-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathsearch.json
1 lines (1 loc) · 218 KB
/
search.json
1
[{"title":"Hello World","url":"/2025/01/19/hello-world/","content":"Welcome to [Hexo](https://hexo.io/)! This is your very first post. Check [documentation](https://hexo.io/docs/) for more info. If you get any problems when using Hexo, you can find the answer in [troubleshooting](https://hexo.io/docs/troubleshooting.html) or you can ask me on [GitHub](https://github.com/hexojs/hexo/issues).\n\n## Quick Start\n\n### Create a new post\n\n``` bash\n$ hexo new \"My New Post\"\n```\n\nMore info: [Writing](https://hexo.io/docs/writing.html)\n\n### Run server\n\n``` bash\n$ hexo server\n```\n\nMore info: [Server](https://hexo.io/docs/server.html)\n\n### Generate static files\n\n``` bash\n$ hexo generate\n```\n\nMore info: [Generating](https://hexo.io/docs/generating.html)\n\n### Deploy to remote sites\n\n``` bash\n$ hexo deploy\n```\n\nMore info: [Deployment](https://hexo.io/docs/one-command-deployment.html)\n"},{"title":"面试","url":"/2025/01/19/computer/work/面试/","content":"\n# 各企业面试安排\n## [华为]()\n1、牛客网华为真题:独立完成10~15道(保底5~8道),真实机考使用牛客网的环境,请按照牛客的真实机考模拟时间练习,以熟悉机考环境和节奏。务必要留意输入输出操作,不少同学因题目输入输出问题没有通过,如输出和预期相比后面多个空格肉眼看不出来。多关注论坛上,别人分享的真题。\n牛客网网址:https://www.nowcoder.com/ta/huawei\n2、leetcode:建议在LeetCode上熟悉题型和算法,各类型的题选做10~15道(保底5~8道。\n针对薄弱知识点查缺补漏题号:\n字符串:3,49,30\n线性表:86,16,27,732\n队列:641,406,899\n栈:946,116,117,895\n哈希表:61,729,25,554\ndfs:105,112,98,494,547,1254\nbfs:1091,1129,102,101,752\n动态规划类题目也可以适当熟悉练习一下\nLeetCode网址: https://leetcode-cn.com/\n\n常考知识点:\n基本操作:输入输出处理(重点),字符串操作与ASCii码(重点)\n数据结构:一维数组,栈,队列\n编程思想:暴力法(重点),递归\n算法:排列组合(重点),快速排序(重点),二分查找,位运算,滑动窗口,深度优先搜索(进阶),广度优先搜索(进阶),搜索回溯(进阶)\n\n注意:\n1 需要开摄像头,不能访问其他网页或查找资源,可以在本地IDE调试好后拷贝到牛客网上再调试\n2 多刷一下各种类型算法题,难度中等及以上,在牛客有或力扣上刷都可以\n3 熟悉牛客网考试环境,和本地IDE,力扣有差异\n4 ACM模式,需要解决输入输出\n5 一定不要死磕某一题,三题得分加起来达到及格分150即可(三道题目分值100、200、300共600分)\n\n\n# [知识问答]()\n\n## java springboot原理\nSpring 框架是一个轻量级的、开源的、基于 Java 的应用框架,用于简化企业级应用的开发。它提供了全面的基础设施支持和丰富的特性,使得开发者可以更加容易地构建和管理复杂的企业级应用。\n\nSpring 框架的主要特点包括:\n\n1. **依赖注入(Dependency Injection,DI)**:\n Spring 框架通过依赖注入(DI)机制来`管理组件之间的依赖关系`,使得应用组件之间的解耦更加灵活,降低了组件之间的耦合度,提高了代码的可维护性和可测试性。\n\n2. **面向切面编程(Aspect-Oriented Programming,AOP)**:\n Spring 框架提供了面向切面编程(AOP)的支持,可以通过切面(Aspect)`将应用的横切关注点(如事务管理、日志记录等)与核心业务逻辑分离`,提高了代码的模块化和复用性。\n\n3. **声明式事务管理**:\n Spring 框架提供了声明式事务管理的支持,可以通过注解或 XML 配置来声明事务的边界和属性,使得事务管理更加简单和灵活。\n\n4. **轻量级和非侵入性**:\n Spring 框架设计简洁、轻量级,没有复杂的继承和实现关系,使得开发者可以更加专注于业务逻辑的实现,而不必关注框架本身的复杂性。\n\n5. **模块化和可扩展性**:\n Spring 框架由多个模块组成,每个模块都提供了特定的功能和特性,开发者可以根据需要选择性地使用这些模块,从而实现定制化的应用开发。\n\n6. **全面的集成支持**:\n Spring 框架提供了丰富的集成支持,可以与各种第三方框架和技术进行集成,如 Hibernate、MyBatis、JPA、JMS、RESTful Web Services 等,使得开发者可以更加便捷地构建复杂的应用。\n\n7. **测试支持**:\n Spring 框架提供了丰富的测试支持,包括单元测试、集成测试等,可以使用各种测试框架和工具进行测试,保证应用的质量和稳定性。\n\n总的来说,Spring 框架是一个功能强大且灵活的企业级应用开发框架,它提供了丰富的特性和全面的基础设施支持,使得开发者可以更加轻松地构建高性能、可维护和可扩展的企业级应用。\n\nJava Spring Boot是一个用于构建Java应用程序的框架,它基于Spring框架,但提供了更简单的方式来配置和启动Spring应用程序。它采用了约定优于配置的理念,可以让开发者更快速地创建基于Spring的应用程序。\n\nSpring Boot的原理可以分为以下几个方面:\n\n1. **自动配置(Auto-Configuration)**:Spring Boot根据项目的依赖和文件结构,自动配置应用程序的各种组件,包括数据源、Web服务器、安全等。它会根据类路径中的jar包和其他条件自动配置Spring应用程序上下文。\n\n2. **起步依赖(Starter Dependencies)**:Spring Boot提供了大量的起步依赖,它们是预先配置好的一组依赖项,可以满足特定类型应用程序的需求。比如,`spring-boot-starter-web`包含了构建Web应用程序所需的一切依赖。\n\n3. **嵌入式Web服务器(Embedded Web Server)**:Spring Boot可以将应用程序打包成一个可执行的jar文件,并且内置了多种Web服务器,如Tomcat、Jetty和Undertow,使得应用程序可以直接运行,而无需额外的Web服务器。\n\n4. **外部化配置(Externalized Configuration)**:Spring Boot支持将配置信息从代码中分离出来,以外部文件(如properties或yaml文件)、环境变量、命令行参数等形式进行配置,这样可以使得应用程序更具灵活性和可配置性。\n\n5. **Spring Boot CLI**:Spring Boot提供了命令行工具(CLI),可以通过Groovy脚本来快速创建、运行和测试Spring Boot应用程序,简化了开发流程。\n\n总的来说,Spring Boot的核心原理是通过自动配置和起步依赖简化了Spring应用程序的开发和部署过程,使得开发者可以更加专注于业务逻辑的实现,而不必关注繁琐的配置和部署细节。\n\n## jvm调优原理\nJVM(Java虚拟机)调优的原理涉及优化Java应用程序在运行时的性能和资源利用率。以下是JVM调优的主要原理:\n\n1. **内存管理**:JVM的内存管理涉及到堆内存(Heap)和非堆内存(Non-Heap)的管理。通过调整堆内存大小(通过-Xms和-Xmx参数),可以控制应用程序的内存使用情况,避免内存溢出或过度消耗内存。此外,还可以通过调整非堆内存中的永久代或元空间大小来优化内存使用。\n\n2. **垃圾回收(Garbage Collection)**:GC是JVM自动管理内存的过程。通过选择合适的垃圾回收器以及调整GC的相关参数,可以降低GC的频率和停顿时间,提高应用程序的响应性能。例如,选择串行GC、并行GC、CMS或G1等不同的垃圾回收器,根据应用程序的特点和需求进行调优。\n\n3. **线程管理**:JVM管理线程的方式对应用程序的并发性能有着直接影响。通过调整线程池的大小、优化线程的创建和销毁、避免线程阻塞等方式,可以提高应用程序的并发处理能力。\n\n4. **类加载优化**:JVM在运行时动态加载和链接类。通过减少类加载次数、缓存已加载的类等方式,可以提高类加载的效率,加快应用程序的启动速度。\n\n5. **编译优化**:JVM的即时编译器(JIT)可以将Java字节码编译成本地机器码,提高程序的执行效率。通过选择合适的编译级别、调整编译器参数等方式,可以优化编译过程,提高应用程序的性能。\n\n6. **监控和诊断**:通过监控JVM的运行状态,收集和分析各种性能指标(如内存使用、GC情况、线程状态等),可以及时发现并解决性能瓶颈和潜在问题,从而进行有效的调优。\n\n综上所述,JVM调优的原理是通过调整内存管理、垃圾回收、线程管理、类加载、编译优化等方面的参数和策略,以提高Java应用程序的性能、稳定性和资源利用率。\n\n## tomcat,nginx的优缺点和实际应用\nTomcat和Nginx都是常用的Web服务器,它们各自有不同的优缺点以及适用场景。下面是它们的主要优缺点和实际应用:\n\n### Tomcat:\n\n优点:\n1. **Servlet容器**:Tomcat是一个Java Servlet容器,支持运行Java Servlet和JSP等动态Web应用程序。\n2. **易于使用**:Tomcat配置相对简单,对Java Web应用程序的部署和管理较为友好。\n3. **兼容性**:作为Java Servlet容器,Tomcat可以很好地与Java生态系统中的其他组件集成,如Spring框架、Hibernate等。\n4. **社区支持**:Tomcat有一个庞大的社区和活跃的开发团队,提供了丰富的文档和资源。\n\n缺点:\n1. **性能相对较低**:相比较于专门的静态文件服务器,Tomcat的性能相对较低。\n2. **静态资源处理弱**:Tomcat并不擅长处理大量的静态资源,如图片、CSS和JavaScript等。\n3. **占用资源多**:Tomcat相对较重,对系统资源的占用较多。\n\n实际应用:\n- Tomcat主要用于运行Java Web应用程序,特别是基于Java Servlet技术的应用,如企业级Web应用、电子商务网站等。\n\n### Nginx:\n\n优点:\n1. **高性能**:Nginx以其出色的性能而闻名,特别是在处理静态内容和高并发请求时表现优异。\n2. **轻量级**:Nginx的内存占用较低,启动速度快,适合用作反向代理服务器。\n3. **高并发支持**:Nginx采用了事件驱动的架构,能够高效地处理大量并发连接。\n4. **灵活性**:Nginx支持反向代理、负载均衡、静态文件服务等多种功能,并且可以通过插件和模块进行扩展。\n\n缺点:\n1. **不支持Java Servlet**:Nginx并不直接支持运行Java Servlet和JSP等动态Web应用程序,需要与后端服务器结合使用。\n2. **配置相对复杂**:相比Tomcat,Nginx的配置相对复杂一些,特别是在配置反向代理和负载均衡时。\n\n实际应用:\n- Nginx主要用作反向代理服务器、负载均衡器、静态文件服务器等。常见的应用场景包括Web应用程序的负载均衡、反向代理、静态文件服务、缓存加速等。\n\n综上所述,Tomcat适合运行Java Web应用程序,而Nginx适合作为反向代理服务器、负载均衡器和静态文件服务器。在实际应用中,通常会将两者结合使用,以发挥各自的优势。例如,Nginx作为前端服务器处理静态资源和反向代理请求,而Tomcat作为后端服务器运行Java应用程序。\n\n## pgsql和mysql有什么区别,各自优缺点是什么?\nPostgreSQL(通常简称为PgSQL)和MySQL是两种常见的开源关系型数据库管理系统(RDBMS),它们有一些区别和各自的优缺点。\n\n### PostgreSQL:\n\n优点:\n1. **功能丰富**:PostgreSQL提供了许多高级功能,如复杂的数据类型(如数组、JSON等)、触发器、存储过程、复制、分区等,使得它适用于复杂的数据库需求。\n2. **事务支持**:PostgreSQL支持ACID事务,并且具有较高的并发控制能力,能够处理高并发的数据操作。\n3. **完整性**:PostgreSQL在数据完整性方面表现良好,支持各种约束、外键等,能够保证数据的一致性和完整性。\n4. **可扩展性**:PostgreSQL支持水平和垂直扩展,可以通过分区、复制、集群等方式实现高可用和高性能。\n\n缺点:\n1. **性能相对较低**:相比MySQL,PostgreSQL在一些场景下的性能可能较低。\n2. **资源消耗**:由于其功能丰富和复杂性,PostgreSQL可能会消耗更多的系统资源。\n\n### MySQL:\n\n优点:\n1. **性能优化**:MySQL在一些简单查询和高并发读取场景下表现优异,特别是针对读密集型应用。\n2. **易用性**:MySQL的配置相对简单,易于安装和使用,适合小型项目或者初学者使用。\n3. **社区支持**:MySQL有庞大的用户群和活跃的社区支持,提供了丰富的文档和资源。\n4. **广泛应用**:MySQL被广泛应用于Web应用程序、中小型企业应用等场景。\n\n缺点:\n1. **功能相对有限**:相比较于PostgreSQL,MySQL的功能相对较少,缺乏一些高级功能。\n2. **事务支持不完善**:虽然MySQL支持事务,但在某些情况下可能存在性能问题或者不完善的事务支持。\n3. **存储引擎限制**:MySQL的某些存储引擎如MyISAM对事务支持较弱,而InnoDB虽然支持事务,但可能会占用更多的系统资源。\n\n在事务处理方面,PostgreSQL和MySQL都支持ACID属性,但它们的实现细节有所不同。\n\nPostgreSQL采用了多版本并发控制(MVCC)来实现事务的隔离性,通过保存不同版本的数据来实现对并发事务的隔离。这使得PostgreSQL在处理高并发事务时具有较好的性能。\n MySQL也支持事务,但其默认的存储引擎InnoDB使用了行级锁定来实现事务的隔离性,这可能在高并发环境下导致一些性能问题。MySQL的另一个存储引擎MyISAM不支持事务。\n\n总的来说,PostgreSQL适合对数据完整性、复杂查询和高级功能有要求的场景,而MySQL适合对性能要求较高、易用性要求较强的场景。选择哪种数据库取决于具体的需求和项目特点。\n\n## acid是什么\n原子性(Atomicity):原子性要求事务是不可分割的最小操作单元,要么全部执行成功,要么全部执行失败。如果事务中的任何一个操作失败,整个事务都应该被回滚(撤销),以确保数据不会处于不一致的状态。\n\n一致性(Consistency):一致性指的是在事务执行之前和之后,数据库的状态必须保持一致性。这意味着事务执行前后数据库中的约束和规则必须保持完整性,以确保数据的正确性。如果一个事务违反了数据库的一致性规则,系统应该阻止该事务的提交。\n\n隔离性(Isolation):隔离性指的是并发执行的多个事务之间应该互相隔离,彼此不应该影响。即使多个事务同时对同一数据进行操作,每个事务也应该感觉到自己是在独立地操作数据,而不受其他事务的影响。这可以通过各种并发控制机制来实现,如锁定、多版本并发控制(MVCC)等。\n\n持久性(Durability):持久性指的是一旦事务提交,对数据库中的数据的修改应该永久保存在数据库中,并且不会因为系统故障或其他异常情况而丢失。即使系统崩溃,数据库系统也应该能够在恢复后保持事务的提交状态。\n\n## css让你写个动画你会吗\n当涉及到编写 CSS 动画效果时,可以使用 @keyframes 规则定义动画的关键帧,然后将动画应用于元素。\n\n## js怎么操作浏览器api或者操作dom文档\n\n调用浏览器api\nJavaScript 可以通过 DOM(Document Object Model 文档对象模型)来操作网页中的元素,包括创建、修改、删除和查询元素等操作。\n\n## vue的生命周期是什么\nVue.js 是一种流行的 JavaScript 框架,它提供了一种用于构建用户界面的渐进式框架。Vue 组件有自己的生命周期,这些生命周期钩子函数允许你在组件的不同阶段执行代码。\n\nVue 组件的生命周期包括创建、挂载、更新和销毁等阶段。以下是 Vue 组件的生命周期钩子函数:\n\n1. **beforeCreate**:在实例初始化之后、数据观测 (data observation) 和 event/watcher 事件配置之前被调用。在这个阶段,实例的选项对象已经被处理了,但是实例上的 data 和 methods 属性都不可用。\n\n2. **created**:实例已经创建完成后调用。在这个阶段,实例已经完成了数据观测 (data observation) 和 event/watcher 事件的配置,但是还没有挂载到 DOM 上。\n\n3. **beforeMount**:在挂载开始之前被调用:相关的 render 函数首次被调用。\n\n4. **mounted**:在挂载结束后调用,此时组件已经挂载到 DOM 中。如果组件中使用了 DOM 操作,该钩子函数中的代码会在 DOM 元素准备好后执行。\n\n5. **beforeUpdate**:在数据更新之前调用,发生在虚拟 DOM 重新渲染和打补丁之前。这里适合在更新之前访问现有 DOM。\n\n6. **updated**:在数据更新之后调用,发生在虚拟 DOM 重新渲染和打补丁之后。该钩子函数中的代码会在组件更新完成后执行。\n\n7. **beforeDestroy**:在实例销毁之前调用。在这个阶段,实例仍然完全可用,所有的事件监听器和观察者都会被移除。\n\n8. **destroyed**:在实例销毁之后调用。在这个阶段,Vue 实例的所有指令和侦听器都已解绑,所有子实例也已经销毁。\n\n除了以上的生命周期钩子函数,还有一些较少使用的钩子函数,如 activated 和 deactivated(用于 keep-alive 组件)、errorCaptured(用于捕获子组件的错误)等。\n\n通过使用这些生命周期钩子函数,你可以在 Vue 组件的不同阶段执行代码,以满足特定的需求,比如在数据更新前后执行一些操作、在组件销毁前释放资源等。\n\n## vue3和vue2的区别\nVue.js 3 是 Vue.js 的下一个主要版本,相比 Vue.js 2,它引入了许多重大的改进和新特性。以下是 Vue.js 3 和 Vue.js 2 的一些主要区别:\n\n1. **性能提升**:\n\n\n2. **更小的包大小**:\n\n\n3. **Composition API**:\n\n\n4. **Teleport 和 Suspense**:\n\n\n5. **编译器优化**:\n\n\n6. **TypeScript 支持**:\n\n\n7. **更好的 TypeScript 集成**:\n\n\n8. **更多的特性和改进**:\n\n\n综上所述,Vue.js 3 相比 Vue.js 2 在性能、体积、灵活性和开发体验等方面都有很大的提升,但由于引入了一些新的概念和 API,可能需要一定的学习成本。选择使用哪个版本取决于项目的需求、团队的技术栈和个人的偏好。(说得好,我选择vue2)\n\n## java的优点是什么\n\nJava 作为一种广泛使用的编程语言,具有许多优点,以下是其中一些主要优点:\n\n1. **平台无关性**:\n Java 是一种跨平台的编程语言,编\n\n\n\n\n\n\n\n\n 写的 Java 代码可以在不同的操作系统上运行,只需要安装对应平台的 Java 虚拟机(JVM)。这种平台无关性使得 Java 成为开发跨平台应用的理想选择。\n\n2. **面向对象**:\n Java 是一种面向对象的编程语言,支持面向对象的编程范式,包括封装、继承和多态等特性。面向对象的编程风格有助于构建模块化、可维护和可扩展的应用程序。\n\n3. **丰富的类库**:\n Java 提供了丰富的类库和 API,涵盖了各种领域的功能,如网络编程、多线程、图形用户界面(GUI)、数据结构等。这些类库可以加速开发过程,提高开发效率。\n\n4. **内存管理和垃圾回收**:\n Java 提供了自动内存管理和垃圾回收机制,程序员不需要手动管理内存分配和释放,这降低了内存泄漏和内存溢出的风险,提高了应用程序的稳定性。\n\n5. **高性能**:\n 虽然 Java 是一种解释型语言,但 Java 编译器将 Java 源代码编译成字节码,然后在运行时由 JVM 解释执行,JVM 可以使用即时编译(JIT)技术将频繁执行的字节码编译成本地机器代码,提高了运行时的性能。\n\n6. **安全性**:\n Java 提供了强大的安全机制,如沙箱安全模型、类加载器、安全管理器等,可以防止恶意代码对系统的攻击,提高了应用程序的安全性。\n\n7. **多线程支持**:\n Java 内置了对多线程的支持,提供了多线程编程的相关类和接口,可以轻松创建和管理多线程应用程序,实现并发执行,充分利用多核处理器的性能。\n\n8. **社区支持和广泛应用**:\n Java 拥有庞大的开发者社区和活跃的开源生态系统,有许多成熟的开源框架和工具可供选择,使得 Java 成为开发 Web 应用、企业应用、移动应用等各种类型应用的首选语言之一。\n\n这些优点使得 Java 成为一种非常流行和广泛应用的编程语言,被广泛应用于各种领域的软件开发中。\n\n## python的优点是什么\n\nPython 是一种简单易学、功能强大且灵活的高级编程语言,具有许多优点,以下是其中一些主要优点:\n\n1. **简单易学**:\n Python 设计简洁,语法清晰,易于学习和使用。它具有优雅的语法,采用了简洁的语法结构和可读性强的代码风格,使得初学者能够更快速地掌握编程基础。\n\n2. **高级功能**:\n Python 提供了丰富的标准库和第三方库,涵盖了各种领域的功能,如网络编程、数据处理、科学计算、人工智能等。这些库可以帮助开发者快速构建各种类型的应用程序。\n\n3. **跨平台性**:\n Python 是一种跨平台的编程语言,可以在各种操作系统上运行,包括 Windows、Linux、Mac OS 等,同样的代码可以在不同的平台上运行,这提高了代码的可移植性。\n\n4. **动态类型**:\n Python 是一种动态类型语言,不需要显式地声明变量的类型,可以根据变量的值自动推断其类型。这简化了代码编写过程,提高了开发效率。\n\n5. **多种编程范式**:\n Python 支持多种编程范式,包括面向对象编程、函数式编程、过程式编程等,开发者可以根据项目需求选择合适的编程范式进行开发。\n\n6. **大型社区和活跃生态系统**:\n Python 拥有庞大的开发者社区和活跃的开源生态系统,有众多成熟的第三方库和框架可供选择,如 Django、Flask、NumPy、Pandas 等,这些库和框架可以加速开发过程,提高开发效率。\n\n7. **适用于各种场景**:\n Python 在各种领域都有广泛的应用,包括 Web 开发、数据科学、人工智能、机器学习、自然语言处理、网络爬虫、游戏开发等,适用于各种规模和类型的项目。\n\n8. **开源和免费**:\n Python 是一种开源的编程语言,可以免费获取和使用,没有商业使用的限制,同时也可以参与到 Python 的开发和社区贡献中。\n\n这些优点使得 Python 成为一种非常受欢迎的编程语言,被广泛应用于各种领域的软件开发中。\n\n## python如何做一批上千万的数据处理\n\n处理上千万条数据是 Python 的一个常见场景,下面是一些处理大数据集的常用技巧和工具:\n\n1. **选择合适的数据结构**:\n 在 Python 中选择合适的数据结构对于处理大数据集非常重要。对于需要频繁查询和更新的数据,可以选择使用字典(dict)或集合(set)等数据结构;对于需要按顺序访问和处理的数据,可以选择使用列表(list)等数据结构。\n\n2. **分块处理数据**:\n 如果数据量非常大,内存无法一次加载所有数据,可以考虑分块处理数据。可以使用迭代器(iterator)或生成器(generator)来逐行读取数据,并在处理过程中释放已经处理的数据,从而减少内存占用。\n\n3. **使用并行处理**:\n 对于需要耗时较长的数据处理任务,可以考虑使用并行处理来加速处理过程。Python 提供了多线程和多进程等并发编程工具,可以利用多核处理器并行处理数据,提高处理效率。\n\n4. **使用适当的库和工具**:\n Python 有许多优秀的第三方库和工具,如 NumPy、Pandas、Dask 等,它们针对大规模数据处理提供了高效的算法和数据结构,可以加速数据处理过程。\n\n5. **优化代码性能**:\n 在编写代码时,可以通过优化算法、减少内存占用、避免不必要的循环等方式来提高代码性能。此外,可以使用 Python 的 JIT 编译器(如 Numba)来加速代码执行。\n\n6. **使用数据库**:\n 如果数据量非常大,可以考虑将数据存储在数据库中,使用数据库查询和索引来加速数据访问和处理。常用的数据库包括 SQLite、MySQL、PostgreSQL 等,可以根据需求选择合适的数据库。\n\n7. **使用分布式计算**:\n 对于需要处理非常大规模数据的任务,可以考虑使用分布式计算框架,如 Apache Spark、Dask、Ray 等,这些框架可以将任务分发到多台计算机上并行处理,大大加速了数据处理的速度。\n\n综上所述,Python 有许多处理大数据集的方法和工具,可以根据具体的需求选择合适的方法来处理上千万条数据。\n\n## linux内核调优怎么调\n在 Linux 中进行内核调优涉及到多个方面,包括文件系统、网络、内存、CPU 调度等。以下是一些常见的内核调优技巧:\n\n1. **文件系统调优**:\n - 使用适当的文件系统类型:根据应用场景选择合适的文件系统类型,如 ext4、XFS、Btrfs 等。\n - 调整文件系统参数:可以通过修改文件系统的参数来提高性能,如调整磁盘调度器(I/O scheduler)、文件系统缓存大小等。\n\n2. **网络调优**:\n - 调整网络参数:可以通过修改网络参数来优化网络性能,如调整TCP缓冲区大小、修改TCP拥塞控制算法等。\n - 使用高性能网络设备:选择性能较好的网卡和网卡驱动程序可以提高网络性能。\n\n3. **内存调优**:\n - 调整内存参数:可以通过修改内存参数来优化内存使用,如调整内存分配策略、修改内存页面大小等。\n - 使用内存压缩技术:可以使用内存压缩技术来减少内存占用,如使用 zswap、zram 等。\n\n4. **CPU 调度**:\n - 调整 CPU 调度策略:可以通过修改 CPU 调度策略来优化 CPU 使用,如使用 CFS 调度器、调整 CPU 亲和性等。\n - 使用 CPU 频率调整工具:可以使用 CPU 频率调整工具来动态调整 CPU 频率,根据负载情况来节省能源或提高性能。\n\n5. **系统监控和调优工具**:\n - 使用性能监控工具:可以使用性能监控工具来实时监测系统性能指标,如 top、sar、vmstat 等。\n - 使用调优工具:可以使用专门的调优工具来自动化调优过程,如 sysctl、tuned 等。\n\n在进行内核调优时,需要根据具体的应用场景和硬件环境来选择合适的调优策略和工具,并进行适当的测试和评估,以确保调优效果符合预期。此外,对于一些关键的调优参数,建议在生产环境之前先在测试环境进行验证。\n\n## linux都有什么平台\n\nLinux 是一种开源的 Unix-like 操作系统内核,它被广泛用于各种计算机平台和设备上。以下是一些常见的 Linux 平台:\n\n1. **服务器**:\n Linux 作为一种稳定、安全且高性能的操作系统,在服务器领域有着广泛的应用。许多云计算服务提供商如 AWS、Azure、Google Cloud 等都支持运行 Linux 的虚拟机实例,而且许多网站和网络服务也运行在 Linux 服务器上。\n\n2. **桌面电脑**:\n Linux 提供了许多不同的桌面环境,如 GNOME、KDE、Xfce、LXDE 等,用户可以根据自己的喜好选择合适的桌面环境。许多 Linux 发行版,如 Ubuntu、Fedora、Debian 等,都提供了适用于桌面用户的版本。\n\n3. **嵌入式系统**:\n Linux 在嵌入式系统领域也有着广泛的应用,如智能手机、平板电脑、智能电视、路由器、网络存储设备等。许多嵌入式 Linux 发行版,如 OpenWrt、OpenEmbedded、Buildroot 等,专门针对嵌入式设备提供了定制化的 Linux 内核和文件系统。\n\n4. **超级计算机**:\n Linux 在超级计算机领域也有一定的应用,许多世界排名前列的超级计算机都运行着 Linux 操作系统。事实上,大部分 TOP500 排行榜上的超级计算机都是基于 Linux 构建的。\n\n5. **嵌入式开发板**:\n Linux 在嵌入式开发领域也有着广泛的应用,许多嵌入式开发板和开发套件都支持运行 Linux 内核,如树莓派、BeagleBone、Arduino Yun 等。\n\n总的来说,Linux 是一种多用途的操作系统内核,可以运行在各种不同的计算机平台和设备上,为用户提供了稳定、灵活且可定制化的操作系统环境。\n\n## arm平台的优缺点\nARM(Advanced RISC Machine)架构是一种基于精简指令集(RISC)的处理器架构,被广泛应用于移动设备、嵌入式系统和物联网设备等领域。以下是 ARM 平台的一些优缺点:\n\n优点:\n1. **低功耗高性能比**:ARM 架构通常具有较低的功耗和高的性能比,使其非常适合于移动设备和嵌入式系统,能够提供良好的性能和长时间的电池续航时间。\n\n2. **灵活性和可定制性**:ARM 架构具有较高的灵活性和可定制性,可以根据不同的应用需求进行定制,生产出适合特定应用场景的处理器和芯片。\n\n3. **成本效益**:ARM 架构的许多处理器芯片都具有成本效益高的优势,适合于大规模生产和低成本设备,如智能手机、智能家居设备等。\n\n4. **生态系统和支持**:ARM 生态系统非常庞大和丰富,拥有大量的开发工具、软件库和支持资源,开发者可以方便地利用这些资源来开发应用程序和系统。\n\n5. **多核处理器支持**:许多 ARM 处理器支持多核技术,可以提供更高的计算性能和并行处理能力,适用于需要高性能的应用场景。\n\n缺点:\n1. **软件兼容性低**:ARM 架构与传统的 x86 架构存在一定的软件兼容性问题,一些需要在 x86 架构上运行的软件可能需要进行重新编译或适配才能在 ARM 平台上运行。\n\n2. **性能与复杂性不如**:尽管 ARM 架构在功耗和性能比方面表现优异,但相比于高端的 x86 处理器,它在单个核心的性能上可能略有不足,并且在处理一些高密度计算任务时可能表现不佳。\n\n3. **硬件碎片化**:由于 ARM 生态系统的广泛性和可定制性,导致了硬件碎片化的问题,即不同厂商生产的 ARM 处理器可能具有不同的特性和性能,这可能会增加软件开发和支持的复杂性。\n\n4. **操作系统支持少**:尽管 ARM 处理器已经在移动设备和嵌入式系统中得到广泛应用,但在传统的桌面和服务器领域,仍然主要是 x86 架构占据主导地位,因此在一些场景下,ARM 平台的操作系统支持可能相对较少。\n\n尽管 ARM 平台存在一些缺点,但其在移动设备、嵌入式系统、物联网设备等领域的优势仍然十分明显,且随着技术的不断发展和 ARM 架构的不断进步,ARM 平台的应用范围和性能还将继续扩大。\n\n## 三次握手,四次握手是什么\n在计算机网络中,特别是在TCP(传输控制协议)的环境下,\"三次握手\"和\"四次挥手\"是确立和终止网络连接的两个基本过程。让我们分别解释这两个过程。\n\n### 三次握手(建立连接)\n\n三次握手是TCP协议建立一个连接的过程,目的是双方确认自身和对方的发送和接收是正常的。这个过程包括以下三步:\n\n1. **SYN**:客户端向服务器发送一个SYN(同步序列编号)报文,请求建立连接,并进入SYN_SENT状态。这个报文里包含客户端的初始序列号,用于同步。\n\n2. **SYN+ACK**:服务器收到SYN报文后,如果同意建立连接,则会发送一个SYN+ACK(确认应答)报文。这个报文同时包含服务器的初始序列号和对客户端初始序列号的确认应答。服务器此时进入SYN_RECEIVED状态。\n\n3. **ACK**:客户端收到服务器的SYN+ACK报文后,会向服务器发送一个ACK(确认)报文,作为对服务器初始序列号的确认。一旦服务器收到这个ACK报文,连接就建立成功,服务器进入ESTABLISHED状态。客户端也在发送ACK之后进入ESTABLISHED状态。\n\n### 四次挥手(断开连接)\n\n四次挥手是TCP协议终止一个连接的过程,目的是双方能够平滑地关闭连接,确保数据完整传输。这个过程包括以下四步:\n\n1. **FIN**:当连接的一方(可以是客户端或服务器)完成数据发送后,它会发送一个FIN(结束)报文,请求关闭连接,并进入FIN_WAIT_1状态。\n\n2. **ACK**:对方收到FIN报文后,会发送一个ACK报文作为应答,并进入CLOSE_WAIT状态。发送方在收到ACK后进入FIN_WAIT_2状态。\n\n3. **FIN**:关闭方完成剩余数据的处理和传输后,会发送另一个FIN报文,请求完全关闭连接,并进入LAST_ACK状态。\n\n4. **ACK**:最初发送FIN报文的一方收到对方的FIN报文后,会发送一个ACK报文作为最终确认,然后进入TIME_WAIT状态,等待足够的时间以确保对方接收到了最后一个ACK报文。在等待一段时间(通常是几倍的报文往返时间)后,连接被完全关闭,双方都回到了CLOSED状态。\n\n三次握手和四次挥手是TCP/IP协议中非常重要的机制,确保了网络通信的可靠性和数据的完整性。\n## 什么情况下会出现大量的close_wait和time_wait,分别是什么原因,怎么解决\n在TCP网络通信中,`CLOSE_WAIT`和`TIME_WAIT`状态分别指示了连接正在等待关闭和连接已经关闭但等待以确保远端收到最终的确认报文。出现大量的`CLOSE_WAIT`和`TIME_WAIT`状态可能会导致资源耗尽,影响系统性能。下面是每种情况出现的原因和解决方案:\n\n### CLOSE_WAIT\n\n**出现原因**:\n\n- **主动关闭方缓慢**:当远端(客户端或服务器)发送了FIN请求关闭连接,本地端收到后回复ACK并进入`CLOSE_WAIT`状态。如果本地应用程序(接收到关闭请求的一方)在处理完剩余数据后,没有及时调用close来关闭连接,那么该连接就会长时间停留在`CLOSE_WAIT`状态。这通常是因为应用程序的设计问题,没有正确地管理TCP连接的关闭。\n\n**解决方案**:\n\n- **优化应用逻辑**:检查和修改应用程序代码,确保在接收到关闭请求后,能够及时处理完毕剩余数据并调用close关闭socket连接。\n- **资源监控和管理**:实现适当的监控,以识别持有`CLOSE_WAIT`状态连接的进程,并分析为什么这些连接没有被及时关闭。\n\n### TIME_WAIT\n\n**出现原因**:\n\n- **大量的TCP连接终止过程**:当TCP连接被主动关闭方终止时,关闭方会发送FIN报文并接收到ACK后进入`TIME_WAIT`状态。`TIME_WAIT`状态通常持续2倍的最大段生命周期(MSL),这是为了确保对方收到最终的ACK报文。如果有大量连接被频繁地建立和关闭,就会产生大量处于`TIME_WAIT`状态的连接。\n- **端口资源耗尽**:在高并发场景下,大量的`TIME_WAIT`状态可能会导致可用端口资源耗尽,从而影响新连接的建立。\n\n**解决方案**:\n\n- **调整TCP参数**:通过修改系统TCP参数来缩短`TIME_WAIT`状态的持续时间,例如调整`tcp_fin_timeout`参数。\n- **启用端口复用**:通过设置`SO_REUSEADDR`或`SO_REUSEPORT`选项允许在`TIME_WAIT`状态的端口上启动新的连接,有助于高并发应用中端口的复用。\n- **优化应用架构**:减少不必要的连接建立和断开,比如通过长连接来减少`TIME_WAIT`状态的出现。\n\n在处理这些问题时,重要的是要平衡性能优化和保持网络通信的可靠性。不当的参数调整或者错误的应用程序修改可能会导致更严重的问题。\n\n## stl那一堆东西给出常用的十个数据结构或函数的解释\nSTL(Standard Template Library)是C++标准库的一部分,提供了一系列模板化的常用数据结构和算法。STL可以大致分为四个主要部分:容器(Containers)、算法(Algorithms)、迭代器(Iterators)和适配器(Adapters)。\n\n### 容器(Containers)\n\n1. **vector**:向量是一个封装了动态大小数组的顺序容器。它允许快速随机访问,能够在尾部相对快速地插入和删除元素,但在中间或开始插入和删除元素则较慢。\n\n2. **list**:列表是一个双向链表,支持快速的元素插入和删除。与向量(vector)相比,它允许在任何位置快速插入和删除,但不支持随机访问。\n\n3. **map**:映射是基于红黑树实现的关联容器,它存储的是键值对,其中每个键唯一,并根据键进行排序。它允许快速查找,插入和删除操作。\n\n4. **set**:集合也是一个基于红黑树的关联容器,但它只存储唯一键的集合。和map类似,它根据键进行排序,并允许快速查找。\n\n5. **unordered_map**:无序映射是基于哈希表实现的关联容器,它存储键值对,但不按任何顺序排序。相比于map,它提供了更快的平均时间复杂度的访问性能,但是在最坏情况下可能会更慢。\n\n6. **unordered_set**:无序集合是一个基于哈希表的容器,它存储唯一元素的集合,但不按任何顺序排序。它提供了快速的元素查找、插入和删除操作。\n\n7. **stack**:栈是一种先进后出(LIFO)的容器适配器,只允许在一端(顶部)进行元素的插入和删除操作。\n\n8. **queue**:队列是一种先进先出(FIFO)的容器适配器,只允许在末端进行插入操作,在头部进行删除操作。\n\n9. **priority_queue**:优先队列是一种容器适配器,元素被按照优先级顺序出队,这使得最高优先级的元素总是位于队列前面。内部通常通过堆实现。\n\n### 算法(Algorithms)\n\n\n1. **sort**:`sort`算法对序列进行排序。默认情况下,它使用元素类型的`<`运算符来进行比较,但也可以接受自定义比较函数。它通常使用快速排序的变种作为排序算法,复杂度为O(N log N)。\n\n2. **find**:`find`算法在给定的范围内搜索一个元素,返回一个指向找到元素的迭代器,如果没有找到,则返回结束迭代器。这个算法对于所有容器都是通用的,复杂度为O(N)。\n\n3. **copy**:`copy`算法从源范围复制元素到目标范围。它需要源范围的开始和结束迭代器,以及目标范围的开始迭代器作为参数。\n\n4. **accumulate**:定义在`<numeric>`头文件中,`accumulate`算法计算给定范围内所有元素的总和,还可以提供一个起始值和自定义的加法运算。\n\n5. **replace**:`replace`算法在一个范围内查找所有特定值的实例,并将它们替换为新值。这对于简单的值替换操作非常有用。\n\n### 迭代器(Iterators)\n\n迭代器是STL的核心概念之一,提供了一种访问容器内元素的方法,无需了解容器的内部结构。根据容器类型和需要操作的复杂性,迭代器可以是输入迭代器、输出迭代器、前向迭代器、双向迭代器和随机访问迭代器。\n\n1. **迭代器操作**:STL中的迭代器支持多种操作,如`++`(前进到下一个元素)、`--`(回退到上一个元素,仅限双向和随机访问迭代器)、`*`(解引用迭代器,访问其指向的元素)、`->`(访问元素成员,仅限指针类似的迭代器)等。正确使用迭代器是高效利用STL容器的关键。\n\n\n\n\n### 适配器(Adapters)\n\n适配器是特殊的容器,它们提供了修改基本容器接口行为的方式。我们已经提到了`stack`和`queue`,下面是另一个常用的适配器:\n\n1. **priority_queue**:虽然已经提及,但值得强调的是,`priority_queue`不支持迭代器,因为它是基于堆的,并且其元素是部分排序的,即只保证顶部元素是按照优先级排序的最高(或最低)。\n\n### 函数对象和绑定器\n\nSTL中还有函数对象(functors)和绑定器(binders),它们用于算法中实现特定的操作。\n\n17. **function objects (functors)**:函数对象是实现了`operator()`的类的实例,可以像普通函数那样被调用。STL中的很多算法都可以接受函数对象作为参数,以实现自定义的比较或操作逻辑。\n\n18. **bind**:`bind`函数用于创建一个新的可调用对象,它绑定了原始函数的一部分参数。这在需要预设一些参数的情况下非常有用。\n\n通过熟悉和使用这些STL的数据结构、算法、迭代器和适配器,可以大幅提升在C++中处理数据和执行复杂算法的能力。STL的设计哲学鼓励代码的重用和抽象,让程序员能够编写更简洁、高效且易于理解的代码。\n\n## nginx会问你这些部件的架构,如何满足高并发,使用场景,以及一些其他的专有特性的\n\nNginx(发音为\"engine-x\")是一个高性能的HTTP和反向代理服务器,也是一个IMAP/POP3代理服务器。Nginx以其高性能、稳定性、丰富的功能集、简单的配置以及低资源消耗而闻名。它特别适合处理高并发连接,这得益于其事件驱动的架构和高度优化的处理方式。\n\n### Nginx架构\n\nNginx采用了模块化、事件驱动的架构,它由主进程(master process)和多个工作进程(worker processes)组成。主进程负责读取和评估配置文件、管理工作进程;工作进程则处理实际的请求。这种设计使Nginx能够高效地利用系统资源,轻松应对成千上万的并发连接。\n\n### 高并发处理\n\n- **事件驱动模型**:Nginx使用非阻塞的事件驱动模型来处理请求,这意味着每个工作进程都能处理数千个并发连接,而不是为每个连接创建新的进程或线程。这极大地减少了上下文切换和资源消耗。\n- **异步非阻塞处理**:Nginx对网络、文件IO等都采用异步非阻塞的方式,这使得在等待IO操作(如向后端服务器转发请求或读取磁盘文件)时,工作进程可以继续处理其他连接和请求。\n\n### 使用场景\n\n- **静态内容服务**:Nginx非常擅长处理静态内容,它可以直接从内核缓存中提供静态文件,减少对磁盘的访问,提高内容分发的效率。\n- **反向代理和负载均衡**:Nginx常用作反向代理服务器,坐在客户端和后端应用服务器之间,它可以根据配置将请求分发到多个后端服务器,实现负载均衡、请求分流、减轻后端压力等功能。\n- **API网关**:Nginx可以作为API网关使用,管理和控制对后端服务的HTTP请求。\n- **动态内容加速**:通过与后端应用服务器(如uWSGI服务器用于Python应用,或者Phusion Passenger用于Ruby应用)的配合,Nginx能够提高动态内容的处理速度。\n\n### 专有特性\n\n- **配置的灵活性**:Nginx的配置系统非常灵活且易于理解,支持基于URI、IP、HTTP头等的请求分流,以及重写规则等高级功能。\n- **高度的可扩展性**:Nginx支持第三方模块,社区和企业都贡献了大量模块,从而扩展了Nginx的功能,包括Web防火墙、图像处理、认证等。\n- **安全特性**:Nginx提供了强大的安全特性,比如SSL/TLS加密、防止DDoS攻击的限制连接速率等。\n\nNginx的成功在于其轻量级、高性能的设计,使其成为处理高并发、高性能Web应用的理想选择。通过精心配置和适当的架构设计,Nginx能够满足最严格的性能要求。\n## redis会问你这些部件的架构,如何满足高并发,使用场景,以及一些其他的专有特性的\nRedis(Remote Dictionary Server)是一个开源的、内存中的数据结构存储系统,用作数据库、缓存和消息代理。它支持多种类型的数据结构,如字符串(strings)、哈希表(hashes)、列表(lists)、集合(sets)、有序集合(sorted sets)以及位图(bitmaps)、超日志(hyperloglogs)和地理空间索引(geospatial indexes)。Redis以其出色的性能、灵活的数据模型和丰富的特性集而广受欢迎。\n\n### Redis架构\n\nRedis是一个基于客户端-服务器模型和请求/响应协议的系统。它主要由以下几个部分组成:\n\n- **Redis服务器**:运行在服务器模式下的Redis进程,负责处理所有数据存储、读写、计算等操作。\n- **客户端库**:提供给客户端应用程序用以与Redis服务器通信的API。\n\nRedis的架构设计简单,它是单线程的,依靠非阻塞的IO多路复用机制来处理并发请求,从而能够高效地处理大量的并发连接。\n\n### 如何满足高并发\n\n- **单线程模型**:Redis使用单线程模型来处理命令,避免了线程切换和锁竞争的开销,能够保证高性能和简单性。\n- **内存存储**:所有数据都存储在内存中,访问速度远快于任何基于磁盘的数据库。\n- **IO多路复用**:Redis使用IO多路复用技术来同时监听多个socket,接收客户端的命令,实现高吞吐量和低延迟。\n- **持久化**:Redis提供了RDB(快照存储)和AOF(追加文件存储)两种数据持久化方式,保证数据的安全性。\n\n### 使用场景\n\n- **缓存系统**:利用其高速访问的特点,广泛用作缓存系统,减轻后端数据库的负载。\n- **消息队列系统**:Redis的发布/订阅模式支持消息队列系统的构建。\n- **实时计数系统**:比如用于统计网站访问量、游戏排行榜等场景。\n- **会话存储(Session Store)**:快速的读写速度使其非常适合存储用户会话信息。\n- **地理空间数据存储**:Redis的地理空间索引支持,可以用于存储地理位置信息,并进行地理位置查询。\n\n### 专有特性\n\n- **支持多种数据结构**:Redis支持丰富的数据结构类型,为不同的应用场景提供了极大的灵活性。\n- **发布/订阅模式**:支持消息的发布/订阅机制,可以用作消息队列、日志收集和实时消息系统。\n- **事务支持**:Redis支持事务,能够执行一组命令,保证原子性。\n- **Lua脚本支持**:通过内置的Lua环境,用户可以在服务器端执行复杂的操作,减少网络开销。\n- **高可用性和分布式**:通过Redis哨兵(Sentinel)和集群(Cluster)支持,提供高可用性解决方案。\n\nRedis通过其高性能的设计和丰富的特性集,成为了构建高性能、可伸缩和灵活的应用程序的强大工具。\n\n## MQ会问你这些部件的架构,如何满足高并发,使用场景,以及一些其他的专有特性的\n消息队列(MQ,Message Queue)是一种在应用程序之间传递消息的技术。它允许应用程序异步地发送消息,这些消息存储在队列中,直到它们被接收和处理。消息队列提供了解耦服务和组件、提高可扩展性和处理率、增强异步通信能力等优点。由于存在多种消息队列实现,这里我将概括性地介绍消息队列的一般架构和特性,以及如何满足高并发的需求。\n\n### 消息队列架构\n\n一般的消息队列架构包括以下几个核心组件:\n\n- **生产者(Producer)**:负责创建并发送消息到消息队列。\n- **消费者(Consumer)**:从消息队列中读取并处理消息。\n- **消息队列(Message Queue)**:存储消息直到它们被处理的中间件组件。它可以是持久的,支持消息的持久化存储,以防进程崩溃或者机器故障。\n- **消息代理(Broker)**:作为中间人,管理和维护消息队列,处理消息的路由、负载均衡、持久化等。\n\n### 如何满足高并发\n\n- **分布式架构**:大多数消息队列软件支持分布式部署,可以跨多个服务器节点分散负载,增强处理能力和容错性。\n- **负载均衡**:通过负载均衡机制,消息队列可以均衡地分配消息到不同的消费者,避免某些节点过载而影响整体性能。\n- **批处理和消息预取**:消费者可以一次性从队列中预取多个消息进行批处理,减少网络请求次数,提高处理效率。\n- **持久化与缓冲**:持久化机制确保消息即使在系统故障时也不会丢失,而缓冲机制帮助应对突发的消息高峰。\n\n### 使用场景\n\n- **异步处理**:解耦生产者和消费者,使得生产者无需等待消费者处理完成即可继续执行。\n- **系统解耦**:不同的服务或应用之间通过消息队列通信,降低它们之间的直接依赖。\n- **流量削峰**:在高负载情况下,消息队列能够作为缓冲区,帮助系统平滑处理请求。\n- **日志处理**:收集系统日志并分发到不同的日志处理系统中。\n- **任务分发**:在复杂的分布式系统中,用于任务的分发和处理状态的管理。\n\n### 专有特性\n\n不同的消息队列实现有其独特的特性,例如:\n\n- **RabbitMQ**:支持多种消息确认机制,如事务和发布确认。提供丰富的路由功能,包括直连交换机、主题交换机和扇出交换机。\n- **Apache Kafka**:专为高吞吐量设计,通过分区和复制机制提供高可用性和数据冗余。适用于大数据处理场景。\n- **Amazon SQS**:完全托管的消息队列服务,提供简单的Web服务API,可以从任何地方发送或接收消息。无需管理消息队列软件或硬件。\n\n## redis是如何固化数据的,固化数据可能出现的一些性能问题,redis是如何做的优化\n\nRedis提供了两种主要的数据持久化方式:RDB(快照)和AOF(追加文件)。这两种方式可以单独使用,也可以同时使用,以便结合各自的优势。每种方式在性能上有不同的考量和优化策略。\n\n### RDB持久化\n\nRDB(Redis Database)持久化方式会在指定的时间间隔内生成Redis数据的快照并保存到硬盘上的一个文件中(通常是dump.rdb)。这种方式非常适合大规模数据恢复,因为它可以更快地将Redis服务器恢复到某个时间点的状态。\n\n**性能问题**:\n- 在创建快照时,如果数据集很大,可能会导致客户端延迟,特别是在使用单一线程的Redis服务器上。\n- 快照生成过程中可能会需要较多的内存,因为Redis在保存快照文件之前,会将所有数据复制一份(在使用某些旧版本或特定配置时)。\n\n**优化**:\n- **后台保存**:Redis使用`fork()`创建一个子进程来进行快照保存操作,父进程可以继续处理客户端请求,这减少了保存操作对服务可用性的影响。\n- **增量快照**:在较新的版本中,Redis使用操作系统的写时复制(Copy-On-Write, COW)技术,仅复制写操作触及的内存部分,减少了内存使用。\n\n### AOF持久化\n\nAOF(Append Only File)持久化是通过保存Redis服务器所执行的写操作命令来记录数据库状态的一种方式。AOF文件在Redis重新启动时被重新执行来重建原始数据。AOF提供了更好的数据安全性,但可能会因为文件大小快速增长而影响性能。\n\n**性能问题**:\n- 随着操作命令的不断增加,AOF文件可能会变得非常大,这不仅会占用大量的磁盘空间,还可能在重新加载时导致较长的启动时间。\n- 频繁的磁盘写操作可能会降低Redis的性能,特别是在高写入负载的情况下。\n\n**优化**:\n- **AOF重写**:Redis提供了AOF重写机制,该机制可以创建一个新的AOF文件,其中仅包含达到当前数据库状态所需的最少命令。这大大减少了AOF文件的大小。\n- **缓冲和批量写入**:Redis允许通过缓冲写操作来减少磁盘写入次数,并支持批量将这些操作写入磁盘,减少了I/O操作的开销。\n- **配置策略**:Redis允许配置AOF的写入频率,如每次命令执行时、每秒写入一次或不定期写入。根据数据安全性与性能之间的权衡,用户可以选择最适合自己场景的策略。\n\n通过这些机制和配置选项,Redis在提供数据持久化功能的同时,尽可能地减少了对性能的影响。用户可以根据自己的具体需求和资源限制,选择最合适的持久化策略和优化配置。\n\n## 僵尸进程\n僵尸进程(Zombie Process)是指在Unix-like操作系统中,一个已经执行完毕但仍然在进程表中占据位置的进程。这种进程完成了执行,但其父进程尚未通过调用`wait()`或`waitpid()`系统调用来读取其退出状态,因此它仍然保留着在进程表中的记录,例如进程ID(PID)和退出状态。僵尸进程本身不消耗除了进程表条目外的资源,但如果大量积累,可能会耗尽系统的进程号资源,导致新的进程无法启动。\n\n### 如何产生\n\n当一个子进程比其父进程先结束时,子进程会发送一个SIGCHLD信号给父进程。父进程通常在处理该信号的处理函数中调用`wait()`或`waitpid()`来等待子进程结束,并读取子进程的终止状态。如果父进程没有调用`wait()`或`waitpid()`,子进程会变成僵尸进程。\n\n### 如何处理\n\n1. **父进程调用wait或waitpid**:这是处理僵尸进程的标准方式。父进程通过调用`wait()`或`waitpid()`等待子进程结束,并获取子进程的退出状态,从而使子进程的记录从进程表中清除。\n\n2. **SIGCHLD信号处理**:父进程可以捕获SIGCHLD信号,并在信号处理函数中调用`wait()`来清理结束的子进程。\n\n3. **使用init进程接管**:如果父进程结束,所有剩余的子进程会被init进程(进程号为1的进程)接管。init进程会定期调用`wait()`来清理任何它接管的已结束的子进程,因此可以通过让父进程结束来清理僵尸进程。\n\n4. **避免产生僵尸进程**:在编写程序时,确保父进程适当地等待子进程,或者让子进程在启动时独立于父进程运行(通过成为守护进程或调用`setsid()`),以避免产生僵尸进程。\n\n### 避免和管理的重要性\n\n虽然单个僵尸进程占用的资源非常少,但它们如果大量积累,可以耗尽系统资源,特别是可用的进程号,进而阻止新进程的创建。因此,妥善管理子进程的生命周期和状态对于保持系统稳定和高效是非常重要的。\n\n## 多进程的编写规范\n\n在编写多进程程序时,遵循一定的规范和最佳实践是非常重要的,以确保程序的健壯性、可维护性和效率。这里是一些多进程编程的核心指导原则和建议:\n\n### 设计阶段\n\n1. **明确进程间通信(IPC `Inter-Process Communication`)机制**:在开始编写代码之前,清楚地定义进程间如何通信是关键。选择合适的IPC机制(如管道、消息队列、共享内存、信号量等)以适应应用程序的需求。\n\n2. **定义清晰的进程角色和职责**:每个进程应该有一个清晰定义的角色和职责集合。避免设计过于复杂或职责交叉的进程。\n\n### 编码阶段\n\n3. **正确处理僵尸进程**:确保父进程适当地回收子进程的资源,避免僵尸进程的产生。使用`wait()`或`waitpid()`函数来等待子进程结束,并处理它们的退出状态。\n\n4. **避免竞态条件和死锁**:当多个进程访问共享资源时,适当地使用同步机制(如互斥锁、信号量等)来避免竞态条件和死锁。\n\n5. **安全地使用IPC资源**:使用IPC资源时,考虑到安全性和错误处理。例如,当使用共享内存时,确保适当地初始化内存,当完成时正确地解除映射和释放资源。\n\n6. **优雅地处理信号**:信号处理应该简单快速,避免在信号处理函数中执行复杂的操作或调用不可重入的函数。\n\n7. **资源管理和泄露防护**:确保所有分配的资源(如内存、文件描述符等)在不再需要时被正确释放,避免资源泄露。\n\n### 测试和维护阶段\n\n8. **压力测试和并发测试**:对多进程程序进行压力测试和并发测试,以确保在高负载和高并发条件下的稳定性和性能。\n\n9. **日志和错误处理**:实现详细的日志记录和错误处理机制,以便于问题的诊断和调试。\n\n10. **信号和异常安全**:确保代码对信号和异常是安全的,特别是在进行资源管理和IPC操作时。\n\n11. **使用成熟的库和工具**:尽可能利用成熟的库和框架来管理进程、线程和IPC,这些库通常提供了经过充分测试的实现,可以减少潜在的错误。\n\n### 性能优化\n\n12. **分析和优化进程间通信**:IPC操作通常比进程内部操作要慢,因此需要仔细分析和优化IPC的使用,减少不必要的通信和数据传输。\n\n遵循这些规范和最佳实践可以帮助开发者避免常见的多进程编程陷阱,同时提高程序的质量和性能。在多进程程序的设计和实现过程中,持续的性能评估和优化是确保高效运行的关键。\n\n## 如何检查服务器卡顿等问题\n检查服务器卡顿或性能下降问题通常涉及多个方面,包括硬件资源使用情况、系统配置、网络状况和应用程序性能。下面是一系列步骤和工具,可以帮助你诊断和定位问题:\n\n### 1. 检查系统资源使用情况\n\n- **CPU使用率**:使用`top`、`htop`或`mpstat`等工具检查CPU使用率。高CPU使用率可能是由于某个进程或服务过度使用CPU资源。\n- **内存使用情况**:使用`free`、`vmstat`或`top`检查内存使用情况。如果可用内存非常低,系统可能会频繁使用交换空间(swap),导致性能下降。\n- **磁盘I/O**:使用`iostat`、`vmstat`或`iotop`检查磁盘I/O性能。磁盘I/O瓶颈可能会导致应用响应缓慢。\n- **网络状况**:使用`iftop`、`nethogs`或`netstat`等工具检查网络流量和连接状态。网络带宽饱和或连接数过多都可能影响服务器性能。\n\n### 2. 系统和应用日志\n\n- **系统日志**:检查`/var/log/syslog`、`/var/log/messages`等系统日志文件,查找错误信息或警告。\n- **应用日志**:查看应用程序的日志文件,搜索异常信息、错误或警告,这些可能会指示出现了性能问题或配置错误。\n\n### 3. 网络连接和配置\n\n- **检查网络延迟**:使用`ping`或`traceroute`检查到关键服务的网络延迟。\n- **配置检查**:检查网络配置和防火墙设置,确保没有错误的规则或配置限制了流量。\n\n### 4. 性能监控和分析工具\n\n- **使用性能监控工具**:工具如Nagios、Zabbix或Prometheus可以提供实时监控和历史性能数据,帮助识别问题的模式或趋势。\n- **分析工具**:使用`perf`、`strace`、`sysstat`等工具进行更深入的系统调用和性能分析。\n\n### 5. 硬件健康和状态\n\n- **检查硬件健康**:使用制造商提供的工具检查服务器的硬件健康状况,包括磁盘、内存和CPU。例如,`smartctl`可以检查硬盘的S.M.A.R.T状态。\n\n### 6. 应用程序性能分析\n\n- **分析应用性能**:如果问题似乎与特定应用相关,考虑使用应用性能监控(APM`Application Performance Management`)工具,如New Relic、AppDynamics或开源选项如Pinpoint,分析应用程序的性能瓶颈。\n\n### 7. 压力测试\n\n- 如果你怀疑是新的更改导致了性能下降,可以在测试环境中使用压力测试工具(如Apache JMeter、Gatling等)模拟高负载场景,比较性能变化。\n\n### 8. 软件更新和补丁\n\n- **检查更新**:确保操作系统和所有关键应用都是最新的,包括安全补丁和性能更新。\n\n通过上述步骤,你可以系统地诊断并定位服务器卡顿的原因。在处理这类问题时,方法ical approach和持续的监控是关键。\n\n## 内存泄漏的检测\n\n内存泄露是指已分配的内存未能正确释放,导致程序运行过程中内存使用持续增加,最终可能耗尽系统资源。检测内存泄露通常需要专门的工具和方法。以下是一些用于检测内存泄露的常用工具和技术,适用于不同的编程语言和环境:\n\n### 1. Valgrind\n\n- **适用环境**:Linux,针对C/C++程序\n- **描述**:Valgrind是一个编程工具集合,其中的Memcheck工具非常适合检测内存泄露和其他内存相关问题。它可以检测对未初始化内存的读写、读写已释放内存、内存泄露等问题。\n\n### 2. LeakSanitizer\n\n- **适用环境**:支持GCC和Clang的平台,针对C/C++程序\n- **描述**:LeakSanitizer(LSan)是一个内存泄露检测器,集成于GCC和Clang编译器中。通过在编译时加上特定的标志(例如,`-fsanitize=leak`),可以启用LeakSanitizer来检测运行时的内存泄露。\n\n### 3. Visual Studio内置工具\n\n- **适用环境**:Windows,针对C/C++程序\n- **描述**:Visual Studio提供了诊断工具,包括内存泄露检测。开发者可以在运行时监视应用程序的内存使用情况,并定位内存泄露的源头。\n\n### 4. Instruments\n\n- **适用环境**:macOS,针对Objective-C和Swift程序\n- **描述**:Instruments是Xcode附带的性能分析工具集,包括用于检测内存泄露的Leak检测器。它可以帮助开发者发现和分析Cocoa和Cocoa Touch应用中的内存泄露。\n\n### 5. Profiling Tools in Integrated Development Environments\n\n- **适用环境**:多种语言和平台\n- **描述**:许多现代IDE,如Eclipse、IntelliJ IDEA等,都提供了内存分析和性能分析工具。这些工具可以帮助开发者在Java、Kotlin、Python等多种编程语言中定位内存泄露。\n\n### 6. JavaScript内存泄露检测工具\n\n- **适用环境**:Web开发\n- **描述**:现代浏览器(如Chrome、Firefox)提供了开发者工具,其中的内存分析器可以用来检测JavaScript内存泄露。通过分析内存快照(Heap Snapshots),开发者可以识别出未被垃圾回收的对象。\n\n### 使用方法和建议\n\n- 在开发和测试阶段就开始关注内存使用情况,定期使用工具检测内存泄露。\n- 理解和熟悉所用工具的报告输出,正确识别真正的内存泄露。\n- 对于检测到的内存泄露,深入分析其原因,修复不仅要关注标记出的泄露位置,还要分析和理解导致泄露的代码逻辑。\n\n有效地检测和处理内存泄露对于保持应用程序性能和稳定性至关重要。使用合适的工具和定期的检测可以帮助开发者及早发现并解决这些问题。\n\n## CPU占用过高的分析\n\n分析CPU占用过高的问题通常需要综合运用操作系统提供的工具、性能分析工具,以及代码级别的审查。下面是一步步的分析方法:\n\n### 1. 确定高CPU占用\n\n- 使用`top`或`htop`(Linux)、`Activity Monitor`(macOS)、或`Task Manager`和`Resource Monitor`(Windows)等工具,确定哪个进程或应用程序的CPU使用率异常高。\n\n### 2. 收集性能数据\n\n- 对于Linux和UNIX系统,`top`命令可以显示哪些线程或进程正在使用最多的CPU资源。`ps`命令也可以用来查看进程的CPU使用情况。\n- 使用`perf`(Linux)收集CPU使用情况的详细性能数据。`perf top`可以实时查看最消耗CPU的函数调用。\n- 对于Windows,可以使用性能监视器(Performance Monitor)和进程资源监视器(Process Explorer)来分析具体的进程和服务的CPU使用详情。\n\n### 3. 分析性能数据\n\n- **分析函数调用**:使用`perf`、`gprof`(GNU Profiler)、`Visual Studio Profiler`(对于Windows应用程序)等工具,分析哪些函数调用最频繁,或者执行时间最长。\n- **查看线程活动**:高CPU使用率可能是由于线程竞争(例如,死锁或活锁)造成的。工具如`ThreadSanitizer`可以帮助识别多线程程序中的问题。\n\n### 4. 代码级别审查\n\n- **循环优化**:检查是否有无效的循环或可以优化的算法,这些往往是CPU占用高的原因。\n- **减少不必要的工作**:查看是否有可以缓存结果而不是重复计算的情况,或者是否有不必要的资源请求操作。\n- **并发和多线程优化**:如果应用是多线程的,分析线程同步和数据访问模式,查找性能瓶颈。\n\n### 5. 使用特定语言或框架的分析工具\n\n- 不同的编程语言和框架可能提供特定的性能分析工具。例如,Java有`VisualVM`和`JProfiler`,Python有`cProfile`和`line_profiler`等。\n\n### 6. 检查外部依赖和服务\n\n- 应用程序的性能问题有时是由于外部依赖或服务引起的。检查数据库查询、网络请求等外部调用的性能。\n\n### 7. 查看系统日志和应用日志\n\n- 系统日志和应用日志可能提供有关性能问题的重要线索。检查这些日志中是否有错误或警告信息,特别是与高CPU使用率同时期的日志记录。\n\n### 结合实际情况采取行动\n\n- 根据分析结果,可能需要对代码进行优化,更改配置,增加硬件资源,或优化外部依赖的使用。\n\n通过综合使用这些工具和方法,可以帮助你找到导致CPU占用过高的原因,并采取相应的优化措施。在进行性能分析和优化时,建议先从最可能的原因开始,逐步深入,直到找到并解决问题。\n\n## 什么情况适合用哪种多路复用,他们之间的区别\n\n在网络编程中,多路复用技术允许单个进程或线程监视多个文件描述符(一般是网络连接),以便知道它们何时可读、可写或是否有异常。这是提高网络应用效率、实现高并发服务器的关键技术之一。最常见的多路复用技术包括select、poll和epoll(仅限于Linux),以及kqueue(仅限于BSD系统,包括macOS)。这些技术之间的主要区别在于它们的API设计、性能、资源消耗和系统兼容性。下面是它们的比较和适用情况:\n\n### select\n\n- **优点**:最广泛的兼容性(几乎所有的操作系统都支持)。\n- **缺点**:文件描述符数量受限于`FD_SETSIZE`(File Descriptor),通常是1024;大量文件描述符时效率低下,因为它是基于线性结构处理的。\n- **适用情况**:小规模文件描述符的场景,或者跨平台兼容性非常重要的应用。\n\n### poll\n\n- **优点**:与select类似的API,但不受`FD_SETSIZE`限制,可以处理更多的连接。\n- **缺点**:同样基于线性结构,大量文件描述符时效率问题依旧存在。\n- **适用情况**:需要处理的文件描述符数量超过select限制,但数量不是特别巨大的场景。\n\n### epoll\n\n- **优点**:只在Linux上可用;高效处理大量文件描述符,因为它基于事件的而不是基于轮询的方式;支持“边缘触发”和“水平触发”模式。\n- **缺点**:仅限Linux使用。\n- **适用情况**:高性能、大规模文件描述符处理需求的Linux服务器应用。\n\n### kqueue\n\n- **优点**:BSD系统上的高效事件通知机制,类似于Linux的epoll。\n- **缺点**:仅在BSD系统(包括macOS)上可用。\n- **适用情况**:在BSD系统上开发,需要高效处理大量文件描述符的应用。\n\n### 他们之间的区别和选择依据:\n\n- **性能和规模**:epoll和kqueue因其更高的性能和更好的扩展性,适合大规模连接处理;而select和poll适用于连接数较少的情况。\n- **系统兼容性**:select和poll几乎在所有平台上都有支持,适合需要跨平台兼容的应用;epoll仅在Linux上,kqueue仅在BSD系统上。\n- **API复杂性**:epoll和kqueue提供了更复杂的控制选项,如边缘触发(ET)和水平触发(LT),但这也意味着使用它们时需要更小心地管理事件循环。\n\n在选择具体实现时,需要根据你的应用场景、性能要求以及目标平台来决定使用哪种多路复用技术。对于跨平台的应用,可能需要根据运行时环境选择不同的实现。对于专注于Linux平台且需要处理大量并发连接的高性能应用,epoll是更好的选择。\n\n## epoll的触发模式,水平触发和边缘触发\nEpoll是Linux特有的高效多路复用IO机制,它支持两种触发模式:水平触发(Level Triggered,LT)和边缘触发(Edge Triggered,ET)。理解这两种模式的区别对于正确使用epoll非常重要,尤其是在设计高性能网络程序时。\n\n### 水平触发(LT)\n\n水平触发是epoll的默认工作模式。在这种模式下,只要被监视的文件描述符上的IO操作处于可执行状态(例如,读取操作的条件满足),epoll_wait就会通知应用程序。具体来说:\n\n- 如果一个socket可读(接收缓冲区有数据),epoll_wait会一直返回该socket,直到所有数据被读取完毕。\n- 如果一个socket可写(发送缓冲区不满),epoll_wait会一直返回该socket,直到数据完全写入内核发送缓冲区。\n\n**优点**:使用简单,程序逻辑相对容易理解和实现。即使应用程序没有立即处理某个事件,该事件会在下次调用epoll_wait时再次报告,降低了事件丢失的风险。\n\n**缺点**:在某些场景下可能导致不必要的重复通知,从而降低效率。\n\n### 边缘触发(ET)\n\n边缘触发是一种更高效的epoll工作模式。ET模式只在被监视的文件描述符的状态发生变化时通知应用程序一次,而不管后续状态是否持续。这意味着:\n\n- 如果一个socket从不可读变为可读,epoll_wait只会在这种状态变化时返回该socket一次,不管读缓冲区内是否还有未读取的数据。\n- 对于可写事件也是同样的逻辑,只在可写状态发生变化时通知一次。\n\n**优点**:减少了事件通知的次数,提高了效率,特别是在处理大量并发连接时更能体现出其性能优势。\n\n**缺点**:编程时需要更加小心。由于事件只通知一次,应用程序必须确保一直读取或写入数据直到返回EAGAIN错误(表示当前没有更多数据可以读取或写缓冲区已满)。否则,可能会错过事件,导致数据在缓冲区中停滞不前。\n\n### 选择建议\n\n- 对于大多数应用,尤其是高性能网络服务,边缘触发模式(ET)更受推荐,因为它能更好地扩展到数千甚至数万个并发连接。\n- 使用边缘触发时,开发者需要仔细管理事件循环和读写操作,确保处理所有数据,避免数据丢失或服务卡顿。\n- 水平触发模式(LT)更容易编程和调试,适合连接数不是特别多,或者对性能要求不是极端苛刻的应用。\n\n在实际开发中,应基于应用的具体需求和预期的负载选择合适的触发模式,并且充分测试以确保高效和稳定的运行。\n\n## 惊群效应\n惊群效应(Thundering Herd Problem)是在并发编程中遇到的一个问题,特别是在网络编程和操作系统的进程或线程调度中较为常见。这个问题发生在多个进程或线程在等待某个共享资源(例如,一个网络socket、文件描述符或锁)变为可用时,但是当资源变得可用时,所有等待的进程或线程都被唤醒来竞争这个资源。结果,只有一个进程或线程实际获得资源,而其他被唤醒的进程或线程必须再次等待,这导致了大量的CPU资源浪费和性能下降。\n\n### 惊群效应的典型场景\n\n1. **网络编程**:多个进程或线程等待在同一个监听socket上,准备接受新的连接。当新连接到来时,所有等待的进程或线程都被唤醒,但实际上只有一个能够接受这个连接。\n2. **锁机制**:多个线程等待同一个锁。当锁被释放时,所有等待的线程都尝试去获取锁,但只有一个能成功,其他线程则需要重新等待。\n\n### 避免惊群效应的方法\n\n1. **使用互斥锁和条件变量**:在某些情况下,通过使用互斥锁(Mutex)和条件变量(Condition Variable)可以有效避免惊群效应。这种方法能够确保当条件满足时,只有一个线程被唤醒。\n\n2. **使用epoll的EPOLLEXCLUSIVE标志**:在Linux内核中,针对epoll机制的惊群问题,可以通过设置EPOLLEXCLUSIVE标志来避免。这个选项确保事件只被分配给一个正在等待该事件的线程,减少不必要的唤醒。\n\n3. **使用SO_REUSEPORT套接字选项**:在使用socket进行网络编程时,SO_REUSEPORT选项允许多个套接字在同一端口上监听。内核会负责负载均衡,确保每个新的入站连接只被一个进程或线程处理,从而减轻惊群效应。\n\n4. **适当的进程和线程设计**:通过在设计阶段考虑到惊群效应,并采用适当的架构和设计模式(如使用工作线程池),可以在根本上减少因资源争用导致的性能问题。\n\n### 总结\n\n惊群效应可以导致显著的性能问题,特别是在高并发的环境下。通过采用现代操作系统和编程语言提供的机制和选项,可以有效地避免或减轻惊群效应的影响。在设计系统和应用时,考虑到惊群效应并采取适当的策略,对于提高性能和资源利用率至关重要。\n\n\n\n\n\n## 段页式内存,页有多大,为什么这么设计,为什么要用这种形式\n\n段页式内存管理是一种结合了分段和分页两种内存管理技术的方法,它利用了分段的优点来提供`更好的数据保护和更灵活的内存分配`,同时通过分页来`简化内存的物理分配和提高内存利用率`。在段页式内存管理中,程序的地址空间被划分为多个段,每个段进一步被划分为固定大小的页。\n\n### 页的大小\n\n页的大小可以根据不同的操作系统和硬件而变化,常见的页大小有4KB、8KB、16KB、64KB等。在x86架构的操作系统中,4KB是最常见的页大小,而在一些大型机或高性能计算系统中,页的大小可能更大。\n\n### 为什么选择这样的设计\n\n1. **提高内存利用率**:通过使用固定大小的页,操作系统可以更有效地管理内存,减少内存碎片,从而提高内存利用率。\n2. **简化内存管理**:分页系统简化了物理和虚拟地址之间的映射关系,每个页可以独立映射到物理内存的任何位置,使得内存分配更加灵活。\n3. **支持虚拟内存**:分页是实现虚拟内存系统的基础,允许操作系统将磁盘空间用作额外的内存,从而扩展了物理内存的容量。\n4. **提高数据保护和安全性**:分段和分页机制允许操作系统对不同的内存区域设置不同的访问权限(如只读、可执行等),增加了内存的保护能力,避免了程序间的非法访问。\n5. **便于共享和复制**:分页机制使得进程间共享内存和复制页变得更加容易,提高了操作系统的效率和响应速度。\n\n### 为什么要用这种形式\n\n- **兼容性和标准化**:分页是现代操作系统广泛采用的一种内存管理标准,大多数现代CPU都直接支持分页机制,这有利于软件的兼容性和系统的稳定性。\n- **性能和效率**:虽然分页可能引入额外的内存访问开销(如页表查找),但通过硬件支持的页表缓存(如TLB,Translation Lookaside Buffer)和优化算法,这种开销可以被有效地减少。\n- **灵活性和扩展性**:段页式内存管理结合了分段和分页的优点,提供了高度的灵活性和扩展性,使得操作系统可以根据应用需求和硬件特性进行优化内存管理策略。\n\n总的来说,段页式内存管理通过提供灵活的内存管理策略、高效的资源利用和强大的保护机制,成为了现代操作系统广泛采用的内存管理模型。\n\n## static关键字,我回答完后他问我为什么局部变量的生命周期被改变了,编译器是怎么实现这个的\n\n在C和C++中,`static`关键字用于多个上下文中,具有不同的含义。当`static`用于局部变量时,它改变了局部变量的存储期(生命周期),使得该变量在程序的执行期间持续存在,即使它的作用域是局部的。这意味着该变量在第一次执行到声明它的代码时被初始化,之后即使离开了作用域,在下次进入作用域时,变量保持上次离开时的状态,不会重新初始化。\n\n### 编译器是怎么实现的\n\n编译器通过将`static`局部变量存储在程序的数据段(特别是初始化数据段或BSS段,取决于是否进行了初始化)来实现其生命周期的改变,而不是存储在栈上。这意味着这些变量在程序的整个执行期间都存在。\n\n1. **数据段或BSS段**:数据段用于存储程序的全局变量和静态变量,这些变量在程序启动时初始化。未初始化的全局变量和静态变量通常存储在BSS段(Block Started by Symbol),这些变量在程序启动时被自动初始化为零。\n\n2. **地址固定**:`static`局部变量的地址在程序编译时就已经确定,编译器会为这些变量分配固定的内存地址。\n\n3. **初始化**:编译器确保`static`局部变量只被初始化一次。这通常通过生成检查变量是否已初始化的代码来实现。如果变量未被初始化,则执行初始化代码;否则,跳过初始化。\n\n4. **访问和生命周期管理**:尽管`static`局部变量的作用域仍然限定在声明它的块内,但由于其存储在数据段,编译器生成的代码会在需要时直接访问这个固定地址,无论何时进入或离开作用域。因此,这些变量的生命周期与程序的生命周期相匹配。\n\n通过上述机制,编译器能够有效地实现`static`关键字改变局部变量生命周期的语义,同时保持其作用域不变,这为编程提供了更大的灵活性和控制能力。\n\n## 汇编\n\n汇编语言是一种低级编程语言,它提供了对硬件资源(如CPU寄存器)的直接控制能力。与高级编程语言相比,汇编语言的代码更难编写和理解,但它允许开发者编写非常高效的代码,直接管理内存和处理器指令。下面是一个快速而全面的汇编语言入门指南。\n\n### 基础概念\n\n1. **汇编语言和机器语言**:汇编语言的指令对应于机器语言的操作码,但它使用的是人类可读的符号(例如,`MOV`、`ADD`等)代替二进制代码。汇编器(Assembler)是将汇编代码转换为机器代码的程序。\n2. **寄存器**:寄存器是CPU内部的非常小但速度极快的存储单元。不同的寄存器有不同的用途,如存储数据、地址、状态信息等。\n3. **操作数**:大多数汇编指令至少需要一个操作数,可以是立即数(直接给出的数)、寄存器中的值或内存地址。\n\n### 学习步骤\n\n1. **了解CPU架构**:开始学习汇编语言之前,了解你的CPU架构(如x86、ARM等)是很重要的,因为不同的CPU架构有着不同的指令集。\n2. **学习基本指令**:熟悉基本的汇编指令,如数据传输(`MOV`)、算术运算(`ADD`、`SUB`)、比较跳转(`CMP`、`JMP`)等。\n3. **实践编程**:通过写一些简单的程序(如数据排序、基本的数学运算等)来实践你的汇编语言技能。这些练习将帮助你理解如何操作寄存器和内存。\n4. **使用汇编器和调试器**:学习如何使用汇编器将你的汇编代码转换为可执行的机器代码,以及使用调试器来检查程序的执行流程和状态。\n\n### 资源和工具\n\n- **书籍和在线资源**:《汇编语言》(王爽著)是入门非常好的书籍,针对x86架构。网上也有很多优秀的教程和指南。\n- **汇编器**:NASM(Netwide Assembler)和MASM(Microsoft Macro Assembler)是两个广泛使用的x86架构汇编器。\n- **调试器**:GDB(GNU Debugger)可以用于调试程序,查看寄存器状态和执行流程。\n\n### 注意事项\n\n- **平台特定**:汇编语言是平台特定的,不同平台上的汇编语言有很大差异。\n- **难度**:汇编语言编程相对困难,入门可能需要一些时间和耐心。\n- **实际应用**:尽管汇编语言在性能优化和底层系统开发中非常有用,但在日常应用程序开发中,高级语言更加普遍和实用。\n\n汇编语言虽然不如高级编程语言那样直观和易于编写,但它能提供对硬件的精细控制和高效执行,对于理解计算机的工作原理和性能优化非常有帮助。\n\n\n\n## 如果请求一个页面,没有请求到,分析发生的错误类型和解决方法\n\n当请求一个页面但没有成功时,可能会遇到多种类型的错误。这些错误通常可以归类为客户端错误(4xx状态码)、服务器错误(5xx状态码)或网络问题。下面是一些常见的错误类型,以及相应的分析方法和解决策略:\n\n### 1. 客户端错误(4xx)\n\n- **404 Not Found**:请求的资源不存在。检查URL是否正确,确保路径和文件名没有拼写错误。\n- **403 Forbidden**:服务器拒绝响应请求。检查是否有适当的权限访问该资源,或者服务器配置可能禁止了对该资源的访问。\n- **400 Bad Request**:服务器无法理解请求的格式。检查请求的语法是否正确,例如,确保HTTP头部和请求体格式正确。\n\n### 解决方法\n\n- 确认URL正确无误。\n- 检查文件权限和服务器配置(如`.htaccess`或Web服务器配置文件)。\n- 清理缓存和Cookies,尝试重新发起请求。\n\n### 2. 服务器错误(5xx)\n\n- **500 Internal Server Error**:服务器遇到了一个未知的错误,无法完成请求。查看服务器日志以获取更多信息。\n- **503 Service Unavailable**:服务器当前无法处理请求,可能是因为过载或停机维护。稍后再试,或联系网站管理员。\n\n### 解决方法\n\n- 检查Web服务器和应用服务器的日志文件。\n- 确保服务器软件(如数据库、Web应用框架)正常运行。\n- 如果是资源限制(如内存不足),考虑增加服务器资源或优化应用。\n\n### 3. 网络问题\n\n- **DNS查询失败**:无法解析域名。尝试更换DNS服务器或使用`ping`命令检查DNS解析是否正常。\n- **超时**:请求超时可能是由于网络连接慢或服务器响应慢。检查网络连接,或使用`traceroute`命令分析网络路径。\n\n### 解决方法\n\n- 确保网络连接正常,尝试重新启动路由器或调整网络设置。\n- 更换公共DNS,如Google DNS(8.8.8.8)或Cloudflare DNS(1.1.1.1)。\n- 联系网站或服务器管理员,了解是否有已知的服务中断或维护计划。\n\n### 综合分析和解决方法\n\n当面对无法请求到页面的问题时,首先确定错误类型,然后根据错误的具体情况采取相应的解决措施。同时,利用开发者工具(在大多数现代浏览器中可用)可以帮助诊断问题,例如查看网络请求的状态码、响应头和响应体。如果问题仍然存在,考虑联系网站管理员或技术支持以获得帮助。\n"},{"title":"软件开发","url":"/2025/01/19/computer/work/SoftwareDevelopment/","content":"\n# 技术债\n技术债(Technical Debt)是软件开发中一个广泛使用的隐喻,用来描述为了快速交付软件而采取的非理想或简便的技术解决方案所产生的长期成本。这个概念由Ward Cunningham在1990年代提出,用来解释向非技术人员说明延迟软件重构的必要性。技术债可以比喻为财务债务:短期内你可能会从中获益,但长期来看,如果不还清这笔债,利息会不断累积,最终造成更大的代价。\n技术债的来源\n\n技术债可能源自多种情况,包括但不限于:\n\n 有意债务:为了追求短期目标(如符合发布截止日期),故意选择快速但不是最佳的技术实现。\n 无意债务:由于设计或决策不佳、技术能力不足、项目需求变化等因素,无意中产生的技术问题。\n 遗留代码:随着时间的推移,原本合理的代码设计和决策可能变得不再适用,导致需要进行重构或替换。\n# 软件开发综述\n软件开发是一个广阔且不断进化的领域,涵盖了从前端界面设计到后端服务器、数据库管理,再到移动应用和云服务的各个方面。每个方向都有其特定的技术栈,这些技术栈包括用于构建和维护软件系统的编程语言、框架、数据库、服务器环境、开发工具和实践方法。以下是一些主要的软件开发方向及其相关技术栈的介绍。\n\n### 前端开发\n\n前端开发关注于用户界面和用户体验的构建,涉及的技术使用户能够直接与软件系统交互。其核心技术栈包括:\n\n- **HTML/CSS**:构建网页的基础,用于定义结构和样式。\n- **JavaScript**:使网页具有交互性的脚本语言。现代前端开发高度依赖于JavaScript及其丰富的生态系统。\n- **框架和库**:React、Vue.js、Angular 是最流行的前端JavaScript框架,极大地提高了开发效率和应用性能。\n- **构建工具**:Webpack、Gulp、Babel 等工具用于优化前端资源(如JS、CSS文件)的加载和处理。\n- **CSS预处理器**:Sass、LESS等,增强了CSS的可用性,提供了变量、嵌套和混合等高级功能。\n\n### 后端开发\n\n后端开发关注于服务器、应用逻辑和数据库的交互。后端技术栈确保了应用的核心功能性和性能:\n\n- **编程语言**:Python、Java、Ruby、PHP、Node.js等。\n- **框架**:Express.js (Node.js)、Django (Python)、Spring (Java)、Ruby on Rails (Ruby)等,提供了开发复杂应用的骨架和工具集。\n- **数据库技术**:关系型数据库(MySQL、PostgreSQL、Oracle)和非关系型数据库(MongoDB、CouchDB)用于数据存储和检索。\n- **服务器技术**:Nginx、Apache、Tomcat等,处理客户端请求并向其提供响应。\n\n### 移动应用开发\n\n移动开发专注于在移动设备上运行的应用程序。技术栈可以分为原生应用开发和跨平台开发:\n\n- **原生应用开发**:\n - **Android**:使用Java或Kotlin语言,Android Studio作为开发环境。\n - **iOS**:使用Swift或Objective-C语言,Xcode作为开发环境。\n- **跨平台开发**:React Native、Flutter、Xamarin等框架允许开发者使用一套代码基础开发可在多个平台上运行的应用。\n\n### 全栈开发\n\n全栈开发者具备前端和后端开发的能力,能够处理从用户界面到服务器、数据库的整个应用程序开发过程。全栈技术栈通常涵盖前端和后端的所有技术,加上对数据库、服务器操作和API开发的理解。\n\n### 云计算与DevOps\n\n随着云计算的兴起,了解云服务提供商如AWS、Azure和Google Cloud Platform变得越来越重要。这些平台提供了虚拟服务器、数据库、机器学习服务等,支持软件的快速开发和部署。\n\nDevOps文化和实践方法旨在缩短开发周期,提高交付效率,包括持续集成(CI)、持续部署(CD)、自动化测试和容器化技术(如Docker和Kubernetes)。\n\n### 数据科学与机器学习(AI/ML)技术\n\n数据科学和机器学习领域与传统的软件开发相比,更多地关注于数据分析、数据可视化、以及使用算法预测未来趋势或模式识别。这个领域的技术栈包括:\n\n- **编程语言**:Python 和 R 是这一领域最流行的编程语言,由于其对数据分析和机器学习库(如 NumPy、Pandas、Scikit-learn、TensorFlow、Keras)的广泛支持。\n- **数据处理和可视化**:使用 SQL 语言进行数据提取和处理,以及使用 Matplotlib、Seaborn、Plotly 等库进行数据可视化。\n- **机器学习和深度学习框架**:Scikit-learn 适用于传统机器学习算法,而 TensorFlow 和 PyTorch 是构建复杂的深度学习模型的首选框架。\n\n### Web3 和区块链\n\nWeb3 和区块链技术开辟了去中心化应用(DApp)和智能合约的开发新领域。技术栈包括:\n\n- **智能合约开发**:Solidity 是以太坊智能合约的主要编程语言,而其他平台如Polkadot和Cardano则使用不同的语言和框架。\n- **区块链框架和库**:Truffle、Hardhat 和 Brownie 等工具用于智能合约的开发、测试和部署。\n- **前端交互**:Web3.js、Ethers.js 等库允许前端应用与区块链进行交互。\n\n### 项目管理和协作工具\n\n虽然不直接涉及到代码编写,但项目管理和协作工具对于高效的软件开发流程至关重要。这包括:\n\n- **版本控制**:Git 是目前最广泛使用的版本控制系统,而 GitHub、GitLab 和 Bitbucket 提供了基于云的代码托管和协作平台。\n- **项目和团队管理**:Jira、Trello、Asana 和 Notion 等工具帮助团队跟踪项目进度、任务分配和协作。\n- **持续集成/持续部署(CI/CD)**:Jenkins、CircleCI、GitHub Actions 和 GitLab CI/CD 等工具自动化了代码的构建、测试和部署过程,提高了开发效率和软件质量。\n\n### 安全性\n\n随着软件开发的复杂性增加,安全性变得越来越重要。了解和应用安全最佳实践是开发任何软件系统的关键部分。这包括:\n\n- **安全协议和标准**:了解常见的安全威胁(如 SQL 注入、XSS)和防护措施。\n- **加密技术**:使用 HTTPS、SSL/TLS、JWT 等技术确保数据传输的安全。\n- **身份验证和授权**:OAuth、OpenID Connect 和 JWT 等技术用于管理用户身份和访问控制。\n\n软件开发领域不断演进,新的技术和框架持续出现。因此,作为一名开发者,持续学习和适应新技术是成功的关键。同时,理解业务需求和能够使用合适的技术栈解决问题同样重要。在选择学习哪些技术时,考虑到你的兴趣、职业目标以及技术的市场需求,可以帮助你在软件开发的道路上更进一步。"},{"title":"md语法","url":"/2025/01/19/computer/sample/markdown/","content":"\n[超链接显示名](超链接地址 \"超链接title\")\n图片![图片alt](../picture/Snipaste_2022-11-23_20-31-42.png \"完美\")\n另一种图片 <img width=\"50\" height=\"30\" src=\"../picture/Snipaste_2022-11-23_20-31-42.png\" />\n\n一般用>的都是指随意移动位置,与上下文无关联的说明,~才是有关联的\n\n<font size =6>目录</font>\n* [标题](#title)\n* [颜色](#color)\n\n<a id=\"1\"></a> 树 `//定义的id不能有大写字母`\n\n<a id=\"1.\"></a> 树的遍历\n\n---\n标题\n# <center> 一级标题居中 <a id =\"title\"></a>\n## 二级标题\n#\n各种字体\n**这是加粗的文字**\n*这是倾斜的文字*`\n***这是斜体加粗的文字***\n~~这是加删除线的文字~~\n<u>下划线</u>\n\n\n>引用的内容\n列表和表格\n- 列表内容\n+ 列表内容\n* 列表内容\n1. 列表内容\n2. 列表内容\n3. 列表内容\n\n| Name | Age |\n| ----- | --- |\n| Bob | 27 |\n| Alice | 23 |\n\n\n| Italics | Bold | Code |\n| --------- | -------- | ------ |\n| *italics* | **bold** | `code` |\n\n---\n字体颜色\n<a id=\"color\"></a>\n浅红色文字:<font color=\"#dd0000\">浅红色文字:</font><br />\n深红色文字:<font color=\"#660000\">深红色文字</font><br />\n浅绿色文字:<font color=\"#00dd00\">浅绿色文字</font><br />\n深绿色文字:<font color=\"#006600\">深绿色文字</font><br />\n浅蓝色文字:<font color=\"#0000dd\">浅蓝色文字</font><br />\n深蓝色文字:<font color=\"#000066\">深蓝色文字</font><br />\n浅黄色文字:<font color=\"#dddd00\">浅黄色文字</font><br />\n深黄色文字:<font color=\"#666600\">深黄色文字</font><br />\n浅青色文字:<font color=\"#00dddd\">浅青色文字</font><br />\n深青色文字:<font color=\"#006666\">深青色文字</font><br />\n浅紫色文字:<font color=\"#dd00dd\">浅紫色文字</font><br />\n深紫色文字:<font color=\"#660066\">深紫色文字</font><br />\n\n---\nsize为1:<font size=\"1\">size为1</font><br />\nsize为2:<font size=\"2\">size为2</font><br />\nsize为3:<font size=\"3\">size为3</font><br />\nsize为4:<font size=\"4\">size为4</font><br />\nsize为10:<font size=\"10\">size为10</font><br />\n\n---\n各种艺术字体\n<font face=\"黑体\">我是黑体字</font>\n<font face=\"宋体\">我是宋体字</font>\n<font face=\"微软雅黑\">我是微软雅黑字</font>\n<font face=\"fantasy\">我是fantasy字</font>\n<font face=\"Helvetica\">我是Helvetica字</font>\n\n---\n背景色\n<table>\n <tr>\n <td bgcolor=#FF00FF>背景色的设置是按照十六进制颜色值:#7FFFD4</td>\t\t</tr>\n</table>\n<table>\n <tr>\n <td bgcolor=#FF83FA>背景色的设置是按照十六进制颜色值:#FF83FA\n </td>\n </tr>\n</table>\n<table>\n <tr>\n <td bgcolor=#D1EEEE>背景色的设置是按照十六进制颜色值:#D1EEEE\n </td>\n </tr>\n</table>\n<table>\n <tr>\n <td bgcolor=#C0FF3E>背景色的设置是按照十六进制颜色值:#C0FF3E\n </td>\n </tr>\n</table>\n<table>\n <tr>\n <td bgcolor=#54FF9F>背景色的设置是按照十六进制颜色值:#54FF9F\n </td>\n </tr>\n</table>\n<table>\n <tr>\n <td bgcolor=DarkSeaGreen>这里的背景色是:DarkSeaGreen,此处输入任意想输入的内容\n </td>\n </tr>\n</table>\n\n---\n空格\n例 是半角的空格,两个相当于一个中文宽度\n例 是全角的空格,占一个中文宽度\n例 不换行空格,也是我们按下空格键产生的空格,不会累加\n例 窄空格,一个中文字符的六分之一宽\n\n---\n[多行大括号]()\n$$ 标题\\left\\{\n\\begin{array}{lcl}\n一\\\\\n二\\\\\n\\end{array} \\right .$$\n<pre>\n\t\t{\n\t\t\t\"foo\": \"bar\",\n\t\t\t\"baz\": \"qux\"\n\t\t}\n\t</pre>\n$$\n\\textcolor{red}{\\bigg\\{} \\quad \\text{方程组内容} \\quad \\textcolor{red}{\\bigg\\}}\n.$$\n\n\n$$\n\\underbrace{\\left\\{ \\quad \\text{方程组内容} \\quad \\right.}_{\\text{标签}}\n.$$\n\n$$\\begin{cases}\n\\begin{aligned}\n& ... \\\\\n& ...\n\\end{aligned}\n\\end{cases}.$$"},{"title":"前端语法","url":"/2025/01/19/computer/sample/FrontEnd/","content":"\n# [标题heading]()\n\n<h1>主标题</h1>\n<h2>顶层标题</h2>\n...(递推)\n# [段落paragraph]()\n\n<p>这是一个段落</p>\n<p>这是另一个段落</p>\n# [列表list]()\n* 无序列表`unordered lists`\n <ul>\n <li>豆浆</li>\n <li>油条</li>\n </ul>\n\n* 有序列表`ordered lists`\n <ol>\n <li>豆浆</li>\n <li>油条</li>\n </ol>\n* 定义列表(标题和描述文本)`definition lists`\n <dl>\n <dt>豆浆<dt>\n <dd>很好喝<dd>\n <dt>油条<dt>\n <dd>很好吃<dd>\n </dl>\n# [超链接anchor]()\n<a href=\"vim.ipynb\">vim指南</a>\n\n<center> <img src=\"../picture/Snipaste_2023-03-03_17-04-40.png\" height=\"300\" width=\"600\">\n# [表格table]()\n<table border=\"1\">\n <tr> table row\n <th>table head</th>\n <th>性别</th>\n <th>邮箱</th>\n </tr>\n <tr>\n <td>table data</td>\n <td>男</td>\n <td>神秘邮箱</td>\n </tr>\n <tr>\n <td>那个男人</td>\n <td>男</td>\n <td>宝藏邮箱</td>\n </tr>\n\n</table>\n# [常用元素和其他元素]()\n* 内联元素(inline element):\n<p>Hello,<span style=\"color:#FF0000\">Trump</span>!</p>\n\n\n* 块级元素(block element):\n<div style=\"color:#FF0000\">\n <h3>This is a header</h3>\n <p>This is a paragraph.</p>\n</div>\n\n\n* 音频(audio)\n\n\n* 视频(video)\n\n\n* 画布(canvas)\n\n\n* 矢量图(svg)\n\n\n# [表单form]()\n<form action=\"hello.php\" method=\"post\">\n First name:<br>\n <input type=\"text\" name=\"firstname\" value=\"Donald\" /><br>\n Last name:<br>\n <input type=\"text\" name=\"lastname\" value=\"Trump\" /><br>\n <input type=\"submit\" value=\"Submit\" />\n</form>\n\n别点这里的Submit,会发生未知的事\ninput的元素(=\"\"里的内容)\n| | | |\n| -------- | -------------- | -------- |\n| text | password | radio |\n| checkbox | button | hidden |\n| submit | reset | datalist |\n| number | date | color |\n| range | month | week |\n| time | datetime-local |\n| emaiL | search | tel |\n| url |\n# 一些标签\n* button\n* select和option\n* label textarea\n* frame和frameset\n* iframe\n* output\n\n```\nif(true){\n var a =5; //非块作用域\n let b =5;//现在推荐使用let定义变量\n}\nconsole.log(a);//输出5\nconsol.log(b);//ReferenceError\n```\n[自闭合标签]() 这是<br/>换行标签"},{"title":"需求分析与系统设计","url":"/2025/01/19/computer/notes/Finished/需求分析与系统设计/","content":"\n<font>目录</font>\n* [系统开发过程管理](#sdpm)\n* [views](#v)\n* [UML](#uml)\n * [starUML](#staruml)\n* [Software Requirements](#sr)\n* [模型和建模](#model)\n* [用例图](#usecase)\n* [系统分析-结构化](#sysana)\n* [系统分析-对象化](#obor)\n* [系统设计-结构化](#sds)\n# [需求分析与系统设计]()\n\n\n>[erp]()`Enterprise Resource Planning`\n联合应用设计会议(Joint Application Design, JAD)\n\n列表框,组合框\n\n\n---\n---\n# [系统开发过程管理]() <a id=\"sdpm\"></a>\n1. **RUP** rational unified process 统一软件开发过程\n2. **RAD** rapid application development 快速软件开发\n3. **MSF** microsoft sync framework 微软解决方案框架\n4. **JAD** joint application development 联合应用软件开发\n5. **Agile** XP、scrum等\n\n\n---\n# [views]() <a id=\"v\"></a>\n是表达系统某一方面特征的 UML 建模元素的子集,它是由一个或者多个图组成的对系统某个角度的抽象\n1. Usecase View\n  描述系统应该具备的功能,即被称为参与者(执行者)的外部用户所能观察到的功能\n2. Logical View\n  描述`用例视图`中提出的系统功能的实现\n3. Process View\n  考虑资源的有效利用、代码的并行执行以及系统环境中异步事件的处理\n4. Implementation View\n  描述系统的实现模块以及它们之间的依赖关系\n5. Deployment View\n  显示系统的物理部署,并描述位于节点实例上的运行组件实例的部署情况\n\n\n---\n# [UML]() <a id=\"uml\"></a>\nunified modeling language 对软件系统实现visualizing,specifying,constructing,documenting\n关系: 关联、依赖、泛化、实现、聚合\n+ 用例图 UseCaseDiagram\n+ 类图   ClassDiagram\n  描述类的内部结构和类与类之间的关系\n+ 状态图 StatechartDiagram\n  来描述类的对象所有可能的状态以及时间发生时状态的转移条件\n+ 活动图 ActivityDiagram `是状态图的一种特殊情况`\n  描述了活动到活动的控制流\n+ 时序图 SequenceDiagram\n  描述了对象之间消息发送的先后顺序\n+ 协作图 CollaborationDiagram\n  描述了收发消息的对象的组织关系\n+ 组件图 ComponentDiagram\n  表示系统中组件与组件之间,类或接口与组件之间的关系\n+ 部署图 DeploymentDiagram\n  描述了系统运行时进行处理的结点以及在结点上活动的构件的配置。\n\n\n---\n# [StarUML]() <a id=\"staruml\"></a>\n\n\n---\n# [Software Requirements]() <a id=\"sr\"></a>\n以一种清晰、简洁、一致且无二义性的方式,描述用户对目标软件系统在功能、行为、性能、设计约束等方面的期望,是在开发过程中对未来系统的约束\n[业务需求Business Requirements]() 客户对于系统的高层次目标要求`high-level objectives` ,定义了项目的远景和范畴`vision and scope` \\\n[用户需求(User Requirements)]() 从用户角度描述的系统功能需求与非功能需求,通常只涉及系统的外部行为而不涉及内部特性\n[功能需求Functional Requirements]() 系统应该提供的功能或服务,通常涉及用户或外部系统与该系统之间的交互\n[非功能需求Non-Functional Requirements]()\n  从各个角度对系统的约束和限制,即质量和性能(quality and performance):\n  `安全性、可靠性、互操作性、健壮性、易使用性、可维护性、可移植性、可重用性、可扩充性等`\n[业务规则Business Rule]() 对某些功能的可执行性或内部执行逻辑的一些限定条件\n[数据定义]() 当客户描述一个数据项或一个复杂的业务数据结构的格式、允许值或缺省值时,他们正在进行数据定义。\n[约束条件Constraints]() 系统设计和实现时必须满足的限制条件\n[外部接口需求External Interface Requirement]() 描述系统与其所处的外部环境之间如何进行交互\n\n[需求获取Requirement Elicitation]() 通过与用户的交流,对现有系统的观察及对任务进行分析,从而开发、捕获和修订用户的需求\n[需求分析Requirement Analysis]() 对收集到的需求进行提炼、分析和审查,为最终用户所看到的系统建立概念化的分析模型\n[需求规格说明Software Requirement Specification]() 精确的、形式化的阐述一个软件系统必须提供的功能、非功能、所要考虑的限制条件\n[需求验证Requirement Verification]() 以需求规格说明为输入,通过评审、模拟或快速原型等途径,分析需求规格的正确性和可行性\n[需求管理Requirement Management]() 在整个项目过程中跟踪需求状态及其变更情况\n[需求获取的方法]() 一般以开放式问题开始谈话,发现问题;以选择式问题引导;以封闭式问题确认事实;以探究式问题(probing,除了....还有....吗?)发现真实想法\n\n\n---\n# [模型和建模]() <a id=\"model\"></a>\n\n[模型]()\n* `数学模型`描述系统技术方面的一系列数学公式\n* `描述模型`描述系统某些方面的叙述性的备忘录、报表、列表、文字等\n* `图形模型`描述系统的图表或系统某些方面的示意性表示\n\n[事件]() 发生在某一特定的时间和地点、可描述并且系统应该记录下来的事情(系统应该响应)\n* [外部事件]() 系统之外发生的事件\n* [临时事件]() 由于到达某一时刻所发生的事件\n* [状态事件]() 当系统内部发生了需要处理的情况时所引发的事件\n [事件列表]()\n ![](../../picture/Snipaste_2022-11-28_23-53-25.png)\n\n[事物]() 传统开发中`是构成系统存储信息的相关数据`(数据实体) 面向对象开发中`是在系统中相互交互的对象`(对象)\n [事物的属性]() 有关事物的一条特定信息\n[实体关系图EntityRelationshipModel]()`ERD` 类IDEF1X图\n [乌鸦脚]() ![](../../picture/Snipaste_2023-02-19_09-10-09.png)\n[IDEF1X图]() IDEF是ICAM DEFinition method 的缩写,是美国空军在70年代末80年代初ICAM(Integrated Computer Aided Manufacturing)工程在结构化分析和设计方法基础上发展的一套系统分析和设计方法。是比较经典的系统分析理论与方法。\nIDEF1X是IDEF系列方法中IDEF1的扩展版本,是在E-R(实体联系)法的原则基础上,增加了一些规则, 使语义更为丰富的一种方法。用于建立系统信息模型。\n\n[类图]()\n* 抽象类\n* 具体类\n* 关联类\n\n [泛化/具体层次图]() 把类按照从最概括的父类到最具体的子类的顺序进行排列的层次图,有时也被称作`继承层次图`\n\n>相比于`聚合`(空心菱形),`组成`(实心菱形)是对象与部分不可分割的关系。\n\n\n---\n# [用例图]() <a id=\"usecase\"></a>\n\n[用户故事Use Story]()\n![](../../picture/Snipaste_2023-02-19_09-28-59.png)\n好的用户故事应具备的特征:INVEST:Independent,Negotiable,Valuable,Estimatable,Small,Testable\n\n[用例Use Case]() 表示系统所提供的服务或可执行的某种行为,是actor与系统的交互\n 官方定义:一个用例定义了一组用例实例,其中每个实例都是系统所执行的一系列操作,这些操作生成特定主角可以观测的值\n$$ 四大特征\\left\\{\n\\begin{array}{lcl}\n行为序列(sequences of actions)\\\\\n系统执行(system performs)\\\\\n可观测到的、有价值的结果(observable result of value)\\\\\n特定的角色(particular actor)\n\\end{array} \\right.$$\n\n$$ 用例\\left\\{\n\\begin{array}{lcl}\n业务用例\\\\\n概念用例\\\\\n系统用例\n\\end{array} \\right.$$\n不能以步骤作为用例\n$$ 用例模型\\left\\{\n\\begin{array}{lcl}\n参与者(Actor)\\\\\n用例(Use Case)\\\\\n通讯关联(Communication Association)\n\\end{array} \\right.$$\n特殊的参与者:系统时钟:\n![](../../picture/Snipaste_2023-02-19_09-47-01.png)\n[用例粒度]() 用例内涵的大小\n[边界]() 用例分析工作的范围(组织/系统/领域)\n\n[泛化(generalization)]() 用户共有的基用户 或 用例共有的基用例(空心三角形箭头指向基用户/基用例)\n[包含(include)]() 用例1会用到用例2(箭头属性<< include >>)\n[扩展(extend)]() 用例2在某些特定情况下会用到用例1(箭头属性<< extend >>)\n\n[泳道图swim-lane diagram]() 侧重于描述多个参与者的活动之间的交互关系\n\n\n---\n# [系统分析-结构化]() <a id=\"sysana\"></a>\n[结构化方法]() 面向过程,分析->设计->编程\n  结构化、模块化、层次化\n[结构化分析方法(SA)]() 将待解决的问题看作一个系统,从而用系统科学的思想方法(抽象、分解、模块化)来分析和解决问题\n  `核心思想:`自顶而下的分解(top-down)\n  `定义`帮助开发人员定义系统需要做什么(处理需求),系统需要存储和使用哪些数据(数据需求),系统需要什么样的输入和\n  输出以及如何把这些功能结合在一起来完成任务\n$$ 图\\left\\{\n \\begin{array}{lcl}\n 数据流图 DFD\\\\\n 实体-关系图 ERD\n\\end{array} \\right.$$\n\n[DFD数据流图DataFlowDiagram]() 用处理、外部实体、数据流以及数据存储来表示系统需求的图表,可以逐步细化(关联、零层、一层...)\n  要最小化复杂度,避免信息超量\n![](../../picture/Snipaste_2022-12-06_22-40-53.png)\n![](../../picture/Snipaste_2022-12-06_22-46-58.png)\n![](../../picture/Snipaste_2022-12-06_22-47-46.png)\n![](../../picture/Snipaste_2022-12-06_22-48-42.png)\n![](../../picture/Snipaste_2022-12-06_22-49-19.png)\n[关联图]() 在单个处理符号中概括系统内所有处理活动的DFD,数据存储不放在这里\n[零层图]() 将一个系统或子系统的所有DFD片段组合到一个单个的DFD图中,这样的DFD图称为事件分离的系统模型/0层图\n  [黑洞]() 带有输入数据的但并不用其产生输出数据的处理或数据存储\n  [奇迹]() 没有足够数据元素作为输入或产生来源的一个处理或数据存储\n[结构化语言]()\n* 使用短句\n* 多层缩进\n* 将结构化编程技术和叙述性语言结合\n* 无确定语法\n* 可分层、嵌套\n\n[决策表]() “处理”逻辑的一种表格形式的表示方法,其中包括决策变量、决策变量值、行为或公式\n[决策树]() 用树形结构组织起来的线条对“处理”逻辑进行图形化的描述\n\n[数据字典]() 是数据分析的描述模型,包括:数据项定义,数据结构定义,数据流描述,数据存储描述\n\n\n---\n# [系统分析-对象化]() <a id=\"obor\"></a>\n\n$$ 图\\left\\{\n \\begin{array}{lcl}\n 用例图\\\\\n 类图\\\\\n 时序图\\\\\n 协作图\\\\\n 状态图\n\\end{array} \\right.$$\n\n$$ 分析模型\\left\\{\n \\begin{array}{lcl}\n 功能模型\\\\\n 静态结构模型\\\\\n 动态行为模型\n\\end{array} \\right.$$\n\nOOA`->`OOD`->`OOP`->`Testing\n\n[分析类BCE]() 是概念层次上的内容,用于描述系统中较高层次的对象,直接与应用逻辑相关,而不关注于技术实现的问题\n [边界类]() 表示参与者与系统之间的交互 ![50](../../picture/Snipaste_2022-12-07_11-04-24.png)\n [控制类]() 表示系统在运行过程中的业务控制逻辑![50](../../picture/Snipaste_2022-12-07_11-06-38.png)\n [实体类]() 表示系统存储和管理的持久性信息![50](../../picture/Snipaste_2022-12-07_11-07-19.png)\n\n`~` 除非系统需要在各用例中管理和维护该角色的信息(不是指ID和密码),否则只需将其作为actor,无需作为实体类(就是不需要存储这个角色的相关信息)\n\n[边界类、控制类分析]() UI、API;接收和发送的信息\n[实体类的属性分析]() 常识、问题域、系统责任、保存信息、为实现功能增设的属性、需要区分的状态、与其他实例的关系\n\n$$ 类之间的关系\\left\\{\n \\begin{array}{lcl}\n 泛化generalization\\\\\n 关联association\\\\\n 组合composition\\\\\n 聚合aggregation\\\\\n 依赖dependency\n\\end{array} \\right.$$\n\n[时序图]() 是强调时间顺序的交互图。将用户与分析类结合在一起,实现将用户的行为分配到所识别的分析类中\n  纵轴是时间轴,时间沿竖线向下延伸;横轴代表了在协作中各独立的对象\n![](../../picture/Snipaste_2022-12-07_23-40-19.png)\n\n[消息]() 是对象之间某种形式的通信.它可以激发某个操作、唤起信号或导致目标对象的创建或撤销\n![](../../picture/Snipaste_2022-12-07_23-43-32.png)\n\n[时序图(顺序图)绘制]() 六种箭头:Create、Call、Return、Self-call、Send、Destroy\n\n\n---\n# [系统设计-结构化]() <a id=\"sds\"></a>\n[自动化系统边界划分(Automation System Boundary)]()\n\n[结构图structure chart]() 以模块为基础、以模块间的调用为关联所构成的图称`模块结构图`,简称之\n![200](../../picture/Snipaste_2023-02-19_13-01-09.png) ![200](../../picture/Snipaste_2023-02-19_13-02-23.png) ![200](../../picture/Snipaste_2023-02-19_13-03-13.png) ![200](../../picture/Snipaste_2023-02-19_13-04-39.png) ![200](../../picture/Snipaste_2023-02-19_13-05-06.png) ![200](../../picture/Snipaste_2023-02-19_13-05-35.png)\n\n\n---\n# [系统设计-面向对象]()\n系统设计->对象设计->审评设计模型\n\n[包package]() 为了系统实现与维护过程中的方便性,将多个设计类按照彼此关联的紧密程度聚合到一起,形成大粒度的`包`\n包`->`子系统`->`系统\n[包图]() 是在 UML 中用类似于文件夹的符号表示的模型元素的组合\n\n![](../../picture/Snipaste_2023-02-19_13-31-53.png)\n\n[检查系统]() 正确性、一致性、完整性、可行性\n\n[面向对象设计的基本步骤]()\n1. 创建初始的设计类\n2. 细化属性\n3. 细化操作\n4. 定义状态\n5. 细化依赖关系\n6. 细化关联关系\n7. 细化泛化关系\n\n[设计类图]() 更新分析阶段的类图,对各个类给出详细的设计说明\n\n[系统拓扑结构设计 -- 网络拓扑图]()\n\n[功能结构图]()\n\n\n---\n# [数据库设计]()\n\n数据库系统=数据库(DB)+数据库管理系统(DBMS)\n\n[关系型数据库管理系统]()将数据存储成表`table`和关系的结构\n数据库的表(Table)之间的关系通过Key Fields来建立\n– 主键(Primary Key):本表中的关键属性\n– 外键(Foreign Key):存储在本表中的其他表的关键属性,用来与其他表建立关联关系(相当于指针)\n\n[参照完整性]()\n  当建立一个包含外键的记录时,DBMS 确保该外键同时作为主键出现在另一个相关表的记录中\n  当删除一个记录时,DBMS 确保在其它相关的表中不会出现和该记录主键值相同的外键\n  当主键值改变时,DBMS保证相关表中没有外键与该主键具有相同的值\n\n[对象关系映射(Object Relational Mapping,ORM)]()\n\n[ERD]()物理ERD需要数据类型,逻辑ERD不需要。\n\n\n---\n# [用户界面设计]()\n\n[缺省设计]()\n(1)经验值(固定常用值)作为缺省值;\n(2)学习得到动态缺省值;\n(3)最近输入内容作为缺省值;\n(4)用户设置缺省值;\n(5)输入数据的上下文关联缺省值;\n\n[输入验证设计]()\n  [错误处理机制]()\n1. 选择性确认(拦截性提示)\n2. 操作中断允许(在任务执行过程中有\"取消\"选项)\n3. 回滚(在任务被中断的情况下回退到操作发生之前的状态)\n4. Undo(随时可以回退到操作发生之前的状态)\n\n[系统响应及信息反馈]()\n\n\n---\n# [赞美]()\n减少输入数据量,或者减少操作过程、降低复杂性,提高数据输入或操作的效率,从而提高可用性,改善用户体验"},{"title":"软件过程与项目管理","url":"/2025/01/19/computer/notes/Finished/软件过程与项目管理/","content":"\n[软件]() 一组对象或项目所形成的一个配置,由 `程序` `文档` `数据` 组成\n[四大特征]() `复杂性complexity` `不可见性invisibility` `易变性changeablility` `一致性conformity`\n[CASE工具]() Computer-Aided Software Engineering\n> 软件 = 对象Object + 消息Message\n> 面向构件的软件 = 构件Component + 框架Framework\n> 面向服务的软件 = 服务Service + 消息Message + 总线Bus\n[软件工程]() `IEEE`: 将系统性的、规范化的、可定量的方法应用于软件的开发运行和维护,即将工程化应用到软件上\n `国务院学位委员会`: 按预算和进度实现满足用户要求的软件产品的定义、开发、发布和维护的工程\n[工具]() 自动或半自动的软件支撑环境\n[SWEBOK]() 软件过程知识体系Software Engineering Body of Knowledge\n软件开发就是从现实的需求到计算机的软件代码之间的映射和转换,可单步或多步\n[概念映射]() 问题的概念与解的模型化概念 学生 `->` Class Student(No,Name,Grade)\n[业务逻辑映射]() 问题的处理逻辑与解的处理逻辑的映射 算法\n问题空间 `->` 需求模型 `->`设计模型 `->` 实现模型 `->` 部署和运行模型 `->` 软件(解)空间\n功能性需求FR`完成spec程度`和非功能性需求NFR`性能和质量`\n> 大部分实践都是没有理论基础的\n[核心概念]() 分治 复用 折中 演化\n[软件过程模型]()\n* 预测型Predictive\n* 迭代型Iterative\n* 增量型Incremental\n* 敏捷型Agile\n[敏捷开发]() 固定节奏,小步快跑,及时反馈,应对变化,快速交付 增量+迭代+原型\n[Scrum]() 由Sprint组成\n[软件维护]() 纠错型Corrective,适应型Adaptive,完善型Perfective,预防型Preventive\n[项目Project]() 为创建某种特定的产品或服务而组织或设计的临时的、一次性的活动。\n[4P]() people,project,process,product\n[产品结构分解Product Breakdown Structure]() 用分层的树形结构细分产品\n[Gantt图]() 任务进度安排图\n[工作包]() WBS的叶节点,8、80原则,每个工作包不少于8小时,不多于80小时\n\n任务分解方法:\n* 模板参照法\n* 类比法\n* 自顶而下\n* 自底而上\n[成本估算]()\n* 代码行\n* 功能点\n* 用例点\n* 类比\n* 自下而上\n* 三点 最可能、最乐观、最悲观\n* 专家\n# 组织方式\n[一窝蜂模式chaos team]() 没有明确分工\n[主治医生模式Chief-Programmer Team]() 一个人为主干\n[社区模式Community Model]() 如开源项目\n[交响乐团模式Orchestra]() 各司其职,规格严格\n[爵士乐模式Jazz Band]() 有arranger协调指导,各位即兴发挥\n[功能团队模式feature team]() 组织不同功能的人平等协作\n[官僚模式Bureaucratic model]() 行外领导\n[组织结构]() 职能型,项目型,矩阵型\n责任分配矩阵RAM Responsibility Assignment Matrix\n组织分解结构OBS"},{"title":"Software Architecture and middleware","url":"/2025/01/19/computer/notes/Finished/软件架构与中间件/","content":"\n[课程简介]() 架构,中间件\n[资源]()\n本机Note课件\n"},{"title":"软件架构","url":"/2025/01/19/computer/notes/Finished/软件构造/","content":"\n# <font color=\"#0000dd\">代码基础</font> <a id=\"Judy\"/>\n由功能偏向质量,由具体偏向抽象,由编程偏向工程,由手工偏向工具\n1. Design Goals 编程的视野\n2. Design Principles 编程的标尺\n3. Design Patterns 编程的经验\n\n[三维度八视图]()\n`阶段`构造时build-time / 运行时视图run-time\n`动态性`时刻moment / 阶段视图period\n`构造对象`代码code / 构件视图component\n![](Snipaste_2023-05-10_00-15-02.png)\n[Build-time 构建阶段]() idea`->`requirement`->`design`->`code`->`installable/executable package\n$$ 代码的逻辑组织\\left\\{\n \\begin{array}{lcl}\n functions\\\\\n classes\\\\\n methods\\\\\n interfaces\n \\end{array} \\right.$$\n* Software = Program(codes)\n* Software = Algorithm+Data Structure\n* Software = Program+Data+Documents\n* Software = Modules(Components)+Data/Control Flows\n\n\n[链接]()\n* `静态链接` 库被copy进代码形成整体,执行的时候无需提供库文件\n* `动态链接` 仅仅做出标记,运行时根据标记加载库文件至内存\n\n\n[SCI ]()`Software Connfiguration Item`软件配置项\n[Evolution Graph]() 演化图\n[versioning]()`版本号的一般命名` major.minor.patch\n\n\n<font color=\"#dd0000\">几种代码运行方式</font>\n[full program interpretation]() 由runtime system完全载入并interpret\n[native machine code]() 完全转换为CPU的可执行程序\n[Interpreted byte codes]() 被编译成字节码的形式(如java的class文件)再以前两种方式运行\n[Perl or Python]() 在运行时编译成字节码解释执行\n\n\n\n[snapshot diagram]() 描述程序运行时,某时刻内存里变量层面的状态\n[memory dump]() 内存信息转储,储存程序间断错误或信号\n\n[execution tracing]() 用日志方法记录程序执行的调用次序\n[event logging]() (系统层次)抽象的行为和错误日志\n\n[external quality factor]()\n1. <font color=\"#dd0000\">Correctness 按照预先定义的\"规约\"执行</font>\n * Testing and Debugging\n * Defensive programming\n * Formal approach(高级)\n2. <font color=\"#dd0000\">Robustness 针对异常情况的处理(Exception handling)</font>\n > 合称reliability\n3. <font color=\"#dd0000\">Extendibility 对规约修改的容易程度(高内聚,低耦合,如下)</font>\n * Design simplicity简约主义\n * Decentralization分离主义\n4. <font color=\"#dd0000\">Reusability 一次开发,多次使用</font>\n > 合称modularity\n5. Compatibility 不同软件间的相互可容易的集成\n * 关键是in homogeneity of design, standardization; 尤其是standard protocols\n6. Efficiency 在硬件资源上放尽可能少的demands(processor time, space, bandwidth)\n7. Portability 软件在不同的软硬件环境间移植\n8. Ease of use 容易use, installation, operation, monitoring\n * Structural Simplicity\n * Know the user\n9. Functionality\n10. Timeliness 按时release\n\n\n\n[Liskov Substitution Principle]()`LSP原则` 如果S是T的子类型`subtype`,那么程序中使用T类型的对象的地方,也可以用S类型的对象替换,而不会产生任何错误或异常。\n\n\n[委托]()`delegation`是一种设计模式,用于将某个对象的功能委托给另一个对象来处理。它通过在对象之间建立一种关系,使得一个对象能够调用另一个对象的方法,并将任务的执行委托给该对象。\n\n[协变]()`Covariance`:\n协变是指在类型转换或继承关系中,保持类型关系的方向不变。简而言之,如果类型 A 可以被隐式转换为类型 B,那么 A 是 B 的协变类型。\n\n[Composite Reuse Principle (CRP)]() 更倾向于使用委派而不是继承来实现复用。\n\n[SOLID]()是OO设计原则 5 classes design principles\n▪ (SRP) The Single Responsibility Principle 单一责任原则:There should never be more than one reason for a class to change\n▪ (OCP) The Open-Closed Principle 开放-封闭原则:行为是可拓展的,自身代码是不可修改的\n▪ (LSP) The Liskov Substitution Principle Liskov替换原则:子类型可替换父类型\n▪ (DIP) The Dependency Inversion Principle 依赖转置原则:具体应该依赖于抽象\n▪ (ISP) The Interface Segregation Principle 接口聚合原则:只提供必须的接口\n# <font color=\"#0000dd\">测试</font>\n[internal quality factor]()\n1. LOC`代码行数`\n2. Cyclomatic complexity`循环层次`\n3. coupling and cohesion`耦合度和内聚性`\n4. readability`可读性`\n\n[Test first programming]() 先写测试,再写代码\n[residual defect rates per kloc]() 每千行代码残留缺陷率\n`Unit Testing`单元测试\n`Integration testing`集成测试\n`System testing`系统测试\n[黑盒测试]() 从spec导出测试区间的等价类划分\n[白盒测试]() 考虑内部实现细节,对所有执行路径进行等价类划分找出代表性的简单路径\n\n[code coverage]() 代码覆盖度\n1. Function Coverage\n2. Statement Coverage\n3. Branch Coverage\n4. Condition Coverage\n5. Path Coverage\n# <font color=\"#0000dd\">构造过程</font>\n\n$$ \\textcolor{red}{basic\\ types} \\left\\{\n\\begin{array}{lcl}\nLinear\\\\\nIterative\\\\\n\\end{array} \\right.$$\n\n$$ \\textcolor{red}{existing\\ models}\\left\\{\n\\begin{array}{lcl}\nWaterfall\\ 瀑布\\\\\nIncremental\\ 增量\\\\\nV-Model\\ V字\\\\\nPrototyping\\ 原型\\\\\nSpiral\\ 螺旋\n\\end{array} \\right.$$\n[Waterfall]() 线性推进,阶段划分清楚\n[Increment]() 多个Waterfall的串行\n[V-Model]() Waterfall变型,强调测试的重要性\n[W-Model]() 由两个V组成,增加了Verification和Validation,\n[Prototyping]() 首先做出合适的基础模型,接着不断根据需求迭代 抛弃式和演化式\n[Spiral]() 风险驱动,多轮迭代基本遵循Waterfall\n[Agile development 敏捷开发]() rapid delivery,eXtreme Programming\n[Pair Programming]() 一个人写,一个人看\n[Scrum]() 核心是 Sprint(迭代)和 Scrum Team(团队)\n[Fagan inspection]() 核心思想是通过系统性的检查和评审来提高软件质量。\n# <font color=\"#0000dd\">Team Version Control</font>\n[Software Configuration Item]() 软件中发生变化的基本单元\n# <font color=\"#0000dd\">OOP的基本概念</font>\n`public`,`protected`,`default`,`private`四种对象访问权限类型\n[抽象类]() 包含至少一个抽象方法\n```\nabstract class name{\n\n}\n```\n[多态]()\n1. <font color=red>Ad-hoc polymorphism</font>`重载多态 / 运算符多态` 函数重载或运算符重载\n2. <font color=red>Parametric polymorphism</font>`泛型多态 / 参数化多态` 泛型\n3. <font color=red>subtyping(subytpe polymorphism or inclusion polymorphism)</font>`对象多态/继承多态` 继承和方法重写\n# <font color=\"#0000dd\">Specifacations</font>\n\n\n[Spec]()`规约`充当过程的实现者与其客户之间的重要防火墙。它使单独开发成为可能:客户可以自由编写使用该过程的代码而无需查看其源代码,而实现者可以自由编写实现该过程的代码而不知道它将如何使用。\n\n`Null` 值是 Java 类型系统中的一个不幸漏洞。当程序试图在null上调用方法或访问其成员时,会触发NullPointerException(空指针异常)\n\n[precondition]()`前提条件`说明参数的限制等,[postcondition]()`后置条件`说明返回类型等\n[java异常]()\n\n$$ \\left\\{\n\\begin{array}{lcl}\n checked\\ exception\\\\\n unchecked\\ exception (RuntimeException)\n\\end{array}\n\\right.$$\n`try,catch,finally`\n![](Snipaste_2023-05-16_09-36-58.png)\n> Error表示严重的错误,一般是由于虚拟机出现问题或系统资源耗尽等无法恢复的情况引起的。通常情况下,程序不会捕获和处理Error类型的异常,而是由虚拟机来处理。\n> Exception表示非致命的异常,可以通过程序的处理来恢复或终止程序的执行。\n# <font color=\"#0000dd\">Designing Specifications</font>\n$$ \\left\\{\\begin{array}{lcl}\ndeterministic和undetdetermined(不是nondeterministic)\\\\\ndeclarative和operational\\\\\nstrong(precondition弱,postcondition强)和weak\n\\end{array}\\right.$$\n要求:coherent`meaning that it does one thing and does it well`,\nresults informative,\nstrong enough,\nweak enouph,\nuse abstract types when possible\n`static` vs. `instance`\n[static]()\nstatic关键字用于声明静态成员(变量或方法),即类级别的成员,不依赖于类的实例而存在。\n静态成员属于类本身,只会在内存中存在一份副本,被所有类的实例共享。\n可以通过类名直接访问静态成员,无需创建类的实例。\n静态变量在程序启动时被初始化,可以在任何时候访问。\n[instance]()\n实例成员是与类的实例相关联的成员,每个类实例都有自己的一组实例成员。\n实例成员包括实例变量和实例方法,它们依赖于类的实例的创建和存在。\n实例成员在每个类的实例中都有自己的副本,它们独立于其他实例。\n实例成员需要通过创建类的实例来访问和使用。\n# <font color=\"#0000dd\">Avoiding Debugging</font>\n利用`assert`检查先决条件是`防御性编程`的一个例子。\n不要使用断言来测试程序外部的条件,而是使用异常。\n由于断言可能被禁用,您的程序的正确性不应该依赖于断言表达式是否被执行。\n```\nassert (x >= 0) : \"x is \" + x;\n```\n当x是-1时,将输出x is -1\n默认情况断言语句不执行,必须通过将-ea(代表启用断言)传递给 Java 虚拟机来显式启用断言。\n# <font color=\"#0000dd\">Mutability&Immutability</font>\nmutabale objects会使对其大量操作时所需空间复杂度大大降低\npassing mutable objects和returning mutable objects一样有latent bug,需要defensive copying\nSharing a mutable object complicates a contract. 因为要用时合同不清楚的话不知道是否已经被人修改\n> contract: a form of agreement or protocol that establishes the rules of engagement between different parts of a system\n# <font color=\"#0000dd\">Recursion</font>\nbase case + recursive step\n# <font color=\"#0000dd\">Debugging</font>\nreproduce the bug `->` find the bug `->` fix the bug\n\n# <font color=\"#0000dd\">Abstract Data Type</font>\noperation分类:\n1. creator: create new objects of the type. `t* → T`\n2. producer: create new objects from old objects of the type. `T+, t* → T`\n3. observer: take objects of the abstract type and return objects of a different type. ` T+, t* → t`\n4. mutator: change objects. `T+, t* → void | t | T`\n >Each T is the abstract type itself; each t is some other type. The + marker indicates that the type may occur one or more times in that part of the signature, and the * marker indicates that it occurs zero or more times. | indicates or.\n\n抽象(高层思维)、模块化、封装、细节隐藏、单元化(separation of concerns)\n[representation independent]()`表示独立性` 核心思想是将数据的表示方式与其处理方法相分离.\n[override]()`覆盖`,可把基类中标记为`abstract`的函数覆盖重写\n[overload]()`重载`,构造函数名相同但参数列表不同的方法,以实现静态多态性\n# <font color=\"#0000dd\">Design Patterns</font>\n▪ `Creational patterns` 创建型模式\n– Concern the process of object creation\n▪ `Structural patterns` 结构型模式\n– Deal with the composition of classes or objects\n▪ `Behavioral patterns` 行为类模式\n– Characterize the ways in which classes or objects interact and distribute responsibility.\n[factory method]()`Virtual Constructor/工厂模型` A creator implemented as a static method\n[Adapter]()`适配器模式`\n[Decorator]()`装饰器模式` 对每一个特性构造子类,通过委派机制增加到对象上\n[Strategy]()`策略模式` 有多种不同的算法来实现同一个任务,但需要client根据需要动态切换算法,而不是写死在代码里\n[Template Method]()`模板模式` 共性的步骤在抽象类内公共实现,差异化的步骤在各个子类中实现\n[Iterator]() A strategy pattern for iteration\n[visitor]() 为ADT预留一个将来可扩展功能的“接入点”,外部实现的功能代码可以在不改变ADT本身的情况下通过delegation接入ADT\n\n# <font color=\"#0000dd\">Abstract Functions & Representation Invariants(AF &RI)</font>\n`抽象函数`定义了系统的功能接口,使得模块之间可以进行交互和协作;而`表示不变量`则确保数据结构的有效性和一致性,提供了正确和可靠的操作。\n# <font color=\"#0000dd\">Interfaces</font>\nJava 的`接口`是一种用于表达抽象数据类型的有用语言机制`Language mechanism`。\n`subtypes`子类型 “B is a subtype of A” means “every B is an A.” In terms of specifications: “every B satisfies the specification for A.”\n# <font color=\"#0000dd\">Equality</font>\nThe `==` operator compares references. More precisely, it tests `referential equality`. Two references are == if they point to the same storage in memory.\nThe `equals()` operation compares object contents – in other words, `object equality`, in the sense that we’ve been talking about in this reading.\nThe `instanceof` operator tests whether an object is an instance of a particular type.\nAlways override `hashCode` when you override `equals`.\n immutable types must override both equals() and hashCode().\n# <font color=\"#0000dd\">Recursive Data Types</font>\n递归数据类型\n# <font color=\"#0000dd\">Regular Expression & Grammars</font>\n`形式语言和自动机`讲过原理,java实现的语法没讲过\n`级联`\n`x ::= y z`\nan x is a y followed by a z\n\n\n`重复`\n`x ::= y*`\nan x is zero or more y\n\n\n`联合(也称为交替)`\n`x ::= y | z`\n an x is a y or a z\n# <font color=\"#0000dd\">Parser Generators</font>\n解析器生成器(Parser Generator)是一种工具,用于根据给定的文法规则和语法描述生成解析器代码。解析器的作用是将输入的文本按照语法规则进行分析,将其转换为抽象语法树或执行特定的操作。\n\n# <font color=\"#0000dd\">Concurrency</font>\n即`并发`,多个计算同时运行,共享内存和消息传递范例\n`进程`就像一台虚拟计算机;`线程`就像一个虚拟处理器\n# <font color=\"#0000dd\">Thread Safety</font>\n1. 限制:不共享数据。\n2. 不变性:共享,但保持数据不可变。\n3. 线程安全数据类型:将共享可变数据存储在单个线程安全数据类型中。\n# <font color=\"#0000dd\">Socket & Networking</font>\n`Socket(套接字)`是计算机网络编程中用于实现网络通信的一种编程接口。它提供了一种机制,使得不同计算机之间的进程能够通过网络进行数据交换和通信。\nSocket在网络通信中的作用类似于电话中的插座。\n1. `TCP套接字(Transmission Control Protocol)`:TCP套接字提供可靠的、面向连接的通信。它使用TCP协议来确保数据的可靠传输,通过三次握手建立连接,并提供流式的、双向的通信。TCP套接字适用于需要可靠传输和顺序传输的应用,如文件传输、网页浏览等。\n\n2. `UDP套接字(User Datagram Protocol)`:UDP套接字提供无连接的、不可靠的通信。它使用UDP协议来发送和接收数据,不保证数据的可靠性和顺序,但具有较低的延迟。UDP套接字适用于实时通信和广播等应用,如视频传输、游戏、DNS等。\n# <font color=\"#0000dd\">Queues & Message-Passing</font>\n使用队列来实现消息传递\n# <font color=\"#0000dd\">Locks & Synchronization</font>\n`Locks(锁)`和`Synchronization(同步)`是在并发编程中用于管理共享资源和保护临界区的重要概念和技术。\n`锁`是一种机制,用于控制对共享资源的访问。它提供了对临界区的互斥访问,确保在同一时间只有一个线程可以进入临界区并执行操作,从而避免多个线程同时访问共享资源而导致的数据不一致或竞态条件问题。常见的锁包括`互斥锁(Mutex Lock)`和`读写锁(Read-Write Lock)`等。\n`同步`是一种机制,用于协调多个线程的执行顺序,以确保数据的一致性和正确性。它通过使用锁和其他同步原语(如`条件变量`、`信号量`等)来控制线程的执行顺序和访问共享资源的方式。同步机制可以防止多个线程之间的竞争条件和数据竞争问题,并确保线程之间的操作按照预期的顺序执行。\n# <font color=\"#0000dd\">Graphical User Interfaces</font>\n1. `窗口(Window)`:窗口是 GUI 的基本容器,用于承载其他组件。每个窗口都有自己的标题栏、边框和控制按钮,可以最大化、最小化、关闭等。\n\n2. `控件(Widget)`:控件是 GUI 中的可视化元素,用于展示信息、接受用户输入和执行操作。常见的控件包括按钮、文本框、标签、复选框、滚动条等。\n\n3. `布局管理器(Layout Manager)`:布局管理器用于控制和安排窗口中的控件的位置和大小。它可以确保控件在窗口中正确布局,并根据窗口的大小进行自适应调整。\n\n4. `事件处理(Event Handling)`:GUI 界面可以响应用户的输入事件,如点击按钮、拖动滚动条等。事件处理机制用于捕获和处理这些事件,并触发相应的操作和逻辑。\n\n\n# <font color=\"#0000dd\">Map,Filter,Reduce</font>\n1. `映射(Mapping)`:\n映射操作是将集合或序列中的每个元素都应用一个函数,生成一个新的集合或序列,其中每个元素都是原始元素经过函数处理后得到的结果。简单来说,就是对集合中的每个元素进行转换或映射。常见的应用场景包括对列表中的每个元素进行加工、提取元素的某个属性等。\n\n2. `过滤(Filtering)`:\n过滤操作是基于某个条件,从集合或序列中选择满足条件的元素,生成一个新的集合或序列。过滤操作通过提供一个判定条件函数来决定哪些元素应该被保留下来,而哪些应该被过滤掉。常见的应用场景包括从列表中筛选出符合特定条件的元素。\n\n3. `归约(Reducing)`:\n归约操作是将一个集合或序列中的所有元素通过某个操作进行组合,生成一个单一的结果。这个操作通常是将集合中的元素逐个进行累积或聚合,以产生一个最终结果。常见的归约操作有求和、求最大值、求平均值等。\n# <font color=\"#0000dd\">Little Languages</font>\n`小语言`通常用于描述和处理特定领域的数据和操作。它们可以用于`数据转换`、`配置文件解析`、`模板生成`、领`域特定的查询`和`规则引擎`等任务。\n一些常见的小语言包括`正则表达式语言`、`SQL(结构化查询语言用于数据库查询)`、`HTML(超文本标记语言)`"},{"title":"数据结构","url":"/2025/01/19/computer/notes/Finished/数据结构/","content":"\n<font size =6> 目录</font>\n* [前记](#start)\n* [树](#tree)\n * [树的遍历](#1.)\n* [栈](#2)\n* [队列](#3)\n* [最小生成树](#4)\n* [矩阵的储存](#5)\n* [图](#6)\n* [查找](#7)\n* [排序](#8)\n* [贪心算法]()\n * [最优装载问题]()\n * [背包问题]()\n * [会议安排]()\n * [最短路径]()\n * [哈夫曼编码]()\n * [最小生成树]()\n* [分治法]()\n * [二分搜索]()\n * [合并排序]()\n * [快速排序]()\n * [大数整乘法]()\n* [动态规划]()\n * [最长公共子序列]()\n * [编辑距离]()\n * [游艇租赁]()\n * [矩阵连乘]()\n * [最优三角剖分]()\n * [石子合并]()\n * [0-1背包]()\n * [最优二叉搜索树]()\n* [回溯法]()\n * [0-1背包]()\n * [最大团]()\n * [地图着色]()\n * [n皇后问题]()\n * [最优加工序列]()\n * [旅行商问题]()\n* [分支限界法]()\n * [广度优先]()\n * [0-1背包]()\n * [旅行商问题]()\n * [最优工程布线]()\n* [线性规划]()\n * [单纯形算法]()\n * [最短增广路算法]()\n * [最小费用路算法]()\n * [配对方案法]()\n * [圆桌问题]()\n * [试题库问题]()\n * [最大收益问题]()\n * [方格取数问题]()\n * [旅游路线问题]()\n\n`数据结构`是相互之间存在一种或多种特定关系的数据元素的集合\n`算法`对特定问题求解步骤的一种描述\n\n\n**三要素:**\n1. 逻辑结构\n2. 数据的运算\n3. 储存结构(物理结构,储存不同,运算的实现方法不同)\n\n[空间复杂度]() 运行时有程序代码内存(大小固定,与问题规模无关),数据内存,\n[时间复杂度]() 平均情况假设每个基本事件概率相等,然后取平均数。\n\n[渐进分析]() Asymptotic Analysis\n\n[数据]()是一个广义术语,代指各种类型信息\n\n[常用算法]()\n1. 分治Divide and Connquer\n2. 递归Recursion Algorithm\n3. 动态规划Dynamic Programmig\n4. 贪心算法Greedy Technique\n5. 回溯算法Back Tracking Method\n6. 分支界限Branch and Bound Method\n\n\n[存储方式]()\n1. 顺序储存\n2. 链式储存\n3. 索引储存(静态链表)\n4. 散列储存\n\n>算法必须是有穷的,程序可以是无穷的。\n\n>高效率,低储存量\n\n>时间复杂度按步数计算\n>常数1<对数logN<线性N<线性对数NlogN<平方N^2<立方N^3<指数x^N<阶乘N!<幂指N^N\n\n>尽管不能比较冒泡排序和选择排序,大 O 还是很重要的,因为它能够区分不同算法的长期增长率。\n>快速排序的每一轮处理其实就是将这一轮的基准数归位\n\n>最坏情况O 、最好情况Ω、平均情况Θ\n\n---\n---\n# [树]() <a id=\"tree\"></a>\n\n[树]() 具有层次关系的数据结构,是最小连通图\n[二叉树]() 子节点的最大个数是二\n[树和二叉树的转换]() 孩子兄弟表示法,firstchild作为左指针,nextsibling作为右指针。\n\n[中序遍历]() 指根中序遍历:左子树、根、右子树 <a id=\"1.\"></a>\n[分支节点]() 度不为零的结点,也称为非终端结点。\n[前缀编码]() 没有一个编码是另一个编码的前缀\n[哈夫曼树]() 给定一组具有确定权值的叶子结点,WPL最小的二叉树,亦称**最优二叉树**\n[堆]() heap 是最高效的优先级队列\n[BST:binary sort tree]() 二叉排序树,二叉搜索树\n  它的中序遍历存在有序性\n[binary balanced tree 平衡二叉树]() AVL树,二叉平衡搜索树,\n  左子树和右子树高度差不超过一。\n  插入数据后调整最小的不平衡子树,利用左旋右旋\n  [平衡因子]() 左右子树高度差\n\n>所有结点都只有左子树的二叉树称为**左斜树**\n\n>层次遍历用队列\n\n>**三叉链表** 在二叉链表的基础上增加了一个指向亲代的指针域。\n\n>**静态二叉链表** 不用指针\n\n>***优先队列*** 被出列的是优先级最高或低的元素的队列\n\n>***选择树*** Selection Tree,包括Winnner Tree和Loser Tree\n\n>并查集,Union-Find Disjoint Sets\n\n>用随意打乱的数据创建出来的树才有可能是比较平衡的。\n\n[红黑树]() [2-3-4树]()\n\n---\n\n# [栈]() <a id =\"2\"></a>\n\n[LIFO]() last in,first out\n\n[计算机调用栈]() 是用来记录每个调用中的函数的栈\n\n[共享栈]() 两个Stack(数组实现)共用同一片空间,从数组两头开始使用\n[后缀表达式]() 利用栈来实现\n\n>栈用来处理语法错误(括号错误)\n\n>**卡特兰数** Catalan number ![50](Snipaste_2022-11-23_20-31-42.png)\n\n[表达式求值]()\n\n---\n# [队列]() <a id =3></a>\n\n[FIFO]() fist in,first out\n\n>队列(空一位区分队满队空状态)用取余判断是否满了,(加数组)或者给每一位设置状态参数 ,(加大小量)一个存size的int\n---\n# [最小生成树]() <a id=\"4\"></a>\n\n[生成树(Spanning Tree)]() 连接V中所有顶点的一棵开放树(Free Tree,无环路的无向图)。\n[最小生成树(Minimum-cost Spanning Tree, MST)]() 在图G所有生成树中,代价(各边权值之和)最小的生成树称之,即包含全部顶点的极小连通子图。\n[prim算法]() IMP:每次把到最小生成树的最短距离的点收入 时间复杂度O(V2),适用边稠密\n[kruskal]() IMP:每次加入一个最短边,并且保证不会形成回路。 时间复杂度O(ElogE),适用边稀疏\n[双连通图]() 没有割点的图\n[强连通图]() 如果图中有一条有向回路,则任意两点间可互达,称之。\n[dijkstra算法]() 亦称SPF(shortest path first最短路径优先算法)\n[floyd算法]() 使任意两点间路径遍历一次,都尽量加入点缩短。\n\n[拓扑排序]() 偏序排序,IMP:每次取一个入度为零的点并删去关联的边,重复操作入队。\n\n[AOV:activity on vertex]() 在一个表示工程的有向图中,用顶点表示活动,用弧表示活动之间的优先关系,称这样的有向图为顶点表示活动的网,简称AOV网。\n[AOE]() 带权有向图中,顶点表示事件,边表示活动,边上权表示活动的开销(如持续时间),则称之\n  [源点、汇点]() 仅有的一个入度为零的点,仅有的一个出度为零的点\n  [关键活动]() 从源点到汇点的WPL最大的路径称为`关键路径`,上边的活动称为`关键活动`\n  [最早发生时间]() 从源点开始的最短路径时间\n  [最迟发生时间]() 在不推迟整个工程完成的前提下,最迟发生的时间,从汇点开始推理\n  利用拓扑排序确定每个事件的最早最晚开始时间,如果相等,则是个关键活动,加入**关键路径**中。\n\n\n---\n# [矩阵的储存]() <a id=\"5\"></a>\n\n[带状矩阵]() 当|i-j|>1时,aij=0.\n\n---\n\n# [图]() <a id=\"6\"></a>\n\n[图]() 是由顶点(vertex)的有穷非空集合和顶点之间边(edge)的集合组成的一种数据结构\n\n[极小连通子图]() `连通分量`\n\n[图的遍历]()\n1. BFS\n  [广度优先生成树]() BFS后路径形成的树\n2. DFS\n\n[最短路径]()\n1. [Dijkstra算法]() 运行后找到的可能不是一条路径,而是分叉路径,但可以找到到任意点的最短路径。\n2. [floyd算法]() 对每条边都尝试加入各个点看能不能缩短路径\n\n[有向无环图Directed Acyclic graph]() 题如其名,以把一部分子树合并的方法进行优化储存\n\n\n[邻接矩阵]() adjacency matrix\n  用一个二维数组(称为邻接矩阵)存储图中各顶点之间的邻接关系\n[邻接表(链表表示)]()\n  对于有向图的每个顶点vi,将从vi出发的弧到达的所有顶点链成一个单链表,称为顶点vi的**出边表**;\n  再把所有出边表的指针和顶点信息的一维数组构成**顶点表**。\n  **入边表**同理\n[十字链表( Orthogonal List )]() 横向上是正邻接表,纵向上是逆邻接表\n[邻接多重表]() 类似于十字链表,但储存无向图。\n\n\n---\n# [查找(检索)]() <a id=\"7\"></a>\n\n[Average Search Length 平均查找长度]() ASL,比较次数的期望值\n\n[静态查找表]() 只需查找,无需插入、删除操作\n\n[线性查找]()\n[折半查找]() 折半查找的判定树一定是平衡二叉树\n[分块查找]()\n  均匀分块,块间有序,块内无序\n  索引表中记录每个分块的最大关键字、分块的区间\n  每个分块的内容可采用链式储存。\n[B树 多路平衡查找树]() m-叉查找树\n  除了根节点外任何非叶节点至少有 m/2上取整 个分叉,即至少有 m/2上取整-1 个关键字,B树的叶子必须在同一层上(对于任意节点,所有子树的高度都要\n  相同)\n[B+树]() 经分块查找思想改造的B树,非终端节点只是记录端点,叶节点才是数据\n[散列表hash table]()\n  [装填因子]()表中记录数/散列表长度\n\n[拉链法、链地址法]() 当散列函数的值有冲突时,把所有的同义词储存在一个链表中\n[开放地址法]() 当散列函数的值有冲突时,把空余的地址利用起来\n  1. `线性探测法`\n  2. `平方探测法`散列表的长度必须是一个可以表示为4j+3的素数\n  3. `伪随机序列法`\n[再散列法]() 当散列函数的值有冲突时,用下一个散列函数计算地址\n\n[常见的散列函数]()\n1. `取余法`用一个小于等于散列表长度的质数取余\n2. `直接定址法` 哈希值设置为key的线性函数\n3. `数字分析法` 取key的一部分作为散列地址\n4. `平方取中法` 取key的平方的中间几位\n\n---\n# [排序]() <a id=\"8\"></a>\n\n[冒泡排序]() 每次把待排序中最小的冒到前边\n[快速排序]() 任取一个元素做基准,利用双指针进行一次划分\n\n[直接选择排序]() 每一次在待排序元素中选取关键字最小的元素加入有序子序列\n[锦标赛排序]()\n[堆排序]() 基于堆的排序,如基于大根堆进行下坠操作后取堆根入队列得到递增序列,\n\n[直接插入排序]() 每一次把待排序元素加入有序子数列的合适位置\n[折半插入排序]() 优化,插入时实现折半查找\n[Shell排序]() 将待排序表间隔d(逐渐减少到一) 的元素取到一起分为子表,对子表进行直接插入排序\n\n[归并排序]()\n  递归式地把数组不断二分进行归并,可以把一个数组有序化\n  [归并]()把多个有序数组合并成一个数组。\n[基数排序]() 把关键字分为权重不同的关键字,所有的小关键字都在零到基数左范围内。小关键字组按权重从小到大利用队列对小关键字进行分配和搜集\n\n\n[稳定性]() 排序过程中尽量不改变原本相同元素的相对位置\n\n[外部排序]()\n  操作系统是以\"块\"为单位对磁盘储存空间进行管理的,\n1. 构造归并段(从磁盘写入块并内部排序后写回磁盘)\n2. 两两归并(递归)\n `优化`多路归并\n `优化`减少初始归并段数量\n\n[败者树]() 直接比较k个归并段选出最值元素需要对比k-1次,构建败者树使关键字对比次数减少到 log k上取整 次\n[置换-选择排序]() 利用内存工作区构建一个筛选法则,每次内存工作区满了就重新开辟一个归并段\n[最佳归并树]() 即Huffman-k叉树,构建的归并树的带权路径长度WPL(weighted path length)最小\n  [虚段]()对于k-叉归并,若(初始归并段数量-1)%(k-1)!=0,则无法构成严格的k-叉归并树,则需要补充几个长度为零的虚段\n\n---"},{"title":"ComputerNetworking","url":"/2025/01/19/computer/notes/Finished/ComputerNetworking/","content":"\n# [Application Layer]()\n# [Computer Networking]()\n# [Security in Computer Networks]()\n# [The Link Layer and LANs]()\n# [The Network Layer-Control Plane]()\n# [The Network Layer-Data Plane]()\n# [Transport Layer]()\n网关,五元组`--`交换机,mac地址\n# [Wireless and Mobile Networks]()\n# 中文\n# 缩写大全\n[CIDR]() Classless Inter-Domain Routing\n`TCP`:Transmission Control Protocol,传输控制协议。\n`IP`:Internet Protocol,互联网协议。\n`HTTP`:Hypertext Transfer Protocol,超文本传输协议。\n`SMTP`:Simple Mail Transfer Protocol,简单邮件传输协议。\n`POP`:Post Office Protocol,邮局协议。\n`IMAP`:Internet Mail Access Protocol,互联网邮件访问协议。\n`SSL`:Secure Sockets Layer,安全套接层。\n`VPN`:Virtual Private Network,虚拟专用网络。\n`WAN`:Wide Area Network,广域网。\n`LAN`:Local Area Network,局域网。\n`MAN`:Metropolitan Area Network,城域网。\n`DHCP`:Dynamic Host Configuration Protocol,动态主机配置协议。\n`ICMP`:Internet Control Message Protocol,Internet控制报文协议。\n`ARP`:Address Resolution Protocol,地址解析协议。\n`VLAN`:Virtual Local Area Network,虚拟局域网。\n`OSP`:Open Shortest Path First,开放式最短路径优先。\n`BGP`:Border Gateway Protocol,边界网关协议。\n`RIP`:Routing Information Protocol,路由信息协议。\n`QoS`:Quality of Service,服务质量。\n`VoIP`:Voice over Internet Protocol,网络语音协议。\n`CDN`:Content Delivery Network,内容分发网络。\n`SIP`:Session Initiation Protocol,会话发起协议。\n`SNMP`:Simple Network Management Protocol,简单网络管理协议。\n`ICMPv6`:Internet Control Message Protocol version 6,Internet控制报文协议第6版。\n[PDU]() Protocol Data Unit 协议数据单元\n[MTU]() Maxium Transport Unit 最大传输单元\n`CRC` Cyclic redundancy check 循环冗余检查\n[DSL]() digital subscriber line\n[RFC]() request for comments\n[NAT]() Network Address Translation\n[前导码(Preamble)]() :\n 包含7个字节,由10循环组成,每个字节内容都是:10101010,作用是在发送方和接收方之间进行时钟同步\n[帧开始界定符(SFD)]() :\n 长度为1字节,内容为 10101011,这段代码的意思是通知接收方,当收到11后边的内容时,不是同步信号了,是真正的数据了\n通常所说的前导码包含了(Preamle和 SFD)一共8字节,但是实际是7+1,知道每个字节的作用即可。\n[TCP/IP]() Internet protocol suite\n`网络接口层(Network Interface Layer)`: 这一层处理物理网络硬件和数据链路层的细节,确保数据正确地从一个设备传输到相邻设备。它与OSI模型的数据链路层和物理层相对应。\n\n`网络层(Internet Layer)`: 该层主要负责数据包的路由和转发,将数据从源主机传输到目标主机。IP(Internet Protocol)是在这一层实现的。这对应于OSI模型的网络层。\n\n`传输层(Transport Layer)`: 传输层提供端到端的通信,负责可靠的数据传输。TCP(Transmission Control Protocol)和UDP(User Datagram Protocol)是在这一层实现的。这对应于OSI模型的传输层。\n\n`应用层(Application Layer)`: 应用层是与最终用户或应用程序直接交互的层次。它包括各种应用层协议,如HTTP(Hypertext Transfer Protocol)、FTP(File Transfer Protocol)、SMTP(Simple Mail Transfer Protocol)等。这对应于OSI模型的会话、表示和应用层。\n[Mac]() Media Access Control\n分配给计算机网络中的网络接口的唯一标识符。它是由网络接口卡(NIC)或其他网络硬件的制造商分配的硬件地址,用于在计算机网络上进行通信。MAC地址对OSI模型的数据链路层的正常运作至关重要。\n[ATM]()\nAsynchronous Transfer Mode (ATM): ATM旨在有效地在网络上传输数据,包括语音、视频和多媒体。然而,由于在大多数数据网络应用中被以太网和互联网协议(IP)等其他技术所取代,ATM在这方面的应用已经大幅减少。\n\n[RTT]() round trip time 往返时间\n[FTP]() file transfer protocol 文件传输协议\n[SMTP]() Simple Mail Transfer Protocol)是用于在计算机网络上传输电子邮件的协议。推式协议\n[POP3]() (Post Office Protocol version 3)是一种用于从邮件服务器接收电子邮件的协议。\n[IMAP]() (Internet Message Access Protocol)是一种用于在邮件服务器和客户端之间管理电子邮件的协议。\nIMAP支持在服务器上创建文件夹(也称为邮箱或邮件目录),允许用户组织和管理邮件。这意味着邮件可以在多个设备上同步,并且在服务器上保留一份拷贝。\n[MIME]() (Multipurpose Internet Mail Extensions)是一种在互联网上广泛使用的标准,用于扩展电子邮件系统以支持文本以外的各种数据格式,如图像、音频、视频等。\n[DNS]() 使用分层的DNS服务器实现了记录主机名与主机IP地址映射关系的分布式数据库,基于UDP协议工作,使用53号端口。\nDNS服务器中维护的DNS资源记录表示为四元组`(Name,Value,Type,TTL)`,其中TTL`time to live`为记录有效 时间,Type为记录类型,有以下4种:\n• A:描述主机名与IP地址的映射,例如(relay1.bar.foo.com,145.3.3.3,A)\n• NS:描述域名与权威DNS服务器主机名映射,例如(foo.com,dns.foo.com,NS)\n• CNAME:描述主机别名与规范主机名的映射,例如(foo.com,relay1.bar.foo.com,CNAME)\n• MX:描述邮件服务器与规范主机名的映射,例如(foo.com,mail.bar.foo.com,MX)\n[OSI/RM]()(Open Systems Interconnection/reference model)\n[RDT]()\n\"rdt\" 的缩写通常代表 \"Reliable Data Transfer\",即可靠数据传输。\n[全双工与半双工]()\n`全双工(Full Duplex)`:\n\n在全双工通信中,数据可以同时在两个方向上传输。这意味着设备能够同时发送和接收数据,就像两个人进行正常的电话对话一样。\n通信双方可以同时说话和倾听,而且这两个操作是独立的,互不干扰。\n典型的全双工通信的例子包括电话通话、对讲机以及计算机网络中的全双工模式。\n\n`半双工(Half Duplex)`:\n\n当一个设备发送数据时,它不能同时接收数据,反之亦然。通信的双方需要轮流进行发送和接收。\n典型的半双工通信的例子包括对讲机(在按下对讲按钮时才能发送或接收)、传统的无线电通信以及一些计算机网络协议的半双工模式。\n[MSS]()\n`Maximum Segment Size` (最大分段大小): 在计算机网络中,MSS 通常指的是 TCP(传输控制协议)中的一个参数,表示在一个 TCP 数据报文段中的最大有效载荷(即数据部分)的大小。这个值是在 TCP 握手时由通信的两端协商确定的,它影响着网络中数据的传输效率。\n[ISN]()\nInitial Sequence Number(初始序列号\n[ssthresh]()\nSlow Start 阈值(Slow Start Threshold)\n[OSI七层参考模型]()\n• `应用层`:运行网络应用程序,互相传输报文(可视作完整数据)。\n• `表示层`:进行数据表示转换、压缩/解压缩、加密/解密等。\n• `会话层`:建立和维护不同主机上进程对话,在数据流中插入同步点。\n• `传输层`:负责端到端(进程间)完整报文数据的传输,传输的分组称为报文段,具有分段\n重组、连接控制、流量控制、差错控制的功能,使用端口号对进程寻址。\n• `网络层`:负责源主机到目的主机的分组交付,传输的分组称为数据报,具有路由和分组\n转发的功能,使用逻辑寻址(IP地址)。\n• `数据链路层`:在相邻结点间进行分组传输,传输的分组称为帧,具有流量控制和差错控\n制的功能,使用物理寻址。\n• `物理层`:在相邻结点间通过物理介质进行比特传输。"},{"title":"nand2tetris","url":"/2025/01/19/computer/notes/nand2tetris/","content":"\n# info\n\n[课程网站](https://www.coursera.org/learn/build-a-computer/supplement/Mko1W/module-0-introduction-roadmap)\n\n"},{"title":"MySQL","url":"/2025/01/19/computer/notes/MySQL/","content":"\n`Sql` `函数` `约束` `多表查询` `事务` `储存引擎` `索引` `Sql优化` `储存过程` `锁` `InnoDB核心` `MySql管理` `日志` `主从复制` `分库分表` `读写分离`\n# [基础知识]()\n[数据库]()`Database`\n[数据库管理系统]()`DataBaseManagementSystem`\n[SQL]()`Structured Query Language`\n\n`net start mysql80`\n`net stop mysql80`\n运行命令行,控制MySql服务器\n\n`mysql -u root -p`启动MySql\n\n[关系型数据库]()`RDBMS`建立在关系模型基础上,由多张相互连接的二维表组成的数据库\n\n[单行注释]() `--`或`#`\n\n$$ SQL\\left\\{\n\\begin{array}{lcl}\nDDL:definition定义数据库对象(数据库,表,字段)\\\\\nDML:manipulation对数据进行增删改\\\\\nDQL:query查询表的记录\\\\\nDCL:control创造数据库用户,控制访问权限\\\\\n\\end{array} \\right.$$\n\n\n`VO类(Value Object)`:\n用于封装数据,通常是不可变的对象,用于在不同层之间传递数据。VO类只包含属性的定义和访问方法,不包含业务逻辑。\n`DAO类(Data Access Object)`:\n负责与数据库进行交互,提供对数据库的增删改查等操作。DAO类封装了数据访问的细节,对上层提供简单的接口来操作数据库。\n`Service类`:\n处理业务逻辑的核心层,负责协调不同的DAO类和其他Service类来完成具体的业务功能。Service类封装了复杂的业务逻辑,对上层提供高层次的接口。\n`Factory类`:\n负责创建和管理其他类的实例,可以用于解耦和灵活地管理对象的创建和生命周期。Factory类可以通过依赖注入等方式将所需的实例传递给其他类。\n\n# `mycli` 挺方便的一个mysql命令行工具,有着自动提示等功能\n```\n$ mycli local_database\n$ mycli -h localhost -u root app_db\n$ mycli mysql://amjith@localhost:3306/django_poll\n```"},{"title":"疯狂java讲义","url":"/2025/01/19/computer/books/疯狂java讲义/","content":"\n# [1 java语言概述与开发环境]()\n`javac -d destdir srcFile` 编译srcFile这个java文件在destdir路径生成class文件,当前路径可以用`.`来表示\n# [2 理解面向对象]()\n# [3 数据类型与运算符]()\n# [4 流程控制与数组]()\n# [5 面向对象]()\n# [6 面向对象]()\n# [7 java基础类库]()\n# [8 java集合]()\n# [9 泛型]()\n# [10 异常处理]()\n# [11 AWT编程]()\n# [12 swing编程]()\n# [13 MySQL数据库与JDBC编程]()\n# [14 注解annotation]()\n# [15 输入输出]()\n# [16 多线程]()\n# [17 网络编程]()\n# [18 类加载机制与反射]()"},{"title":"java核心技术卷一","url":"/2025/01/19/computer/books/java核心技术卷一/","content":"\njava中数组没有指针运算\n# [第十章 图形用户界面程序设计]()\nJFrame\n# 第十一章 Swing用户界面组件\n\n# 第十二章 并发\n"},{"title":"C++ Primer Plus","url":"/2025/01/19/computer/books/C++ Primer Plus/","content":"\n>作为C++经典\n# [5 循环和关系表达式]()\n`int x=(1,024);`值为二十\n# [6 分支语句和逻辑运算符]()\n`and or not`都是C++中的保留字,如果C想用,包含头文件`<ios646.h>`\n`ofstream`对象,格式类似于`cout`,实现文件输入与输出。有子函数`open(),close()`\n# [7 函数 C++的编程模块]()\n函数原型中不必提供变量名,只需有数据类型就行\n(...) 表示不指定参数\n在编译阶段进行的原型化被称为<u>静态类型检查</u>\narguement 表示实参,parameter表示形参\n指针和`const`,这两个一结合就麻烦起来了\n与C不同,C++不允许main()调用自己\n递归,分治思想 divide-and-conquer strategy\n获取函数地址的方法很简单,只需要使用函数名(后边不加括号)即可。\n`double pm(int);`\n`double (*pf)(int)`\n`pf =pam;`\n则定义出一个指向pm()的函数指针,这个函数指针可以这么用`pf(4)`,等价于`(*pf)(4)`\n忍受逻辑上无法自圆其说的观点正是人类思维活动的特点。\n# [8 函数探幽]()\n如果实参与引用参数不匹配,C++将生成临时变量。当前,仅当参数为const引用时,C++才允许这样做,但以前不是这样。\n**左值** 可被引用的数据对象。\n`long edge =5L;`5L代表long类型的5\n如果接受引用参数的函数的意图是修改作为参数传递的变量,则创建临时变量将阻止这种意图的实现。解决方法是,禁止创建临时变量,现在的C++标准正是这样做的(然而,在默认情况下,有些编译器仍将发出警告,而不是错误消息,因此如果看到了有关临时变量的警告,请不要忽略)。\n\n`&&`表示右值引用。右值,不能通过地址访问的值。\n`NULL`在C中是(void*)0,C++中为整数0.c++中当一个指针的值为0时,认为指针为空指针\n`void*`无类型指针\n[返回引用]()主要是为了更高的效率,减少拷贝。\n要为某个参数设置默认值,则必须为他右边的所有参数提供默认值。\n[函数重载]() 关键是函数特征标(function signature),即函数参数列表。\n[函数模板]()\n`template<typename AnyType>`定义了一种无类型变量`AnyType`\n\n>实例化和具体化\n\n`decltype(x) y`make y the same type as x\n# [9 内存模型和名称空间]()\n\n\n不要使用#include来包含源代码文件,这样做将导致多重声明。\n\n`#ifndef` if not define\n\n\n`register int x;`\n指出程序员想使用一个自动变量,在C++11中,这种提示作用也失去了,保留关键字register的重要原因是,避免使用了该关键字的现有代码非法。\n\n$$ 链接性\\left\\{\n\\begin{array}{lcl}\n外部\\\\\n内部\\\\\n无\\\\\n\\end{array} \\right.$$\n\n[cv限制符]() const和volatile\n`const`表明内存被初始化后程序便不能再对它进行修改\n`volatile`表明,即使程序代码没有对内存单位进行修改,其值也可能发生变化\n\n[mutable]() 指出某个变量可以被修改\n\n对函数使用static修饰表明该函数只在这个文件中可见\n# [10 对象和类]()\n[接口]() 一个共享框架,供两个系统交互时使用。"},{"title":"软件开发","url":"/2025/01/19/computer/base/软件开发/","content":"\n# 软件架构\n\n构造过程类型:\n* 自顶向下 top-down\n* 自底向上 bottom-up\n* 迭代式 Iterative\n* 增量式 Incremental\n* 模块化 Modular\n\n\n设计模式类型:\n* 创建型 Creational\n* 结构型 Structural\n* 行为型 Behavioral\n* 并发型 Concurrency\n\n"},{"title":"计算机组成原理","url":"/2025/01/19/computer/base/计组/","content":"\n`RISC` Reduced Instruction Set Computer"},{"title":"Algo","url":"/2025/01/19/computer/base/算法/","content":"\nwhile(True)作为一种无限循环思想,然后用break跳出"},{"title":"win10","url":"/2025/01/19/computer/base/win10/","content":"\n>`Win+Shift+S`就可以快速截图了\n>当我们打开很多窗口的时候,想快速将其他窗口最小化,只需要拖动当前窗口快速「抖动」两下即可实现。\n\n>`Alt+Tab`快速切换到不同的窗口视图,`shift+tab`反向切换。\n`Ctrl+Tab`快速切换浏览器窗口\n\n[chrome开启夜间模式]() 打开chrome://flags 搜索force dark mode\n\n# 虚拟桌面\n\n>ctrl+win+d 新建虚拟桌面\nctrl+win+`->` 切换虚拟桌面\n\n>win+tab 弹出窗口总览\n\n`f11`调整网页全屏\n`F1`帮助\n`F2`改名\n`F5`刷新\n`tab`改变焦点\n`Ctrl+D` 打开“添加收藏”面版(把当前页面添加到收藏夹中)\n`ctrl+W` 关闭当前页面\n`Ctrl+Y` 重做刚才动作(一般只用于文本操作)\n`Ctrl+*` 恢复当前页面的缩放为原始大小\n`alt+f4`关闭当前应用\n`win+tab` 在打开的项目之间切换\n`win+a`电脑通知栏\n`win+q`全局搜索界面\n`win+h`语音输入\n\n机器开机出现标志的时候按`F10`进入BIOS(不同品牌不一样,我的是`F2`)\n\n[修改任务栏图标颜色]()\nHKEY_CURRENT_USER\\Software\\Microsoft\\Windows\\CurrentVersion\\Themes\\Personalize\n\n修改的ColorPrevalence值为1 # 值=0 黑色;值=1或2 白色\n修改SystemUsesLightTheme的值为0 # 值=0 白色;值=1 黑色\n\n[系统文件]() LocalLow 文件夹与Local 文件夹基本相同,区别在于前者用于优先级较低的应用程序(运行时安全设置受限)\n\n2023-0616 Computer\\HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Control\\Session Manager\\Memory Management这里把Large System Cache改成了1\n如果是针对某款游戏或程序要禁用全屏优化,可以直接点击游戏exe文件右键[属性-兼容性-禁用全面优化]勾上就行。\n\n```\nnetstat -ano\n//查询后门程序连接\n```\n```\nrename *.* ?????-original.*\n```\n\n`*.*`表示此文件夹中任何文件\n`?????`表示保留原始文件名的前五个字符\n`-original`在每个文件名末尾加上这些字符\n`netsh wlan show profile HIT-WLAN key=clear` 显示已保存的互联网`HIT-WLAN`密码\n`osk`打开on-screen keyboard\n`telnet towel.blinkenlights.nl`观看星球大战\n[BAT]() batch批处理\n[CLI]()(Command Line Interface,命令行界面)\n`echo .>filename` 创建一个无后缀文件\n//DONE 不知道为什么注册表右键添加不能用(也已经在注册表写了没删),我准备用AutoHotkey搞一个\n我添加了右键本目录cmd选项,这样我就可以输入\necho .> filename 来快捷建立新文件了(会使文件添加一个.)\necho. > filename 会使文件添加一个 (空格)\n\n\n# windows下禁用笔记本自带键盘\n管理员运行cmd2. sc config i8042prt start=disabled3. 重启win10 1803亲测可用。但是注意这里有个坑,网上能搜到的教你恢复的方法都是不管用的,最起码win10下不管用,sc config i8042prt start=auto是恢复不了的,要用sc config i8042prt start=demand才行。对应的注册表位置:[HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Services\\i8042prt]\"Start\"=dword:00000003 // 对应start= demand,服务类型:手动\"Start\"=dword:00000004 // 对应start= disabled,服务类型:禁用\n\n[环境变量]()\n当前执行的程序如果在当前目录不存在,win10会自动去名为path的环境变量中查找。\n环境变量没有区分大小写,例如path跟PATH是一样的\n如果系统变量和用户变量的PATH中同时包含了同一个命令,则优先执行系统变量PATH中的命令\n\n```\nnetsh winsock reset //修复网络LSP\n```\n# 注册表\n\n[鼠标右键功能键]()\nHKEY_CLASSES_ROOT\\*\\shellex\\ContextMenuHandlers\nHKEY_CLASSES_ROOT\\Directory\\shell\nHKEY_CLASSES_ROOT\\Directory\\shellex\\ContextMenuHandlers\nHKEY_CLASSES_ROOT\\Folder\\shell\nHKEY_CLASSES_ROOT\\Folder\\shellex\\ContextMenuHandlers\n[资源管理器左侧功能]()\n;取消文件资源管理器左侧 下载 文件夹\n\n[-HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Explorer\\MyComputer\\NameSpace\\{088e3905-0323-4b02-9826-5d99428e115f}]\n\n;取消文件资源管理器左侧 3D对象 文件夹\n\n[-HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Explorer\\MyComputer\\NameSpace\\{0DB7E03F-FC29-4DC6-9020-FF41B59E513A}]\n\n;取消文件资源管理器左侧 图片 文件夹\n\n[-HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Explorer\\MyComputer\\NameSpace\\{24ad3ad4-a569-4530-98e1-ab02f9417aa8}]\n\n;取消文件资源管理器左侧 音乐 文件夹\n\n[-HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Explorer\\MyComputer\\NameSpace\\{3dfdf296-dbec-4fb4-81d1-6a3438bcf4de}]\n\n;取消文件资源管理器左侧 桌面 文件夹\n\n[-HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Explorer\\MyComputer\\NameSpace\\{B4BFCC3A-DB2C-424C-B029-7FE99A87C641}]\n\n;取消文件资源管理器左侧 文档 文件夹\n\n[-HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Explorer\\MyComputer\\NameSpace\\{d3162b92-9365-467a-956b-92703aca08af}]\n\n;取消文件资源管理器左侧 视频 文件夹\n\n[-HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Explorer\\MyComputer\\NameSpace\\{f86fa3ab-70d2-4fc7-9c99-fcbf05467f3a}]\n[改paint为默认照片查看器]()\nHKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows Photo Viewer\\Capabilities\\FileAssociations,这里新建字符串值,名字为.png或.jpg,值设为PhotoViewer.FileAssoc.Tiff,即可出现原来的图片查看器。(发现都不好用)\n[隐藏右下角图标]()\n在注册表中寻找以下路径:HKEY_CURRENT_USER\\Software\\\\(你的应用),右键它——新建——DWORD (32 位) 值,将新建的注册表命名为:hideTrayIcon,将值赋为1.\n[启动项]()\nHKEY_LOCAL_MACHINE\\Software\\Microsoft\\Windows\\CurrentVersion\\Run\nHKEY_LOCAL_MACHINE\\Software\\Microsoft\\Windows\\CurrentVersion\\RunOnce\nHKEY_LOCAL_MACHINE\\Software\\Microsoft\\Windows\\CurrentVersion\\RunServices\nHKEY_CURRENT_USER\\Software\\Microsoft\\Windows\\CurrentVersion\\Run\n...\n在 Windows 中,要实现右键菜单中包含“在此处打开命令提示符”选项,您可以使用注册表编辑器添加一个注册表项。请注意,修改注册表可能会对系统产生影响,因此在进行此类更改之前,请确保备份您的注册表。\n\n以下是通过注册表编辑器添加右键菜单选项的步骤:\n\n1. **打开注册表编辑器:**\n - 按下 `Win + R` 打开“运行”对话框。\n - 输入 `regedit` 并按下 Enter。\n\n2. **导航到适当的注册表路径:**\n - 转到以下注册表路径:\n ```\n HKEY_CLASSES_ROOT\\Directory\\Background\\shell\n ```\n\n3. **在“shell”键下创建一个新的项:**\n - 在 \"shell\" 键下右键单击,选择“新建” > “项”。\n - 将新项命名为你想要显示在右键菜单中的名称,比如 \"OpenCmdHere\"。\n\n4. **在新项下创建子项 “command”:**\n - 在新创建的项下右键单击,选择“新建” > “项”。\n - 将新项命名为 \"command\"。\n\n5. **设置默认值:**\n - 在右侧窗格中,双击 \"Default\" 项。\n - 在弹出的编辑字符串对话框中,将数值数据设置为:\n ```\n cmd.exe /s /k pushd \"%V\"\n ```\n\n 这个值将打开一个新的命令提示符窗口,并将当前目录设置为资源管理器中右键单击的目录。\n\n6. **关闭注册表编辑器:**\n - 保存更改并关闭注册表编辑器。\n\n之后,您在资源管理器中右键单击文件夹时应该会看到新添加的 \"OpenCmdHere\" 选项。请注意,修改注册表可能对系统产生影响,因此在进行此类更改之前,请确保备份您的注册表。\n我发现如果直接重命名一项(只改变某个字母大小写)会报错,说已经存在这项,解决方法是先随意改名,再改成你想要的版本\n\n# 禁用笔记本自带键盘\n\n1. 管理员运行cmd\n\n2. sc config i8042prt start=disabled\n\n3. 重启\n\nsc config i8042prt start=demand 恢复\n\n注册表位置:[HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Services\\i8042prt]\n\"Start\"=dword:00000003 // 对应start= demand,服务类型:手动\n\n\"Start\"=dword:00000004 // 对应start= disabled,服务类型:禁用\n\n"},{"title":"shell","url":"/2025/01/19/computer/base/shell/","content":"\n`$?` 是一个特殊的 shell 变量,它保存了最近一次执行的命令的退出状态码(exit status code)"},{"title":"Python","url":"/2025/01/19/computer/base/python/","content":"# python基础\n单引号和双引号一样\n![符号简介](../picture/2022-09-18-15-44-32.png)\n`def` 定义函数\n`*arg `可变参数\n`from .py import function`\n`import .py as name` 起别名\n`__name__`是Python中一个隐含的变量它代表了模块的名字\n 只有被Python解释器直接执行的模块的名字才是`__main__`\n如果我们导入的模块除了定义函数之外还有可以执行代码,那么Python解释器在导入这个模块时就会执行这些代码\n`global`关键字来指示函数中的变量来自于全局作用域\n***The Law of Demeter (LoD) or principle of least knowledge***\n> is a design guideline for developing software, particularly object-oriented programs. In its general form, the LoD is a specific case of loose coupling. The guideline was proposed by Ian Holland at Northeastern University towards the end of 1987, and can be succinctly summarized in each of the following ways:\n\n>1. Each unit should have only limited knowledge about other units: only units \"closely\" related to the current unit.\n>2. Each unit should only talk to its friends; don't talk to strangers.\n>3. Only talk to your immediate friends.\n```\ndef main():\n # Todo: Add your code here\n pass\n\n\nif __name__ == '__main__':\n main()\n```\n从现在开始我们可以将Python代码按照上面的格式进行书写,这一点点的改进其实就是在我们理解了函数和作用域的基础上跨出的巨大的一步。\n在\\后面还可以跟一个八进制或者十六进制数来表示字符,例如\\141和\\x61都代表小写字母a\n`sys.getsizeof()`相当于C++的sizeof()\n`yield` 相当于return(默认为iter类型)\n\n元组(定义方式为(,,)),默认无法修改\n\n集合{}\n```\nprint(f'{a} * {b} = {a * b}')\nprint('{0} * {1} = {2}'.format(a,b,a*b))\nprint('%d * %d = %d'%(a,b,a*b))\n```\n`add()` 添加元素\n`update()`添加元素或集合\n```\nstr1 = 'hello, world!'\n# 通过内置函数len计算字符串的长度\nprint(len(str1)) # 13\n# 获得字符串首字母大写的拷贝\nprint(str1.capitalize()) # Hello, world!\n# 获得字符串每个单词首字母大写的拷贝\nprint(str1.title()) # Hello, World!\n# 获得字符串变大写后的拷贝\nprint(str1.upper()) # HELLO, WORLD!\n# 从字符串中查找子串所在位置\nprint(str1.find('or')) # 8\nprint(str1.find('shit')) # -1\n# 与find类似但找不到子串时会引发异常\n# print(str1.index('or'))\n# print(str1.index('shit'))\n# 检查字符串是否以指定的字符串开头\nprint(str1.startswith('He')) # False\nprint(str1.startswith('hel')) # True\n# 检查字符串是否以指定的字符串结尾\nprint(str1.endswith('!')) # True\n# 将字符串以指定的宽度居中并在两侧填充指定的字符\nprint(str1.center(50, '*'))\n# 将字符串以指定的宽度靠右放置左侧填充指定的字符\nprint(str1.rjust(50, ' '))\nstr2 = 'abc123456'\n# 检查字符串是否由数字构成\nprint(str2.isdigit()) # False\n# 检查字符串是否以字母构成\nprint(str2.isalpha()) # False\n# 检查字符串是否以数字和字母构成\nprint(str2.isalnum()) # True\nstr3 = ' [email protected] '\nprint(str3)\n# 获得字符串修剪左右两侧空格之后的拷贝\nprint(str3.strip())\n```\n## 函数 lambda表达式\n\n可以单独引入一个py文件中的某个函数\n\n`**kw` 表示接受任意数量的关键字参数(关键字参数是指以键值对形式传入的参数)。\n\n`*`解包运算符\n\n## 输入输出IO\n\n\n## 语法\n\nWith\n```\nThe with statement\nThe with statement is used to wrap the execution of a block\nwith methods defined by a context manager (see section With\nStatement Context Managers). This allows common try...\nexcept...finally usage patterns to be encapsulated for\nconvenient reuse\n```\n\n\n\n\n## 数学\n\n[start:stop:step]python的数组全参数\n\n区间中,正数是移,负数是本身\n\npython中的区间大部分是左闭右开,有趣,念作不到(自己想的)\n\npython的整数占内存这么多啊,一个PyObject_VAR_HEAD就24B,常规28B\n\nHARD ~a,a是正负数什么东西啊,这个取反符号看不懂\n\n/是除,//是整除\n\n两种风格输出\n```\nname=\"张三\"; age=20\nprint(\"%s的年龄是%d\"%(name,age)) #输出结果:张三的年龄是20\nprint(\"{}的年龄是{}\".format(name,age)) #输出结果:张三的年龄是20\n```\n\n# CONDA\n## `miniconda`常用指令\n创建一个新的环境:\n\nconda create --name <环境名称>\n可以使用 -n 或 --name 参数指定环境名称。可以加上 python=<版本号> 来指定安装的Python版本。\n\n激活一个环境:\n\nconda activate <环境名称>\n这将激活指定的环境。激活后,命令行提示符前会显示环境名称。\n\n退出当前环境:\n\nconda deactivate\n这将退出当前已激活的环境,返回到系统默认环境。\n\n列出所有已安装环境:\n\nconda env list\n这将显示所有已创建的环境及其路径。当前激活的环境会用星号 (*) 标记。\n\n安装包:\n\nconda install <包名称>\n这将安装指定的包及其依赖项。可以通过 conda install <包名称>=<版本号> 指定特定的包版本。\n\n升级包:\n\nconda update <包名称>\n这将升级指定的包到最新版本。\n\n移除包:\n\nconda remove <包名称>\n这将移除指定的包及其依赖项。可以加上 -y 参数来跳过确认提示。\n\n导出环境配置:\n\nconda env export > environment.yml\n这将将当前环境的配置导出到 environment.yml 文件中,包括所有已安装的包及其版本。\n\n导入环境配置:\n\nconda env create -f environment.yml\n这将根据 environment.yml 文件中的配置创建一个新的环境。\n\n查找可用包:\n\nconda search <包名称>\n这将搜索并显示与指定名称匹配的可用包。\n\n显示已安装的包:\n\nconda list\n这将显示当前环境下已安装的所有包及其版本信息。\n\n清理不再使用的包和缓存:\n\n清理不再使用的包:\nconda clean --packages\n这将清理不再被使用的包。\n清理缓存:\nconda clean --all\n这将清理不再被使用的缓存和索引文件,以释放磁盘空间。\n移除环境:\n\nconda env remove --name <环境名称>\nconda remove -n <需要删除的环境名> --all\n这将移除指定的环境。\n\n复制虚拟环境到另外一台设备:\n在Miniconda的安装路径下,找到envs文件夹,该文件夹中包含了所有的虚拟环境。找到你要拷贝的虚拟环境的文件夹,并将该文件夹复制到目标电脑Miniconda的安装路径下的envs文件夹\n在目标电脑上打开命令提示符或PowerShell,进入Miniconda的安装路径下的envs文件夹。运行以下命令来激活虚拟环境:\n\n.\\envs\\your_env_name\\Scripts\\activate\n其中,your_env_name是你想要激活的虚拟环境的名称。\n\nLinux复制虚拟环境方法\n在Miniconda的安装路径下,找到envs文件夹,该文件夹中包含了所有的虚拟环境。找到你要拷贝的虚拟环境的文件夹,将其打包成一个压缩文件,例如使用tar命令:\n\ntar -czvf my_env.tar.gz my_env\n在目标服务器上Miniconda的envs文件夹下,解压缩文件:\n\ntar -xzf my_env.tar.gz\n进入解压后的虚拟环境文件夹\n\ncd my_env\n运行以下命令来激活虚拟环境:\n\nsource activate my_env\n\n用于人工智能的python版本都不能太高,因为有包依赖的"},{"title":"openSouce","url":"/2025/01/19/computer/base/openSource/","content":"\n# 不同类型开源证书\n1. **GNU General Public License (GPL)**\n - 特点:强大的版权保护,要求衍生作品也必须以GPL发布。\n - 例子:Linux系统核心、Inkscape、MySQL、MariaDB。\n\n2. **GNU Lesser General Public License (LGPL)**\n - 特点:较弱的版权保护,适用于程序库,允许使用在商业产品中。\n - 例子:OpenOffice.org 3、CUPS、GNU Aspell。\n\n3. **Eclipse Public License (EPL)**\n - 特点:商业友好,允许构建包含EPL和非EPL代码的软件。\n - 例子:Clojure、Jetty、Java测试框架。\n\n4. **Mozilla Public License (MPL)**\n - 特点:介于严格和宽松许可证之间,项目适合商业用途,要求提供引用说明。\n - 例子:Firefox浏览器、LibreOffice、Cairo。\n\n5. **Apache License 2.0 (ASL)**\n - 特点:非版权许可证,适合商业用途,被许可方可以修改并重新分配。\n - 例子:Android、Apache Spark、Spring Framework。\n\n6. **MIT License**\n - 特点:非常灵活,适合商业用途,被许可方可以自由使用、修改和重新分发。\n - 例子:Node.js、Atom、AngularJS。\n\n7. **BSD License**\n - 特点:有三个版本,与MIT许可证相似,适合商业用途,不要求将源代码与衍生作品一起发布。\n - 例子:Django、Ruby、Redis。\n"},{"title":"makefile","url":"/2025/01/19/computer/base/makefile/","content":"\nmakefile指定整个工程的编译规则\n\n# makefile\nMakefile里主要包含了五个东西:显式规则、隐式规则、变量定义、指令和注释。\n\n## etc\n写好clean\n\n文件名最好写成 Makefile, 比 makefile 或 GNUmakefile 好\n\n## make的工作方式\n\nGNU的make工作时的执行步骤如下:(想来其它的make也是类似)\n\n 读入所有的 Makefile。\n\n 读入被 include 的其它 Makefile。\n\n 初始化文件中的变量。\n\n 推导隐式规则,并分析所有规则。\n\n 为所有的目标文件创建依赖关系链。\n\n 根据依赖关系,决定哪些目标要重新生成。\n\n 执行生成命令。\n\n## 书写规则\n```makefile\ntargets : prerequisites ; command\n command\n...\n```\n目标文件名:依赖文件;命令(;或tab间隔)\n\n---\n```makefile\nVPATH = src:../headers\n```\n指示环境路径\n\n另一个设置文件搜索路径的方法是使用make的“vpath”关键字(注意,它是全小写的),这不是变量,这是一个make的关键字,这和上面提到的那个VPATH变量很类似,但是它更为灵活。它可以指定不同的文件在不同的搜索目录中。这是一个很灵活的功能。它的使用方法有三种:\n\n`vpath <pattern> <directories>`\n 为符合模式<pattern>的文件指定搜索目录<directories>。\n\n`vpath <pattern>`\n 清除符合模式<pattern>的文件的搜索目录。\n\n`vpath`\n 清除所有已被设置好了的文件搜索目录。\n\n---\n`.PHONY : clean`\n显式指明clean为伪目标\n\n## 书写命令\n在Makefile的命令行前加一个减号 - (在Tab键之后),标记为不管命令出不出错都认为是成功的。如:\n```\nclean:\n -rm -f *.o\n```\n\n---\n定义函数\n```\ndefine\nendef\n```\n\n变量如同宏一样,`=`定义,`$()`引用\n\n---\n```\nFOO ?= bar\n```\n其含义是,如果FOO没有被定义过,那么变量FOO的值就是“bar”,如果FOO先前被定义过,那么这条语将什么也不做,其等价于:\n```\nifeq ($(origin FOO), undefined)\n FOO = bar\nendif\n```\n\n---\n`$(var:a=b)` 或是 `${var:a=b}` ,其意思是,把变量“var”中所有以“a”字串“结尾”的“a”替换成“b”字串。\n\n---\n`+=` 操作符给变量追加值\n\n---\n模式变量\n以如下方式给所有以 .o 结尾的目标定义目标变量:\n\n%.o : CFLAGS = -O\n\n## 函数\n\n字符串处理函数\n\n## make的运行\n\n-f 指定运行文件\n-d -debug=a\n\n---\n即然make可以指定所有makefile中的目标,那么也包括“伪目标”,于是我们可以根据这种性质来让我们的makefile根据指定的不同的目标来完成不同的事。在Unix世界中,软件发布时,特别是GNU这种开源软件的发布时,其makefile都包含了编译、安装、打包等功能。我们可以参照这种规则来书写我们的makefile中的目标。\n\n all:这个伪目标是所有目标的目标,其功能一般是编译所有的目标。\n\n clean:这个伪目标功能是删除所有被make创建的文件。\n\n install:这个伪目标功能是安装已编译好的程序,其实就是把目标执行文件拷贝到指定的目标中去。\n\n print:这个伪目标的功能是例出改变过的源文件。\n\n tar:这个伪目标功能是把源程序打包备份。也就是一个tar文件。\n\n dist:这个伪目标功能是创建一个压缩文件,一般是把tar文件压成Z文件。或是gz文件。\n\n TAGS:这个伪目标功能是更新所有的目标,以备完整地重编译使用。\n\n check和test:这两个伪目标一般用来测试makefile的流程。\n\n## 隐含规则\n默认规则,不再赘述\n"},{"title":"Linux","url":"/2025/01/19/computer/base/Linux/","content":"\nsudo chmod 600 ××× (只有所有者有读和写的权限)\n\nsudo chmod 644 ××× (所有者有读和写的权限,组用户只有读的权限)\n\nsudo chmod 700 ××× (只有所有者有读和写以及执行的权限)\n\nsudo chmod 666 ××× (每个人都有读和写的权限)\n\nsudo chmod 777 ××× (每个人都有读和写以及执行的权限)\n\n其中×××指文件名(也可以是文件夹名,不过要在chmod后加-ld)。\n0 [000] 无任何权限\n\n4 [100] 只读权限\n\n6 [110] 读写权限\n\n7 [111] 读写执行权限\nnano按ctrl+x退出(并询问你是否保存)\n[AltGr]()\nAltGr(Alternative Graphic)是一个键盘上的修饰键,通常位于右侧的 Alt 键旁边。它在某些国际键盘布局中存在,尤其是在欧洲和其他一些地区的键盘上较为常见。AltGr 键设计用于提供一种方式,通过按住 AltGr 键并同时按下其他键,以访问一些特殊字符、符号或国际字符。\n\nAltGr 键通常用于生成与按下普通 Alt 键时不同的字符。例如,在使用 AltGr 键时,某些键可能会产生特殊符号,例如 €、@、~、{、} 等。\n\n具体来说,AltGr 键在键盘上的位置可能因键盘布局而异。在美式键盘上,AltGr 键通常位于右侧的 Alt 键旁边,但并非所有键盘布局都包含 AltGr 键。在使用某些键盘布局时,Alt 键本身可能充当 AltGr 键,用于生成附加字符。\n\n[bash: ./setup: /bin/bash^M: bad interpreter: No such file or directory ]()\n\n这个错误通常是由于文本文件的换行符格式引起的。^M 表示回车符(Carriage Return,CR),在Unix/Linux系统中通常使用换行符(Line Feed,LF)。在Windows系统中,换行通常由回车和换行两个字符表示(CR LF)。\n\n`sed -i 's/\\r$//' setup`\n这将在文件中删除回车符,使其在Unix/Linux系统上能够正确执行。\n\n```\nsudo /usr/bin/vmhgfs-fuse .host:/ /mnt/hgfs -o subtype=vmhgfs-fuse,allow_other\n\n```\n挂载与主机共享目录"},{"title":"java","url":"/2025/01/19/computer/base/java/","content":"\nUnicode转义序列会在解析代码之前得到处理,如\"\\u0022+\\u0022\"只是一个空串。注释中的`\\u`型符号也会被处理\n[操作]()有三种不同的语法:\n* 作为`中缀、前缀或后缀运算符`。 例如,a + b调用操作+ : int × int → int。\n* 作为`对象的方法`。 例如,bigint1.add(bigint2)调用操作add: BigInteger × BigInteger → BigInteger。\n* 作为一个`功能`。 例如,Math.sin(theta)调用操作sin: double → double。在这里,Math不是一个对象。它是包含函数的类sin。\n[Static Checking]() 在运行前检查bug\n* [Static Typing]() 在编译时检查bug\n\n[Dynamic Checking]() 在运行时检查bug\n[final]() 分配一次并且永远不会重新分配的变量\n[Immutability]() immunity from change,指类型没有methods改变值,但可以重新赋值\ndouble对除以零有一个特殊返回值POSITIVE_INFINITY,因此当您将数除以零时它会返回这个值。\n有小数运算时很多运算都会变成近似运算\n[写java程序使用idea]()\n[java基本概念]()\n很早以前,java三大分支:javaSE、javaEE、javaME\n(Java EE 已经被改名且融入到 Java 企业级框架之中,Java SE 已经成为 Java 的同义词,而 Java ME 已经逐渐被忘记了。)\n[javaSE]() Standard Edition(标准版)\nJava SE 仅指 Java 技术中的基础部分,但这是一个历史遗留的概念,在很多有年代的文章中常常出现。现在不要使用这个名词了,直接使用 Java 一词即可。所以,当读者认为自己学会 Java 的时候,不要高兴得太早,这只是学完了 Java 中最基础的部分。\n[JDK]() Java Development Kit(java开发工具包)\n如果不进行严格的区分,可以认为 JDK 与 Java SE 是一种等价的概念。很早以前,Java 中还有一个 JRE(Java Runtime Environment,Java 运行环境)的概念,而现在 JRE 已被合并到 JDK 中了。\n[javaEE]() Enterprise Edition(企业版)\nWeb 容器已经内置了 Java EE 的开发工具包。2018年,Java EE 改名为 Jakarta EE。\n[javaME]()\nMicro Edition\njava ME 曾经在移动设备和嵌入式设备上使用。值得一提的是,虽然安卓属于嵌入式设备,且安卓开发大多使用 Java。但安卓开发中使用的 Java 并不是 Java ME。现在,在 Java 的相关流行技术中,Java ME 早已销声匿迹,成为时代的眼泪。\n[java创始人]() Gosling\n[java的健壮性]() java的强类型机制、异常处理、垃圾自动收集是它的保障\n[java的跨平台型]() 编译后的文件(.class)可直接分别在linux、windows系统下运行\n\n[常见错误]()\n* 语法错误:\n * 相似字符混淆\n * 中英字符错误\n * 拼写错误\n* 业务错误\n* 环境错误\n$$字符编码表\\left\\{\n\\begin{array}{lcl}\nASCII: 128个字符\\\\\nUnicode:统一两字节\\\\\nutf-8:字母一字节,汉字三字节\\\\\ngbk:字母一字节,汉字二字节\\\\\ngb2312:<gbk\\\\\nbig5:繁体中文,香港,台湾\n\\end{array} \\right.$$\n[dos]()`Disk Operating System`\n`boolean`,布尔类型,不可用0或1代替.\n[自动类型转换]() char`->`P; byte`->`short`->`P\nP: int`->`long`->`float`->`double\n`byte` `short` `char`在参与运算时会自动转换为`int`\n[强制类型转换]() 符号()\n[取模运算]() a%b =a-a/b*b\n[逻辑与`&&`和短路与`&`的区别]() 除了后者会发生短路现象外,没什么区别,同逻辑或`||`和短路或`|`\n[jshell]() Read-Eval-Print Loop工具。\n[const]()是java保留字,但并没有使用\n[final]()指示常量,相当于C++中的const\n`import static java.lang.Math.*;`\n就可以不必在数学方法名前添加前缀Math了,即[静态导入]()\n[break标签]()\n```\nlabel1:\nfor(int i =0;i<n;i++){\n label2:\n for(int j =0;j<n;j++){\n break label1;//退出双重循环\n }\n}\n```\n[嵌套定义]()在C++中,可以在嵌套的块中重定义一个变量。在内层定义的变量会覆盖\n在外层定义的变量。这就有可能带来编程错误,因此Java中不允许这样做。\n[浮点数相等判断]() 浮点数是否相等,需要有一个相等的精度,浮点数是无法在计算机中精准储存的\n[泛型for循环]()\njava没有提供运算符重载功能\n`Objects.equals()`\n`String`使用`charAt()`访问单个字符\n[Nested Classes]()`嵌套类`\nStatic nested classes, inner classes, anonymous inner classes, local classes, and lambda expressions\n[javap]() 是 JDK`Java Development Kit`中的一个工具,它用于反编译 Java 字节码文件。\n[backwards compatibility]()是指软件系统在进行更新或升级时,能够与先前版本的接口、协议或数据格式保持兼容,而不破坏现有功能或导致现有代码无法正常运行的特性。\n当某个变量没有被引用时,会被GC处理\n\n[Spring Boot]()\n\nPOM poroject object model\n"},{"title":"guide","url":"/2025/01/19/computer/base/guide/","content":"\n`Socket(套接字)`\n\n套接字(Socket)是计算机网络中用于实现进程间通信的一种方式。它可以在不同的机器之间传递数据,是网络通信的基础。套接字可以是TCP(传输控制协议)或UDP(用户数据报协议)的,分别用于不同的网络通信需求。TCP套接字提供可靠的双向通信流,而UDP套接字则提供无连接的数据报服务。\n`Select(选择)`\n\nselect 是一个用于监视多个套接字(或其他文件描述符)的函数,它可以用来检测哪些套接字准备好了进行读取、写入或有错误发生。select 通过复制文件描述符列表到调用者提供的数组中,然后等待至少有一个文件描述符准备好进行I/O操作。当select返回时,它会告诉你哪些文件描述符已经准备好了,这样程序就可以对这些文件描述符进行操作。\n`Epoll(事件轮询)`\n\nepoll 是Linux内核中的一个高效的I/O事件通知机制,它提供了一种快速、可扩展的方式来处理大量的并发连接。与select和poll相比,epoll在处理大量并发连接时更加高效,因为它使用了事件通知机制,而不是轮询机制。epoll通过创建一个epoll实例,然后将感兴趣的文件描述符添加到这个实例中,当这些文件描述符上的事件发生时,epoll会通知程序。"},{"title":"git","url":"/2025/01/19/computer/base/git/","content":"\n# info\n\n[缺失的git课程](https://missing.csail.mit.edu/2020/version-control/)\n\n\n\n# [vscode git]()\n `git init` 初始化一个仓库\n\n`完整错误`:\n\n 1 `fatal: unable to access 'https://xxxxxx': OpenSSL SSL_read: Connection was aborted, errno 10053`\n\n>Git默认限制推送的大小,运行命令更改限制大小即可 增加缓冲\n\n git config --global http.postBuffer 524288000\n\n>更改网络认证设置\n\n git config --global http.sslVerify \"false\"\n\n>更改代理\n\n`git config --global --unset http.proxy` 取消梯子代理\n直连彻底挂了用梯子:\n```\ngit config --global http.proxy 127.0.0.1:7890\ngit config --global https.proxy 127.0.0.1:7890\n```\n\n配置账户\n`git config --list`检查已有的配置信息\n`git config --global user.name \"name\"`\n`git config --global user.email \"email\"`\n`ipconfig /renew` 可以解决一部分网络连接问题\n`Stage`: 暂存区,将代码暂存到本地仓库但不上传。\n`Stash`:本地缓存,在切换分支但不提交当前分支时使用\n\ngit不知道出什么问题了,github端一直回退版本,莫名其妙,都很邪乎。\n乐,是我梯子的问题,真的依托答辩。\n\n# [gitignore]()\n\n忽略所有以 .a 结尾的文件\n`*.a`\n\n不能忽略所有 lib.a 文件\n`!lib.a`\n\n仅仅忽略当前目录下的 TODO 文件\n`/TODO`\n\n忽略 build 目录下的所有文件\n`build/`\n\n仅仅忽略 doc 一个目录下的所有 .txt 文件\n`doc/*.txt`\n\n忽略 doc 目录下(包括子目录)的所有 .pdf 文件\n`doc/**/*.pdf`\n\n`git rm --cached test.txt`忽略已上传的文件\n`git rm -r --cached folder/`忽略已上传的文件夹\n`git add -f test.txt` 重新添加被忽略的文件\n`git push -f origin master`强制上传覆盖远程文件,这个命令在团队开发的时候最好不要用,否则可能会有生命危险\n\n`git config --global core.quotepath false`解决中文名文件无法正常显示问题\n\n# [IDEA git]()\n\n解决网络错误:\n`git config --global http.sslBackend openssl`\n`git config --global http.sslVerify false`\n\ngit alias\ngit log --graph --oneline --decorate\ngit reset --hard origin/master 强制覆盖本地文件\nrm -rf .git\n\n`git pull` = `git fetch` + `git merge`\n `Recv failure: Connection was reset`错误\n\n1. 检查防火墙设置:有时防火墙可能会阻止 Git 连接到远程仓库。确保你的防火墙设置允许 Git 通过。你可以尝试暂时禁用防火墙,然后再次尝试 Git 操作,以查看是否仍然出现错误。\n\n2. 检查代理设置:如果你在使用代理服务器来连接互联网,确保你的代理设置是正确的。你可能需要配置 Git 来使用代理服务器。"},{"title":"front-end","url":"/2025/01/19/computer/base/front-end/","content":"\n# [Front-end/Web 开发]()\n [CGI]() common gateway interface 公共网关接口\n[script]() 脚本语言,是介于HTML和Java、C++和Visual Basic之类的编程语言之间的语言。\n[javascript]() 是一种基于对象(Object)和事件驱动(Event Driven)并具有安全性能的脚本语言。\n[pps]() precision positioning system网络吞吐率\n[API]() application program interface应用程序界面\n\n---\n[网络搜索]()\n\n[inurl:,intitle,intext]() 搜索功能值\n[网站后缀]() `com`商业公司,`gov`政府机构,`edu`教育机构,`net`网络服务提供,`org`组织协会机构,`int`国际组织,`co`社区或公司,`info`信息服务提供,`mil`军事机构\n[时间限制]() x..y从x年到y年\n[指定网站搜索]() 关键词 site:网站网址\n\n---\n$$ 应用软件\\left\\{\n\\begin{array}{lcl}\n单机软件(本地应用程序与本地服务端)\\\\\nC/S结构(本地应用程序与服务器服务端)\\\\\nB/S结构(浏览器访问)\\\\\n\\end{array} \\right.$$\n[胖客户端Fat client]() 是在本地安装了丰富资源的网络电脑,而不是像瘦客户端那样把资源分散到网络中。比如很多PC(个人电脑)就是胖客户端\n[HTTP]() 用于传输超媒体文档(例如HTML)的应用层协议\n<img width=\"800\" height=\"300\" src=\"../picture/Snipaste_2023-02-27_15-57-31.png\">\n<img width=\"600\" height=\"300\" src=\"../picture/Snipaste_2023-02-27_16-18-30.png\">\n动态网页技术:\n* [PHP]() hypertext preprocessor\n* [JSP]() Java Server Pages JavaEE的动态网页技术\n* [ASP:Active Server Pages]() 微软公司windows平台动态网页技术\n* [ASP.NET]() 微软.NET平台动态网页技术\n* [Python]() Django\n* [Node]() Express\n\n\n[前端框架]()\n* Angular\n * google\n * typescript\n* React\n * facebook\n * javascript\n* Vue\n * 尤雨溪\n\n[后端框架]()\n* Java Servlet\n* SpringBoot\n* Node Express\n* PHP\n* ASP.NET\n* Python\n* C++/Golang\n*\n[浏览器内核]()\n* Trident IE内核\n* Gecko Firefox内核\n* Webkit Safari内核\n* Blink Chrome内核\n\n[DAO模式]() data Acess Object\n## [HTML]() HyperText Markup Language超文本标记语言\n\ndocument.write() 方法仅用于测试。\n[子元素 后代元素]()\n子元素是指一个元素内部的第一层子元素,也就是直接作为该元素子节点的元素。\n后代元素是指一个元素内部包含的所有嵌套元素\n\n[渲染Render]() 浏览器将HTML,CSS,JS展示在页面的过程称之\n[嵌套元素]() 将一个元素置于其他元素之中\n[空元素(自闭和标签)]() 不含任何内容的元素,如`<img>`\n <center> <img width=\"600\" height=\"300\" src=\"../picture/Snipaste_2023-03-01_16-25-45.png\">\n <img width=\"600\" height=\"300\" src=\"../picture/Snipaste_2023-03-01_16-28-25.png\">\n <img width=\"600\" height=\"300\" src=\"../picture/Snipaste_2023-03-01_16-38-30.png\">\n\n## [CSS]() 层叠样式表(Cascading Style Sheets\n一种描述HTML(以及其他XML`extensible Markup Language`)文档样式的语言\n\n[七种主要的CSS处理方式]()\n\ncss语法:\n\n<img src=\"../picture/Snipaste_2023-03-05_22-50-36.png\">\n[选择器]()\n* 元素\n* id\n* 类\n* 通用 用`*`表示选择所有元素\n* 分组 元素的合并分组 `,`\n* 后代 `.`\n* 子元素 `>`\n* 相邻兄弟 `+`\n* 兄弟 `~`\n\n[使用CSS的方法]()\n* 内部CSS 在`<head>`区用`<style>`标签定义\n* 外部CSS 用`<link>`以外部文件方式引入\n* 行内CSS 以`style=\"\"`方式定义\n\n[盒子模型]() 网页中的每个元素都可以看作一个盒子模型\n[CSS布局]()\n* 弹性布局`Flex Box`\n* 网格布局`Grid`\n* 响应式布局`自适应布局`\n## [JavaScript]() 运行在浏览器中的Web前端脚本语言\n[ECMAScript]()是标准,JS是ES的一种实现或方言\n```\nvar x = new String();\nvar y = new Number();\nvar z = new Boolean();\n```\n字符串、数值或逻辑对象。他们会增加代码的复杂性并降低执行速度。\n使用var声明的变量会提升`hoisting`,即在声明之前就可以使用\n[小驼峰]() js推荐使用小驼峰命名变量\n### [DOM]() `Document Object Model` 文档对象模型\n[BOM]() `Browser Object Model` BOM包含DOM\n#### [AJAX]() `Asynchronous Javascript And Xml` 不刷新页面更新网页\n[get请求]()\n```\nconst xhr = new XMLHttpRequest();\nxhr.onreadystatechange = function() {\n if (xhr.readyState === 4 && xhr.status === 200) {\n console.log(xhr.responseText);\n }\n};\nxhr.open(\"GET\", \"https://example.com/data.json\");\nxhr.send();\n```\n[post请求]()\n```\nconst xhr = new XMLHttpRequest();\nxhr.onreadystatechange = function() {\n if (xhr.readyState === 4 && xhr.status === 200) {\n console.log(xhr.responseText);\n }\n};\nxhr.open(\"POST\", \"https://example.com/data\");\nxhr.setRequestHeader(\"Content-Type\", \"application/json\");\nxhr.send(JSON.stringify({key: \"value\"}));\n```\n#### [JSON]() `JavaScript Object Notation` 一种储存和交换数据的语法规范\n并列的数据用`,`分割\n映射用`:`表示\n并列数据的集合(数组)用`[]`表示\n映射的集合(对象)用`{}`表示\n### [jQuery]() 最受欢迎的JavaScript库,是一套封装好的操作DOM的语法\n### [**JS语法规则**]()\n[数值]() 不分整数和浮点数,所有都是64位浮点,整数可精准15位,小数可精准17位\n[对象构造器]() 可以创造类型相同的多个对象,利用`this`\nES6中使用类替换了它\n[# 私有成员]()\n[static 静态成员]()\n[prototype]() 为对象构造器增加属性\n[extends]()继承\n[模块]() 一个js文件就是一个模块,`export`导出,`import`导入\n[默认导出]()是匿名函数,关键字default\n#### [异步操作]()\n[async和await]()\n[标志符]()以字母,下划线或美元符号开头\n[定义变量和输出]()\n```\nvar a =5;//非块作用域(全局变量)\n{let b =2;}//b无法在这块作用域以外使用\nlet a =[];//数组\nlet f =function(){};//函数\nlet g ={};//对象\nconsole.log(a);//输出a\n```\n[解构赋值]()\n```\nlet[a,b] =[5,7];//let a =5,b =7;\n```\n[操作符]() 算数、关系、布尔、位、赋值\nJS不区分整数和浮点数,所有数值都是64位,整数可精确15位,小数可精确17位\n<img width=300 height=100 src=\"../picture/Snipaste_2023-03-10_00-57-32.png\">\n`${}` 反引号表示法,包含的字符串称为`模板字符串`\n[类 class]() js中类是函数\n`===`值等于且类型等于\n\n# [node]()\n是一个开源、跨平台的 JavaScript 运行时环境,它允许开发者使用 JavaScript 语言在服务器端构建高性能、可扩展的网络应用程序。\n\n[函数式组件]() 首字母大写的js函数,函数返回虚拟DOM\n[render]() 在Web开发中,\"render\"一般指将数据转化成HTML页面的过程。\n\n# [Vue]()\n[插值表达式 Interpolation Expression]()\n允许将变量或表达式的值动态地嵌入到字符串中,以形成最终的字符串结果。\n[el挂载点]() element mounting point\n[nvm 的坑]()在你每次切换版本之后,必须切换 全局模块和全局缓存 的文件位置,不然你安装的全局库全都无法使用:# 比方说我切换到 18\n`nvm use 18.14.0`\n全局下载配置必须修改(配置到你安装 nvm 地址的地方)\n`npm config set prefix D:\\nvm\\v18.14.0`\n`npm config set cache D:\\nvm\\v18.14.0`\n垃圾nvm,不能用\nSCSS(Sassy CSS)是一种CSS预处理器,它扩展了普通CSS的功能,使得样式表更加模块化、易于维护和可重用。\n\n[2024-03]() 原来`<router-view>`是`<router-link>`的占位符,我调了一天没想明白为什么`<router-link>`不管用,乐死了\n\n `RSS`全称是“Really Simple Syndication”(真正简易的聚合),是一种消息来源格式规范,用来发布经常更新的信息,如博客文章、新闻头条、音频、视频等。RSS使用户能够通过RSS阅读器或者聚合工具订阅网站,自动获取更新内容,而无需直接访问网站。这样,用户可以通过一个统一的界面浏览自己感兴趣的各种网站的最新内容。\nRSS文件是基于XML(可扩展标记语言)的,包含了内容更新的标题、描述、发布日期和链接等信息。当网站内容更新时,RSS文件也会相应更新,订阅了该RSS源的用户能够通过他们的RSS阅读器看到新的内容和更新。"},{"title":"database","url":"/2025/01/19/computer/base/database/","content":"\n[DBA]() Database Administrator数据库管理员\n\n"},{"title":"cmake","url":"/2025/01/19/computer/base/cmake/"},{"title":"C","url":"/2025/01/19/computer/base/C/","content":"\n## `<unistd.h>`\n的名字来源于“Unix standard”(Unix标准)的缩写。这个头文件定义了符合POSIX(Portable Operating System Interface,可移植操作系统接口)标准的接口,提供了一套操作系统级别的API,使得应用程序可以在不同的Unix-like系统之间进行移植。POSIX标准旨在提供一个统一的操作系统编程接口,以促进软件在不同Unix系统之间的兼容性和可移植性。\n\n\n## `termios.h`\n是一个C语言的头文件,用于POSIX(Portable Operating System Interface)系统上的终端I/O接口。这个头文件提供了对终端接口进行控制的API,允许程序员配置和管理终端或伪终端的行为,例如设置字符回显、行处理、控制字符等。\n\n名称`termios`来源于“terminal input/output settings”(终端输入/输出设置)的缩写,强调了这个API集主要用于控制终端I/O行为的设置。在早期Unix历史中,终端是用户与计算机交互的主要方式,因此对终端行为的精细控制是非常重要的。随着时间的发展,虽然用户交互方式更加多样化,但`termios`接口仍然是在Unix-like系统中控制和配置基于文本的输入/输出设备的基础。\n\n`termios`API代表了对更早Unix终端控制接口的一个进化,它提供了比旧的`termio`和`sgtty`接口更一致和更灵活的方式来处理终端设置。通过`termios`,程序可以以非常精细的方式控制终端的各种模式,使得创建诸如文本编辑器、终端模拟器等复杂的文本界面应用成为可能。\n\n`&=:`这是位操作符中的按位与赋值操作符"},{"title":"C++","url":"/2025/01/19/computer/base/C++/","content":"\n# [C++]()\n`cs架构`client-server模式\n我把快捷方式里的alt加数字改成了ctl加数字\n\n`stl`\n1. containers\n2. algorithms\n3. iterators\n\n`freopen(\"1.out\",\"w\",stdout); `\n\n通常,编写清晰、容易理解的代码比使用语言的晦涩特性来显示自己的能力更为有用。\n\n---\n[降低cin,cout时耗]()\n```\ncin.tie(0);\nios::base::sync_with_stdio(false);\n```\n算法使用的内存空间分为三种:\n1. **指令空间**:编译后,程序指令所使用的内存空间。\n2. **数据空间**:算法中的各项变量使用的空间,包括:声明的常量、变量、动态数组、动态对象等使用的内存空间。\n3. **栈帧空间**:程序调用函数是基于栈实现的,函数在调用期间,占用常量大小的栈帧空间,直至返回后释放。\n---\n有些时候,使用晦涩特性不是用来展示自己能力的,而是用来提升程序运行效率和实现更多功能的。\n任何一门语言中都没有没用的特性,语言特性设计出来就一定有其需求。\n比如下面几行\n```\nr=x&-x;\na^=b^=a^=b;\nr=(x>>(a-1))&1;\n```\n---\n用来注释掉代码\n```\n#if 0\n#endif\n```\n\n---\n\n`KPM算法` 串的模式匹配\n`最长相等前后缀` 字符串最长的相等长度前缀和后缀,不包含字符串本身。\n `balanced binary tree` 平衡二叉树,又称AVL树(两个人名)。\n  是一种循**关键码**访问的二叉树,并且要求保持顺序性,即任一节点不小于其左后代,不大于其右后代\n`堆` 一颗完全二叉树,某个结点的值总是不小于或者不大于其父节点的值,不大于的称为大堆,反之称为小堆。\n[兼容]()\n直译有一个问题, 英语的\"前后\"在时间和空间上统一, 而汉语却是相反. 比如forward在空间上指前进, 在时间上指未来. 但是汉语中的\"前\"在空间上指前进, 在时间上却指过去.\n**向前兼容**前进兼容\n**向后兼容**后退兼容\n[vsode终端]() 输入chcp (change code page)后,显示936 对应 GB 2312,65001 对应 UTF-8,windows 中文系统默认是 936。\n[cwd]() change word to double word\n[malloc]() memory allocation 内存分配\n`<a id=\"\"></a>`出bug了,烦\n这个不清楚是什么样的bug,重启一次又没了\n[CRUD]() Create Read Update Delete\n\n---\n\n[PNG]()`Portable Network Graphics` 便携式网络图形,是一种采用无损压缩算法的位图格式,支持索引、灰度、RGB三种颜色方案以及Alpha通道等特性\n[API]()`Application Program Interface`应用程序界面\n转义用的是右斜`\\`\n`shift+tab`反向缩进\n[代码风格]()\n行尾风格:\n```\ntest{\n\n}\n```\n次行风格:\n```\ntest\n{\n\n}\n```\n\n\n[MSC]() microsoft management console\n[CPL]() Presentation(Compel) \"演示强制\"\n[FAT]() File Allocation Table 文件分配表\n[FCFS]() first come first service\n[无穷]()\n正无穷 0x3f3f3f3f`1061109567`\n负无穷 0xc0c0c0c0`-1061109568` 或 -0x3f3f3f3f\n\n---\n[DHCP]()`Dynamic Host Configuration Protocol`,动态主机配置协议:计算机用来获得配置信息的协议。\n\n---\n`0x`16进制,`0b`二进制,`NaN`非数值,\n[PHP]()personal home page,之后解释为hypertext preprocessor\n[wine]() Windows Emulator,之后解释为Wine Is Not an Emulator\n[GNU]() 许可证`GPL`: General Public License; 编译器`GCC`: General C Compiler,加入其他语言后改为Compilor Collection; 则GNU可能是General Not Unix.\n[NTFS]() New Technology File System,以`簇`为最小读写单元\n<img width=\"1200\" height=\"100\" src=\"../picture/1675944543421.jpeg.png\">\n\n`typeid().name()`输出所属类型的首字母\n\n---\n[pure virtual function]() 纯虚函数,表示抽象类,在函数末由`=0`标记"},{"title":"AI","url":"/2025/01/19/computer/base/AI/","content":"# gpt原理\nGPT(Generative Pre-trained Transformer)是一个基于Transformer架构的生成式预训练模型,广泛用于各种自然语言处理(NLP)任务,如文本生成、翻译、摘要等。GPT的核心原理包括预训练和微调两个阶段,通过在大规模文本数据上预训练模型,然后针对特定任务进行微调,以达到较好的性能。以下是GPT原理的详细解释:\n\n### 1. Transformer架构\nGPT基于Transformer架构,特别是其解码器部分。Transformer模型由编码器(Encoder)和解码器(Decoder)组成,但GPT只使用了解码器结构。解码器主要由自注意力机制(Self-Attention Mechanisms)和前馈神经网络(Feed-Forward Neural Networks)构成。自注意力机制允许模型在处理每个单词时,考虑到输入序列中的所有单词,从而捕获词与词之间的关系。\n\n### 2. 预训练\nGPT通过在大规模未标注文本数据上进行预训练来学习语言模式和知识。这一阶段主要使用语言模型任务,即给定一段文本序列,模型需要预测序列中的下一个单词。这种自回归(Autoregressive)方式使得模型能够学习到文本中的长距离依赖关系和丰富的语言知识。\n\n### 3. 微调\n在预训练阶段学习到通用语言知识后,GPT可以通过微调(Fine-tuning)过程来适应特定的下游任务,如文本分类、问答等。在微调阶段,模型在特定任务的有标签数据上进行训练,微调预训练阶段学到的参数,以提高在特定任务上的性能。\n\n### 4. 生成式预测\nGPT作为生成式模型,能够生成连贯、有意义的文本。在给定前缀文本的情况下,模型通过重复预测下一个单词,直到生成整个句子或段落。这一过程利用了模型在预训练阶段学到的语言模式和知识。\n\n### 5. 注意力和位置编码\n自注意力机制是GPT的核心,它使得模型能够关注到输入序列中的不同部分。同时,GPT还使用位置编码来处理序列数据中的顺序信息,使模型能够理解单词在序列中的位置关系。\n\n### 6. 层次结构\nGPT模型包含多层Transformer解码器层,每一层都包括自注意力机制和前馈神经网络。随着层数的增加,模型能够捕获更复杂的语言特征和模式。\n\nGPT模型通过其独特的架构和训练方法,在自然语言处理领域展现出了强大的能力和灵活性。随着模型版本的更新(如GPT-2、GPT-3等),其性能和应用范围也在不断扩大。****\n# gpt4特殊点\nGPT-4相对于GPT-3和之前的版本,在架构原理上并没有根本性的变革,它依然基于Transformer架构和自回归(Autoregressive)的预训练方法。然而,GPT-4在多个方面进行了优化和改进,使得其性能大幅提升,这些改进主要体现在模型规模、数据处理、训练策略、效率和灵活性等方面。下面是GPT-4相比早期版本更为“高级”的几个关键点:\n\n### 1. 模型规模\nGPT-4的模型规模远超过前代产品,拥有更多的参数,这使得它能够更好地学习和理解复杂的语言模式和知识。参数量的增加有助于提高模型的表现力,使其在各种任务上都能达到更高的准确率。\n\n### 2. 训练数据和预训练技术\nGPT-4使用了更大规模和更多样化的数据集进行预训练,这包括从更广泛的来源收集的文本数据。此外,它采用了更先进的数据清洗和预处理技术,以及改进的训练策略,如对抗性训练、数据增强等,这些都有助于模型更好地泛化和理解复杂的语境。\n\n### 3. 优化和效率\n虽然模型规模的扩大会增加计算需求,但GPT-4在算法优化和计算效率方面也进行了显著的改进。这包括更有效的参数使用、改进的训练算法,以及对硬件的优化支持,从而使大规模模型的训练和推理变得更加高效。\n\n### 4. 微调和适应性\nGPT-4提供了更灵活的微调和适应机制,使其能够更好地适应特定的应用场景。这包括对少量样本学习的优化(Few-Shot Learning)、零样本学习(Zero-Shot Learning)能力的提升,以及更好的跨语言和跨领域适应性。\n\n### 5. 多模态能力\nGPT-4在处理非文本信息方面也有所进步,增强了其多模态能力,这意味着它不仅能处理文本,还能理解和生成图像、音频等多种类型的数据。这使GPT-4能够应用于更广泛的场景,如图文生成、自动图像描述等。\n\n### 6. 安全性和道德考虑\n针对以往模型可能出现的安全性和偏见问题,GPT-4在设计和训练过程中更加注重安全性、透明度和道德考量。通过改进的内容过滤机制、偏见缓解策略等措施,GPT-4旨在减少潜在的不良影响,提供更负责任的AI使用体验。\n\n总体而言,GPT-4的“高级”之处主要体现在通过技术和方法上的创新和优化,使得模型在理解能力、适应性、效率和安全性等方面都有了显著提升。"},{"title":"vscode","url":"/2025/01/19/computer/App/vscode/","content":"\n已经实现:\ncpg生成C++常用结构`snippets`\n\n\nctrl+j生成新空白行,ctrl+l相当于右箭头\n弃用以上,还是用回了nvim,编程式移动很爽。\n\n用`he`按tab生成`[]()`\n笔记使用相对引用的一个问题是,当移动笔记位置时(层次上的移动),将导致图片无法识别,需要手动更改\n\n又出现了个莫名其妙的bug,新文件如果不先debug下,无法使用智能提示\n\n:在很多情况下,使用 G++ 命令编译 C++ 程序相比使用 GCC 命令,不需要手动指定链接 C++ 标准库。\n\n把vscode的默认终端换成强大的pw7\n\"terminal.integrated.profiles.windows\": {\n \"PowerShell 7\": {\n \"path\": \"C:\\\\your path\\\\pwsh.exe\"\n }\n},\n\"terminal.integrated.defaultProfile.windows\": \"PowerShell 7\"\n"},{"title":"Ubuntu","url":"/2025/01/19/computer/App/ubuntu/","content":"\n# [快照]()\n[CRLF]() Carriage Return Line Feed 回车换行符,*unix上是LF\n`touch filename` 生成新文件\n`ENOENT` Error NO ENTity\n\n# 挂载主机共享文件夹"},{"title":"tmux","url":"/2025/01/19/computer/App/tmux/","content":"\ntmux是一个流行的终端复用器,它允许用户在一个终端窗口中运行多个终端会话,并且可以不间断地在它们之间切换。tmux对于远程工作、长期运行的任务以及终端环境的组织管理非常有帮助。\n\n# rename\n会话(Session)重命名\n\n使用快捷键重命名:\n\n`Ctrl + B, $`\n\n使用指令重命名,按快捷键进入指令模式\n\n`Ctrl + B, :`\n\n输入下述指令, 指定当前会话名称和新的会话名称\n\n`rename-session [-t current-name] [new-name]`\n\n窗口(Windows)重命名\n\n使用快捷键来重命名:\n\n`Ctrl + B, ,`\n\n使用指令重命名, 类似上面提到的进入命令模式\n\n`Ctrl + B, :`\n\n输入窗口重命名指令\n\n`rename-window [-t current-name] [new-name]`\n"},{"title":"neovim","url":"/2025/01/19/computer/App/nvim/","content":"\n# etc\n Language Server Protocol (LSP)\n\n在 Neovim 中运行 :PackerSync 命令来安装或更新插件:\n\n布局,搜索,点命令,寄存器,宏,撤销,折叠。。。一些有用的思想,当然,我觉得vim最本质的优点是函数式编写\n\n# 移动\n\n## 搜索移动\n`/` 进入搜索模式 n下一个N上一个\n`f` 单字母搜索\n\n## 以行为单位的移动\n`^` 移动到行首第一个词的首字母。\n`|` 移动到行首第一个字符。\n`$` 移动到行尾。\n`j` 移动到下一行。\n`k` 移动到上一行。\n`:10` 移动光标到文件第 10 行。可以 :set number 来让 vim 显示行号。\n`gg` 移动到文件首行。\n`G` 移动到文件尾行。\n\n\n## 以屏幕为单位的移动\n\n\n`H` 移动到当前屏的首行。\n`L` 移动到当前屏的尾行。\n`M` 移动到当前屏的中间行。\n`zt` 光标所在字符不动,将当前行移动到屏幕顶部,通常用来查看完整的下文,比如函数、类的定义。\n`zz` 光标所在字符不动,将当前行移到屏幕中间。\n`zb` 光标所在字符不动,将当前行移到屏幕底部。\n`ctrl-f` 向下翻页,移动一整个屏幕。\n`ctrl+d` 下移半页\n`ctrl-b` 向上翻页,移动一整个屏幕。\n`ctrl-e` 屏幕向下滚动一行。\n`ctrl-u` 上移半页\n`ctrl-y` 屏幕向上滚动一行。\n\n后面几个 Ctrl 开头的命令是 Unix 命令行的惯例,比如在 man 和 less 里也适用。\n\n## 标记移动\n`m` 打标记,小写字母是当前文件,大写字母是nvim全局\n`'a` 移动至标记处的行首\n`` `a `` 移动至标记的具体行列\n` :marks `列出所有标记\n\n## 单词移动\n\n`w`: 将光标移动到下一个单词的开头\n`b`: 将光标移动到前一个单词的开头\n`e`: 将光标移动到下一个单词的词末\n`E`: 移动到单词的结尾(忽略标点符号)\n`ge`: 将光标移动到上一个单词的词末\n`2w`: 指定移动的次数\n\n## 文本块移动\n\n(:移到当前句子的开头\n): 移到下一个句子的开头\n{: 移到当前一段的开头\n}:移到下一段的开头\n[[: 移到当前这一节的开头\n]]: 移到下一节的开头\n\n## etc\n`gg`\t光标移动到文件开头\n`G`\t光标移动至文件末尾\n\n`b` 或 `B`\t光标移动至上一个单词的单词首\n`w` 或 `W`\t光标移动至下一个单词的单词首\n\n`fx`\t光标移动至当前行中下一个 x 字符处\n`Fx` \t光标移动至当前行中上一个 x 字符处\n`0` 或 `Home`:光标移动到本行开头\n\n告别鼠标手,尽快选vim.\n现在感觉vim单独使用比较好,和IDE的快捷键太容易冲突了,我会在虚拟机上单独vim,虚拟机就是为了从无到有体验编程的存在。\n\n# [插入]()\n[插入—普通模式]() 在插入模式中使用Ctrl + o 来进入该模式。该模式运行用户暂时回到普通模式,然后在执行一条普通模式的命令之后自动回到插入模式中。\n\n# [删除]()\n插入模式下删除:\n`Ctrl + h`: 删除光标前一个词(与退格键相同)\n`Ctrl + w`: 删除光标前一个单词\n`Ctrl + u`: 删除至行首\n`x` 快速删除一个字符\n\n# [替换]()\n\n# [复制粘贴]()\n\n`ggvGy`复制全文\n`y`复制选中的文本\n`yy`复制当前行\n`d` 剪贴文本\n`p` (小写)新起一行粘贴文本\n`P` 在当前位置粘贴文本"},{"title":"idea","url":"/2025/01/19/computer/App/idea/","content":"\n`Plugin org.apache.maven.plugins:maven-jar-plugin:1.8.1 or one of its dependencies could not be resolved: Failure to find org.apache.maven.plugins:maven-jar-plugin:jar:1.8.1 in https://maven.aliyun.com/repository/public was cached in the local repository, resolution will not be reattempted until the update interval of aliyunmaven has elapsed or updates are forced -> [Help 1]\n[ERROR] `\n\n default settings,setting只是对当前项目进行设置。\n点击Runner 在VIM Options位置添加(原理是:忽略了ssl证书的验证)\n\n-Dmaven.wagon.http.ssl.insecure=true -Dmaven.wagon.http.ssl.allowall=true -Dmaven.wagon.http.ssl.ignore.validity.dates=true\n"}]