├── .gitignore ├── .makemd ├── fileCache.mdc └── superstate.mdc ├── .space ├── context.mdb ├── def.json └── waypoints.json ├── Excalidraw ├── Drawing 2024-07-22 23.11.29.excalidraw.md ├── font │ ├── YaoRuanBiShouXieTi.zip │ └── YaoRuanBiShouXieTi │ │ ├── Muyao-Softbrush-2.ttf │ │ └── 字由客户端.url ├── 我的1.md └── 测试画布.md ├── JavaEE框架 ├── Mybatis │ └── MyBatis常见问题.md ├── Spring │ ├── Spring入门与常用配置.md │ ├── 最熟悉的陌生人Spring框架.md │ └── 注解IOC&AOP.md ├── Struts2 │ ├── Servlet的API&封装.md │ ├── Struts2中的OGNL和值栈ValueStack.md │ ├── Struts2中的拦截器和标签库.md │ └── struts2入门&常见配置.md ├── hibernate │ ├── Hibernate之入门.md │ ├── Hibernate之进阶1——主键生成策略和事务管理.md │ ├── Hibernate之进阶2——表操作和多对多配置.md │ ├── Hibernate之进阶3——查询方式.md │ ├── Hibernate之进阶4——抓取策略.md │ └── eclipse中配置XML提示.md ├── springMVC │ └── SpringMVC重温知识点.md └── springboot │ ├── Spring Boot.md │ ├── Spring Boot核心技术-笔记.pdf │ ├── images │ ├── 2018-02-04_123955.png │ ├── concrete-bindings.png │ ├── legacy.png │ ├── template-engine.png │ ├── 搜狗截图20180129151045.png │ ├── 搜狗截图20180129151112.png │ ├── 搜狗截图20180129224104.png │ ├── 搜狗截图20180130161620.png │ ├── 搜狗截图20180131220946.png │ ├── 搜狗截图20180131221411.png │ ├── 搜狗截图20180203164743.png │ ├── 搜狗截图20180203181108.png │ ├── 搜狗截图20180203181751.png │ ├── 搜狗截图20180211130621.png │ ├── 搜狗截图20180211130721.png │ ├── 搜狗截图20180211134506.png │ ├── 搜狗截图20180226173408.png │ ├── 搜狗截图20180226173527.png │ ├── 搜狗截图20180226180347.png │ ├── 搜狗截图20180226180504.png │ ├── 搜狗截图20180228135513.png │ ├── 搜狗截图20180301142915.png │ ├── 搜狗截图20180302114401.png │ ├── 搜狗截图20180302144835.png │ ├── 搜狗截图20180302144910.png │ ├── 搜狗截图20180302221835.png │ ├── 搜狗截图20180303145450.png │ ├── 搜狗截图20180303145531.png │ ├── 搜狗截图20180303165113.png │ ├── 搜狗截图20180305194443.png │ ├── 搜狗截图20180306105412.png │ ├── 搜狗截图20180306145727.png │ ├── 搜狗截图20180306145855.png │ ├── 搜狗截图20190901112859.jpg │ ├── 搜狗截图20190901113509.jpg │ └── 搜狗截图20190901113535.jpg │ ├── springboot与缓存(整合redis).md │ └── springboot系列知识.md ├── JavaWeb前后端交互技术基础 ├── Ajax │ └── Ajax常用用法.md ├── HTML&CSS │ ├── HTML&CSS基础.md │ ├── webstorm上导入文件中文乱码问题解决.md │ ├── webstorm设置黑色主题及相关的编码和显示设置.md │ ├── 表单.jpg │ └── 表单.xmind ├── JavaScript │ ├── JS中的数据类型转换.md │ ├── JavaScript基础知识.md │ ├── xmind │ │ ├── JavaScript对象及初识面向对象.xmind │ │ └── JavaScript操作DOM对象.xmind │ └── 思维导图图片 │ │ ├── JavaScript对象及初识面向对象.jpg │ │ └── JavaScript操作DOM对象.jpg ├── Java_web │ ├── eclipse中将JSP文件的默认字符编码设置成UTF-8.md │ ├── 在javaEE中外部的js文件如何和页面之间传递参数.md │ ├── 知识点 │ │ ├── Cookie&Session │ │ │ ├── Cookie&Session.doc │ │ │ ├── cookie的购物.png │ │ │ ├── session.png │ │ │ ├── session域.png │ │ │ ├── 显示上次访问时间.png │ │ │ └── 购物过程.png │ │ ├── Http协议和Tomcate服务器 │ │ │ ├── HTTP协议详解.txt │ │ │ ├── Http协议和Tomcate服务器.doc │ │ │ ├── http响应.png │ │ │ ├── http请求.png │ │ │ ├── last-modified.png │ │ │ └── 抓包工具 │ │ │ │ └── httpwatch9.3.35.zip │ │ ├── JSP │ │ │ ├── javaEE三层架构.png │ │ │ ├── jsp&el&jstl.doc │ │ │ ├── jsp的出现.png │ │ │ ├── out缓冲区.png │ │ │ ├── 显示商品列表.png │ │ │ ├── 案例-显示商品列表.png │ │ │ ├── 静态与动态包含区别.png │ │ │ └── 页面包含.png │ │ ├── javaweb核心之Servlet │ │ │ ├── javaweb核心之Servlet.doc │ │ │ ├── servlet模板.txt │ │ │ ├── servlet访问过程.png │ │ │ ├── servlet访问过程2.png │ │ │ ├── 在javaEE中外部的js文件如何和页面之间传递参数.md │ │ │ ├── 域对象.png │ │ │ └── 用户登录.png │ │ ├── request │ │ │ ├── HttpServletRequest.doc │ │ │ ├── request的乱码.png │ │ │ ├── 注册功能.png │ │ │ ├── 转发.png │ │ │ └── 转发和重定向.png │ │ ├── response │ │ │ ├── HttpServletResponse.doc │ │ │ ├── response乱码.png │ │ │ ├── response运行过程.png │ │ │ ├── 一次性验证码 │ │ │ │ ├── CheckImgServlet.java │ │ │ │ └── new_words.txt │ │ │ └── 重定向.png │ │ └── 滤器&监听器 │ │ │ ├── 监听器.txt │ │ │ └── 过滤器.txt │ └── 解决在Eclipse新建web项目没有自动生成web.xml和在新建servlet的时候自动生成web.xml配置.md ├── easyUI │ └── jQuery+EasyUI开发指南.pdf └── jQuery │ ├── Xmind │ ├── jQuery中的事件.xmind │ └── jQuery选择器.xmind │ ├── jQuery知识.md │ └── 思维导图JPG │ ├── jQuery中的事件.jpg │ └── jQuery选择器.jpg ├── Java_basic ├── HashMap和ConcurrentHashmap.md ├── JVM垃圾回收GC.md ├── JVM执行引擎、对象实例化、String相关知识.md ├── JVM概述和类加载子系统.md ├── JVM运行时数据区.md ├── Java核心知识总结(面试必问).md ├── java_basic_API │ ├── Java中的IO流和反射.md │ ├── XML技术.md │ ├── 多线程.md │ └── 网络编程技术.md ├── java基础相关知识.md ├── java多线程以及并发相关知识.md ├── 开发总结 │ └── java在过滤器中为http请求加请求头header.md ├── 算法 │ └── N个人站圈报数算法问题.md ├── 编程入门.md ├── 计算机网络 │ └── 计算机网络基础概述.md └── 设计模式 │ └── 设计模式应用之策略模式.md ├── Java与数据库交互技术 ├── MySQL数据库 │ ├── JDBC操作数据库 │ │ ├── DBCP连接池 │ │ │ └── DBCP连接池和登录注册按例.md │ │ ├── DBUtils │ │ │ └── DBUtils工具类操作数据库.md │ │ ├── JDBC操作数据库基础 │ │ │ └── JDBC操作数据库.md │ │ ├── c3p0连接池 │ │ │ └── c3p0连接池的用法.md │ │ └── 三层架构 │ │ │ ├── 基本概念 │ │ │ ├── dao │ │ │ │ ├── BaseDao.java │ │ │ │ ├── PetDao.java │ │ │ │ └── impl │ │ │ │ │ └── PetDaoImpl.java │ │ │ ├── entity │ │ │ │ └── Pet.java │ │ │ ├── service │ │ │ │ ├── PetService.java │ │ │ │ └── impl │ │ │ │ │ └── PetServiceImpl.java │ │ │ └── test │ │ │ │ └── Test.java │ │ │ └── 宠物管理系统模拟功能 │ │ │ └── PetDeo │ │ │ ├── resouces │ │ │ └── database.properties │ │ │ └── src │ │ │ ├── dao │ │ │ ├── BaseDao.java │ │ │ ├── MasterDao.java │ │ │ ├── PetDao.java │ │ │ └── impl │ │ │ │ ├── MasterDaoImpl.java │ │ │ │ └── PetDaoImpl.java │ │ │ ├── entity │ │ │ ├── Master.java │ │ │ └── Pet.java │ │ │ ├── mgr │ │ │ └── PetMgr.java │ │ │ ├── service │ │ │ ├── MasterService.java │ │ │ ├── PetService.java │ │ │ └── impl │ │ │ │ ├── MasterServiceImpl.java │ │ │ │ └── PetServiceImpl.java │ │ │ └── test │ │ │ ├── Test.java │ │ │ └── Test2.java │ ├── MySQL基础 │ │ ├── MySQL数据库基础知识.md │ │ ├── win10环境下MySql(8.0.16最新版本)安装过程以及遇到的问题.md │ │ ├── 数据库.jpg │ │ ├── 数据库.xmind │ │ └── 数据库详细思维导图.jpg │ └── 超全的MySQL核心原理,从底层剖析MySQL.md ├── Oracle数据库 │ ├── Oracle的安装 │ │ ├── 云服务器安装oracle修改IP地址监听器报错问题.md │ │ └── 将oracle11安装到虚拟机并在本机进行远程操控oracle数据库(超详细步骤).md │ ├── Oracle重点知识点 │ │ └── oracle知识点总结.md │ └── xmind │ │ ├── 01.安装_函数查询and条件查询.xmind │ │ ├── 02.多表查询_子查询_集合运算.xmind │ │ ├── 03.DDL,DML,视图,PLSQL编程.xmind │ │ └── 04.游标,存储过程,存储函数,触发器.xmind └── Redis │ └── Redis缓存界的神话.md ├── README.md ├── Vault.md ├── java面试相关 ├── JavaSE基础面试题(精简版).md ├── java基础面试题.md └── 疫情之下我是如何大胆跳槽的.md ├── rocketmq ├── 图解RocketMQ之666.md └── 图解RocketMQ之初识MQ.md ├── 互联网架构新技术 ├── Docker │ ├── Docker入门到精通.md │ └── images │ │ ├── 搜狗截图20190831120304.jpg │ │ ├── 搜狗截图20190831121606.jpg │ │ └── 搜狗截图20190831141427.jpg ├── kafka │ └── kafka介绍以及结合spring消费topic.md ├── springcloud │ ├── 微服务中的鉴权怎么做?.md │ ├── 微服务之SpringCloud.md │ ├── 微服务如何做好监控.md │ ├── 微服务网关Gateway(上).md │ └── 微服务网关Gateway(下).md └── 消息队列 │ └── 消息队列yyds.md ├── 兴趣爱好 ├── 2019-07-10-hexo在GitHub上搭建个人博客.md ├── 2019-07-14-hexo博客结合百度语音合成为你的博客添加欢迎语音.md ├── 三周年惊喜:我用微信聊天记录做成了纪念册,她的反应竟然是....md ├── 使用序列化保存对象信息的时候出现中文乱码问题.md ├── 微信聊天机器人.md └── 简历写上这个,HR看了贼开心.md ├── 常用功能模块代码 ├── JSP实现文件下载功能.md ├── ajax │ └── ajax表单验证 │ │ └── ajax-demo │ │ ├── WebContent │ │ ├── META-INF │ │ │ └── MANIFEST.MF │ │ ├── WEB-INF │ │ │ └── web.xml │ │ ├── css │ │ │ └── style.css │ │ ├── index.jsp │ │ ├── js │ │ │ ├── jquery-1.8.3.js │ │ │ ├── page.js │ │ │ ├── project.js │ │ │ └── registe.js │ │ └── registe.jsp │ │ └── src │ │ ├── ajax.txt │ │ └── com │ │ ├── bean │ │ └── User.java │ │ ├── dao │ │ ├── BaseData.java │ │ └── UserData.java │ │ └── servlet │ │ └── user │ │ └── CheckUserName.java ├── java生成图片验证码.md ├── 为数据库批量添加测试数据 │ └── AddData.java ├── 利用cookie获取最近一次访问页面时间 │ └── LastCookieTimeServlet.java └── 防盗链 │ └── RefererServlet.java ├── 常用工具和环境 ├── Git&GitHub │ ├── 3分钟同步GitHub到Gitee.md │ ├── Git&GitHub.pdf │ ├── 关于GitHub的一些经验总结(包括README文件的编写目录的自动生成).md │ └── 分布式版本控制工具——Git.md ├── InteliJ_IDEA │ ├── idea下新建的spring boot项目,无法导入依赖以及idea基础回顾.md │ ├── settings.jar │ ├── 尚硅谷_宋红康_IntelliJIDEA的安装、配置与使用.pdf │ ├── 激活码.txt │ ├── 这几款 idea 插件让效率起飞!.md │ └── 这几款 idea 插件让效率起飞!_new.md ├── Linux │ ├── Linux命令大全(修改版).chm │ ├── Linux操作系统.md │ ├── linux入门.pdf │ └── 操作系统的作用.png ├── Maven │ └── Maven依赖管理.md ├── SVN │ └── 版本控制工具之SVN.md └── eclipse │ ├── Eclipse调用方法放回值快捷键.md │ ├── Eclipse配置Servlet模板.md │ ├── eclipse中tomcat-advanced以及插件的使用.md │ ├── eclipse中配置XML提示.md │ ├── eclipse详解及eclipse快捷键.md │ └── 解决在Eclipse新建web项目没有自动生成web.xml和在新建servlet的时候自动生成web.xml配置.md ├── 微信读书 └── 自动同步笔记 │ ├── IP之道——30家国内一线创新公司的知识产权是如何运营的.md │ ├── Spring Cloud微服务和分布式系统实践.md │ ├── 一人企业:一个人也能赚钱的商业新模式.md │ ├── 半小时漫画中国哲学史2.md │ ├── 史蒂夫·乔布斯传.md │ ├── 天堂旅行团.md │ ├── 学会写作:自我进阶的高效方法.md │ ├── 我曾走在崩溃的边缘:俞敏洪亲述新东方创业发展之路.md │ ├── 明朝那些事儿(全集).md │ ├── 沉默的大多数.md │ ├── 海边的卡夫卡.md │ ├── 程序员的底层思维.md │ ├── 简读中国史:世界史坐标下的中国.md │ ├── 纳瓦尔宝典.md │ ├── 认知觉醒:开启自我改变的原动力.md │ ├── 认知驱动:做成一件对他人很有用的事.md │ ├── 长安的荔枝.md │ └── 黄金时代.md ├── 物联网和嵌入式开发 ├── C语言入门(1)——特点及关键字.md ├── C语言入门(2)——数据类型、运算符、类型转换、控制语句.md ├── MQTT-轻量级的物联网消息传输协议.md └── 边缘计算与云边协同.md ├── 经验总结 ├── 如何做好技术架构选型.md ├── 如何部署上线项目.md └── 震惊,我的数据库被勒索了!.md └── 编程学习资料 ├── 2000G资料分享 ├── 2000G网盘学习资源分享-Python从入门到精通.md ├── 2000G网盘学习资源分享-学习视频资料篇.md ├── 2000G网盘学习资源分享-工具篇.md ├── 2000G网盘学习资源分享-程序员教资备考全套资料篇.md └── 2000G网盘学习资源分享-计算机学习资料分享.md └── 计算机转行必备学习资料(含视频常用工具和面试资料).md /.gitignore: -------------------------------------------------------------------------------- 1 | HELP.md 2 | target/ 3 | logs/ 4 | !.mvn/wrapper/maven-wrapper.jar 5 | !**/src/main/**/target/ 6 | !**/src/test/**/target/ 7 | 8 | ### STS ### 9 | .apt_generated 10 | .classpath 11 | .factorypath 12 | .project 13 | .settings 14 | .springBeans 15 | .sts4-cache 16 | 17 | ### IntelliJ IDEA ### 18 | .idea 19 | *.iws 20 | *.iml 21 | *.ipr 22 | 23 | ### NetBeans ### 24 | /nbproject/private/ 25 | /nbbuild/ 26 | /dist/ 27 | /nbdist/ 28 | /.nb-gradle/ 29 | build/ 30 | !**/src/main/**/build/ 31 | !**/src/test/**/build/ 32 | 33 | ### VS Code ### 34 | .vscode/ 35 | logs 36 | log 37 | /target/* 38 | .DS_Store 39 | .obsidian/* -------------------------------------------------------------------------------- /.makemd/fileCache.mdc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/freestylefly/CodeCanvas/bff2dea45228c0e247109c4b628ebadbc2024b3b/.makemd/fileCache.mdc -------------------------------------------------------------------------------- /.makemd/superstate.mdc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/freestylefly/CodeCanvas/bff2dea45228c0e247109c4b628ebadbc2024b3b/.makemd/superstate.mdc -------------------------------------------------------------------------------- /.space/context.mdb: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/freestylefly/CodeCanvas/bff2dea45228c0e247109c4b628ebadbc2024b3b/.space/context.mdb -------------------------------------------------------------------------------- /.space/def.json: -------------------------------------------------------------------------------- 1 | {"_filters":[],"_contexts":[],"_links":["rocketmq","rocketmq/图解RocketMQ之666.md"],"_sort":{"field":"rank","asc":false,"group":false},"_template":"","_templateName":""} -------------------------------------------------------------------------------- /.space/waypoints.json: -------------------------------------------------------------------------------- 1 | [{"sticker":"emoji//1f4a5","name":"","paths":[]}] -------------------------------------------------------------------------------- /Excalidraw/Drawing 2024-07-22 23.11.29.excalidraw.md: -------------------------------------------------------------------------------- 1 | --- 2 | 3 | excalidraw-plugin: parsed 4 | tags: [excalidraw] 5 | 6 | --- 7 | ==⚠ Switch to EXCALIDRAW VIEW in the MORE OPTIONS menu of this document. ⚠== You can decompress Drawing data with the command palette: 'Decompress current Excalidraw file'. For more info check in plugin settings under 'Saving' 8 | 9 | 10 | # Excalidraw Data 11 | ## Text Elements 12 | askda ^gJHdZHaH 13 | 14 | 阿萨德三大 ^UMJJSjQ2 15 | 16 | %% 17 | ## Drawing 18 | ```compressed-json 19 | N4KAkARALgngDgUwgLgAQQQDwMYEMA2AlgCYBOuA7hADTgQBuCpAzoQPYB2KqATLZMzYBXUtiRoIACyhQ4zZAHoFAc0JRJQgEYA6bGwC2CgF7N6hbEcK4OCtptbErHALRY8RMpWdx8Q1TdIEfARcZgRmBShcZQUebTiATho6IIR9BA4oZm4AbXAwUDAiiBJuCCEjIwBNAEEABgBhAAUE3GcADXwG/QBrQgAJAGZCJH5i2EQywOwojmVg5KLITG5n 20 | 21 | AEZBgA5tADYAFjqdngBWMcgYVZ46ve0AdnvBvcHb0/zIChJ1bh41ne0DniPZ6vJZSBCEZTSbhrK7aQZ1TbHBLAs4QazzcSoOqo5hQUhsHoIBpsfBsUhlADEawQ1Opi2Kmlw2B6ynxQg4xGJpPJEjx1mYcFwgUy9MgADNCPh8ABlWALCSCDyiiC4/GEgDqn0k3xxeIJCFlMHl6EVpVRbMhHHC2TQa1RbEF2DUF1tdWxbwgrOEcAAksQbagcgBdVFi 22 | 23 | 8jpP3cDhCKWowgcrBlXB1ZVsjlW5gBwqgiaYwZvAC+OIQCGI0Lqawrex2CV+qMYLHYXDQPD4HobrE4ADlOGJvscdpW9nsrnHmAARVJQUvcMUEMKozTCDkAUWC6UyAbySwKb3G8Ex0CwUFFxVKEmUACl+sQAFr9XD9CB7gtvEMeoRwYi4adl223H4dkHOoEmONY9hBYoiA4HooxjfBUVJZkZzQOd8DCfIi3ybNIHPdArxve9H2VXMymnTAT1RFY0G 24 | 25 | cJE7hrJ4rh2W5NluSsEj2VEXVQdZjlubQYXhatWMg94tW4Y5th2JFQJYxFbhHNYElRSRwUhE8W1EtE5mNd1QVVfUuTJSlaRpUYPUZZkvXZTkSWM3lyA4AUhQySiPQlKVDWNFUSTND0DI1cSW11NUDTlQ9TTLc1hEta1oXtR1nXLPTims31/Vyd9QTDXAIz/VBo1jD142IRMJFwNZU2XYgMwDQqEP8kt8vAwdNi2TYYXrJhO2bVBlPbbqmx7Dg+zQ 26 | 27 | IDNkRY52rHSdgl/Wd5wQRdqrXNJXLq+DUU/b95v/QDgISWtAUQ+NYLQerELYZD8rQhcPXIjT0FCHpv1TSgABVjyTZgXtwZUxU4KBpUIIxMVHdzAYAMVyyVuLte7jxqIhlF6iAxEyJhlQbKBzAIJGIVR/QSGIBZUT0TJcHjJhIwkCpqnqZpWg6LpegGYZzNBMkIXjAhPoo77fuVXAhCgNgACVwhBzE8SEJaPWghB+jUqFbXiY5MLGHCSnyiAAFUAF 28 | 29 | lL0vaUACsAEUeBIg8yK+qjVlrbQK1AwYYS07j1huWtbgSHYRNRD5iC+V0UsgVSIRV3gtPRXSQsMuyeXQKkzLpRcmRZNNbO5MjHOc4U3OyyUZXCspIuVAKEE1QPtWC/y9UJLyIt8qKPQtSRavij0HSZJLg9RNK/S3LLihyvK4KK0ESrKp7Leimz2/OzbGpQ1Bjh4WsDggttQQ7JtoXh7fBu7XtMU2Hgdmub2AJmqdl9uuXQSXGzVo3LIx4a0Ftp/Z 30 | 31 | e1gA35B0rVe4NQTQTOgVRewCrqEhuotVED0yiAH40wAFCGAHb9QAkHKAHJNN6FA+aPQgEgtBmDQyA2BqDb4IcIAA0yNDIm+A4awMRsjVGwQxT52KNjXG+B8YozIg6ZU5MohU1IDTMB49ihc38LzL6Eh8EYKFiLcWktSFoBlvfKCVMlbh0emsNWmFwBZTRHAOAsov7cGzNAVS6QyjIyhGMBgIwKAACE07WQ5EZBOEAKRii8d4+kaMRB5x9NOfQspQ 32 | 33 | puJMsnDmkBsD+NcoEtITirIZzCQ5fkgo86+OiaQAJQTIaFwbiXJuGSYmZDicEuuFcgq8FsZk7JaQQn6nyQqQp1TilQFKWLGKbc4q2haVk2JQSADyiVYDJV6bU/QkMoYw1oR3YoNT+lpEmZkEhYMUp+L6SUoJOCuFMIQCwopGy2lBOMaQKANQslsAoKpXA+ULr5HWeMlcHJzn4iuSEHWQpXm+OYNgfEUp2jfB4DcF4tifl/PwFUbgLsEiO02AkTYT 34 | 35 | wQX3KMGwAwpj2wEFltCDW9z5mbLSB0ue3T0AZ18ayEgKy362PJZneyqAtYOJJDrCkDQEistZZDSGyoJbKBjEKSkK5xyCsFZy58RQsJzNafUwkQycacA2qIiAcBAhmGEMwAA4qQClUsqX3JHggCWCYtVzHRaCDIuBNDBHyiosmRA4DcBtR6DguVpakFlvaEWCsHVuoQDisRmgTYIBmMwaUzq4D6zYKVJ5FqrULXQr6sAEqKGSnCKY18BYgA== 36 | ``` 37 | %% -------------------------------------------------------------------------------- /Excalidraw/font/YaoRuanBiShouXieTi.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/freestylefly/CodeCanvas/bff2dea45228c0e247109c4b628ebadbc2024b3b/Excalidraw/font/YaoRuanBiShouXieTi.zip -------------------------------------------------------------------------------- /Excalidraw/font/YaoRuanBiShouXieTi/Muyao-Softbrush-2.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/freestylefly/CodeCanvas/bff2dea45228c0e247109c4b628ebadbc2024b3b/Excalidraw/font/YaoRuanBiShouXieTi/Muyao-Softbrush-2.ttf -------------------------------------------------------------------------------- /Excalidraw/font/YaoRuanBiShouXieTi/字由客户端.url: -------------------------------------------------------------------------------- 1 | [{000214A0-0000-0000-C000-000000000046}] 2 | Prop3=19,11 3 | [InternetShortcut] 4 | IDList= 5 | URL=https://www.hellofont.cn/download?from=zttxpackage:download 6 | -------------------------------------------------------------------------------- /Excalidraw/测试画布.md: -------------------------------------------------------------------------------- 1 | --- 2 | 3 | excalidraw-plugin: parsed 4 | tags: [excalidraw] 5 | 6 | --- 7 | ==⚠ Switch to EXCALIDRAW VIEW in the MORE OPTIONS menu of this document. ⚠== You can decompress Drawing data with the command palette: 'Decompress current Excalidraw file'. For more info check in plugin settings under 'Saving' 8 | 9 | 10 | # Excalidraw Data 11 | ## Text Elements 12 | 字体测试的 ^XnNf8MCV 13 | 14 | %% 15 | ## Drawing 16 | ```compressed-json 17 | N4KAkARALgngDgUwgLgAQQQDwMYEMA2AlgCYBOuA7hADTgQBuCpAzoQPYB2KqATLZMzYBXUtiRoIACyhQ4zZAHoFAc0JRJQgEYA6bGwC2CgF7N6hbEcK4OCtptbErHALRY8RMpWdx8Q1TdIEfARcZgRmBShcZQUebTiATho6IIR9BA4oZm4AbXAwUDAiiBJuCAANDgA5ADMADgBZAGEANWSiyFhEMqgsKHbizG5nAEYAZgB2bQBWabrphMnp/mKY 18 | 19 | YZGAFgA2bQAGecWJ5fzIChJ1bhHd3ZXISQRCZWluHmOOiGtlYO4bk4hmKCkNgAawQTTY+DYpDKAGIRgh4fCBpBNLhsMDlEChBxiODIdCJIDrMw4LhAplkRAaoR8PgAMqwb4SQQeSkAoGggDq50kL1u/0BIIQDJgTPQLNK/KxTw44WyaBG/LYpOwajWCuu/MxwjgAEliPLUDkALr8mrkdL67gcIS0/mEHFYMq4XaUrE42XMQ02u1/MIIYiXaZjK5b 20 | 21 | LbbOr8xgsdhcNA8X7vaOsThVThiS4TDYbCY8Op5jb25gAEVSvUDaBqBDC/M0whxAFFgulMt7bfh+UI4MRcOXMzwRmGrnVcwlI38iBxgdb2/zIeiA9wq/ga39eph+hJAOragGV5QDStoBV6MAIW5uygAFT6ZV3h5PZs4UDphCM4l4ieKNXvADFcPoaerUIqa59AAgkQyhxugwQ1P0UZMFA5gEKBjwQdAyqUnomS4A6TBWmgPodn8UKPA6BAXhuV77 22 | 23 | selK4EIUBsAASuET4voCQgIHO2EABIPE8m4AfE0z5AAvuApp0LgcBwAyvYvoUnT3OkZRgc8KwMIQCAUAAQmiGLuriEJQrCNTGSZAwQNgIjklAuq9PoDIcmCBkEugcIIm5ZkWaQVk2Wk2notq2L6fiPTkBwJJkhkMH5OZlmRT5+ifjS9KMi+/wQpK0Wed5tn2UK3LEBc8aqVlcU5YKoIimKaWssVsWZPF9HCDKcqXLVXmlWkADyKpqpcmqZXV1m2Z 24 | 25 | +X4/n+rUDe19XDfej7Pi8b4xVNQ1pGRUBIeBSkINBHmDfF0mkOtXlsBQ9y4BWqD4W12VpA2OLAcdp0hBdHyPWZzDYECtLlC8PAbNoRyqR9X34AAmtwIYJHsdRjhsSyqUYbAGNwcmQPQBBsZcwnXR1+iNYFnqGhAelmZiJBzS+V3RWTQWGWgqMQJpEIvTCTQJGzbOfp+lKMcotpkrCDbFkLQtcxA2OTVZuWgt18GcG2vrFHAgRmMIzAAOKkOTzEzo 26 | 27 | rkDmj+CCMY6WscMoKN/BkuCaMEF2sexfzYEQcDcPb/IcIbrukGxSq0ZOLHewgEvFHYABWCDYFkdIe3ADRsMQCB3dbttLtWQdgEJ/BUjS4QoyJQlAA=== 28 | ``` 29 | %% -------------------------------------------------------------------------------- /JavaEE框架/Mybatis/MyBatis常见问题.md: -------------------------------------------------------------------------------- 1 | # 一、什么是Mybatis 2 | 3 | ## 1、Mybatis是一个类似于Hibernate的ORM持久层开源框架, 4 | 5 | ## 2、Mybatis通过XML或者注解配置和映射,实现对数据库的访问 6 | 7 | ## 3、Mybatis的核心设计理念是基于原生sql进行的,正是由于这个设计理念使得Mybatis相对于Hibernate框架执行效率更高,但是代码的可移植性差,由于Mybatis是一个轻量级的框架,框架本身提供的功能较少,但是使用的灵活性更高。 8 | 9 | # 二、结果集映射 10 | 11 | ## 1、结果集映射是在Mybatis的xml映射文件中进行配置的一个映射,表示查询语句结果集中每一条记录如何转换成对应的java对象,将我们的java对象和数据表中的字段一一对应。 12 | 13 | ## 2、他是通过resultMap这个标签进行配置,里面属性有type和id,id是这个结果集映射的唯一一个标识,用于查询标签的一个引用,type属性用于设置查询结果需要转换的java对象,就是相对应的实体类,可以写全类名,当我们在Mybatis配置文件中配置默认扫描包或者配置类的别名的时候可以使用类名或者别名 14 | 15 | ## 3、一共有2个字标签,分别是id和result,id于配置数据表主键对应关系,result用于设置其他字段和类属性的一个对应,这两个标签都有2个属性,propery和column,分别设置java对象的属性和数据表字段名 16 | 17 | # 三、动态SQL 18 | 19 | ## 1、Mybatis的动态SQL是Mybatis灵活性的一种体现,可以通过外部传入的参数,使用一系列标签,灵活的拼接sql语句 20 | 21 | ## 2、里面主要有这几个标签,if、where、set、foreach、choose、when、otherwise, 22 | 23 | ## 3、if标签用来进行条件判断,有一个test属性,添加判断条件,多个if标签时,记得用。where标签取代sql中的where命令,若标签中无任意结果,则where不会出现在sql中,记得在前面加一个and用来连接;set标签用来取代sql中update set命令;foreach标签进行循环遍历,有collection、item、open、close、separator属性,分别指传入的参数类型,临时变量、语句开始和结束需要拼接的内容,分隔符;choose、when、otherwise相当于java中的多重if结构 24 | 25 | # 四、#和$区别 26 | 27 | ## 1、两者都是用来进行参数传递 28 | 29 | ## 2、#的方式更常用,内部封装了prepareStatement接口,进行预编译处理,相当于JDBC中为?占位符赋值,这种相对安全,$的方式是字符串拼接,用$号取到的数据会那需要使用正确的格式,拼接到sql中 30 | 31 | ## 3、当比较而言#更加的安全,能有效的方式sql注入 32 | 33 | # 五、多表间关联查询 34 | 35 | ## 1、开发中经常查询数据会用到多张表进行查询,比如查询一个用户可以有多个订单,但是用户表和商品表是两张不同的表,如果要查询用户以及其对应的商品信息就需要用到多表联查 36 | 37 | ## 2、主要有两种方式,第一种编写带有连接查询的sql,将需要的字段从多张表中取出,放入结果集,首先在实体类中添加属性对应数据表中字段,其次,在映射文件的结果集映射中添加result标签,为新增的属性设置对应字段,最后修改查询sql,添加连接查询, 38 | 39 | ## 3、这种方式很少用,方式二是,使用标签通过指定的格式进行配置,在查询时自动获取相关数据表的数据,主要用到两个标签,association处理多对一的关系,一般设置在多的一方的配置文件中,用于子表查询主表,collection标签处理一对多,设置在一的一方的配置文件中,用于主表查询子表, 40 | 41 | ## 4、如何使用呢?首先在实体类中添加属性,一的一方添加多的一方的集合对象,泛型是多的一方的对象,多的一方添加一的一方的对象,其次在配置文件的结果集中添加标签,多的一方用association,一的一方用collection,对标签进行配置,分别有property、column、select属性,property自动查询的结果保存到那个实体类,column设置携带到查询语句中的字段,select设置自动执行的sql语句的id,最后需要添加对应数据表的结果集映射进来。 42 | 43 | 44 | 45 | 46 | -------------------------------------------------------------------------------- /JavaEE框架/Struts2/Struts2中的OGNL和值栈ValueStack.md: -------------------------------------------------------------------------------- 1 | # 一、OGNL 2 | 3 | ## 1、什么是OGNL 4 | 5 | 是一种功能强大的表达式语言,通过他可以获取对象的任意属性和方法,同时能实现必要的类型转换,比EL表达式更加的强大,可以应用在页面,Action以及配置文件中 6 | 7 | ## 2、OGNL的作用 8 | 9 | - 对象方法调用 10 | - 类静态方法调用 11 | - 赋值操作和表达式串联 12 | - 访问OGNL上下文 13 | - 操作集合对象 14 | 15 | ## 3、OGNL的要素 16 | 17 | - 表达式 18 | - 跟对象root 19 | - context对象 20 | 21 | # 二、值栈的概述 22 | 23 | ## 1、什么是值栈 24 | 25 | ValueStack是Struts2的一个接口,OgnlValueStatck是实现类,客户端发送一个请求就会创建一个Action实例,同时会创建一个OgnlValueStatck实例,ValueStack其实类似于数据中转站,Struts中的数据都保存在值栈中,贯穿Action的生命周期,值栈中的数据可在JSP、Action、配置文件中使用 26 | 27 | ## 2、值栈的内部结构 28 | 29 | 值栈的内部有两个主要区域, 30 | 31 | 1)root区域 32 | 33 | 实际上是一个ArrayList集合,放的是对象,实现压栈和出栈功能,拥有栈的特点,先进后出,后进先出,最后压进栈的数据再栈顶,称之为对象栈,取的时候不用加#号 34 | 35 | 通常操作值栈,就是值操作root区域,可查看值栈的内部结构 36 | 37 | 2)context区域 38 | 39 | 他是一个map结构,存放的是一些引用,request、session、等,其中attr代表该Map按如下顺序检索某个属性:request、session、application,其中使用 63 | ``` 64 | 65 | 2)采用valueStatck本身方法方式存入获取 66 | 67 | ``` 68 | 69 | ``` 70 | 71 | 3)获取值栈中集合的数据 72 | 73 | ``` 74 | 75 | ``` 76 | 77 | 4)获取context区域存放的数据 78 | 79 | ``` 80 | 81 | ``` 82 | 83 | ## 7 、EL为何能访问值栈中的数据 84 | 85 | 因为Struts2的底层对request.getAttribute()方法进行了增强,找到 找到就返回,没有找到就会从值栈中去找 86 | 87 | # 三、OGNL特殊字符 88 | 89 | ## 1、#号 90 | 91 | 1)获取context中的数据,在使用标签遍历的时候var中的值 92 | 93 | 2)构建Map集合 94 | 95 | 默认Struts2框架会识别 96 | 97 | ``` 98 | {"aa","bb","cc"}为list集合 99 | {"aa":"11","bb":"22"}为map集合 100 | ``` 101 | 102 | 当使用标签的时候,可以用#构建map集合 103 | 104 | ## 2、%号 105 | 106 | 强制解析OGNL,Struts2的有些便签不能识别OGNL,需要使用%强制解析OGNL 107 | 108 | ## 3、$号 109 | 110 | 1)在配置文件中使用 111 | 112 | A、属性文件:国际化的地方 113 | 114 | B:XML:如文件下载的时候使用 115 | 116 | 117 | 118 | 119 | 120 | 121 | 122 | 123 | 124 | 125 | 126 | 127 | 128 | 129 | 130 | 131 | 132 | -------------------------------------------------------------------------------- /JavaEE框架/hibernate/eclipse中配置XML提示.md: -------------------------------------------------------------------------------- 1 | ## 一、问题原油 2 | 当我们在eclipse中编写XML时,需要出来提示信息(前提是没有联网),那么就需要进行用户自定义配置相关信息、 3 | ## 二、步骤 4 | 这里我以配置Hibernate框架 中的XML为例子 5 | ### 1、将网络地址复制 6 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20190127142330842.png) 7 | ### 2、打开windows下的个性设置profenrencese 8 | 如图,依次找到用户自定义设置 9 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20190127142602526.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQzMjcwMDc0,size_16,color_FFFFFF,t_70) 10 | 点击add 11 | ### 3、add页面配置 12 | 将刚复制的网络URI地址放入keys中,type类型选择URI,location路径选择对应的路径,比如我这里对应的是hibernate-mapping-3.0的路径,需要在hibernate的jar包中找到该配置文件 13 | ### 4、完成配置 14 | ------ 15 | # 本文章已同步至GitHub仓库:Javastudy,期待您的加入:blush: 16 | 17 | 18 | # 本文章已同步至苍何的个人博客,可以直接在博客上留言哦:blush: 19 | 20 | 21 | # 来我的微信公众号玩耍呗:blush: 22 | 23 | 24 | # 扫码无套路关注我的CSDN博客:blush: 25 | 26 | 27 | -------------------------------------------------------------------------------- /JavaEE框架/springboot/Spring Boot核心技术-笔记.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/freestylefly/CodeCanvas/bff2dea45228c0e247109c4b628ebadbc2024b3b/JavaEE框架/springboot/Spring Boot核心技术-笔记.pdf -------------------------------------------------------------------------------- /JavaEE框架/springboot/images/2018-02-04_123955.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/freestylefly/CodeCanvas/bff2dea45228c0e247109c4b628ebadbc2024b3b/JavaEE框架/springboot/images/2018-02-04_123955.png -------------------------------------------------------------------------------- /JavaEE框架/springboot/images/concrete-bindings.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/freestylefly/CodeCanvas/bff2dea45228c0e247109c4b628ebadbc2024b3b/JavaEE框架/springboot/images/concrete-bindings.png -------------------------------------------------------------------------------- /JavaEE框架/springboot/images/legacy.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/freestylefly/CodeCanvas/bff2dea45228c0e247109c4b628ebadbc2024b3b/JavaEE框架/springboot/images/legacy.png -------------------------------------------------------------------------------- /JavaEE框架/springboot/images/template-engine.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/freestylefly/CodeCanvas/bff2dea45228c0e247109c4b628ebadbc2024b3b/JavaEE框架/springboot/images/template-engine.png -------------------------------------------------------------------------------- /JavaEE框架/springboot/images/搜狗截图20180129151045.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/freestylefly/CodeCanvas/bff2dea45228c0e247109c4b628ebadbc2024b3b/JavaEE框架/springboot/images/搜狗截图20180129151045.png -------------------------------------------------------------------------------- /JavaEE框架/springboot/images/搜狗截图20180129151112.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/freestylefly/CodeCanvas/bff2dea45228c0e247109c4b628ebadbc2024b3b/JavaEE框架/springboot/images/搜狗截图20180129151112.png -------------------------------------------------------------------------------- /JavaEE框架/springboot/images/搜狗截图20180129224104.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/freestylefly/CodeCanvas/bff2dea45228c0e247109c4b628ebadbc2024b3b/JavaEE框架/springboot/images/搜狗截图20180129224104.png -------------------------------------------------------------------------------- /JavaEE框架/springboot/images/搜狗截图20180130161620.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/freestylefly/CodeCanvas/bff2dea45228c0e247109c4b628ebadbc2024b3b/JavaEE框架/springboot/images/搜狗截图20180130161620.png -------------------------------------------------------------------------------- /JavaEE框架/springboot/images/搜狗截图20180131220946.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/freestylefly/CodeCanvas/bff2dea45228c0e247109c4b628ebadbc2024b3b/JavaEE框架/springboot/images/搜狗截图20180131220946.png -------------------------------------------------------------------------------- /JavaEE框架/springboot/images/搜狗截图20180131221411.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/freestylefly/CodeCanvas/bff2dea45228c0e247109c4b628ebadbc2024b3b/JavaEE框架/springboot/images/搜狗截图20180131221411.png -------------------------------------------------------------------------------- /JavaEE框架/springboot/images/搜狗截图20180203164743.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/freestylefly/CodeCanvas/bff2dea45228c0e247109c4b628ebadbc2024b3b/JavaEE框架/springboot/images/搜狗截图20180203164743.png -------------------------------------------------------------------------------- /JavaEE框架/springboot/images/搜狗截图20180203181108.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/freestylefly/CodeCanvas/bff2dea45228c0e247109c4b628ebadbc2024b3b/JavaEE框架/springboot/images/搜狗截图20180203181108.png -------------------------------------------------------------------------------- /JavaEE框架/springboot/images/搜狗截图20180203181751.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/freestylefly/CodeCanvas/bff2dea45228c0e247109c4b628ebadbc2024b3b/JavaEE框架/springboot/images/搜狗截图20180203181751.png -------------------------------------------------------------------------------- /JavaEE框架/springboot/images/搜狗截图20180211130621.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/freestylefly/CodeCanvas/bff2dea45228c0e247109c4b628ebadbc2024b3b/JavaEE框架/springboot/images/搜狗截图20180211130621.png -------------------------------------------------------------------------------- /JavaEE框架/springboot/images/搜狗截图20180211130721.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/freestylefly/CodeCanvas/bff2dea45228c0e247109c4b628ebadbc2024b3b/JavaEE框架/springboot/images/搜狗截图20180211130721.png -------------------------------------------------------------------------------- /JavaEE框架/springboot/images/搜狗截图20180211134506.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/freestylefly/CodeCanvas/bff2dea45228c0e247109c4b628ebadbc2024b3b/JavaEE框架/springboot/images/搜狗截图20180211134506.png -------------------------------------------------------------------------------- /JavaEE框架/springboot/images/搜狗截图20180226173408.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/freestylefly/CodeCanvas/bff2dea45228c0e247109c4b628ebadbc2024b3b/JavaEE框架/springboot/images/搜狗截图20180226173408.png -------------------------------------------------------------------------------- /JavaEE框架/springboot/images/搜狗截图20180226173527.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/freestylefly/CodeCanvas/bff2dea45228c0e247109c4b628ebadbc2024b3b/JavaEE框架/springboot/images/搜狗截图20180226173527.png -------------------------------------------------------------------------------- /JavaEE框架/springboot/images/搜狗截图20180226180347.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/freestylefly/CodeCanvas/bff2dea45228c0e247109c4b628ebadbc2024b3b/JavaEE框架/springboot/images/搜狗截图20180226180347.png -------------------------------------------------------------------------------- /JavaEE框架/springboot/images/搜狗截图20180226180504.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/freestylefly/CodeCanvas/bff2dea45228c0e247109c4b628ebadbc2024b3b/JavaEE框架/springboot/images/搜狗截图20180226180504.png -------------------------------------------------------------------------------- /JavaEE框架/springboot/images/搜狗截图20180228135513.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/freestylefly/CodeCanvas/bff2dea45228c0e247109c4b628ebadbc2024b3b/JavaEE框架/springboot/images/搜狗截图20180228135513.png -------------------------------------------------------------------------------- /JavaEE框架/springboot/images/搜狗截图20180301142915.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/freestylefly/CodeCanvas/bff2dea45228c0e247109c4b628ebadbc2024b3b/JavaEE框架/springboot/images/搜狗截图20180301142915.png -------------------------------------------------------------------------------- /JavaEE框架/springboot/images/搜狗截图20180302114401.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/freestylefly/CodeCanvas/bff2dea45228c0e247109c4b628ebadbc2024b3b/JavaEE框架/springboot/images/搜狗截图20180302114401.png -------------------------------------------------------------------------------- /JavaEE框架/springboot/images/搜狗截图20180302144835.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/freestylefly/CodeCanvas/bff2dea45228c0e247109c4b628ebadbc2024b3b/JavaEE框架/springboot/images/搜狗截图20180302144835.png -------------------------------------------------------------------------------- /JavaEE框架/springboot/images/搜狗截图20180302144910.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/freestylefly/CodeCanvas/bff2dea45228c0e247109c4b628ebadbc2024b3b/JavaEE框架/springboot/images/搜狗截图20180302144910.png -------------------------------------------------------------------------------- /JavaEE框架/springboot/images/搜狗截图20180302221835.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/freestylefly/CodeCanvas/bff2dea45228c0e247109c4b628ebadbc2024b3b/JavaEE框架/springboot/images/搜狗截图20180302221835.png -------------------------------------------------------------------------------- /JavaEE框架/springboot/images/搜狗截图20180303145450.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/freestylefly/CodeCanvas/bff2dea45228c0e247109c4b628ebadbc2024b3b/JavaEE框架/springboot/images/搜狗截图20180303145450.png -------------------------------------------------------------------------------- /JavaEE框架/springboot/images/搜狗截图20180303145531.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/freestylefly/CodeCanvas/bff2dea45228c0e247109c4b628ebadbc2024b3b/JavaEE框架/springboot/images/搜狗截图20180303145531.png -------------------------------------------------------------------------------- /JavaEE框架/springboot/images/搜狗截图20180303165113.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/freestylefly/CodeCanvas/bff2dea45228c0e247109c4b628ebadbc2024b3b/JavaEE框架/springboot/images/搜狗截图20180303165113.png -------------------------------------------------------------------------------- /JavaEE框架/springboot/images/搜狗截图20180305194443.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/freestylefly/CodeCanvas/bff2dea45228c0e247109c4b628ebadbc2024b3b/JavaEE框架/springboot/images/搜狗截图20180305194443.png -------------------------------------------------------------------------------- /JavaEE框架/springboot/images/搜狗截图20180306105412.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/freestylefly/CodeCanvas/bff2dea45228c0e247109c4b628ebadbc2024b3b/JavaEE框架/springboot/images/搜狗截图20180306105412.png -------------------------------------------------------------------------------- /JavaEE框架/springboot/images/搜狗截图20180306145727.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/freestylefly/CodeCanvas/bff2dea45228c0e247109c4b628ebadbc2024b3b/JavaEE框架/springboot/images/搜狗截图20180306145727.png -------------------------------------------------------------------------------- /JavaEE框架/springboot/images/搜狗截图20180306145855.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/freestylefly/CodeCanvas/bff2dea45228c0e247109c4b628ebadbc2024b3b/JavaEE框架/springboot/images/搜狗截图20180306145855.png -------------------------------------------------------------------------------- /JavaEE框架/springboot/images/搜狗截图20190901112859.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/freestylefly/CodeCanvas/bff2dea45228c0e247109c4b628ebadbc2024b3b/JavaEE框架/springboot/images/搜狗截图20190901112859.jpg -------------------------------------------------------------------------------- /JavaEE框架/springboot/images/搜狗截图20190901113509.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/freestylefly/CodeCanvas/bff2dea45228c0e247109c4b628ebadbc2024b3b/JavaEE框架/springboot/images/搜狗截图20190901113509.jpg -------------------------------------------------------------------------------- /JavaEE框架/springboot/images/搜狗截图20190901113535.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/freestylefly/CodeCanvas/bff2dea45228c0e247109c4b628ebadbc2024b3b/JavaEE框架/springboot/images/搜狗截图20190901113535.jpg -------------------------------------------------------------------------------- /JavaWeb前后端交互技术基础/Ajax/Ajax常用用法.md: -------------------------------------------------------------------------------- 1 | # 一、ajax是什么 2 | 3 | 异步的脚本,在整体页面不刷新的情况下,完成与后台数据交互,并根据返回数据,局部刷新页面 4 | 5 | # 二、ajax常用场合 6 | 7 | 1、表单验证:如验证用户名是否可用 8 | 9 | 2、页面拼接显示 10 | 11 | 3、前后端分离式的网站结构 12 | 13 | # 三、ajax常见使用格式 14 | 15 | ## 1、基础格式 16 | 17 | ``` 18 | 语法: $.ajax({ 19 | url:"需要访问的后台方法的地址", 20 | type:"post", //数据传递的格式, post或get 21 | data: {}, //需要携带到后台的请求参数 22 | dataType: "", //参数的数据格式, 例如"json" 23 | success:fucntion(data){ 24 | //后台响应成功后需要执行的回调函数 25 | 26 | } 27 | }); 28 | ``` 29 | 30 | ## 2. post格式(常用) 31 | 32 | ``` 33 | //表单验证 34 | $("[name='userName']").bind("blur", function(){ 35 | //获取数据 36 | var userName = $("[name='userName']").val().trim(); 37 | //关闭异步 38 | $.ajaxSettings.async = false; 39 | //使用ajax访问后台, 查询用户名是否存在 40 | //ajax post格式 41 | $.post( 42 | "${pageContext.request.contextPath }/checkUserName", //地址 43 | { 44 | userName:userName 45 | }, 46 | //"userName="+userName, //参数(传给后台的参数) 47 | //"${pageContext.request.contextPath }/checkUserName?userName="+userName, 48 | function(data){//data是后台传过来的参数,也可以是HTML页面 49 | //辅助变量 50 | var msg = "√"; 51 | var color = "green"; 52 | //判断 53 | if(data==0){ 54 | msg = "用户名已存在"; 55 | color = "red"; 56 | flag = false; 57 | } 58 | 59 | $("[name='userName']").parent().next().html(msg).css("color", color); 60 | } 61 | ); 62 | //开启异步 63 | $.ajaxSettings.async = true; 64 | 65 | 66 | } 67 | ``` 68 | 69 | ## 3、get格式 70 | 71 | ``` 72 | $.get( 73 | "${pageContext.request.contextPath }/checkUserName?userName="+userName, 74 | function(data){ 75 | //辅助变量 76 | var msg = "√"; 77 | var color = "green"; 78 | //判断 79 | if(data==0){ 80 | msg = "用户名已存在"; 81 | color = "red"; 82 | flag = false; 83 | } 84 | $("[name='userName']").parent().next().html(msg).css("color", color); 85 | } 86 | ); 87 | ``` 88 | 89 | # 四、使用ajax进行页面拼接 90 | 91 | ## 1、ajax局部刷新函数 92 | 93 | 使用该函数可以做到,将请求通过ajax传递给后台并携带页面需要传递到后台的参数,这个后台就是处理该请求的servlet,吼他接收到了请求,需要传递给页面一个消息,跳转到需要的页面。当然这里可以理解为后台传递给了页面一个页面作为参数data,然后tojump方法接收到该data,将该页面显示在我们需要指定的区域,这个时候相当于完成了局部刷新(记住ajax的执行过程) 94 | 95 | ``` 96 | //ajax局部页面刷新 97 | function toJump(url, param) { 98 | //alert(url+":"+param); 99 | $.post( 100 | webroot+url, //拼接绝对路径 101 | param, 102 | function(data){ 103 | //alert(data); 104 | $("#main").html(data); //将id main中的内容替换成data接收到的页面 105 | }, 106 | "html" //表示, data接收的数据类型是页面 107 | ); 108 | } 109 | ``` 110 | 111 | 比如我要将这个请求给到queryOne这个servlet,不携带任何参数,那么该后台接收到请求之后做什么呢? 112 | 113 | ``` 114 | //跳转到个人中心显示页(将页面信息作为参数传给页面 115 | response.sendRedirect(request.getContextPath()+"/page/user/info.jsp"); 116 | ``` 117 | 118 | 很简单,只需要跳转到需要显示的页面,这里理解为跳转该页面为将该页面作为data参数返回给到页面 119 | 120 | ## 2、调用函数,实现局部显示 121 | 122 | 这个时候在页面中调用toJump("queryOne");函数那么就可以将该页面放在我们想放的范围内显示了 -------------------------------------------------------------------------------- /JavaWeb前后端交互技术基础/HTML&CSS/webstorm上导入文件中文乱码问题解决.md: -------------------------------------------------------------------------------- 1 | ## 一、出现如下错误乱码 2 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20181127183315937.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQzMjcwMDc0,size_16,color_FFFFFF,t_70) 3 | 4 | ## 解决办法 5 | 1、右键——file encoding 6 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20181127183448521.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQzMjcwMDc0,size_16,color_FFFFFF,t_70) 7 | 2、![在这里插入图片描述](https://img-blog.csdnimg.cn/20181127183513756.png) 8 | 9 | 3、![在这里插入图片描述](https://img-blog.csdnimg.cn/20181127183532563.png) 10 | 11 | 3、再右键选择GBK![在这里插入图片描述](https://img-blog.csdnimg.cn/20181127183553310.png) 12 | 13 | 4、![在这里插入图片描述](https://img-blog.csdnimg.cn/20181127183633499.png) 14 | 15 | 5、完成 16 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20181127183651264.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQzMjcwMDc0,size_16,color_FFFFFF,t_70) 17 | 18 | -------------------------------------------------------------------------------- /JavaWeb前后端交互技术基础/HTML&CSS/webstorm设置黑色主题及相关的编码和显示设置.md: -------------------------------------------------------------------------------- 1 | ## 设置黑色主题 2 | 1、file——setting 3 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20181127184239622.png) 4 | 5 | 2、找到Appearance 6 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20181127184355219.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQzMjcwMDc0,size_16,color_FFFFFF,t_70) 7 | 8 | 3、选择黑色主题,注意箭头一定打勾 9 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20181127185150491.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQzMjcwMDc0,size_16,color_FFFFFF,t_70) 10 | 箭头处设置的是在代码编辑区左边项目的字体样式 11 | 12 | 注意这个一定要save as 13 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20181127184600954.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQzMjcwMDc0,size_16,color_FFFFFF,t_70) 14 | 15 | 16 | ## 设置代码区字体样式 17 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20181127185041791.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQzMjcwMDc0,size_16,color_FFFFFF,t_70) 18 | 19 | ## 设置编码为UTF-8 20 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20181127185328289.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQzMjcwMDc0,size_16,color_FFFFFF,t_70) 21 | 22 | 都设置成UTF-8 23 | -------------------------------------------------------------------------------- /JavaWeb前后端交互技术基础/HTML&CSS/表单.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/freestylefly/CodeCanvas/bff2dea45228c0e247109c4b628ebadbc2024b3b/JavaWeb前后端交互技术基础/HTML&CSS/表单.jpg -------------------------------------------------------------------------------- /JavaWeb前后端交互技术基础/HTML&CSS/表单.xmind: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/freestylefly/CodeCanvas/bff2dea45228c0e247109c4b628ebadbc2024b3b/JavaWeb前后端交互技术基础/HTML&CSS/表单.xmind -------------------------------------------------------------------------------- /JavaWeb前后端交互技术基础/JavaScript/JS中的数据类型转换.md: -------------------------------------------------------------------------------- 1 | ## 1、普通转换 2 | parseInt() parseFloat() 3 | ## 2、强制转换Boolean() 4 | 可以将所有的数据类型转换为布尔值 5 | 1、字符砖 6 | 空字符串——false 7 | 其他——true 8 | 2、数值 9 | 0——false 10 | 其他——true 11 | 3、变量值 12 | null或者未定义——false 13 | 其他——true 14 | ## 3、开发中常用到 15 | if(!num)直接写变量代表的意思是,如果如果num存在值,那么执行下一步操作,首先num未定义会变成false,然后加上感叹号就变成了true 16 | -------------------------------------------------------------------------------- /JavaWeb前后端交互技术基础/JavaScript/xmind/JavaScript对象及初识面向对象.xmind: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/freestylefly/CodeCanvas/bff2dea45228c0e247109c4b628ebadbc2024b3b/JavaWeb前后端交互技术基础/JavaScript/xmind/JavaScript对象及初识面向对象.xmind -------------------------------------------------------------------------------- /JavaWeb前后端交互技术基础/JavaScript/xmind/JavaScript操作DOM对象.xmind: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/freestylefly/CodeCanvas/bff2dea45228c0e247109c4b628ebadbc2024b3b/JavaWeb前后端交互技术基础/JavaScript/xmind/JavaScript操作DOM对象.xmind -------------------------------------------------------------------------------- /JavaWeb前后端交互技术基础/JavaScript/思维导图图片/JavaScript对象及初识面向对象.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/freestylefly/CodeCanvas/bff2dea45228c0e247109c4b628ebadbc2024b3b/JavaWeb前后端交互技术基础/JavaScript/思维导图图片/JavaScript对象及初识面向对象.jpg -------------------------------------------------------------------------------- /JavaWeb前后端交互技术基础/JavaScript/思维导图图片/JavaScript操作DOM对象.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/freestylefly/CodeCanvas/bff2dea45228c0e247109c4b628ebadbc2024b3b/JavaWeb前后端交互技术基础/JavaScript/思维导图图片/JavaScript操作DOM对象.jpg -------------------------------------------------------------------------------- /JavaWeb前后端交互技术基础/Java_web/eclipse中将JSP文件的默认字符编码设置成UTF-8.md: -------------------------------------------------------------------------------- 1 | ## 一、问题描述 2 | 在eclipse中新建jsp文件,默认的字符编码是ISO-8859-1,我们需要转换成utf-8,但是不是每次都是在jsp文件中改charset的值,而是在新建jsp的时候就进行更改 3 | ![默认字符编码](https://img-blog.csdnimg.cn/20181217234152503.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQzMjcwMDc0,size_16,color_FFFFFF,t_70) 4 | ## 二、设置UTF-8编码 5 | windouw——proferences——搜索jsp——jsp files 6 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20181217234508682.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQzMjcwMDc0,size_16,color_FFFFFF,t_70) 7 | 将Encoding改成UTF-8即可 8 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20181217234547464.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQzMjcwMDc0,size_16,color_FFFFFF,t_70) 9 | 这样再新建jsp的时候就更改成功了! 10 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20181217234739772.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQzMjcwMDc0,size_16,color_FFFFFF,t_70) -------------------------------------------------------------------------------- /JavaWeb前后端交互技术基础/Java_web/在javaEE中外部的js文件如何和页面之间传递参数.md: -------------------------------------------------------------------------------- 1 | 问题:当我们在进行javaEE开发时(原生态开发,未利用框架),需要为页面引入外部JS脚本,但是在外部JS脚本中是没法利用EL表达式拿到我们想要的参数的,一个最简单的例子就是:当我们在页面点击某个按钮的时候,想要进行跳转,在外部JS中,需要改变location的值,此时需要用到工程的根目录 2 | 3 | 我们都知道在页面中可以利用EL表达式: 4 | 5 | ```java 6 | ${pageContext.request.contextPath } 7 | ``` 8 | 就可以拿到工程根目录,如何在外部JS中也拿到页面的参数呢?方法很简单 9 | ## 1、在外部JS中声明需要用到的变量,如工程根目录 10 | 有时候将所有JS都需要用到的js变量抽出去,携程project.js 11 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/2019011816234686.png) 12 | ## 2、在页面body之后引入所有要使用到的外部js文件 13 | 一定要在body之后。这是页面加载问题 14 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20190118162031665.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQzMjcwMDc0,size_16,color_FFFFFF,t_70) 15 | ## 3、在引入外部js的最后协商页面内部js代码 16 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20190118162131509.png) 17 | ## 4、这个时候你的外部JS就可以使用该变量了 18 | 19 | 20 | ## 总结 21 | 外部js要想使用页面的某一变量,需要先在js里面声明,然后加载到页面,最后在页面的最后为该变量进行赋值即可 22 | 23 | 24 | 25 | -------------------------------------------------------------------------------- /JavaWeb前后端交互技术基础/Java_web/知识点/Cookie&Session/Cookie&Session.doc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/freestylefly/CodeCanvas/bff2dea45228c0e247109c4b628ebadbc2024b3b/JavaWeb前后端交互技术基础/Java_web/知识点/Cookie&Session/Cookie&Session.doc -------------------------------------------------------------------------------- /JavaWeb前后端交互技术基础/Java_web/知识点/Cookie&Session/cookie的购物.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/freestylefly/CodeCanvas/bff2dea45228c0e247109c4b628ebadbc2024b3b/JavaWeb前后端交互技术基础/Java_web/知识点/Cookie&Session/cookie的购物.png -------------------------------------------------------------------------------- /JavaWeb前后端交互技术基础/Java_web/知识点/Cookie&Session/session.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/freestylefly/CodeCanvas/bff2dea45228c0e247109c4b628ebadbc2024b3b/JavaWeb前后端交互技术基础/Java_web/知识点/Cookie&Session/session.png -------------------------------------------------------------------------------- /JavaWeb前后端交互技术基础/Java_web/知识点/Cookie&Session/session域.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/freestylefly/CodeCanvas/bff2dea45228c0e247109c4b628ebadbc2024b3b/JavaWeb前后端交互技术基础/Java_web/知识点/Cookie&Session/session域.png -------------------------------------------------------------------------------- /JavaWeb前后端交互技术基础/Java_web/知识点/Cookie&Session/显示上次访问时间.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/freestylefly/CodeCanvas/bff2dea45228c0e247109c4b628ebadbc2024b3b/JavaWeb前后端交互技术基础/Java_web/知识点/Cookie&Session/显示上次访问时间.png -------------------------------------------------------------------------------- /JavaWeb前后端交互技术基础/Java_web/知识点/Cookie&Session/购物过程.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/freestylefly/CodeCanvas/bff2dea45228c0e247109c4b628ebadbc2024b3b/JavaWeb前后端交互技术基础/Java_web/知识点/Cookie&Session/购物过程.png -------------------------------------------------------------------------------- /JavaWeb前后端交互技术基础/Java_web/知识点/Http协议和Tomcate服务器/HTTP协议详解.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/freestylefly/CodeCanvas/bff2dea45228c0e247109c4b628ebadbc2024b3b/JavaWeb前后端交互技术基础/Java_web/知识点/Http协议和Tomcate服务器/HTTP协议详解.txt -------------------------------------------------------------------------------- /JavaWeb前后端交互技术基础/Java_web/知识点/Http协议和Tomcate服务器/Http协议和Tomcate服务器.doc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/freestylefly/CodeCanvas/bff2dea45228c0e247109c4b628ebadbc2024b3b/JavaWeb前后端交互技术基础/Java_web/知识点/Http协议和Tomcate服务器/Http协议和Tomcate服务器.doc -------------------------------------------------------------------------------- /JavaWeb前后端交互技术基础/Java_web/知识点/Http协议和Tomcate服务器/http响应.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/freestylefly/CodeCanvas/bff2dea45228c0e247109c4b628ebadbc2024b3b/JavaWeb前后端交互技术基础/Java_web/知识点/Http协议和Tomcate服务器/http响应.png -------------------------------------------------------------------------------- /JavaWeb前后端交互技术基础/Java_web/知识点/Http协议和Tomcate服务器/http请求.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/freestylefly/CodeCanvas/bff2dea45228c0e247109c4b628ebadbc2024b3b/JavaWeb前后端交互技术基础/Java_web/知识点/Http协议和Tomcate服务器/http请求.png -------------------------------------------------------------------------------- /JavaWeb前后端交互技术基础/Java_web/知识点/Http协议和Tomcate服务器/last-modified.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/freestylefly/CodeCanvas/bff2dea45228c0e247109c4b628ebadbc2024b3b/JavaWeb前后端交互技术基础/Java_web/知识点/Http协议和Tomcate服务器/last-modified.png -------------------------------------------------------------------------------- /JavaWeb前后端交互技术基础/Java_web/知识点/Http协议和Tomcate服务器/抓包工具/httpwatch9.3.35.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/freestylefly/CodeCanvas/bff2dea45228c0e247109c4b628ebadbc2024b3b/JavaWeb前后端交互技术基础/Java_web/知识点/Http协议和Tomcate服务器/抓包工具/httpwatch9.3.35.zip -------------------------------------------------------------------------------- /JavaWeb前后端交互技术基础/Java_web/知识点/JSP/javaEE三层架构.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/freestylefly/CodeCanvas/bff2dea45228c0e247109c4b628ebadbc2024b3b/JavaWeb前后端交互技术基础/Java_web/知识点/JSP/javaEE三层架构.png -------------------------------------------------------------------------------- /JavaWeb前后端交互技术基础/Java_web/知识点/JSP/jsp&el&jstl.doc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/freestylefly/CodeCanvas/bff2dea45228c0e247109c4b628ebadbc2024b3b/JavaWeb前后端交互技术基础/Java_web/知识点/JSP/jsp&el&jstl.doc -------------------------------------------------------------------------------- /JavaWeb前后端交互技术基础/Java_web/知识点/JSP/jsp的出现.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/freestylefly/CodeCanvas/bff2dea45228c0e247109c4b628ebadbc2024b3b/JavaWeb前后端交互技术基础/Java_web/知识点/JSP/jsp的出现.png -------------------------------------------------------------------------------- /JavaWeb前后端交互技术基础/Java_web/知识点/JSP/out缓冲区.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/freestylefly/CodeCanvas/bff2dea45228c0e247109c4b628ebadbc2024b3b/JavaWeb前后端交互技术基础/Java_web/知识点/JSP/out缓冲区.png -------------------------------------------------------------------------------- /JavaWeb前后端交互技术基础/Java_web/知识点/JSP/显示商品列表.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/freestylefly/CodeCanvas/bff2dea45228c0e247109c4b628ebadbc2024b3b/JavaWeb前后端交互技术基础/Java_web/知识点/JSP/显示商品列表.png -------------------------------------------------------------------------------- /JavaWeb前后端交互技术基础/Java_web/知识点/JSP/案例-显示商品列表.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/freestylefly/CodeCanvas/bff2dea45228c0e247109c4b628ebadbc2024b3b/JavaWeb前后端交互技术基础/Java_web/知识点/JSP/案例-显示商品列表.png -------------------------------------------------------------------------------- /JavaWeb前后端交互技术基础/Java_web/知识点/JSP/静态与动态包含区别.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/freestylefly/CodeCanvas/bff2dea45228c0e247109c4b628ebadbc2024b3b/JavaWeb前后端交互技术基础/Java_web/知识点/JSP/静态与动态包含区别.png -------------------------------------------------------------------------------- /JavaWeb前后端交互技术基础/Java_web/知识点/JSP/页面包含.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/freestylefly/CodeCanvas/bff2dea45228c0e247109c4b628ebadbc2024b3b/JavaWeb前后端交互技术基础/Java_web/知识点/JSP/页面包含.png -------------------------------------------------------------------------------- /JavaWeb前后端交互技术基础/Java_web/知识点/javaweb核心之Servlet/javaweb核心之Servlet.doc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/freestylefly/CodeCanvas/bff2dea45228c0e247109c4b628ebadbc2024b3b/JavaWeb前后端交互技术基础/Java_web/知识点/javaweb核心之Servlet/javaweb核心之Servlet.doc -------------------------------------------------------------------------------- /JavaWeb前后端交互技术基础/Java_web/知识点/javaweb核心之Servlet/servlet模板.txt: -------------------------------------------------------------------------------- 1 | package ${enclosing_package}; 2 | import java.io.IOException; 3 | import javax.servlet.ServletException; 4 | import javax.servlet.http.HttpServlet; 5 | import javax.servlet.http.HttpServletRequest; 6 | import javax.servlet.http.HttpServletResponse; 7 | 8 | public class ${primary_type_name} extends HttpServlet { 9 | 10 | public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 11 | response.getWriter().write("hello haohao..."); 12 | } 13 | 14 | public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 15 | doGet(request, response); 16 | } 17 | } -------------------------------------------------------------------------------- /JavaWeb前后端交互技术基础/Java_web/知识点/javaweb核心之Servlet/servlet访问过程.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/freestylefly/CodeCanvas/bff2dea45228c0e247109c4b628ebadbc2024b3b/JavaWeb前后端交互技术基础/Java_web/知识点/javaweb核心之Servlet/servlet访问过程.png -------------------------------------------------------------------------------- /JavaWeb前后端交互技术基础/Java_web/知识点/javaweb核心之Servlet/servlet访问过程2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/freestylefly/CodeCanvas/bff2dea45228c0e247109c4b628ebadbc2024b3b/JavaWeb前后端交互技术基础/Java_web/知识点/javaweb核心之Servlet/servlet访问过程2.png -------------------------------------------------------------------------------- /JavaWeb前后端交互技术基础/Java_web/知识点/javaweb核心之Servlet/在javaEE中外部的js文件如何和页面之间传递参数.md: -------------------------------------------------------------------------------- 1 | 问题:当我们在进行javaEE开发时(原生态开发,未利用框架),需要为页面引入外部JS脚本,但是在外部JS脚本中是没法利用EL表达式拿到我们想要的参数的,一个最简单的例子就是:当我们在页面点击某个按钮的时候,想要进行跳转,在外部JS中,需要改变location的值,此时需要用到工程的根目录 2 | 3 | 我们都知道在页面中可以利用EL表达式: 4 | 5 | ```java 6 | ${pageContext.request.contextPath } 7 | ``` 8 | 就可以拿到工程根目录,如何在外部JS中也拿到页面的参数呢?方法很简单 9 | ## 1、在外部JS中声明需要用到的变量,如工程根目录 10 | 有时候将所有JS都需要用到的js变量抽出去,携程project.js 11 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/2019011816234686.png) 12 | ## 2、在页面body之后引入所有要使用到的外部js文件 13 | 一定要在body之后。这是页面加载问题 14 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20190118162031665.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQzMjcwMDc0,size_16,color_FFFFFF,t_70) 15 | ## 3、在引入外部js的最后协商页面内部js代码 16 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20190118162131509.png) 17 | ## 4、这个时候你的外部JS就可以使用该变量了 18 | 19 | 20 | ## 总结 21 | 外部js要想使用页面的某一变量,需要先在js里面声明,然后加载到页面,最后在页面的最后为该变量进行赋值即可 22 | 23 | 24 | 25 | -------------------------------------------------------------------------------- /JavaWeb前后端交互技术基础/Java_web/知识点/javaweb核心之Servlet/域对象.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/freestylefly/CodeCanvas/bff2dea45228c0e247109c4b628ebadbc2024b3b/JavaWeb前后端交互技术基础/Java_web/知识点/javaweb核心之Servlet/域对象.png -------------------------------------------------------------------------------- /JavaWeb前后端交互技术基础/Java_web/知识点/javaweb核心之Servlet/用户登录.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/freestylefly/CodeCanvas/bff2dea45228c0e247109c4b628ebadbc2024b3b/JavaWeb前后端交互技术基础/Java_web/知识点/javaweb核心之Servlet/用户登录.png -------------------------------------------------------------------------------- /JavaWeb前后端交互技术基础/Java_web/知识点/request/HttpServletRequest.doc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/freestylefly/CodeCanvas/bff2dea45228c0e247109c4b628ebadbc2024b3b/JavaWeb前后端交互技术基础/Java_web/知识点/request/HttpServletRequest.doc -------------------------------------------------------------------------------- /JavaWeb前后端交互技术基础/Java_web/知识点/request/request的乱码.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/freestylefly/CodeCanvas/bff2dea45228c0e247109c4b628ebadbc2024b3b/JavaWeb前后端交互技术基础/Java_web/知识点/request/request的乱码.png -------------------------------------------------------------------------------- /JavaWeb前后端交互技术基础/Java_web/知识点/request/注册功能.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/freestylefly/CodeCanvas/bff2dea45228c0e247109c4b628ebadbc2024b3b/JavaWeb前后端交互技术基础/Java_web/知识点/request/注册功能.png -------------------------------------------------------------------------------- /JavaWeb前后端交互技术基础/Java_web/知识点/request/转发.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/freestylefly/CodeCanvas/bff2dea45228c0e247109c4b628ebadbc2024b3b/JavaWeb前后端交互技术基础/Java_web/知识点/request/转发.png -------------------------------------------------------------------------------- /JavaWeb前后端交互技术基础/Java_web/知识点/request/转发和重定向.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/freestylefly/CodeCanvas/bff2dea45228c0e247109c4b628ebadbc2024b3b/JavaWeb前后端交互技术基础/Java_web/知识点/request/转发和重定向.png -------------------------------------------------------------------------------- /JavaWeb前后端交互技术基础/Java_web/知识点/response/HttpServletResponse.doc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/freestylefly/CodeCanvas/bff2dea45228c0e247109c4b628ebadbc2024b3b/JavaWeb前后端交互技术基础/Java_web/知识点/response/HttpServletResponse.doc -------------------------------------------------------------------------------- /JavaWeb前后端交互技术基础/Java_web/知识点/response/response乱码.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/freestylefly/CodeCanvas/bff2dea45228c0e247109c4b628ebadbc2024b3b/JavaWeb前后端交互技术基础/Java_web/知识点/response/response乱码.png -------------------------------------------------------------------------------- /JavaWeb前后端交互技术基础/Java_web/知识点/response/response运行过程.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/freestylefly/CodeCanvas/bff2dea45228c0e247109c4b628ebadbc2024b3b/JavaWeb前后端交互技术基础/Java_web/知识点/response/response运行过程.png -------------------------------------------------------------------------------- /JavaWeb前后端交互技术基础/Java_web/知识点/response/一次性验证码/CheckImgServlet.java: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/freestylefly/CodeCanvas/bff2dea45228c0e247109c4b628ebadbc2024b3b/JavaWeb前后端交互技术基础/Java_web/知识点/response/一次性验证码/CheckImgServlet.java -------------------------------------------------------------------------------- /JavaWeb前后端交互技术基础/Java_web/知识点/response/一次性验证码/new_words.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/freestylefly/CodeCanvas/bff2dea45228c0e247109c4b628ebadbc2024b3b/JavaWeb前后端交互技术基础/Java_web/知识点/response/一次性验证码/new_words.txt -------------------------------------------------------------------------------- /JavaWeb前后端交互技术基础/Java_web/知识点/response/重定向.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/freestylefly/CodeCanvas/bff2dea45228c0e247109c4b628ebadbc2024b3b/JavaWeb前后端交互技术基础/Java_web/知识点/response/重定向.png -------------------------------------------------------------------------------- /JavaWeb前后端交互技术基础/Java_web/知识点/滤器&监听器/监听器.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/freestylefly/CodeCanvas/bff2dea45228c0e247109c4b628ebadbc2024b3b/JavaWeb前后端交互技术基础/Java_web/知识点/滤器&监听器/监听器.txt -------------------------------------------------------------------------------- /JavaWeb前后端交互技术基础/Java_web/知识点/滤器&监听器/过滤器.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/freestylefly/CodeCanvas/bff2dea45228c0e247109c4b628ebadbc2024b3b/JavaWeb前后端交互技术基础/Java_web/知识点/滤器&监听器/过滤器.txt -------------------------------------------------------------------------------- /JavaWeb前后端交互技术基础/Java_web/解决在Eclipse新建web项目没有自动生成web.xml和在新建servlet的时候自动生成web.xml配置.md: -------------------------------------------------------------------------------- 1 | ## 一、在Eclipse新建web项目没有自动生成web.xml解决办法 2 | ## 方法一:在Eclipse新建web项目的时候重要参数上打勾 3 | 1、file--new-Dynamic Web Project 4 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20181214160226360.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQzMjcwMDc0,size_16,color_FFFFFF,t_70) 5 | 2、next下一步 6 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20181214160315960.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQzMjcwMDc0,size_16,color_FFFFFF,t_70) 7 | 8 | 3、next下一步 9 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20181214160348211.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQzMjcwMDc0,size_16,color_FFFFFF,t_70) 10 | 11 | 4、关键:这里一定要打勾,默认是没有打勾的![在这里插入图片描述](https://img-blog.csdnimg.cn/20181214160416976.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQzMjcwMDc0,size_16,color_FFFFFF,t_70) 12 | 13 | 5、建好后可以点开就有web.xml了 14 | 15 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20181214160544786.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQzMjcwMDc0,size_16,color_FFFFFF,t_70) 16 | 17 | ## 方法二:在已经建好的项目上加上web.xml 18 | 1.项目名称右键-->Properties: 19 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20181214160700888.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQzMjcwMDc0,size_16,color_FFFFFF,t_70) 20 | 2.点击Project Facets,取消选中Dynamic Web Module,点击Apply 21 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20181214160730677.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQzMjcwMDc0,size_16,color_FFFFFF,t_70) 22 | 3.重新选中Dynamic Web Module后,会出现Further configuration available... 23 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20181214160754808.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQzMjcwMDc0,size_16,color_FFFFFF,t_70) 24 | 25 | 4.点击Further configuration available...,选中Generate web.xml deployment descriptor,点击ok,Apply后,在WEB-INF下生成了web.xml。 26 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20181214160812893.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQzMjcwMDc0,size_16,color_FFFFFF,t_70) 27 | 28 | ## Eclipse在新建servlet的时候自动生成web.xml配置 29 | 在新建web项目的时候: 30 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20181214161006245.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQzMjcwMDc0,size_16,color_FFFFFF,t_70) 31 | 我们新建默认用的是Tomact7.0,里面用的是servlet3.0版本默认的是使用注解配置,在新建dynamic web project 时,dynamic web module version选择2.5就ok了。 32 | 选择2.6即可 33 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20181214161120451.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQzMjcwMDc0,size_16,color_FFFFFF,t_70) 34 | 这样就自动生成了servlet的文本.xml的自动配置t -------------------------------------------------------------------------------- /JavaWeb前后端交互技术基础/easyUI/jQuery+EasyUI开发指南.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/freestylefly/CodeCanvas/bff2dea45228c0e247109c4b628ebadbc2024b3b/JavaWeb前后端交互技术基础/easyUI/jQuery+EasyUI开发指南.pdf -------------------------------------------------------------------------------- /JavaWeb前后端交互技术基础/jQuery/Xmind/jQuery中的事件.xmind: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/freestylefly/CodeCanvas/bff2dea45228c0e247109c4b628ebadbc2024b3b/JavaWeb前后端交互技术基础/jQuery/Xmind/jQuery中的事件.xmind -------------------------------------------------------------------------------- /JavaWeb前后端交互技术基础/jQuery/Xmind/jQuery选择器.xmind: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/freestylefly/CodeCanvas/bff2dea45228c0e247109c4b628ebadbc2024b3b/JavaWeb前后端交互技术基础/jQuery/Xmind/jQuery选择器.xmind -------------------------------------------------------------------------------- /JavaWeb前后端交互技术基础/jQuery/思维导图JPG/jQuery中的事件.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/freestylefly/CodeCanvas/bff2dea45228c0e247109c4b628ebadbc2024b3b/JavaWeb前后端交互技术基础/jQuery/思维导图JPG/jQuery中的事件.jpg -------------------------------------------------------------------------------- /JavaWeb前后端交互技术基础/jQuery/思维导图JPG/jQuery选择器.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/freestylefly/CodeCanvas/bff2dea45228c0e247109c4b628ebadbc2024b3b/JavaWeb前后端交互技术基础/jQuery/思维导图JPG/jQuery选择器.jpg -------------------------------------------------------------------------------- /Java_basic/HashMap和ConcurrentHashmap.md: -------------------------------------------------------------------------------- 1 | ## 前言 2 | 大家好,我是苍何。最近思考了一个问题,为什么会出现公司面试造火箭,工作扭螺丝的现象,包括各种八股文的连环大绝杀问到你不会为主,其实这是考察你的知识面以及掌握的深度,而为什么需要这样呢?归其原因,无非是通过筛选找到那些会思考的人,他们需要的并不是CRUD的工具人,而是会思考能创新的工程师。 3 | 4 | 当你深刻理解到这点,我想不用刻意去学习,在工作中,肯定会吾日三省吾身。 5 | 6 | 于是乎,这个重新开始学习编程系列文章出来了。 7 | 8 | 愿与君共勉! 9 | 10 | 最近读了HashMap和ConcurrentHashmap的源码,以及花了两天时间看了这方面相关的视频,记录一下新get到的知识。以问答的方式记录。 11 | 12 | ## 一、HashMap的特性 13 | 1、存储的是键值对,允许为null,key不可重复,重复则覆盖 14 | 2、非同步,线程不安全 15 | 3、底层hash表,不保证有序 16 | 17 | ## 二、HashMap的底层原理是什么? 18 | 19 | 1、JDK7扩容时候多线程情况下可能会出现死循坏,根本原因是头插法导致 20 | 2、hash种子默认0,可以配置变量来使得hash值更散列一些。 21 | 3、modCount++每一次修改都会加一 22 | 容错快速失败机制(fail fast,并发时候出现问题 23 | 4、1.8hashmap是尾插法,链表长度大于8会转为红黑树,即第九个来的时候,数组是空的或者数组长度小于64不会树化 24 | 5、hashmap1.7扩容条件多了一个判断当前数组节点不为空,均要判断是否大于阈值 25 | 6、红黑树节点个数小于6个会转为链表 26 | 27 | ## 三、hashmap 的底层数据结构 28 | 29 | JDK7:数组+链表 30 | JSK8:数组+链表+红黑树 31 | 32 | ## 四、JDK8中hashmap为什么要用红黑树 33 | 34 | 当元素个数在小于某一个阈值时,链表的插入查询效率高于红黑树,大于该阈值时,红黑树插入和查询效率高于链表,在hashmap中此阈值为8,即链表的长度大于8时,转为红黑树效率更高 35 | 36 | ## 五、JDK8中hashmap什么时候将链表转为红黑树 37 | 38 | 链表元素个数大于8,且数组的长度大于等于64时,才会将链表转为红黑树,数组长度小于64,会进行扩容 39 | 40 | ## 六、JDK8中hashmap中put方法的实现过程 41 | 42 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/a2d38045394d47aab2b4e59dafc9be69.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQzMjcwMDc0,size_16,color_FFFFFF,t_70#pic_center) 43 | 44 | 45 | ## 七、JDK8中hashmap中get方法实现过程? 46 | 47 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/191128a18efd422ba108c6f5f1128fde.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQzMjcwMDc0,size_16,color_FFFFFF,t_70#pic_center) 48 | 49 | 50 | ## 八、JDK7和JDK8中hashmap不同? 51 | 52 | 1、8中用到了红黑树 53 | 2、7中链表插入用头插法(扩容元素的时候使用的也是头插法,头插法速度更快,无需遍历链表,但是在多线程扩容的情况下会出现循坏链表的问题,导致CPU飙升),8中用尾插法(反正要遍历计算链表当前的结点个数) 54 | 3、7中hash算法更复杂,生成的hashcode更散列,hashmap中的元素更散列,查询性能更好,8中有红黑树简化hash算法,防止消耗CPU 55 | 4、扩容7可能rehash,和hash种子有关,8中无 56 | 5、7的扩容条件除了判断size是否大于阈值外,还判断tab【i】不为空,才扩容,8中仅仅判断size是否大于阈值 57 | 58 | 6、扩容转移元素逻辑不一致,7是一次转移,8是先算出高低位,再一次性转移 59 | 60 | ## 九、JDK7中ConcurrentHashmap是怎么保证并发安全的? 61 | 62 | 主要是利用Unsafe操作+ReentrantLock+分段思想 63 | 64 | Unsafe:通过CAS修改对象属性,并发安全的给数组的某个位置赋值以及获取元素; 65 | 分段思想是为了提高并发量,分段数可以通过参数控制 66 | 67 | ## 十、JDK7中ConcurrentHashmap的底层原理 68 | 69 | 由两层嵌套数组实现的 70 | 1、ConcurrentHashmap对象中有一个属性segments,类型为segment[], 71 | 2、segment对象有一个属性table,类型为hashEntry[] 72 | put方法十,先根据key计算segment[],数组下标,确定好当前key,value应该插入到哪个segment对象中,如果segment[],为空,利用自旋锁在该位置生成segment对象,然后再调用segment对象的put方法先加锁,根据key计算hashEntry[]数组下标,加锁先通过自加锁(trylock),如果超过一定次数就会加阻塞锁(lock()) 73 | 74 | ## 十一、JDK8中ConcurrentHashmap是怎么保证线程安全的? 75 | 76 | 主要是unsafe操作+synchronized 77 | 对table[i]进行加锁 78 | 79 | ## 十二、JDK7和JDK8中ConcurrentHashmap不同点 80 | 81 | 1、8中没有分段锁了,而是通过synchronized来控制 82 | 2、8中扩容性能更高 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | -------------------------------------------------------------------------------- /Java_basic/java_basic_API/多线程.md: -------------------------------------------------------------------------------- 1 | 较为详细扩展的文章可参见这篇博客: 2 | https://blog.csdn.net/qq_34337272/article/details/79640870 3 | 4 | ## 一、线程定义 5 | 线程是进程中执行运算的最小单位,是进程内部的一个执行单元 6 | 1、多个线程同时进行,采用枪占的机制,单核计算机一个时间只有一个线程执行,采用枪占资源的方式 7 | ## 二、多线程的优势 8 | 1、最大限度的提高计算机系统的利用效率 9 | 2、充分利用网络和系统资源 10 | ## 三、主线程 11 | main方法为主线程入口 12 | 主线程必须最后执行 13 | ## 四、创建线程 14 | 1、继承Thread类 15 | 重写run方法 16 | 测试中只需要创建线程对象即可 17 | 2、实现Runnable接口 18 | 测试诶中创建线程时候,需要 19 | Thread thread=new Thread(m,name); 20 | m为线程类的实例 21 | name为此线程的名字 22 | 23 | **两种方法的区别** 24 | Thread方法较简单,适用于单继承 25 | Runnable很好的避免了java中的单根继承,并且使用这种方法可以共享数据资源。 26 | ## 五、线程的状态 27 | 1、新生(创建) 28 | new但是还没调用start方法 29 | 2、就绪 30 | 调用了start方法,但是未抢到CPU的资源 31 | 3、运行 32 | 执行run方法 33 | 4、阻塞 34 | 是一种不可运行状态,造成阻塞的原因: 35 | *执行Thread.sleep()方法 36 | *IO操作时,IO操作未完成 37 | *需要得到琐,但是琐被占用 38 | 5、死亡 39 | 退出main方法 40 | ## 六、线程调度 41 | 1、线程优先级 42 | ①设置优先级 43 | setPriority(int guid) 44 | ②1-10表示优先级,10最高,5为默认,每一个优先级对应Thread的一个公用静态常量 45 | NORM_PRIORITY=5 46 | MIN_PRIORITY=1 47 | MAX_PRIORITY=10 48 | 线程的优先级只是表示一个抢到资源的概率,不一定每次优先级高的都先运行,只是表示有这种可能性 49 | 2、实现线程调度的方法 50 | ①sleep 51 | 静态方法 52 | 要用Thread.sleep(1000);括号内为毫秒数 53 | 强制让线程休眠 54 | ②join 55 | 非静态方法 56 | 线程名.join(); 57 | 谁调用join方法,该线程就先执行完,也有可能出现要加入的线程在未达到join条件时就已执行完毕,这时候join就不起作用了。 58 | ③yield 59 | 静态方法 60 | Thread.yield 61 | 线程的礼让 62 | 可以让当前线程暂停执行,允许其他线程执行,但该线程任然可运行状态,此时,系统选择其他或更高优先级的线程执行,如无其他,则该线程继续执行, 63 | ## 七、线程同步 64 | 高并发安全性问题:马上双十一了,很多多人同一时间点会访问同一数据,这时候线程安全就很重要了 65 | 线程同步: 66 | 所谓线程同步就是当两个或多个线程要访问同一资源时,需要以某种顺序来确保某一时刻只能一个线程使用的方式 67 | 1、同步代码块 68 | 在访问修饰符前或后加synchronized,比如这个例子 69 | 70 | ```java 71 | package demo4; 72 | /* 73 | * 线程同步测试 74 | * 1、同步代码块 75 | */ 76 | public class MyThread implements Runnable { 77 | private int count=10;//显示余票 78 | private int piao;//显示抢到几张票 79 | @Override 80 | public void run() { 81 | while(true) { 82 | synchronized (this) { 83 | if (count <= 0) { 84 | break; 85 | } 86 | count--; 87 | piao++; 88 | //模拟网络延迟 89 | try { 90 | Thread.sleep(2000); 91 | } catch (InterruptedException e) { 92 | // TODO Auto-generated catch block 93 | e.printStackTrace(); 94 | } 95 | System.out.println(Thread.currentThread().getName() + "抢到弟" + piao + "张票,剩余" + count + "张票!"); 96 | } 97 | } 98 | 99 | } 100 | 101 | } 102 | 103 | ``` 104 | 注意:eclipse自动生成同步代码块的快捷键 105 | 右键——Surround with——synchronized... 106 | 2、同步方法 107 | 108 | ```java 109 | package demo5; 110 | /* 111 | * 线程同步测试 112 | * 2、同步方法 113 | */ 114 | public class MyThread implements Runnable { 115 | private int count=10;//显示余票 116 | private int piao;//显示抢到几张票 117 | boolean flag=true; 118 | @Override 119 | public void run() { 120 | while(flag) { 121 | buy(); 122 | } 123 | } 124 | synchronized public void buy() { 125 | 126 | if (count <= 0) { 127 | flag=false; 128 | return; 129 | } 130 | 131 | //模拟网络延迟 132 | try { 133 | Thread.sleep(1000); 134 | } catch (InterruptedException e) { 135 | // TODO Auto-generated catch block 136 | e.printStackTrace(); 137 | } 138 | count--; 139 | piao++; 140 | System.out.println(Thread.currentThread().getName() + "抢到弟" + this.piao + "张票,剩余" + this.count + "张票!"); 141 | } 142 | 143 | } 144 | 145 | ``` 146 | 注意:并不是同步的代码越多越好,容易出现死锁现象 147 | 148 | ## 线程同步涉及的类和方法(重要) 149 | 1、ArryLit类的add方法:是非线程同步,不安全的 150 | 2、StringBuffer同步安全 151 | StringBuilder非同步,不安全 152 | 3、线程安全的:能同步,共享资源,安全 153 | 非线程安全:效率高 154 | 4、HashMap:建只能有一个为空,值不能为空,不安全 155 | Hashtable:键值都不允许为空,安全 156 | -------------------------------------------------------------------------------- /Java_basic/java基础相关知识.md: -------------------------------------------------------------------------------- 1 |  2 | ## 目录 3 | - [目录](#目录) 4 | - [前言](#前言) 5 | - [一、java语言的特点](#一java语言的特点) 6 | - [二、JDK和JRE](#二jdk和jre) 7 | - [三、8种基本数据类型](#三8种基本数据类型) 8 | - [四、位运算符](#四位运算符) 9 | - [五、接口和抽象类的区别](#五接口和抽象类的区别) 10 | - [六、静态变量和实例变量的区别](#六静态变量和实例变量的区别) 11 | - [七、浅拷贝和深拷贝的区别](#七浅拷贝和深拷贝的区别) 12 | - [八、==和eqauls()的区别](#八和eqauls的区别) 13 | - [九、final有哪些用法](#九final有哪些用法) 14 | - [十、String对象的intern()](#十string对象的intern) 15 | - [十一、String和StringBuffer的区别](#十一string和stringbuffer的区别) 16 | - [十二、泛型的上界和下界](#十二泛型的上界和下界) 17 | 18 | ## 前言 19 | 大家好,我是苍何。最近思考了一个问题,为什么会出现公司面试造火箭,工作扭螺丝的现象,包括各种八股文的连环大绝杀问到你不会为主,其实这是考察你的知识面以及掌握的深度,而为什么需要这样呢?归其原因,无非是通过筛选找到那些会思考的人,他们需要的并不是CRUD的工具人,而是会思考能创新的工程师。 20 | 21 | 当你深刻理解到这点,我想不用刻意去学习,在工作中,肯定会吾日三省吾身。 22 | 23 | 于是乎,这个重新开始学习编程系列文章出来了。 24 | 25 | 愿与君共勉! 26 | 27 | ## 一、java语言的特点 28 | **1、面向对象** 29 | java语言是面向对象语言,他和面向过程C不同点是,有封装、继承、多态,万物皆是对象,但是执行效率面向过程稍微快些。 30 | **2、垃圾回收** 31 | JVM垃圾自动回收,即GC操作(后面会细讲) 32 | **3、跨平台性** 33 | 一次编译,到处运行,其实JVM会针对不同不同有不同的实现,我们编写的代码会通过JVM转为.class字节码文件,字节码通过JVM可以在不同平台上运行,转化为能被不同平台识别的机器码。 34 | ## 二、JDK和JRE 35 | **1、JDK是提供给java开发人员使用的开发工具包,包含了JRE** 36 | **2、JRE是运行环境,包含了JVM** 37 | ## 三、8种基本数据类型 38 | 39 | byte、short、int、long、float、double、char、boolean 40 | ## 四、位运算符 41 | 1、<<(左移) 42 | 向左移动n位,相当于乘以2的n次幂 43 | 2、>>(右移) 44 | 向左移动n位,相当于除以2的n次幂 45 | 3、>>(无符号右移) 46 | 被移位二进制最高位无论是0或者是1,空缺位都用0补 47 | 48 | ## 五、接口和抽象类的区别 49 | 1、访问修饰符 50 | 抽象类:public,protected和default等修饰 51 | 接口只能是:public 52 | 2、extends和implements 53 | 3、抽象类可以有构造器,接口不行 54 | 4、抽象类单根继承,接口多个实现 55 | 5、接口是约束定义规范,子类可以不实现父类所有方法,但是要实现接口里所有的方法 56 | ## 六、静态变量和实例变量的区别 57 | 静态变量存储在方法区,属于类所有.实例变量存储在堆当中,其引用存在当前线程栈.需要注意的是从JDK1.8开始用于实现方法区的PermSpace被MetaSpace取代了. 58 | 59 | ## 七、浅拷贝和深拷贝的区别 60 | **1、浅拷贝:** 61 | 被复制对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用仍然指向原来的对象。即对象的浅拷贝会对“主”对象进行拷贝,但不会复制主对象里面的对象。”里面的对象“会在原来的对象和它的副本之间共享。简而言之,浅拷贝仅仅复制所考虑的对象,而不复制它所引用的对象。 62 | 构造方法和clone()方法都介意实现浅拷贝 63 | **2、深拷贝:** 64 | 深拷贝是一个整个独立的对象拷贝,深拷贝会拷贝所有的属性,并拷贝属性指向的动态分配的内存。当对象和它所引用的对象一起拷贝时即发生深拷贝。深拷贝相比于浅拷贝速度较慢并且花销较大。简而言之,深拷贝把要复制的对象所引用的对象都复制了一遍。 65 | 重写clone方法、通过对象序列化实现深拷贝 66 | ## 八、==和eqauls()的区别 67 | 1、基本数据类型:==是值比较 68 | 2、引用数据类型,==和equals都是比较内存地址,只不过有些类重写了Object类的equals方法,比如string类比较的就是值是否相等,重写equals需要重写hashcode方法 69 | ## 九、final有哪些用法 70 | 被final修饰的类不可以被继承 71 | 被final修饰的方法不可以被重写 72 | 被final修饰的变量不可以被改变.如果修饰引用,那么表示引用不可变,引用指向的内容可变. 73 | 被final修饰的方法,JVM会尝试将其内联,以提高运行效率 74 | 被final修饰的常量,在编译阶段会存入常量池中. 75 | 除此之外,编译器对final域要遵守的两个重排序规则更好: 76 | 77 | 在构造函数内对一个final域的写入,与随后把这个被构造对象的引用赋值给一个引用变量,这两个操作之间不能重排序 78 | 初次读一个包含final域的对象的引用,与随后初次读这个final域,这两个操作之间不能重排序. 79 | 80 | 常见的final修饰类: 81 | 82 |   1、java.lang包中 83 | 84 |     包装类:Boolean,Character,Short,Integer,Long,Float,Double,Byte,Void(八大类型的包装类型加一个void) 85 |     字符串类:String,StringBuilder,StringBuffer 86 |     系统类:System、Math,StrictMath 87 | 88 |   2、java.util包中 89 | 90 |     UUID、Scanner 91 | 92 |   3、java.lang.reflect包中 93 | 94 |     Constructor、Field、Method 95 | 96 | ## 十、String对象的intern() 97 | Stirng中的intern()是个Native方法,它会首先从常量池中查找是否存在该常量值的字符串,若不存在则先在常量池中创建,否则直接返回常量池已经存在的字符串的引用 98 | ## 十一、String和StringBuffer的区别 99 | String和StringBuffer主要区别是性能:String是不可变对象,每次对String类型进行操作都等同于产生了一个新的String对象,然后指向新的String对象.所以尽量不要对String进行大量的拼接操作,否则会产生很多临时对象,导致GC开始工作,影响系统性能. 100 | 101 | StringBuffer是对象本身操作,而不是产生新的对象,因此在有大量拼接的情况下,我们建议使用StringBuffer(线程安全). 102 | 103 | 104 | ## 十二、泛型的上界和下界 105 | : 无限制通配符 106 | : extends 关键字声明了类型的上界,表示参数化的类型可能是所指定的类型,或者是此类型的子类 107 | : super关键字声明了类型的下界,表示参数化的类型可能是指定的类型,或者是此类型的父类 108 | 它们的目的都是为了使方法接口更为灵活,可以接受更为广泛的类型. 109 | 110 | < ? extends E>: 用于灵活读取,使得方法可以读取 E 或 E 的任意子类型的容器对象。 111 | < ? super E>: 用于灵活写入或比较,使得对象可以写入父类型的容器,使得父类型的比较方法可以应用于子类对象。 112 | 用简单的一句话来概括就是为了获得最大限度的灵活性,要在表示生产者或者消费者的输入参数上使用通配符,使用的规则就是:生产者有上限(读操作使用extends),消费者有下限(写操作使用super). 113 | 114 | -------------------------------------------------------------------------------- /Java_basic/开发总结/java在过滤器中为http请求加请求头header.md: -------------------------------------------------------------------------------- 1 | # 前言 2 | 现在有一个需求场景是,每一个请求我都需要在请求头里面加上token这个请求头,作为一种校验机制,传统的接口可以通过设置一个全局的变量,然后通过页面携带过来(大概就是先将我们的token放在session中,写一个服务用来获取session中的token,然后主页面用ajax调用接口,将token放在隐藏域中,然后将请求头放进来,用ajax方法,这里不想洗说了),但是有一种情况是通过页面传递的并不一定都会适用所有接口,比如上传和下载的接口有时候头里面就没有token参数,可能是上传和下载是用表单提交的 3 | 这个时候如何将请求头通过后台的方法加进来? 4 | 想到用过滤器,用后台方法强制加入请求头。 5 | 6 | # HTTP请求头 7 | 关于http请求头的相关信息可以参考这票博客,这里就不画蛇添足了 8 | https://blog.csdn.net/alexshi5/article/details/80379086 9 | 下面直接上如何通过filter为请求添加请求头参数: 10 | 11 | # 新建请求控制类 12 | ```java 13 | package com.bitplan.smartCRM.web; 14 | 15 | import java.io.IOException; 16 | import java.util.Collections; 17 | import java.util.Enumeration; 18 | import java.util.HashMap; 19 | import java.util.List; 20 | import java.util.Map; 21 | 22 | import javax.servlet.Filter; 23 | import javax.servlet.FilterChain; 24 | import javax.servlet.FilterConfig; 25 | import javax.servlet.ServletException; 26 | import javax.servlet.ServletRequest; 27 | import javax.servlet.ServletResponse; 28 | import javax.servlet.http.HttpServletRequest; 29 | import javax.servlet.http.HttpServletRequestWrapper; 30 | 31 | public class HeaderMapRequestWrapper extends HttpServletRequestWrapper { 32 | /** 33 | * construct a wrapper for this request 34 | * 35 | * @param request 36 | */ 37 | public HeaderMapRequestWrapper(HttpServletRequest request) { 38 | super(request); 39 | } 40 | 41 | private Map headerMap = new HashMap(); 42 | 43 | /** 44 | * add a header with given name and value 45 | * 46 | * @param name 47 | * @param value 48 | */ 49 | public void addHeader(String name, String value) { 50 | headerMap.put(name, value); 51 | } 52 | 53 | @Override 54 | public String getHeader(String name) { 55 | String headerValue = super.getHeader(name); 56 | if (headerMap.containsKey(name)) { 57 | headerValue = headerMap.get(name); 58 | } 59 | return headerValue; 60 | } 61 | 62 | /** 63 | * get the Header names 64 | */ 65 | @Override 66 | public Enumeration getHeaderNames() { 67 | List names = Collections.list(super.getHeaderNames()); 68 | for (String name : headerMap.keySet()) { 69 | names.add(name); 70 | } 71 | return Collections.enumeration(names); 72 | } 73 | 74 | @Override 75 | public Enumeration getHeaders(String name) { 76 | List values = Collections.list(super.getHeaders(name)); 77 | if (headerMap.containsKey(name)) { 78 | values.add(headerMap.get(name)); 79 | } 80 | return Collections.enumeration(values); 81 | } 82 | 83 | } 84 | ``` 85 | # 新建过滤器 86 | 注意:需要将请求头里面没有token的接口后面带上token参数,参数名是“”token“” 87 | ```java 88 | public class RemoteAddrFilter implements Filter { 89 | 90 | @Override 91 | public void destroy() { 92 | 93 | } 94 | 95 | @Override 96 | public void doFilter(ServletRequest request, ServletResponse response, 97 | FilterChain chain) throws IOException, ServletException { 98 | HttpServletRequest req = (HttpServletRequest) request; 99 | HeaderMapRequestWrapper requestWrapper = new HeaderMapRequestWrapper(req); 100 | //获得请求参数中的token值 101 | String token = request.getParamter("token"); 102 | if(!StringUtils.isEntry(token)){ 103 | //如果请求中带有这个参数,则进行过滤加一个header头 104 | requestWrapper.addHeader("tokenr", token); 105 | chain.doFilter(requestWrapper, response); // Goes to default servlet. 106 | } 107 | chain.doFilter(request, response); // Goes to default servlet. 108 | 109 | } 110 | 111 | @Override 112 | public void init(FilterConfig filterConfig) throws ServletException { 113 | 114 | } 115 | ``` 116 | 这个时候请求头中是会带有这个token,但是你可能用右键F12看不到这个头,相当于是一层伪代理,我们的接口是已经加上token校验。 117 | 118 | # 总结 119 | 查找了很多资料,百度找到的和其他博客上说的感觉都是大同小异,并没有达到想要的效果。我觉得写博客就得一针见血,什么问题必须标书清楚,不要为了写而写,你可能不知道当人看了半天你的博客但是却没有得到问题的解决是一件多么痛苦的过程。最后是在https://stackoverflow.com上面找到的答案,当百度找不到答案时尝试谷歌,谷歌找不到时尝试下stackoverflow。 120 | 查找问题的搜索词也很重要,这些都需要有相关的经验才可以快速的定位问题,快速的找到解决办法,这才是一个资深程序眼必须会的一项技能。 121 | -------------------------------------------------------------------------------- /Java_basic/算法/N个人站圈报数算法问题.md: -------------------------------------------------------------------------------- 1 |  2 | 这是一道算法面试题 3 | --- 4 | layout: post 5 | title: N个人站圈报数算法问题 6 | categories: Java语言核心 7 | description: Java 网络编程技术 8 | keywords: Java-basic, 算法 9 | --- 10 | 11 | 本系列文章在 持(jing)续(chang)更(duan)新(geng)中,欢迎有兴趣的童鞋们关注。 12 | 13 | ```java 14 | import java.util.Scanner; 15 | 16 | public class Test1 { 17 | public static void main(String[] args) { 18 | Scanner input = new Scanner(System.in); 19 | int n;// 人数 20 | int m;// 报名数(报到的出列) 21 | 22 | 23 | System.out.print("请输入n:"); 24 | n = input.nextInt(); 25 | System.out.print("请输入m:"); 26 | m = input.nextInt(); 27 | int num = n;// 剩余人数 28 | int flag = 0;// 标记报名数,每报一次就加1 29 | int[] arr = new int[n];// 数组,刚开始所有数都为0,0代表存货,1代表删除该元素 30 | // 只要剩余人数大于等于1个人,就一直循环 31 | while (num >1) { 32 | for (int i = 0; i < n; i++) { 33 | if (arr[i] == 0) { 34 | flag++; 35 | } 36 | if (flag == m) { 37 | arr[i] = 1; 38 | System.out.println("第" + (i + 1) + "次出列:编号" + (i+1)); 39 | flag=0; 40 | num--; 41 | } 42 | 43 | } 44 | } 45 | 46 | for (int i = 0; i < n; i++) { 47 | //最后编号为0代表存活的 48 | if(arr[i]==0) { 49 | System.out.println("最后剩下:" + (i+1)); 50 | } 51 | 52 | } 53 | } 54 | } 55 | 56 | ``` 57 | 58 | 方式二: 59 | 60 | ```sql 61 | import java.util.LinkedList; 62 | import java.util.List; 63 | import java.util.Scanner; 64 | /** 65 | * 使用集合解决 66 | * @author Administrator 67 | * 68 | */ 69 | public class Test { 70 | public static void main(String[] args) { 71 | Scanner input = new Scanner(System.in); 72 | // 人数 73 | int n; 74 | // 报名数(报到的出列) 75 | int m; 76 | //用来记录报名 77 | int count=0; 78 | System.out.print("请输入人数:"); 79 | n = input.nextInt(); 80 | System.out.print("请输入报到出列的数字:"); 81 | m = input.nextInt(); 82 | //集合放人和出列 83 | List list = new LinkedList(); 84 | for (int i = 1; i <=n; i++) { 85 | list.add(i); 86 | } 87 | 88 | while(list.size()>1) { 89 | for (int i = 0; i Javastudy,期待您的加入:blush: 112 | 113 | 114 | # 本文章已同步至苍何的个人博客,可以直接在博客上留言哦:blush: 115 | 116 | 117 | # 来我的微信公众号玩耍呗:blush: 118 | 119 | 120 | # 扫码无套路关注我的CSDN博客:blush: 121 | 122 | -------------------------------------------------------------------------------- /Java_basic/编程入门.md: -------------------------------------------------------------------------------- 1 | ## 一、前言 2 | 大家好,我是苍何。最近思考了一个问题,为什么会出现公司面试造火箭,工作扭螺丝的现象,包括各种八股文的连环大绝杀问到你不会为主,其实这是考察你的知识面以及掌握的深度,而为什么需要这样呢?归其原因,无非是通过筛选找到那些会思考的人,他们需要的并不是CRUD的工具人,而是会思考能创新的工程师。 3 | 4 | 当你深刻理解到这点,我想不用刻意去学习,在工作中,肯定会吾日三省吾身。 5 | 6 | 于是乎,这个重新开始学习编程系列文章出来了。 7 | 8 | 愿与君共勉! 9 | ## 二、知识图谱 10 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20210701211134318.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQzMjcwMDc0,size_16,color_FFFFFF,t_70) 11 | ## 三、计算机硬件 12 | 13 | 计算机包括硬件和软件,硬件是看得见的物理部分,而软件提供看不见的指令 14 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20210702112355618.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQzMjcwMDc0,size_16,color_FFFFFF,t_70) 15 | 个人计算机上,总线搭建在主板上,主板是一个连接计算机各个部分的电路板 16 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20210702112532384.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQzMjcwMDc0,size_16,color_FFFFFF,t_70) 17 | ### 1、中央处理器【CPU】 18 | 指中央处理器,它是一块超大规模的集成电路,是一台计算机的运算核心和控制核心。它的功能主要是解释计算机指令以及处理计算机软件中的数据。CPU核:一个CPU代表一个核,多核CPU 19 | CPU由运算器、控制器和寄存器及实现它们之间联系的数据、控制及状态的总线构成。CPU的能力高低直接影响了整个电脑的运行速度。 20 | **CPU的选择方法:** 21 | 1、看编号。Intel和AMD的每一颗正品盒装处理器都有一个唯一的编号,在产品的包装盒上的条形码和处理器表面都会标明这个编号,这个编号相当于手机的IMEI码,两个编号必须一致才是正品。 22 | 23 | 2、看包装。Intel盒装处理器与散包处理器的区别就在于三年质保,价格方面相差几十到上百元不等。以AMD的包装盒为例,没有拆封过的包装盒贴有一张标贴,如果没有这张标贴,那肯定是假货。 24 | 25 | 3、看风扇。这个方法针对Intel处理器,打开CPU的包装后,可以查看原装的风扇正中的防伪标签,真的Intel盒包CPU防伪标签为立体式防伪,除了底层图案会有变化外,还会出现立体的“Intel”标志。 26 | ### 2、赫兹Hz 27 | 每台计算机都有一个内部时钟,该时钟以固定速度发射电子脉冲,时钟速度越快,在给定的时间内执行的指令就越多,嘟嘟的伎俩单位为赫兹,1Hz 相当于每秒1个脉冲,随着COU速度不断提高,目前以千兆赫GHz来表述。1khz = 1024hz ,1mhz = 1024khz 1ghz = 1024mhz 28 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20210702112856679.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQzMjcwMDc0,size_16,color_FFFFFF,t_70) 29 | 30 | ## 四、内存 31 | 内存(Memory)是计算机的重要部件之一,也称内存储器和主存储器,它用于暂时存放CPU中的运算数据,与硬盘等外部存储器交换的数据。它是外存与CPU进行沟通的桥梁,计算机中所有程序的运行都在内存中进行,内存性能的强弱影响计算机整体发挥的水平。只要计算机开始运行,操作系统就会把需要运算的数据从内存调到CPU中进行运算,当运算完成,CPU将结果传送出来。 32 | 33 | 1、比特bit 34 | 一个0或1存储为1个比特,是计算机中最小的存储单位 35 | 2、byte 36 | 计算机中是最基本的存储单元byte,每个字节由8个比特构成 37 | 1kb = 1024b 38 | 1MB = 1024kb 39 | 1GB = 1024MB 40 | 1Tb = 1024GB 41 | 42 | ## 五、操作系统 43 | 操作系统(operating system,简称OS)是管理计算机硬件与软件资源的计算机程序。操作系统需要处理如管理与配置内存、决定系统资源供需的优先次序、控制输入设备与输出设备、操作网络与管理文件系统等基本事务。操作系统也提供一个让用户与系统交互的操作界面。常见的操作系统有windows、IOS等。 44 | ### 1、安全加固技术 45 | 随着计算机网络与应用技术的不断发展,信息系统安全问题越来越引起人们的关注,信息系统一旦遭受破坏,用户及单位将受到重大的损失,对信息系统进行有效的保护,是必须面对和解决的迫切课题,而操作系统安全在计算机系统整体安全中至关重要,加强操作系统安全加固和优化服务是实现信息系统安全的关键环节。当前,操作系统安全构成威胁的问题主要有系统漏洞、脆弱的登录认证方式、访问控制形同虚设、计算机病毒、特洛伊木马、隐蔽通道、系统后门恶意程序和代码感染等,加强操作系统安全加固工作是整个信息系统安全的基础。 46 | 47 | **安全加固原理:** 48 | 安全加固是指按照系统安全配置标准,结合用户信息系统实际情况,对信息系统涉及的终端主机、服务器、网络设备、数据库及应用中间件等软件系统进行安全配置加固、漏洞修复和安全设备调优。通过安全加固,可以合理加强信息系统安全性,提高其健壮性,增加攻击入侵的难度,可以使信息系统安全防范水平得到大幅提升。 49 | **安全加固方法** 50 | 安全加固主要通过人工对系统进行漏洞扫描,针对扫描结果使用打补丁、强化账号安全、修改安全配置、优化访问控制策略、增加安全机制等方法加固系统以及堵塞系统漏洞、“后门”,完成加固工作。 51 | 52 | ### 2、操作系统虚拟化 53 | 操作系统虚拟化作为容器的核心技术支撑,得到了研究者的广泛关注。最近几年,无论是在以SOSP/OSDI为代表的计算机系统领域顶级学术会议上,还是以Google为代表的重要互联网企业中,都陆续出现了一批操作系统虚拟化的最新研究成果,并且成果数量呈现出逐年增加的总体趋势。 54 | 操作系统虚拟化技术允许多个应用在共享同一主机操作系统 (Host OS) 内核的环境下隔离运行, 主机操作系统为应用提供一个个隔离的运行环境, 即容器实例:操作系统虚拟化技术架构可以分为容器实例层、容器管理层和内核资源层。 55 | 操作系统虚拟化与传统虚拟化最本质的不同是传统虚拟化需要安装客户机操作系统 (Guest OS) 才能执行应用程序,而操作系统虚拟化通过共享的宿主机操作系统来取代 Guest OS。 56 | ### 3、Windows下的内存是如何管理的 57 | 3种: 58 | 1.虚拟内存: 59 | 最适合用来管理大型对象或者结构数组 60 | 2.内存映射文件: 61 | 最适合用来管理大型数据流(通常来自文件)以及在单个计算机上运行多个进程之间共享数据 62 | 3.内存堆栈: 63 | 最适合用来管理大量的小对象 64 | ### 4、进程间通信有哪些方式以及区别 65 | 参考:https://blog.csdn.net/yang_teng_/article/details/53325280 66 |    https://blog.csdn.net/wh_sjc/article/details/70283843 67 | 68 | IPC方式:7种 69 | 1.管道(pipe):管道是一种半双工的通信方式,数据只能单向流动,而且只能在有血缘关系的进程间使用,进程的血缘关系通常是指父子进程关系。 70 | 2.命名管道(named pipe):也是半双工的通信方式,但是它允许无亲缘关系关系进程间通信。 71 | 72 | 3.信号(signal):是一种比较复杂的通信方式,用于通知接收进程某一事件已经发生。 73 | 4.信号量(semophere):信号量是一个计数器,可用来控制多个进程对共享资源的访问。它通常作为一种锁机制,防止某进程正在访问共享资源时,其他进程也访问该资源。因此,主要作为进程间以及同一进程内不同线程之间的同步手段。 74 | 75 | 5.消息队列(message queue):消息队列是由消息组成的链表,存放在内核中,并由消息队列标识符标识。消息队列克服了信号传递消息少,管道只能承载无格式字节流以及缓冲区大小受限等缺点。 76 | 77 | 6.共享内存(shared memory):就是映射一段能被其他进程所访问的内存,这段共享内存由一个进程创建,但多个进程都可以访问,共享内存是最快的IPC方式,它是针对其他进程间的通信方式运行效率低而专门设计的。它往往与其他通信机制,如信号量等配合使用,来实现进程间的同步和通信。 78 | 7.套接字(socket):套接口也是进程间的通信机制,与其他通信机制不同的是它可用于不同及其间的进程通信。 79 | 几种方式的比较: 80 | 管道:速度慢、容量有限 81 | 消息队列:容量收到系统限制,且要注意第一次读的时候,要考虑上一次没有读完数据的问题。 82 | 信号量:不能传递复杂信息,只能用来同步。 83 | 共享内存:能够很容易控制容量,速度快,但要保持同步,比如一个进程在写的时候,另一个进程要注意读写的问题,相当于线程中的线程安全。 84 | ### 5、进程的调度算法 85 | 参考原文:https://blog.csdn.net/xiongluo0628/article/details/81461053 86 | 1.先来先服务(FCFS):此算法的原则是按照作业到达后备作业队列(或进程进入就绪队列)的先后次序选择作业(或进程) 87 | 88 | 2.短作业优先(SJF:Shortest Process First):这种算法主要用于作业调度,它从作业后备序列中挑选所需运行时间最短的作业进入主存运行。 89 | 90 | 3.时间片轮转调度算法:当某个进程执行的时间片用完时,调度程序便终止该进程的执行,并将它送到就绪队列的末尾,等待分配下一时间片再执行。然后把处理机分配给就绪队列中新的队首进程,同时也让它执行一个时间片。这样就可以保证队列中的所有进程,在已给定的时间内,均能获得一时间片处理机执行时间。 91 | 92 | 4.高响应比优先:按照高响应比(已等待时间+要求运行时间)/要求运行时间 优先的原则,在每次选择作业投入运行时,先计算此时后备作业队列中每个作业的响应比RP。选择最大的作业投入运行。 93 | 94 | 5.优先权调度算法:按照进程的优先权大小来调度。使高优先权进程得到优先处理的调度策略称为优先权调度算法。注意:优先数越多,优先权越小。 95 | 96 | 6.多级队列调度算法:多队列调度是根据作业的性质和类型的不同,将就绪队列再分为若干个队列,所有的作业(进程)按其性质排入相应的队列中,而不同的就绪队列采用不同的调度算法。 97 | 98 | 99 | -------------------------------------------------------------------------------- /Java_basic/计算机网络/计算机网络基础概述.md: -------------------------------------------------------------------------------- 1 | # 1、计算机网络发展简史 2 | ## 1.1、最早的广域网 3 | ![image.png](https://canghe666.oss-cn-chengdu.aliyuncs.com/canghe/48435e9d4c3bfd75d86dc13a4f73f1c8.png) 4 | 5 | ## 1.2、电路交换网特点 6 | ![image.png](https://canghe666.oss-cn-chengdu.aliyuncs.com/canghe/044689b534a3eb1ee2ee196e0ccf74a2.png) 7 | ## 1.3、计算机网络的要求 8 | ![image.png](https://canghe666.oss-cn-chengdu.aliyuncs.com/canghe/8ed3ca4a95581891773faedef6d4fa5f.png) 9 | ## 1.4、分组交换 10 | ![image.png](https://canghe666.oss-cn-chengdu.aliyuncs.com/canghe/0d755c558b0b25f74bf2a49d90ff2c1d.png) 11 | ## 1.5、交换方式 12 | ![image.png](https://canghe666.oss-cn-chengdu.aliyuncs.com/canghe/02e9b4ff0773c6b3a92c4a2cd47032fb.png) 13 | ## 1.6、因特网的发展史 14 | ![image.png](https://canghe666.oss-cn-chengdu.aliyuncs.com/canghe/b64167e71110dfe580dee4c9472dce3d.png) 15 | ### 1.6.1、三层结构因特网 16 | ![image.png](https://canghe666.oss-cn-chengdu.aliyuncs.com/canghe/497eac23e6dd063901ec2082e19d9016.png) 17 | 18 | ### 1.6.2、多级结构因特网 19 | ![image.png](https://canghe666.oss-cn-chengdu.aliyuncs.com/canghe/c9ab5928babbd2e67cdab96ba4cfa103.png) 20 | 21 | # 2、TCP/IP协议简介 22 | ![image.png](https://canghe666.oss-cn-chengdu.aliyuncs.com/canghe/b72029e480ed2cf31f05a823ca1dc99b.png) 23 | ## 2.1、分层结构 24 | ![image.png](https://canghe666.oss-cn-chengdu.aliyuncs.com/canghe/708ceab2637fabbe8e2a9f99d4ee231c.png) 25 | ![image.png](https://canghe666.oss-cn-chengdu.aliyuncs.com/canghe/c2170c11ba6d4ed4f6cf6975f1ad526e.png) 26 | ![image.png](https://canghe666.oss-cn-chengdu.aliyuncs.com/canghe/4ae870759029c4f1554f2ba293c4e058.png) 27 | ![image.png](https://canghe666.oss-cn-chengdu.aliyuncs.com/canghe/bee286c49a52ff2b86cb7338ee17eab9.png) 28 | ![image.png](https://canghe666.oss-cn-chengdu.aliyuncs.com/canghe/d3e76c5405a5a5247e367b5d0f763443.png) 29 | 30 | ## 2.2、IP协议 31 | ![image.png](https://canghe666.oss-cn-chengdu.aliyuncs.com/canghe/b453248b906f52603ce5cc9f06cf63c9.png) 32 | ## 2.3、TCP协议 33 | ![image.png](https://canghe666.oss-cn-chengdu.aliyuncs.com/canghe/ad56bf3e00da90b203ac652d8a83abf1.png) 34 | ## 2.4、UDP协议 35 | 用户数据报协议 36 | ![image.png](https://canghe666.oss-cn-chengdu.aliyuncs.com/canghe/a2cc837d57f8d23fdb673f696611a73f.png) 37 | 38 | # 3、MAC地址、IP地址、子网掩码、端口 39 | ## 3.1、网卡 40 | ![image.png](https://canghe666.oss-cn-chengdu.aliyuncs.com/canghe/f4d6cbd6eba42db1093e8fa2debcdd0b.png) 41 | ## 3.2、MAC地址 42 | ![image.png](https://canghe666.oss-cn-chengdu.aliyuncs.com/canghe/fcf656198e0ef5eb7df8657f513d5a6d.png) 43 | ![image.png](https://canghe666.oss-cn-chengdu.aliyuncs.com/canghe/533f66c93cac33ad7de318e34fa60f81.png) 44 | ## 3.3、IP地址 45 | ![image.png](https://canghe666.oss-cn-chengdu.aliyuncs.com/canghe/92b758b178fe0cbd669c016d68caf8b7.png) 46 | ![image.png](https://canghe666.oss-cn-chengdu.aliyuncs.com/canghe/fbe08c92cc300da0d7dd993633570665.png) 47 | ### 3.3.1、IP地址分类 48 | ![image.png](https://canghe666.oss-cn-chengdu.aliyuncs.com/canghe/3e14df2de9e8349ee3dda27c9f6acd2c.png) 49 | 50 | ### 3.3.2、IPV4地址组成 51 | ![image.png](https://canghe666.oss-cn-chengdu.aliyuncs.com/canghe/395efaccb67e48a645170dcd1fa813ab.png) 52 | 53 | ### 3.2.3、IP地址特点 54 | ![image.png](https://canghe666.oss-cn-chengdu.aliyuncs.com/canghe/7d1a081ab02f4372523c3f6477b9ece5.png) 55 | 56 | ### 3.2.4、IPV4地址分类(依据前8位区分) 57 | ![image.png](https://canghe666.oss-cn-chengdu.aliyuncs.com/canghe/223b5204cd3ed90d6e6ebdaecc0004bd.png) 58 | 59 | ### 3.2.5、私有IP地址 60 | ![image.png](https://canghe666.oss-cn-chengdu.aliyuncs.com/canghe/cfb7ddf05238fc7e041358015db672b0.png) 61 | 62 | ![image.png](https://canghe666.oss-cn-chengdu.aliyuncs.com/canghe/49fd033d46ecf52fe3116b3605cbbfb3.png) 63 | 64 | 65 | ### 3.2.6、回环IP地址 66 | ![image.png](https://canghe666.oss-cn-chengdu.aliyuncs.com/canghe/f256b3306a4ccb59e6e5ac3a55fdb965.png) 67 | 68 | ### 3.2.7、查询ip地址命令 69 | ![image.png](https://canghe666.oss-cn-chengdu.aliyuncs.com/canghe/9c63aa26e0163a890eda133eb494adf8.png) 70 | 71 | ### 3.2.8、如何判断主机是否联通 72 | ping命令 73 | 74 | ## 3.4、子网掩码 75 | ![image.png](https://canghe666.oss-cn-chengdu.aliyuncs.com/canghe/46d21f0a6e41af182b38441aa7fd4f22.png) 76 | ![image.png](https://canghe666.oss-cn-chengdu.aliyuncs.com/canghe/23058c33bc466ab34777ece0cd3bfc9f.png) 77 | 78 | ## 3.5、端口 79 | ![image.png](https://canghe666.oss-cn-chengdu.aliyuncs.com/canghe/b6777f5a5cb9b0a0a2bbda57dac72fe1.png) 80 | ![image.png](https://canghe666.oss-cn-chengdu.aliyuncs.com/canghe/c8b8c2da65cb1c03070a16ef79d40804.png) 81 | ![image.png](https://canghe666.oss-cn-chengdu.aliyuncs.com/canghe/759bf66802666338fa7b5360189943aa.png) 82 | # 4、数据包的组装、拆解 83 | ## 4.1、数据包在各个层之间的传输 84 | ![image.png](https://canghe666.oss-cn-chengdu.aliyuncs.com/canghe/5e1cbb52ebccf87ca50d4b577d53b436.png) 85 | ## 4.2、链路层封包格式 86 | ![image.png](https://canghe666.oss-cn-chengdu.aliyuncs.com/canghe/6aa855a990a9f3ab1c4223c223c05d5b.png) 87 | ![image.png](https://canghe666.oss-cn-chengdu.aliyuncs.com/canghe/9886a7ec342088b4bbf1bc9885db0ddd.png) 88 | ## 4.3、网络层和传输层的封包格式 89 | ![image.png](https://canghe666.oss-cn-chengdu.aliyuncs.com/canghe/584217d2a89341f84d5bc6344c9860a0.png) 90 | 91 | # 5、网络应用程序开发流程 92 | ## 5.1、TCP面向连接 93 | ![image.png](https://canghe666.oss-cn-chengdu.aliyuncs.com/canghe/dbbd8f69c12b44c06d37978a9ab551cc.png) 94 | 95 | ## 5.2、UDP无连接 96 | ![image.png](https://canghe666.oss-cn-chengdu.aliyuncs.com/canghe/68130d8e3956cf3e636a2fa7fc5e26ab.png) 97 | 98 | ## 5.3、CS架构 99 | ![image.png](https://canghe666.oss-cn-chengdu.aliyuncs.com/canghe/8a43a4b69f59e79747eb6243f776eb81.png) 100 | ![image.png](https://canghe666.oss-cn-chengdu.aliyuncs.com/canghe/a5a8afb44e882743db907d9a36ff3232.png) 101 | ![image.png](https://canghe666.oss-cn-chengdu.aliyuncs.com/canghe/7fd208dc0bd51a737ddb9bec1e8c6281.png) 102 | 103 | -------------------------------------------------------------------------------- /Java_basic/设计模式/设计模式应用之策略模式.md: -------------------------------------------------------------------------------- 1 | ## 一、实际开发痛点 2 | 当业务需求涉及到很多的分支逻辑时,过多的if-else或者过多的switch代码显得很不简洁,而且当我们修改某一分支逻辑时,要改动的很多,比如现在某一分支不要了,就要把这个if条件删除掉,这样是很不好的,这个时候,我们想到了策略模式,替换掉过多的if-else或者switch语句。 3 | ## 二、什么是策略模式 4 | 策略这个词应该怎么理解,打个比方说,我们出门的时候会选择不同的出行方式,比如骑自行车、坐公交、坐火车、坐飞机、坐火箭等等,这些出行方式,每一种都是一个策略。 5 | 再比如我们去逛商场,商场现在正在搞活动,有打折的、有满减的、有返利的等等,其实不管商场如何进行促销,说到底都是一些算法,这些算法本身只是一种策略,并且这些算法是随时都可能互相替换的,比如针对同一件商品,今天打八折、明天满100减30,这些策略间是可以互换的。 6 | 策略模式(Strategy),定义了一组算法,将每个算法都封装起来,并且使它们之间可以互换。 7 | ## 三、实际应用 8 | **1、业务场景** 9 | 现在需要接收来自某系统的回调,消息回调会有很多类型,比如私聊文本消息、私聊图片消息、新好友申请、私聊语音消息等,每一种消息类型,对应不同的逻辑处理,我们最开始是想直接if-else或者switch,走不同的分支逻辑搞定,但是这样扩展性不好,不易维护,这时我们想到了策略模式。 10 | **2、定义枚举类** 11 | 枚举类存放各种回调类型,值代表的是具体实现类的类名,首字母这里小写。通过key就能得到对应的类beaName。 12 | 13 | ```java 14 | @Getter 15 | public enum MsgCallBackEnum { 16 | //新好友申请 17 | NEWFRIEND_MSG_CALL_BACK(0, "newFriendMsgCallBackHandler"), 18 | //添加好友成功 19 | ADDFRIENDSUCCESS_MSG_CALL_BACK(16, "addfriendSuccessMsgCallBackHandler"), 20 | //私聊文本消息 21 | PRIVATECHATTEXT_MSG_CALL_BACK(5, "privateChatTextMsgCallBackHandler"), 22 | //私聊图片消息 23 | PRIVATECHATIMAGE_MSG_CALL_BACK(6, "privateChatImageMsgCallBackHandler"), 24 | //私聊视频消息 25 | privateChatVIDEO_MSG_CALL_BACK(7, "privateChatVideoMsgCallBackHandler"), 26 | //私聊语音消息 27 | PRIVATECHATVOICE_MSG_CALL_BACK(8, "privateChatVoiceMsgCallBackHandler"); 28 | 29 | private Integer type; 30 | private String beanName; 31 | 32 | MsgCallBackEnum(Integer type, String beanName) { 33 | this.type = type; 34 | this.beanName = beanName; 35 | } 36 | 37 | public static String getBeanName(Integer type) throws BusinessException { 38 | for (MsgCallBackEnum msgCallBackStrategyEnum : MsgCallBackEnum.values()) { 39 | if (msgCallBackStrategyEnum.type.equals(type)) { 40 | return msgCallBackStrategyEnum.getBeanName(); 41 | } 42 | } 43 | return null; 44 | } 45 | 46 | } 47 | ``` 48 | **3、定义抽象类** 49 | 抽象类定义抽象方法handler,每一种逻辑处理类只需要继承这个抽象类就可以了。 50 | 51 | ```java 52 | public abstract class AbstractMsgCallBackHandler { 53 | public final Boolean process(JSONObject json) { 54 | return this.handler(json); 55 | } 56 | 57 | /** 58 | * 处理相应逻辑 59 | * 60 | * @param json 61 | * @return 62 | */ 63 | protected abstract Boolean handler(JSONObject json); 64 | } 65 | ``` 66 | **4、定义实现类** 67 | 实现类具体处理业务逻辑,继承抽象类 68 | 69 | ```java 70 | @Component 71 | @Slf4j 72 | public class NewFriendMsgCallBackHandler extends AbstractMsgCallBackHandler { 73 | @Resource 74 | private CommonService commonService; 75 | 76 | @Override 77 | protected Boolean handler(JSONObject json) { 78 | JSONObject data = json.getJSONObject("data"); 79 | String wId = data.getString("wId"); 80 | String v1 = data.getString("v1"); 81 | String v2 = data.getString("v2"); 82 | Integer type = data.getInteger("scene"); 83 | Map param = new HashMap<>(); 84 | param.put("wId", wId); 85 | param.put("v1", v1); 86 | param.put("v2", v2); 87 | param.put("type", type); 88 | commonService.commonSendPost(param, UrlConstant.WK_ACCEPTUSER_URL); 89 | return Boolean.TRUE; 90 | } 91 | } 92 | ``` 93 | 94 | **5、调用抽象方法** 95 | 第一步,先把抽象类注入,这里以map的方式注入,key为beanName,值为具体的实现类。 96 | 97 | ```java 98 | @Resource 99 | private Map abstractMsgCallBackHandlerMap; 100 | ``` 101 | 第二步、通过类型获取beanName,从枚举中获取value 102 | 103 | ```java 104 | String beanName = MsgCallBackEnum.getBeanName(messageType); 105 | ``` 106 | 107 | 第三步、通过beanName获取抽象类 108 | 109 | ```java 110 | AbstractMsgCallBackHandler abstractMsgCallBackHandler = abstractMsgCallBackHandlerMap.get(beanName); 111 | ``` 112 | 第四步、调用抽象类抽象方法,会自动指向实现类 113 | 114 | ```java 115 | abstractMsgCallBackHandler.process(json); 116 | ``` 117 | 整体的代码大概是这样的: 118 | 119 | ```java 120 | @Slf4j 121 | @RestController 122 | @RequestMapping("/callBack") 123 | public class CallBackController { 124 | @Resource 125 | private WxAdminService wxAdminService; 126 | @Resource 127 | private Map abstractMsgCallBackHandlerMap; 128 | 129 | /** 130 | * 消息接收服务地址 131 | * 132 | * @param msg 133 | * @return 134 | */ 135 | @TokenNeedless 136 | @PostMapping("/getMsgCallBack") 137 | public Result getMsgCallBack(@RequestBody String msg) { 138 | JSONObject json = JSONObject.parseObject(msg); 139 | //消息类型 140 | Integer messageType = json.getInteger("messageType"); 141 | 142 | log.info("getMsgCallBack:{}", msg); 143 | String beanName = MsgCallBackEnum.getBeanName(messageType); 144 | AbstractMsgCallBackHandler abstractMsgCallBackHandler = abstractMsgCallBackHandlerMap.get(beanName); 145 | if (abstractMsgCallBackHandler == null) { 146 | return Result.ok(); 147 | } 148 | Boolean process = abstractMsgCallBackHandler.process(json); 149 | log.info("getMsgCallBack_process:{}", process); 150 | 151 | return Result.ok(); 152 | } 153 | } 154 | ``` 155 | 这样以后有新的类型,直接写一个实现抽象类的类就可以了,代码藕和度下降很多。 156 | ## 四、总结 157 | 1. 何时使用 158 | 一个系统有许多类,而区分它们的只是他们直接的行为时 159 | 2. 方法 160 | 将这些算法封装成一个一个的类,任意的替换 161 | 3. 优点 162 | 算法可以自由切换 163 | 避免使用多重条件判断(如果不用策略模式我们可能会使用多重条件语句,不利于维护) 164 | 扩展性良好,增加一个策略只需实现接口即可 165 | 4. 缺点 166 | 策略类数量会增多,每个策略都是一个类,复用的可能性很小 167 | 所有的策略类都需要对外暴露 168 | 5. 使用场景 169 | 多个类只有算法或行为上稍有不同的场景 170 | 算法需要自由切换的场景 171 | 需要屏蔽算法规则的场景 172 | 173 | -------------------------------------------------------------------------------- /Java与数据库交互技术/MySQL数据库/JDBC操作数据库/c3p0连接池/c3p0连接池的用法.md: -------------------------------------------------------------------------------- 1 | # c3p0连接池的用法 2 | 3 | ## 1、导入c3p0jar包 4 | 5 | c3p0-0.9.1.2.jar 6 | 7 | ## 2、xml配置文件 8 | 9 | 在src的目录下, 创建一个名称为 c3p0-config.xml的配置文件, 配置信息如下: 10 | 11 | 1)最基本配置*四个连接数据库必须的参数) 12 | 13 | ```sql 14 | 15 | 16 | 17 | com.mysql.jdbc.Driver 18 | jdbc:mysql://106.13.43.205:3306/test 19 | root 20 | aaaaa123 21 | 22 | 23 | ``` 24 | 25 | 2)复杂的配置信息 26 | 27 | ```sql 28 | 29 | 30 |   31 |         com.mysql.jdbc.Driver   32 |         jdbc:mysql://localhost:3306/test   33 |         root   34 |         123456   35 |                 36 |         5   37 |                 38 |         10   39 |                 40 |         5   41 |                 42 |         20   43 |                 44 |         30   45 |                 46 |         1000   47 |                 48 |          false   49 |       50 | 51 | ``` 52 | 53 | ## 3、创建数据源DataSourceUtils(工具类) 54 | 55 | ```java 56 | package com.canghe.utils; 57 | 58 | import java.sql.Connection; 59 | import java.sql.ResultSet; 60 | import java.sql.SQLException; 61 | import java.sql.Statement; 62 | 63 | import javax.sql.DataSource; 64 | 65 | import com.mchange.v2.c3p0.ComboPooledDataSource; 66 | 67 | public class DataSourceUtils { 68 | 69 | private static DataSource dataSource = new ComboPooledDataSource(); 70 | 71 | private static ThreadLocal tl = new ThreadLocal(); 72 | 73 | // 直接可以获取一个连接池 74 | public static DataSource getDataSource() { 75 | return dataSource; 76 | } 77 | 78 | // 获取连接对象 79 | public static Connection getConnection() throws SQLException { 80 | 81 | Connection con = tl.get(); 82 | if (con == null) { 83 | con = dataSource.getConnection(); 84 | tl.set(con); 85 | } 86 | return con; 87 | } 88 | 89 | // 开启事务 90 | public static void startTransaction() throws SQLException { 91 | Connection con = getConnection(); 92 | if (con != null) { 93 | con.setAutoCommit(false); 94 | } 95 | } 96 | 97 | // 事务回滚 98 | public static void rollback() throws SQLException { 99 | Connection con = getConnection(); 100 | if (con != null) { 101 | con.rollback(); 102 | } 103 | } 104 | 105 | // 提交并且 关闭资源及从ThreadLocall中释放 106 | public static void commitAndRelease() throws SQLException { 107 | Connection con = getConnection(); 108 | if (con != null) { 109 | con.commit(); // 事务提交 110 | con.close();// 关闭资源 111 | tl.remove();// 从线程绑定中移除 112 | } 113 | } 114 | 115 | // 关闭资源方法 116 | public static void closeConnection() throws SQLException { 117 | Connection con = getConnection(); 118 | if (con != null) { 119 | con.close(); 120 | } 121 | } 122 | 123 | public static void closeStatement(Statement st) throws SQLException { 124 | if (st != null) { 125 | st.close(); 126 | } 127 | } 128 | 129 | public static void closeResultSet(ResultSet rs) throws SQLException { 130 | if (rs != null) { 131 | rs.close(); 132 | } 133 | } 134 | 135 | } 136 | 137 | ``` 138 | 139 | 140 | 141 | ## 4、使用DButils进行连接并对数据库进行操作 142 | 143 | ```java 144 | QueryRunner runner = new QueryRunner(DataSourceUtils.getDataSource()); 145 | String sql = "select * from product"; 146 | List productList = null; 147 | try { 148 | productList = runner.query(sql, new BeanListHandler(Product.class)); 149 | } catch (SQLException e) { 150 | e.printStackTrace(); 151 | } 152 | ``` 153 | 154 | -------------------------------------------------------------------------------- /Java与数据库交互技术/MySQL数据库/JDBC操作数据库/三层架构/基本概念/dao/BaseDao.java: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/freestylefly/CodeCanvas/bff2dea45228c0e247109c4b628ebadbc2024b3b/Java与数据库交互技术/MySQL数据库/JDBC操作数据库/三层架构/基本概念/dao/BaseDao.java -------------------------------------------------------------------------------- /Java与数据库交互技术/MySQL数据库/JDBC操作数据库/三层架构/基本概念/dao/PetDao.java: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/freestylefly/CodeCanvas/bff2dea45228c0e247109c4b628ebadbc2024b3b/Java与数据库交互技术/MySQL数据库/JDBC操作数据库/三层架构/基本概念/dao/PetDao.java -------------------------------------------------------------------------------- /Java与数据库交互技术/MySQL数据库/JDBC操作数据库/三层架构/基本概念/dao/impl/PetDaoImpl.java: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/freestylefly/CodeCanvas/bff2dea45228c0e247109c4b628ebadbc2024b3b/Java与数据库交互技术/MySQL数据库/JDBC操作数据库/三层架构/基本概念/dao/impl/PetDaoImpl.java -------------------------------------------------------------------------------- /Java与数据库交互技术/MySQL数据库/JDBC操作数据库/三层架构/基本概念/entity/Pet.java: -------------------------------------------------------------------------------- 1 | package entity; 2 | 3 | public class Pet { 4 | private int id; 5 | private String name; 6 | private int health; 7 | private int love; 8 | private String strain; 9 | public int getId() { 10 | return id; 11 | } 12 | public void setId(int id) { 13 | this.id = id; 14 | } 15 | public String getName() { 16 | return name; 17 | } 18 | public void setName(String name) { 19 | this.name = name; 20 | } 21 | public int getHealth() { 22 | return health; 23 | } 24 | public void setHealth(int health) { 25 | this.health = health; 26 | } 27 | public int getLove() { 28 | return love; 29 | } 30 | public void setLove(int love) { 31 | this.love = love; 32 | } 33 | public String getStrain() { 34 | return strain; 35 | } 36 | public void setStrain(String strain) { 37 | this.strain = strain; 38 | } 39 | public Pet() { 40 | super(); 41 | } 42 | public Pet(int id, String name, int health, int love, String strain) { 43 | super(); 44 | this.id = id; 45 | this.name = name; 46 | this.health = health; 47 | this.love = love; 48 | this.strain = strain; 49 | } 50 | 51 | } 52 | -------------------------------------------------------------------------------- /Java与数据库交互技术/MySQL数据库/JDBC操作数据库/三层架构/基本概念/service/PetService.java: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/freestylefly/CodeCanvas/bff2dea45228c0e247109c4b628ebadbc2024b3b/Java与数据库交互技术/MySQL数据库/JDBC操作数据库/三层架构/基本概念/service/PetService.java -------------------------------------------------------------------------------- /Java与数据库交互技术/MySQL数据库/JDBC操作数据库/三层架构/基本概念/service/impl/PetServiceImpl.java: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/freestylefly/CodeCanvas/bff2dea45228c0e247109c4b628ebadbc2024b3b/Java与数据库交互技术/MySQL数据库/JDBC操作数据库/三层架构/基本概念/service/impl/PetServiceImpl.java -------------------------------------------------------------------------------- /Java与数据库交互技术/MySQL数据库/JDBC操作数据库/三层架构/基本概念/test/Test.java: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/freestylefly/CodeCanvas/bff2dea45228c0e247109c4b628ebadbc2024b3b/Java与数据库交互技术/MySQL数据库/JDBC操作数据库/三层架构/基本概念/test/Test.java -------------------------------------------------------------------------------- /Java与数据库交互技术/MySQL数据库/JDBC操作数据库/三层架构/宠物管理系统模拟功能/PetDeo/resouces/database.properties: -------------------------------------------------------------------------------- 1 | driver=com.mysql.jdbc.Driver 2 | url=jdbc:mysql://localhost:3306/epet?useUnicade=true&characterEncoding=UTF-8 3 | user=root 4 | password=aaaaa123 -------------------------------------------------------------------------------- /Java与数据库交互技术/MySQL数据库/JDBC操作数据库/三层架构/宠物管理系统模拟功能/PetDeo/src/dao/BaseDao.java: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/freestylefly/CodeCanvas/bff2dea45228c0e247109c4b628ebadbc2024b3b/Java与数据库交互技术/MySQL数据库/JDBC操作数据库/三层架构/宠物管理系统模拟功能/PetDeo/src/dao/BaseDao.java -------------------------------------------------------------------------------- /Java与数据库交互技术/MySQL数据库/JDBC操作数据库/三层架构/宠物管理系统模拟功能/PetDeo/src/dao/MasterDao.java: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/freestylefly/CodeCanvas/bff2dea45228c0e247109c4b628ebadbc2024b3b/Java与数据库交互技术/MySQL数据库/JDBC操作数据库/三层架构/宠物管理系统模拟功能/PetDeo/src/dao/MasterDao.java -------------------------------------------------------------------------------- /Java与数据库交互技术/MySQL数据库/JDBC操作数据库/三层架构/宠物管理系统模拟功能/PetDeo/src/dao/PetDao.java: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/freestylefly/CodeCanvas/bff2dea45228c0e247109c4b628ebadbc2024b3b/Java与数据库交互技术/MySQL数据库/JDBC操作数据库/三层架构/宠物管理系统模拟功能/PetDeo/src/dao/PetDao.java -------------------------------------------------------------------------------- /Java与数据库交互技术/MySQL数据库/JDBC操作数据库/三层架构/宠物管理系统模拟功能/PetDeo/src/dao/impl/MasterDaoImpl.java: -------------------------------------------------------------------------------- 1 | package dao.impl; 2 | 3 | import java.sql.SQLException; 4 | import java.util.ArrayList; 5 | import java.util.List; 6 | 7 | import dao.BaseDao; 8 | import dao.MasterDao; 9 | import entity.Master; 10 | 11 | public class MasterDaoImpl extends BaseDao implements MasterDao{ 12 | PetDaoImpl petDaoImpl = new PetDaoImpl(); 13 | @Override 14 | public List findallMaster() { 15 | List listMaster = null; 16 | String sql ="SELECT id,`name`,`password`,money FROM `master`"; 17 | Object[] params = null; 18 | rs=this.executQuery(sql, params); 19 | if(null !=rs) { 20 | listMaster=new ArrayList(); 21 | try { 22 | while(rs.next()) { 23 | Master master = new Master(); 24 | int masterid= rs.getInt("id"); 25 | master.setId(masterid); 26 | master.setName(rs.getString("name")); 27 | master.setPassword(rs.getString("password")); 28 | master.setMoney(rs.getInt("money")); 29 | master.setListPet(petDaoImpl.findAllPetByMasterId(masterid)); 30 | listMaster.add(master); 31 | } 32 | } catch (SQLException e) { 33 | e.printStackTrace(); 34 | }finally { 35 | this.closeAll(conn, pstmt, rs); 36 | } 37 | } 38 | return listMaster; 39 | } 40 | @Override 41 | public int addMaster(Master master) { 42 | int result = -1; 43 | String sql = "INSERT INTO `master` (id,`name`,`password`,money) VALUES (DEFAULT,?,?,?)"; 44 | Object[] params= {master.getName(),master.getPassword(),master.getMoney()}; 45 | result=this.exxcutUpdate(sql, params); 46 | return result; 47 | } 48 | 49 | 50 | } 51 | -------------------------------------------------------------------------------- /Java与数据库交互技术/MySQL数据库/JDBC操作数据库/三层架构/宠物管理系统模拟功能/PetDeo/src/dao/impl/PetDaoImpl.java: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/freestylefly/CodeCanvas/bff2dea45228c0e247109c4b628ebadbc2024b3b/Java与数据库交互技术/MySQL数据库/JDBC操作数据库/三层架构/宠物管理系统模拟功能/PetDeo/src/dao/impl/PetDaoImpl.java -------------------------------------------------------------------------------- /Java与数据库交互技术/MySQL数据库/JDBC操作数据库/三层架构/宠物管理系统模拟功能/PetDeo/src/entity/Master.java: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/freestylefly/CodeCanvas/bff2dea45228c0e247109c4b628ebadbc2024b3b/Java与数据库交互技术/MySQL数据库/JDBC操作数据库/三层架构/宠物管理系统模拟功能/PetDeo/src/entity/Master.java -------------------------------------------------------------------------------- /Java与数据库交互技术/MySQL数据库/JDBC操作数据库/三层架构/宠物管理系统模拟功能/PetDeo/src/entity/Pet.java: -------------------------------------------------------------------------------- 1 | package entity; 2 | 3 | public class Pet { 4 | private int id; 5 | private String name; 6 | private int health; 7 | private int love; 8 | private String strain; 9 | private int masterid; 10 | public int getId() { 11 | return id; 12 | } 13 | public void setId(int id) { 14 | this.id = id; 15 | } 16 | public String getName() { 17 | return name; 18 | } 19 | public void setName(String name) { 20 | this.name = name; 21 | } 22 | public int getHealth() { 23 | return health; 24 | } 25 | public void setHealth(int health) { 26 | this.health = health; 27 | } 28 | public int getLove() { 29 | return love; 30 | } 31 | public void setLove(int love) { 32 | this.love = love; 33 | } 34 | public String getStrain() { 35 | return strain; 36 | } 37 | public void setStrain(String strain) { 38 | this.strain = strain; 39 | } 40 | public Pet() { 41 | super(); 42 | } 43 | public int getMasterid() { 44 | return masterid; 45 | } 46 | public void setMasterid(int masterid) { 47 | this.masterid = masterid; 48 | } 49 | public Pet(int id, String name, int health, int love, String strain) { 50 | super(); 51 | this.id = id; 52 | this.name = name; 53 | this.health = health; 54 | this.love = love; 55 | this.strain = strain; 56 | } 57 | @Override 58 | public String toString() { 59 | return this.getId()+"\t"+this.getName()+"\t"+this.getHealth()+"\t"+this.getLove()+"\t" 60 | +this.getStrain(); 61 | } 62 | 63 | } 64 | -------------------------------------------------------------------------------- /Java与数据库交互技术/MySQL数据库/JDBC操作数据库/三层架构/宠物管理系统模拟功能/PetDeo/src/mgr/PetMgr.java: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/freestylefly/CodeCanvas/bff2dea45228c0e247109c4b628ebadbc2024b3b/Java与数据库交互技术/MySQL数据库/JDBC操作数据库/三层架构/宠物管理系统模拟功能/PetDeo/src/mgr/PetMgr.java -------------------------------------------------------------------------------- /Java与数据库交互技术/MySQL数据库/JDBC操作数据库/三层架构/宠物管理系统模拟功能/PetDeo/src/service/MasterService.java: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/freestylefly/CodeCanvas/bff2dea45228c0e247109c4b628ebadbc2024b3b/Java与数据库交互技术/MySQL数据库/JDBC操作数据库/三层架构/宠物管理系统模拟功能/PetDeo/src/service/MasterService.java -------------------------------------------------------------------------------- /Java与数据库交互技术/MySQL数据库/JDBC操作数据库/三层架构/宠物管理系统模拟功能/PetDeo/src/service/PetService.java: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/freestylefly/CodeCanvas/bff2dea45228c0e247109c4b628ebadbc2024b3b/Java与数据库交互技术/MySQL数据库/JDBC操作数据库/三层架构/宠物管理系统模拟功能/PetDeo/src/service/PetService.java -------------------------------------------------------------------------------- /Java与数据库交互技术/MySQL数据库/JDBC操作数据库/三层架构/宠物管理系统模拟功能/PetDeo/src/service/impl/MasterServiceImpl.java: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/freestylefly/CodeCanvas/bff2dea45228c0e247109c4b628ebadbc2024b3b/Java与数据库交互技术/MySQL数据库/JDBC操作数据库/三层架构/宠物管理系统模拟功能/PetDeo/src/service/impl/MasterServiceImpl.java -------------------------------------------------------------------------------- /Java与数据库交互技术/MySQL数据库/JDBC操作数据库/三层架构/宠物管理系统模拟功能/PetDeo/src/service/impl/PetServiceImpl.java: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/freestylefly/CodeCanvas/bff2dea45228c0e247109c4b628ebadbc2024b3b/Java与数据库交互技术/MySQL数据库/JDBC操作数据库/三层架构/宠物管理系统模拟功能/PetDeo/src/service/impl/PetServiceImpl.java -------------------------------------------------------------------------------- /Java与数据库交互技术/MySQL数据库/JDBC操作数据库/三层架构/宠物管理系统模拟功能/PetDeo/src/test/Test.java: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/freestylefly/CodeCanvas/bff2dea45228c0e247109c4b628ebadbc2024b3b/Java与数据库交互技术/MySQL数据库/JDBC操作数据库/三层架构/宠物管理系统模拟功能/PetDeo/src/test/Test.java -------------------------------------------------------------------------------- /Java与数据库交互技术/MySQL数据库/JDBC操作数据库/三层架构/宠物管理系统模拟功能/PetDeo/src/test/Test2.java: -------------------------------------------------------------------------------- 1 | package test; 2 | 3 | import mgr.PetMgr; 4 | 5 | public class Test2 { 6 | 7 | public static void main(String[] args) { 8 | PetMgr mgr = new PetMgr(); 9 | mgr.menu(); 10 | 11 | } 12 | 13 | } 14 | -------------------------------------------------------------------------------- /Java与数据库交互技术/MySQL数据库/MySQL基础/win10环境下MySql(8.0.16最新版本)安装过程以及遇到的问题.md: -------------------------------------------------------------------------------- 1 | ## 目录 2 | 3 | 4 | - [目录](#目录) 5 | - [一、前言](#一前言) 6 | - [二、mysql的彻底卸载](#二mysql的彻底卸载) 7 | - [三、安装mysql](#三安装mysql) 8 | - [四、navicat连接mysql报错1251的解决方法](#四navicat连接mysql报错1251的解决方法) 9 | - [五、正确连接上mysql](#五正确连接上mysql) 10 | 11 | 12 | 13 | ## 一、前言 14 | 买了新的台式机,装了win10操作系统,打算本地安装mysql,由于之前一直用的win7,且用的mysql版本是比较老的,现在打算安装官网最新的版本8.0.16,记录一下安装过程和遇到的坑。 15 | ## 二、mysql的彻底卸载 16 | 在安装新版本前,先要彻底卸载本机上安装的其他版本,这个地方由于我没卸载C:\ProgramData\MySQL文件夹在安装新版本的时候会报这个异常 17 | ```java 18 | Hostname Port and Username are as shown in figure ,and password is right.When I click Test Connection ,it show as above.But if i use 3307 in place of 3306 as port,it connect sucessfully. What matter lead that and how I fix it? 19 | ``` 20 | 如果你也遇到安装时候的这个链接问题,那就表明机器上的mysql没有卸载干净。 21 | 1》停止MySQL服务 22 | 开始-》所有应用-》Windows管理工具-》服务,将MySQL服务停止。 23 | 2》卸载mysql server 24 | 控制面板\所有控制面板项\程序和功能,将mysql server卸载掉。 25 | 3》将MySQL安装目录下的MySQL文件夹删除(我的安装目录是C:\Program Files (x86)\MySQL) 26 | 4》运行“regedit”文件,打开注册表。 27 | 删除HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Services\Eventlog\Application\MySQL文件夹 28 | 删除HKEY_LOCAL_MACHINE\SYSTEM\ControlSet002\Services\Eventlog\Application\MySQL文件夹。 29 | 删除HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Eventlog\Application\MySQL的文件夹。 30 | 如果没有相应的文件夹,就不用删除了。 31 | 5》删除C盘下的“C:\ProgramData\MySQL ”文件夹,如果删除不了则用360粉碎掉即可, 32 | 该programData文件默认是隐藏的,设置显示后即可见,或者直接复制 C:\ProgramData 到地址栏回车即可进入! 33 | 将整个MySQL文件夹删除掉。。。 34 | 6》开始-》所有应用-》Windows管理工具-》服务 35 | 如果已经将MySQL卸载,但通过“开始-》所有应用-》Windows管理工具-》服务”查看到MySQL服务仍然残留在 36 | 系统服务里。又不想改服务名,改怎么办呢。 37 | 只要在CMD里输入一条命令就可以将服务删除: 38 | sc delete mysql //这里的mysql是你要删除的服务名 39 | 这样一来服务就被删除了。 40 | 41 | 然后,就可以重装MySQL数据库了!!! 42 | ## 三、安装mysql 43 | 这里可以参考这个博主写的,我认为已经很详细了。在开始前请看补充点 44 | https://blog.csdn.net/believesoul/article/details/79323530 45 | 补充点:上面的安装步骤第九步,注意看你mysql服务的名字,可以改成mysql。所以你按照默认安装好了之后服务的名称是你默认的名称,在cmd中启动服务就要实际的服务名。 46 | 查看mysql服务名方法 47 | win+R——services.msc——找到mysql服务 48 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/2019062300222530.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQzMjcwMDc0,size_16,color_FFFFFF,t_70) 49 | 可以看到我按照默认的服务名是mysql80,右键属性 50 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20190623002317705.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQzMjcwMDc0,size_16,color_FFFFFF,t_70) 51 | 按照这个修改,否则你会连接不上win10系统下本地的mysql服务 52 | 53 | 看完这些才能去对照着安装。 54 | ## 四、navicat连接mysql报错1251的解决方法 55 | 1、新安装的mysql8,使用破解版的navicat连接的时候一直报错,如图所示: 56 | 57 | 58 | 59 | 2、网上查找原因发现是mysql8 之前的版本中加密规则是mysql_native_password,而在mysql8之后,加密规则是caching_sha2_password, 解决问题方法有两种,一种是升级navicat驱动,一种是把mysql用户登录密码加密规则还原成mysql_native_password. 由于用的是破解版的navicat,所以只能用第二种方法解决了; 60 | 61 | 3、首先以管理员身份运行cmd,然后使用命令进入mysql。 62 | 63 | 64 | 65 | 然后输入你安装mysql是设置的root密码即可进入。进入后界面如下 66 | 67 | 68 | 69 | 注意:如果你在输入mysql -u root -p后,cmd提示mysql 不是内部或外部命令,也不是可运行的程序 或批处理文件,说明你之前安装mysql后没有在环境变量PATH中将mysql的路径添加进去。该方法在文章最后有提示; 70 | 71 | 4、然后在mysql中先更改加密方式,指令如下: 72 | 73 | ALTER USER 'root'@'localhost' IDENTIFIED BY 'password' PASSWORD EXPIRE NEVER; 74 | 5、然后再更改密码,由于加密规则更改,所以需要重新设置密码; 75 | 76 | ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '新密码'; 77 | 6、最后在刷新一下数据库; 78 | 79 | FLUSH PRIVILEGES; 80 | 最后,写一下怎么在环境变量PATH中将mysql的路径添加进去; 81 | 82 | 1、win+r-->services.msc-->右击mysql服务-->属性-->找到可执行路径并复制出来; 83 | 84 | 2、右击“我的电脑”-->属性-->高级系统设置-->环境变量-->系统变量-->PATH-->编辑-->新建-->上面的“可执行路径”,如下图所示; 85 | 86 | 87 | ## 五、正确连接上mysql 88 | 89 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20190623002607487.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQzMjcwMDc0,size_16,color_FFFFFF,t_70) 90 | 91 | ## 六、总结 92 | 1、一定要确保本机mysql完全删除干净,否则会让你怀疑人生的,相信我 93 | 2、一定确保自己的服务名是啥 94 | 3、新版本的mysql可能并没有老版本的稳定,使用还请注意。 95 | ## 七、关于我 96 | 97 | \------ 98 | 99 | **# 本文章已同步至我的GitHub仓库:Javastudy,期待您的加入:blush:** 100 | 101 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/2019061700583138.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQzMjcwMDc0,size_16,color_FFFFFF,t_70) 102 | 103 | **# 本文章已同步至苍何的个人博客,可以直接在博客上留言哦:blush:** 104 | 105 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20190617005714728.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQzMjcwMDc0,size_16,color_FFFFFF,t_70) 106 | 107 | 108 | -------------------------------------------------------------------------------- /Java与数据库交互技术/MySQL数据库/MySQL基础/数据库.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/freestylefly/CodeCanvas/bff2dea45228c0e247109c4b628ebadbc2024b3b/Java与数据库交互技术/MySQL数据库/MySQL基础/数据库.jpg -------------------------------------------------------------------------------- /Java与数据库交互技术/MySQL数据库/MySQL基础/数据库.xmind: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/freestylefly/CodeCanvas/bff2dea45228c0e247109c4b628ebadbc2024b3b/Java与数据库交互技术/MySQL数据库/MySQL基础/数据库.xmind -------------------------------------------------------------------------------- /Java与数据库交互技术/MySQL数据库/MySQL基础/数据库详细思维导图.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/freestylefly/CodeCanvas/bff2dea45228c0e247109c4b628ebadbc2024b3b/Java与数据库交互技术/MySQL数据库/MySQL基础/数据库详细思维导图.jpg -------------------------------------------------------------------------------- /Java与数据库交互技术/Oracle数据库/Oracle的安装/云服务器安装oracle修改IP地址监听器报错问题.md: -------------------------------------------------------------------------------- 1 | 当在云服务器中安装oracle时,按照一般的安装步骤安装后,需要修改两个文件的iIP地址才可以在本机进行访问,修改注意点: 2 | 监听器部分不要改成服务器的公网IP,要改成服务器的计算机名字才可以,两个配置文件夹均要修改 3 | tnsnames.ora文件修改: 4 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20190106113038465.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQzMjcwMDc0,size_16,color_FFFFFF,t_70) 5 | listener.ora: 6 | 其中host=那里也是改成计算机名而不是公网ip,然后分别重启监听器和orclservice服务就好,然后将tnsnames.ora文件拷贝到本机的E:\Java\Oracle\InstantClient\InstantClient目录下满。 7 | 8 | 9 | 如果监听器设置的是IP地址而不是计算机名字的话监听器会不起作用,甚至会启动不了服务。 10 | -------------------------------------------------------------------------------- /Java与数据库交互技术/Oracle数据库/xmind/01.安装_函数查询and条件查询.xmind: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/freestylefly/CodeCanvas/bff2dea45228c0e247109c4b628ebadbc2024b3b/Java与数据库交互技术/Oracle数据库/xmind/01.安装_函数查询and条件查询.xmind -------------------------------------------------------------------------------- /Java与数据库交互技术/Oracle数据库/xmind/02.多表查询_子查询_集合运算.xmind: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/freestylefly/CodeCanvas/bff2dea45228c0e247109c4b628ebadbc2024b3b/Java与数据库交互技术/Oracle数据库/xmind/02.多表查询_子查询_集合运算.xmind -------------------------------------------------------------------------------- /Java与数据库交互技术/Oracle数据库/xmind/03.DDL,DML,视图,PLSQL编程.xmind: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/freestylefly/CodeCanvas/bff2dea45228c0e247109c4b628ebadbc2024b3b/Java与数据库交互技术/Oracle数据库/xmind/03.DDL,DML,视图,PLSQL编程.xmind -------------------------------------------------------------------------------- /Java与数据库交互技术/Oracle数据库/xmind/04.游标,存储过程,存储函数,触发器.xmind: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/freestylefly/CodeCanvas/bff2dea45228c0e247109c4b628ebadbc2024b3b/Java与数据库交互技术/Oracle数据库/xmind/04.游标,存储过程,存储函数,触发器.xmind -------------------------------------------------------------------------------- /Vault.md: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/freestylefly/CodeCanvas/bff2dea45228c0e247109c4b628ebadbc2024b3b/Vault.md -------------------------------------------------------------------------------- /java面试相关/疫情之下我是如何大胆跳槽的.md: -------------------------------------------------------------------------------- 1 | ## 一、前言 2 | 一场突如其来的疫情打乱了很多人的计划,起初没有人在意,直到这场灾难和每个人息息相关。 3 | 企业停工,招聘也随之缩减,别说招聘,有些企业甚至开始了裁员;这个时候。很多人并不愿意冒险离职去寻求新的工作机会,这也会导致招聘市场上放出的岗位很少。 4 | 从二月初开始关注招聘市场,在java工程师这块的深圳招聘数目并不多。但逆境中总有机遇,就像巴菲特所说“众人贪婪时我恐惧,众人恐惧时我贪婪”。 5 | 二月初开始准备,历时近一个月,面试十余家公司,历经数十轮面试。最终收到6个offer,综合对比,去了最满意的公司。 6 | 写这篇文章一来是这么多次面试算是一个总结,二来正值金三银四也给有需要找java开发岗位的朋友复习的思路。 7 | 8 | ## 二、我的备战 9 | 不打无准备的仗,一旦准备跳槽,就要着手开始复习,万事开头难,列出合理的复习计划又是最为重要的环节,我的整体规划如下: 10 | 1、优化简历,并在各大平台更新简历 11 | 2、java基础的复习 12 | 3、数据结构和算法复习 13 | 4、框架复习 14 | 5、高并发和分布式 15 | 6、已做项目的总结归纳 16 | 下面会就具体环境详细讲解注意的地方。 17 | 贴出一些复习时做的笔记,以及面试的题目总结,都是公司实战面试题目(ps:笔记过多,不全贴出,需要的可以加我vx,或者后台私信我,给发压缩包,包括面试的视频、简历模板以及复习的pdf文档) 18 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200328225531455.jpg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQzMjcwMDc0,size_16,color_FFFFFF,t_70) 19 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/2020032822562216.jpg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQzMjcwMDc0,size_16,color_FFFFFF,t_70) 20 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200328225721106.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQzMjcwMDc0,size_16,color_FFFFFF,t_70) 21 | ## 三、优化并更新简历 22 | 在准备复习之前,需要对简历做一个优化,简历可以大概分为以下七个部分: 23 | 1、个人信息 24 | 这个必须放在第一位或者最显眼的地方,hr筛选简历第一眼看的是个人信息是否符合,比如学历信息,工作年限等,也方便面试官联系到你。 25 | 个人信息应至少包含以下方面: 26 | 27 | - 姓名 28 | - 性别 29 | - 年龄 30 | - 学历 31 | - 籍贯 32 | - 联系电话 33 | - 目前城市 34 | - 大学 35 | - 电子邮件 36 | - 工作经验 37 | 2、求职意向 38 | 工作性质、目标地点、目标职能、目标薪资 39 | 3、博客技术网站 40 | 这块是非必须的,但是可以作为一个加分项,很多面试官看到我这块的时候,都有去看我的博客,并就博客和开源网站问一些问题,这也可以表明你平时业余的时间有很大一部分是在技术博客开源网站论坛上面,侧面反应了你对技术的热爱,仅是一个加分项,主要还是要看技术栈和项目经验。 41 | 这里我主要写了我的[csdn博客](https://blog.csdn.net/qq_43270074),[个人网站](http://canghe.top//),[GitHub开源项目](%EF%BC%9Ahttps://github.com/freestylefly/javaStudy),微信公众号(苍何之旅) 42 | 4、工作经历 43 | 工作经历按照就近的一份工作在前,按照时间倒序的原则。写一下公司名称,职位名称,任职年限以及工作职责即可 44 | 5、专业技能 45 | 这部分是很重要的一部分内容,需按实填写,因为面试官拿到你简历问题的很大一部分来源都是根据你写的来的,有很多人把眼下最火的技术全部都写了,不得不说在HR简历筛选时有更大的机会能进入面试,但是面试官一问,没做过的确实很难能答的很好,建议按实写。 46 | 6、项目经历 47 | 这部分主要针对社招生,社招需要你有一定的项目经验,而且面试官很大程度上就围绕你写的项目来问,所以这是最为重要的环节,其中有几个必须项需要优化表述: 48 | - 项目名称 49 | - 项目所用技术 50 | - 开发时间/开发周期: 51 | - 项目描述 52 | - 责任描述 53 | - 技术描述 54 | 55 | 一定要对自己项目很熟悉很熟悉,这里需要花点时间好好总结一下你的开发项目,用到哪些技术,遇到哪些问题以及是怎么解决的,有没有进行优化等等等。 56 | 57 | 优化完了简历在各大招聘网站可以更新自己的简历,比如boss和拉勾网等,我主要在boss上找。接下来就可以边挂着简历边进行技术面试的准备环节了。 58 | ## 四、面试之自我介绍准备 59 | 不得不说,我之前恐惧面试的很大一部分原因是因为我害怕去自我介绍,总觉得自己没什么可介绍的,一两句话就说完了,经过女朋友的一番鼓励以及方法支持,我不但克服了恐惧,在自我介绍时不仅自信从容还能随机应变就不同的面试官进行不同的介绍。 60 | 1、HR关心的是你这个人整体的个人素质,小伙子能不能吃苦,能不能有自己的规划,对技术是不是热爱这些,这个就要多展示一下你的个人优秀品质,少或者不加技术或者项目经验在里面。 61 | 2、技术面试官关心的是你的技术水平,很多公司技术分两轮,分为技术初面和复面,初面是你能不能进入接下来面试的重要一环,技术水平必须到位,所以自我介绍必须多讲一些项目和技术栈的东西,技术复面除了技术初面的介绍外,要让面试官觉得你对一项技术除了会用还要有自己的理解,当然这个平时的时候一定要注意,不要停留在仅仅会用的程度,对底层代码逻辑要很熟悉。 62 | 3、boss终极面试,有些公司会最后一轮老板面试,自我介绍时一定要带上对公司的一个了解,老板希望看到积极阳光、很大意向想进这家公司并且愿意和公司共同进步的人。 63 | 64 | ## 五、面试之技术准备 65 | 技术准备不用说,必然是重中之重。 66 | 我在面试中常被问到的问题,我做了一个总结,但是没有列出答案,我在笔记上写了答案,如果有需要我笔记的可以私信发你。 67 | 1、hashmap相关 68 | 69 | - JDK8中的hashmap有哪些改动 70 | - 为何JDK8中的hashmap要使用红黑树 71 | - hashmap的扩容机制以及JDK7和JDK8的区别 72 | - hashmap是线程安全的嘛 73 | - 使用hashmap的注意点 74 | 75 | 76 | 2、volatile的理解 77 | 3、JDK7和8JVM的变化 78 | 4、Linux常用命令 79 | 5、zookeeper的理解 80 | 81 | - 是什么 82 | - zookeeper提供了什么 83 | - ZAB协议 84 | - 如何保证事务一致性的 85 | - zk的宕机如何处理zk负载均衡和Nginx区别 86 | - zk应用场景 87 | 88 | 6、Mysql碎银 89 | 90 | - 索引底层实现原理和优化 91 | - 什么情况下索引无法使用 92 | 93 | 7、SQL优化 94 | 结合项目谈一下你是怎么进行sql优化的 95 | 8、数据库引擎有什么区别 96 | 9、数据库锁 97 | 10、反射 98 | 11、java读取数据库时如何保证同一时刻只有一个线程修改数据库的某一条记录 99 | 12、union和union all的区别 100 | 13、具体的sql模拟测试 101 | 14、动态代理 102 | 15、java常见的设计模式 103 | 16、HTTP协 104 | 17、TCP协议 105 | 18、map的几个实现类以及区别 106 | 19、讲一下栈 107 | 20、如何让多个域名对应同一个IP 108 | 21、spring的AOP原理 109 | 22、java中动态代理的两种方式 110 | 23、mysql分页查询500万条数据,limit查最后一页很慢怎么优化 111 | 24、分布式事务 112 | 25、事务的隔离级别 113 | 26、多线程的状态,阻塞和非阻塞的区别 114 | 27、共享锁、互斥锁、读写锁 115 | 28、IO和NIO的区别 116 | 29、java垃圾回收机制(GC) 117 | 118 | - JAVA内存 119 | - GC主要任务 120 | - 如何鉴别一个对象是垃圾对象并被GC处理以及用到的算法 121 | - 垃圾回收算法 122 | - 开发中容易造成内存泄露的操作 123 | - JVM内存优化 124 | - 125 | 30、java基本数据类型 126 | 31、方法重载和重写的区别 127 | 32、==和equals的区别 128 | 33、stringbuffer和stringbuilder的区别 129 | 34、java常见的异常 130 | 35、mybatis中的#和$的区别以及什么时候使用 131 | 36、mybatis索引失效怎么办 132 | 37、如何创建索引 133 | 38、笛卡尔积 134 | 39、Redis相关问题 135 | - 什么是redis有什么用 136 | - redis的五种数据类型 137 | - redis持久化机制 138 | - 缓存redis如何扩容 139 | - redis key的过期时间和永久有效分别怎么设置 140 | - 过期数据怎么处理 141 | - redis如何做内存优化 142 | - redi事务 143 | - redis哨兵模式 144 | - redis分布式锁 145 | - 缓存雪崩 146 | - 缓存穿透 147 | - 缓存击穿 148 | - 缓存预热 149 | - 缓存降级 150 | - redis用到的算法 151 | 152 | 153 | 40、JVM相关 154 | 155 | - 说一下JVM主要组成部分以及作用 156 | - 说一下JVM运行时数据区 157 | - 深拷贝和浅拷贝,以及具体你项目中怎么使用 158 | - 堆栈区别说一下 159 | - 队列和栈是什么,有什么区别 160 | - 保证线程安全的两种方式 161 | - java的内存泄露 162 | - 如何判断对象是否可悲回收jvm垃圾回收算法 163 | - 垃圾收集器 164 | - 内存分配策略描述JVM加载class文件原理机制 165 | - 双亲委证模型 166 | 167 | 41、springmvc相关 168 | 169 | - 描述springmvc工作流程 170 | - mvc是什么 171 | - springmvc怎么设置重定向和转发 172 | 173 | 42、为什么需要预编译 174 | 43、动态sql常用标签 175 | ## 六、offer筛选,去到心仪公司 176 | 面试本身就是一个双向选择的过程,手头有一个offer不要立马就去入职这家公司,拒绝也是一种选择,有些公司可能会给你多加钱,这个时候就要各种对比,薪资是一方面,最重要的是个人的发展和公司的前景。 177 | -------------------------------------------------------------------------------- /rocketmq/图解RocketMQ之666.md: -------------------------------------------------------------------------------- 1 | --- 2 | aliases: [] 3 | sticker: emoji//1f600 4 | --- 5 | 阿萨德是 jj,哈哈哈 yes,果果哦共,你好,三大 6 | 7 | 8 | 9 | 10 | [牛逼的链接](https://laigeoffer.cn/pmhub/quickstart/backend/#%E5%90%8E%E7%AB%AF%E9%A1%B9%E7%9B%AE%E5%90%AF%E5%8A%A8) 11 | 12 | 阿打算阿打算 13 | 14 | ![image.png](https://cdn.tobebetterjavaer.com/stutymore/20240722223235.png) 15 | 16 | 17 | ![image.png](https://cdn.tobebetterjavaer.com/stutymore/20240722225103.png) 18 | 19 | ![[JavaWeb前后端交互技术基础/JavaScript/思维导图图片/JavaScript对象及初识面向对象.jpg]] 20 | 21 | [[Excalidraw/我的1.md#^bCrNfJq6ZfNKo1C9CLRGc]] kkk 22 | 23 | ![[Excalidraw/我的1.md#^group=bCrNfJq6ZfNKo1C9CLRGc]] 24 | 25 | ![[Excalidraw/我的1.md#^area=bCrNfJq6ZfNKo1C9CLRGc]] 26 | 27 | ![image.png](https://cdn.tobebetterjavaer.com/stutymore/20240722225935.png) 28 | -------------------------------------------------------------------------------- /rocketmq/图解RocketMQ之初识MQ.md: -------------------------------------------------------------------------------- 1 | 大家好,我是苍何。 2 | 3 | 在微服务架构下,一个业务将会被拆成多个微服务,各个服务间相互通信形成完整功能,那么大家清楚系统间都是如何通信协作的吗? 4 | 5 | 不卖关子啦,系统间的通信协作通常有 2 种: 6 | 7 | - HTTP/RPC 通信 8 | - 消息通信 9 | 10 | HTTP/RPC 通信是微服务系统的标配,不是今天的主角,今天的主角是消息通信,而主角中的主角是消息通信中叱咤风云的 **RocketMQ**。 11 | 12 | ## 什么是消息队列 13 | 14 | 为了大家更好理解消息队列以及 RocketMQ,我将会通过好朋友鸡毛开餐馆的故事来展开。 15 | 16 | “老板,我的酸菜鱼好了没,都等 20 分钟了!”坐在角落那桌的长腿女生极为不满的吼道。 17 | 18 | “就快了,稍等!”鸡毛一边用挂在脖子上的毛巾擦汗,一边看着满桌子的订单,活了大半辈子也没见像今天生意这么好的样子。 19 | 20 | 鸡毛是个大厂退役的 Java 开发,拿着被裁的几个月赔偿费和多年来做牛马的一点积蓄,回老家开了个破烂的餐馆。餐馆是个收垃圾的铺子改造而来,一开始顾客总觉得餐馆有股难闻的气味,所以来的人基本保持在个位数左右。 21 | 22 | 这几天鸡毛搞了个促销,有些好转,但也不愠不火,今天像发了神经私的,不知道哪儿来的这么多人。 23 | 24 | 顾客点单,写在纸条上,然后直接丢给鸡毛,鸡毛放在一个桌子上,就开始炒菜。这个流程在人少的时候当然没问题,鸡毛甚至还有时间刷一会美女视频,但人一多,就手足无措了。 25 | 26 | 鸡毛看着桌子上堆积的订单,想起这不正是消息队列的场景吗?订单是消息,顾客是生产消息的生产者,而鸡毛是订单的消费者。 27 | 28 | ![什么是消息队列](https://cdn.nlark.com/yuque/0/2024/png/29495295/1720591454288-e498b142-f6cf-4a99-b7d0-60bb5ef6988f.png#averageHue=%23403e3d&clientId=u0df9f2c2-02e9-4&from=ui&id=u18492958&originHeight=808&originWidth=1476&originalType=binary&ratio=2&rotation=0&showTitle=true&size=107379&status=done&style=none&taskId=udf5fd1c3-61c9-4c76-a682-032f8db7308&title=%E4%BB%80%E4%B9%88%E6%98%AF%E6%B6%88%E6%81%AF%E9%98%9F%E5%88%97 "什么是消息队列") 29 | 整个消息队列组件其实就三部分: 30 | 31 | - **生产者**:生产消息的一方,比如顾客就是生产者 32 | - **消息队列**:就是消息的「篮子」,用来存放消息,比如鸡毛餐馆的桌子 33 | - **消费者**:专门负责消息的一方,比如鸡毛 34 | 35 | 在分布式微服务系统中,消息队列在系统中扮演者很重要的角色,如果说整个系统是皇帝,消息队列至少是三品以上的大臣了。主要有**解耦**、**异步处理**、**削峰**等作用。 36 | 37 | ## 常用的消息队列有哪些? 38 | 39 | 下面一个表格整理了常用的消息队列以及性能对比: 40 | 41 | | 特性 | Kafka | ActiveMQ | RabbitMQ | RocketMQ | 42 | | ------------------- | ----------------------- | ------------------ | ---------------------- | ----------------------- | 43 | | **功能支持** | 分布式、分区、高吞吐量、流处理、持久化 | JMS 支持、持久化、事务、消息过滤 | 消息路由、插件机制、持久化、多种协议支持 | 分布式、高吞吐量、事务、定时和延时消息、持久化 | 44 | | **可用性** | 高(多副本机制、自动恢复) | 高(支持主从架构和多种持久化机制) | 高(镜像队列、集群模式) | 高(多副本机制、集群模式) | 45 | | **消息可靠性** | 高(数据复制、多副本) | 高(持久化存储、事务支持) | 高(确认机制、持久化存储) | 高(数据复制、多副本、持久化存储) | 46 | | **时效性** | 毫秒级(取决于配置和网络条件) | 毫秒级(取决于配置和网络条件) | 微秒级到毫秒级(取决于配置和网络条件) | 毫秒级(取决于配置和网络条件) | 47 | | **topic 数量对吞吐量的影响** | 影响较大(分区机制带来管理和资源消耗) | 影响中等(队列管理开销) | 影响较小(高效的路由机制) | 影响中等(分区机制和管理开销) | 48 | | **单机吞吐量** | 高(百万级消息每秒) | 中等(十万级消息每秒) | 中等(十万级消息每秒) | 高(百万级消息每秒) | 49 | | **Client SDK** | 多语言(Java、Scala、Python等) | 多语言(Java、C、C++等) | 多语言(Java、Erlang、.NET等) | 多语言(Java、C++、Go等) | 50 | 51 | 我们不难得出结论: 52 | 53 | - 如果是大数据领域的**实时计算**、**日志采集**等场景,就用 kafka 54 | - 对时效性有要求,且不关心底层情况,用 RabbitMQ 就可以 55 | - 国内的大部分项目,特别是微服务项目,就用阿里的 RocketMQ 就好了,有丰富的教程且是阿里出品,经历过双十一这种大促,肯定是没问题的。 56 | 57 | ## RocketMQ 是什么? 58 | 59 | 终于到我们的主角出场啦🎉, RocketMQ 是阿里开源的消息中间件,具有**高性能、高可靠、高实时、分布式 **的特点,底层是用 Java 语言开发的分布式组件。2016 年成为 Apache 的顶级项目,在阿里内部经历了多年的双十一的拷打,主打一个能抗能打。 60 | 61 | - 官网地址:[https://rocketmq.apache.org/](https://rocketmq.apache.org/) 62 | - 开源地址:[https://github.com/apache/rocketmq](https://github.com/apache/rocketmq) 63 | 64 | ![官网截图](https://cdn.nlark.com/yuque/0/2024/png/29495295/1719800067792-10ee3b6a-e7fb-4f98-a1fc-e84c10941fa2.png#averageHue=%23152a67&clientId=ud78c5ee7-482f-4&from=paste&height=594&id=ub17064b7&originHeight=1188&originWidth=2280&originalType=binary&ratio=2&rotation=0&showTitle=true&size=2157513&status=done&style=none&taskId=u4b95be14-0d6f-4cfd-a3ed-198f74b4bc3&title=%E5%AE%98%E7%BD%91%E6%88%AA%E5%9B%BE&width=1140 "官网截图") 65 | 66 | 不得不说,官网做的还是很炫酷的!下面是一张底层架构图: 67 | 68 | ![架构(来自管网)](https://cdn.nlark.com/yuque/0/2024/png/29495295/1719800144582-dafe080d-0a94-457f-9199-efa47397e76c.png#averageHue=%23666666&clientId=ud78c5ee7-482f-4&from=drop&id=u9bdd2438&originHeight=541&originWidth=1342&originalType=binary&ratio=2&rotation=0&showTitle=true&size=62810&status=done&style=none&taskId=u4ce03599-9220-4810-a35f-43e19fdb6d9&title=%E6%9E%B6%E6%9E%84%EF%BC%88%E6%9D%A5%E8%87%AA%E7%AE%A1%E7%BD%91%EF%BC%89 "架构(来自管网)") 69 | 70 | 图中不难看出, RocketMQ 主要有以下 4 个部分: 71 | ### 生产者 Producer 72 | 这哥们是个发布消息的角色。Producer 通过 MQ 的负载均衡模块选择相应的 Broker 集群队列进行消息投递,投递的过程支持快速失败和重试。 73 | 74 | ![](https://cdn.nlark.com/yuque/0/2024/jpeg/29495295/1720593920805-97326e74-0175-49ac-9262-c76ddf0cfdae.jpeg) 75 | ### 消费者 Consumer 76 | 这哥们是消息消费的角色: 77 | 78 | - 支持推(push)和拉(pull)两种模式对消息进行消费。 79 | - 支持集群方式和广播方式的消费。 80 | - 提供实时消息订阅机制,可以满足大多数用户的需求。 81 | 82 | ![](https://cdn.nlark.com/yuque/0/2024/jpeg/29495295/1720594340316-6e0e29e7-4f91-4668-aaed-4c79a39761df.jpeg) 83 | ### 名字服务器 NameServer 84 | NameServer 是 RocketMQ 中的注册中心,支持 Topic、Broker 的动态注册与发现。 85 | 86 | 主要包括两个功能: 87 | 88 | - Broker管理: NameServer接受Broker集群的注册信息并且保存下来作为路由信息的基本数据,并提供心跳检测机制,检查Broker是否存活。 89 | - 路由信息管理: 每个NameServer将保存关于 Broker 集群的整个路由信息和用于客户端查询的队列信息。Producer和Consumer通过NameServer可以知道整个Broker集群的路由信息,从而进行消息的投递和消费。 90 | 91 | 92 | NameServer通常会有多个实例部署,各实例间相互不进行信息通讯。Broker向每一台NameServer注册自己的路由信息,每个NameServer实例上都保存一份完整的路由信息。当某个NameServer因某种原因下线了,客户端仍然可以向其它NameServer获取路由信息。 93 | 94 | ![aHR0cHM6Ly9hdGEyLWltZy5jbi1oYW5nemhvdS5vc3MtcHViLmFsaXl1bi1pbmMuY29tL2FmZThlMWI3OTVkZGI5NTVhOTAwZDY5ZmJmYmJlNDY4LnBuZw.png](https://cdn.nlark.com/yuque/0/2024/png/29495295/1720594605156-ffe95913-1f1f-4aed-906a-94b5014f8a86.png#averageHue=%23f3dbc8&clientId=u0df9f2c2-02e9-4&from=drop&id=u9401d317&originHeight=838&originWidth=1672&originalType=binary&ratio=2&rotation=0&showTitle=false&size=455311&status=done&style=none&taskId=ua56e5275-690c-4482-8000-4d6882b8e63&title=) 95 | 96 | ### 代理服务器 Broker 97 | Broker 主要负责消息的存储、投递和查询以及服务高可用保证。 98 | 99 | - NameServer几乎无状态节点,因此可集群部署,节点之间无任何信息同步。 100 | - Broker部署相对复杂。在 Master-Slave 架构中,Broker 分为 Master 与 Slave。一个Master可以对应多个Slave,但是一个Slave只能对应一个Master。Master 与 Slave 的对应关系通过指定相同的BrokerName,不同的BrokerId 来定义,BrokerId为0表示Master,非0表示Slave。Master也可以部署多个。 101 | 102 | 做个总结吧: 103 | 104 | - 每个 Broker 与 NameServer 集群中的所有节点建立长连接,定时注册 Topic 信息到所有 NameServer。 105 | - Producer 与 NameServer 集群中的其中一个节点建立长连接,定期从 NameServer 获取 Topic 路由信息,并向提供 Topic 服务的 Master 建立长连接,且定时向 Master 发送心跳。Producer 完全无状态。 106 | - Consumer 与 NameServer 集群中的其中一个节点建立长连接,定期从 NameServer 获取 Topic 路由信息,并向提供 Topic 服务的 Master、Slave 建立长连接,且定时向 Master、Slave发送心跳。Consumer 既可以从 Master 订阅消息,也可以从Slave订阅消息。 107 | 108 | 109 | 110 | -------------------------------------------------------------------------------- /互联网架构新技术/Docker/images/搜狗截图20190831120304.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/freestylefly/CodeCanvas/bff2dea45228c0e247109c4b628ebadbc2024b3b/互联网架构新技术/Docker/images/搜狗截图20190831120304.jpg -------------------------------------------------------------------------------- /互联网架构新技术/Docker/images/搜狗截图20190831121606.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/freestylefly/CodeCanvas/bff2dea45228c0e247109c4b628ebadbc2024b3b/互联网架构新技术/Docker/images/搜狗截图20190831121606.jpg -------------------------------------------------------------------------------- /互联网架构新技术/Docker/images/搜狗截图20190831141427.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/freestylefly/CodeCanvas/bff2dea45228c0e247109c4b628ebadbc2024b3b/互联网架构新技术/Docker/images/搜狗截图20190831141427.jpg -------------------------------------------------------------------------------- /互联网架构新技术/kafka/kafka介绍以及结合spring消费topic.md: -------------------------------------------------------------------------------- 1 | ## 一、好久不见 2 | 3 | 现在是2019年6月12日,距离上一次更新足有一个余月。 4 | 5 | 这一个多月以来,甚是忙碌。没有时间写作,写博客,写程序。虽然有很多不确定的因素,但最能确定的是,她永远离开我了。为了停止悲痛,我忙到深夜,可每每想起她的一切,还是会想哭。 6 | 7 | 程序员不需要感性,用理性的头脑才能写好程序。 8 | 9 | 我端午请假回了趟家,虽说家是避风的港湾,可不是所有的悲痛几天时间就可以忘却。 10 | 11 | 回到自己家中,一切还是没变。既然回不去,就往前看。 12 | 13 | 从今天开始,每晚十点,直播程序编写。做以前想做却不敢做的事。 14 | 15 | ## 二、背景 16 | 17 | 由于项目中用到了kafka作为消息中间件,要从远程的kafka服务器去消费topic,前前后后搞了好几天。做一下记录。 18 | 19 | ## 三、什么是kafka 20 | 21 | Apache Kafka是一个开源消息系统,由Scala写成,是一个分布式消息队列:生产者、消费者的功能,Kafka对消息保存时根据Topic进行归类,发送消息者称为Producer,消息接受者称为Consumer,此外kafka集群由多个kafka实例组成,每个实例(server)称为broker。 22 | 23 | ## 四、Kafka核心组件 24 | 25 | Topic:消息根据Topic进行归类,可以理解为一个队里。 26 | Producer:消息生产者,就是向kafka broker发消息的客户端。 27 | Consumer:消息消费者,向kafka broker取消息的客户端。 28 | broker:每个kafka实例(server),一台kafka服务器就是一个broker,一个集群由多个broker组成,一个broker可以容纳多个topic。 29 | Zookeeper:依赖集群保存meta信息。 30 | 31 | ## 五、Kafka消息有序性 32 | 33 | 1、生产者是一个独立的集群,和kafka的broker集群,消费者集群没有太直接的干系。比如flume就可以作为生产者,内部调用kafka的客户端代码,确保把收集的数据发到kafka集群中。 34 | 35 | 2、如何保证kafka全局消息有序? 36 | 37 | ``` 38 | 比如,有100条有序数据,生产者发送到kafka集群,kafka的分片有4个,可能的情况就是一个分片保存0-25,一个保存25-50......这样消息在kafka中存储是局部有序了。严格说,kafka是无法保证全局消息有序的,没有这个机制,只能局部有序。 39 |   但是如果只有一个分片和一个消息的生产者,那么就相当于消息全局有序了。如果有多个消息生产者,就算只有一个分片,如果这些生产者的消息都发给这个分片,那kafka中的消息连局部有序都没有办法了。 40 | ``` 41 | 42 | ## 六、消费者组 43 | 44 | ``` 45 | Consumer Group(CG):这是kafka用来实现一个topic消息的广播(发给所有的consumer)和单播(发给任意一个consumer)的手段。一个topic可以有多个CG。topic的消息会复制(不是真的复制,是概念上的)到所有的CG,但每个partion只会把消息发给该CG中的一个consumer。如果需要实现广播,只要每个consumer有一个独立的CG就可以了。要实现单播只要所有的consumer在同一个CG。用CG还可以将consumer进行自由的分组而不需要多次发送消息到不同的topic。 46 |   Partition:为了实现扩展性,一个非常大的topic可以分布到多个broker(即服务器)上,一个topic可以分为多个partition,每个partition是一个有序的队列。partition中的每条消息都会被分配一个有序的id(offset)。kafka只保证按一个partition中的顺序将消息发给consumer,不保证一个topic的整体(多个partition间)的顺序。 47 |   Offset:kafka的存储文件都是按照offset.kafka来命名,用offset做名字的好处是方便查找。例如你想找位于2049的位置,只要找到2048.kafka的文件即可。当然the first offset就是00000000000.kafka。 48 | 49 |   每个group中可以有多个consumer,每个consumer属于一个consumer group;通常情况下,一个group中会包含多个consumer,这样不仅可以提高topic中消息的并发消费能力,而且还能提高"故障容错"性,如果group中的某个consumer失效那么其消费的partitions将会有其他consumer自动接管。 50 |   对于Topic中的一条特定的消息,只会被订阅此Topic的每个group中的其中一个consumer消费,此消息不会发送给一个group的多个consumer;那么一个group中所有的consumer将会交错的消费整个Topic,每个group中consumer消息消费互相独立,我们可以认为一个group是一个"订阅"者。 51 |   在kafka中,一个partition中的消息只会被group中的一个consumer消费(同一时刻);一个Topic中的每个partions,只会被一个"订阅者"中的一个consumer消费,不过一个consumer可以同时消费多个partitions中的消息。 52 |   kafka的设计原理决定,对于一个topic,同一个group中不能有多于partitions个数的consumer同时消费,否则将意味着某些consumer将无法得到消息。kafka只能保证一个partition中的消息被某个consumer消费时是顺序的;事实上,从Topic角度来说,当有多个partitions时,消息仍不是全局有序的。 53 | ``` 54 | 55 | ## 七、Producer客户端负责消息的分发 56 | 57 | ``` 58 |  kafka集群中的任何一个broker都可以向producer提供metadata信息,这些metadata中包含"集群中存活的servers列表"/"partitions leader列表"等信息; 59 |   当producer获取到metadata信息之后, producer将会和Topic下所有partition leader保持socket连接; 60 |   消息由producer直接通过socket发送到broker,中间不会经过任何"路由层",事实上,消息被路由到哪个partition上由producer客户端决定;比如可以采用"random""key-hash""轮询"等,如果一个topic中有多个partitions,那么在producer端实现"消息均衡分发"是必要的。 61 |   在producer端的配置文件中,开发者可以指定partition路由的方式。 62 |   Producer消息发送的应答机制设置发送数据是否需要服务端的反馈,有三个值0,1,-1 63 |     0:producer不会等待broker发送ack 64 |     1:当leader接收到消息之后发送ack 65 |     -1:当所有的follower都同步消息成功后发送ack 66 |   request.required.acks=0 67 | ``` 68 | 69 | ## 八、kafka的安装和部署 70 | 71 | (kafka在window有很多的不兼容,建议在Linux上进行搭建) 72 | 73 | 参考文章: 74 | 75 | 76 | 77 | ## 九、消费者如何消费kafka的topic 78 | 79 | 采用spring结合kafka的注解式开发是比较高效的做法,但是有很多的小细节需要注意。 80 | 81 | 参考文章: 82 | 83 | 84 | 85 | ## 十、具体实例 86 | 87 | 88 | -------------------------------------------------------------------------------- /兴趣爱好/2019-07-14-hexo博客结合百度语音合成为你的博客添加欢迎语音.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: post 3 | title: hexo博客结合百度语音合成为你的博客添加欢迎语音 4 | date: 2019-07-14 02:57:59 5 | categories: 搭建个人博客 6 | keywords: 个人 7 | tags: 8 | - 语音 9 | --- 10 | ## 前言 11 | 今晚在知乎和CSDN看文章时都发现了文章有点击即可朗读,将文字转换成语音,虽然机器音很严重,但可以将这个用来做个人博客的一个欢迎语。也就是别人点击你博客进入的时候会自动播放这个欢迎语,有点像是你去商店买东西,迎接你的小姐姐说的“欢迎您光临本店”。 12 | 是不是很炫酷?当有人访问你博客的时候,欢迎提示语。 13 | 具体效果请[点击](https://freestylefly.github.io//)(在PC端才会自动播放,客户端目前不支持自动播放,但是可以手动点击左下角的播放按钮即可体验) 14 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20190714023033706.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQzMjcwMDc0,size_16,color_FFFFFF,t_70) 15 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20190714023135989.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQzMjcwMDc0,size_16,color_FFFFFF,t_70) 16 | ## 为hexo博客添加APlayer 17 | APlayer就是支持在网页播放音乐的一个库,具体怎么添加可以稍微百度下很简单,如果想省事,就复制我的博客,在主题下的source的dist下找到music.js 18 | 四个参数代表的含义分别是 19 | 20 | ``` 21 | name:歌曲的名字 22 | artist:作者名字 23 | url:歌曲的外链 24 | cover:歌曲封面图片的外链 25 | ``` 26 | 歌曲和图片外链可以在[这里](http://www.ytmp3.cn/)进行获取,这里我们做的是欢迎语,所以欢迎语的外链得从百度AI开放平台那边获取,具体怎么操作呢/ 27 | ## 在百度AI开放平台注册账号并获取相应的key 28 | 1、注册:最好直接用自己百度账号注册 29 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/2019071402395495.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQzMjcwMDc0,size_16,color_FFFFFF,t_70) 30 | 2、创建应用 31 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20190714024100315.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQzMjcwMDc0,size_16,color_FFFFFF,t_70) 32 | 这里我已经创建了一个应用 33 | 34 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20190714024209978.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQzMjcwMDc0,size_16,color_FFFFFF,t_70) 35 | 创建应用没什么需要注意的,按照默认的选择复选框即可。这个时候回到应用列表点开你的应用会看到标红的这两个值是接下来要用的 36 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20190714024325191.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQzMjcwMDc0,size_16,color_FFFFFF,t_70) 37 | ## 拼接欢迎语URL 38 | 1、先获取access_token 39 | 由于百度做的加密防护,先要获取access_token才可以去请求URL并且access_token(30天)后过期。需要手动刷新 40 | 获取token地址: 41 | 42 | https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id=这里填你的API Key(刚才获得的)&client_secret=这里填你的Secret Key 43 | 44 | 返回值中就有access_token,可以用postman调用接口 45 | 2、拼接URL 46 | 欢迎语的URL为: 47 | 48 | ``` 49 | https://tsn.baidu.com/text2audio?tex=你好呀,欢迎您光临我的博客,有问题您可以点击右下角的在线客服,我会第一时间联系您,您也可以在留言区留言或者文章底部留言&lan=zh&cuid=123456&ctp=1&tok=替换成你刚获取的access_token 50 | ``` 51 | txt后面替换为你的欢迎语即可。 52 | 赶紧试一下吧。 53 | 54 | -------------------------------------------------------------------------------- /兴趣爱好/使用序列化保存对象信息的时候出现中文乱码问题.md: -------------------------------------------------------------------------------- 1 | # 使用序列化保存对象信息的时候出现中文乱码问题 2 | 3 | # eclipse的默认文本编码格式 4 | 5 | 默认是GBK的编码格式,可以调成UTF-8的格式,方法是: 6 | 7 | Windows—preferences—General—Workspace—text for encoding 8 | 9 | 改成UTF-8即可 10 | 11 | ![1541755254047](C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\1541755254047.png) 12 | 13 | # 序列化对象 14 | 15 | 1、将eclipse默认编码格式改变特别注意的一点是,你以前用默认编码格式的所有项目的中文将会全部乱码,如果再切换成GBK也是没有作用的 16 | 17 | 2、使用序列化将对象进行储存成文件格式,是一种二进制编码储存,所以你打开储存的txt文件,打开是中文乱码的,这点初学者是最想不通的一点,甚至会和我一样傻逼的看看能不能用用转换编码试试,就是用fileoutputstreamwriter进行编码转换,但还是没有理解这些流类的层级关系,序列化对象使用的ObjectOutputstream是字节输出流,是Outputstream的一个子类,而fileoutputstreamwriter是字符流Writer的一个子类,这两者不能混了。 18 | 19 | 3、所以就需要反序列化将你序列化的对象进行输出到控制台给大家看 20 | 21 | ```java 22 | package test2; 23 | 24 | import java.io.Serializable; 25 | 26 | /* 27 | * 学生类 28 | */ 29 | public class Student implements Serializable { 30 | private static final long serialVersionUID = 1L; 31 | private String id; 32 | private String name; 33 | private int age; 34 | private String sex; 35 | private String address; 36 | 37 | 38 | public Student() { 39 | super(); 40 | // TODO Auto-generated constructor stub 41 | } 42 | 43 | public Student(String id, String name, int age, String sex, String address) { 44 | super(); 45 | this.id = id; 46 | this.name = name; 47 | this.age = age; 48 | this.sex = sex; 49 | this.address = address; 50 | } 51 | 52 | public String getId() { 53 | return id; 54 | } 55 | 56 | public void setId(String id) { 57 | this.id = id; 58 | } 59 | 60 | public String getName() { 61 | return name; 62 | } 63 | 64 | public void setName(String name) { 65 | this.name = name; 66 | } 67 | 68 | public int getAge() { 69 | return age; 70 | } 71 | 72 | public void setAge(int age) { 73 | this.age = age; 74 | } 75 | 76 | public String getSex() { 77 | return sex; 78 | } 79 | 80 | public void setSex(String sex) { 81 | this.sex = sex; 82 | } 83 | 84 | public String getAddress() { 85 | return address; 86 | } 87 | 88 | public void setAddress(String address) { 89 | this.address = address; 90 | } 91 | 92 | @Override 93 | public String toString() { 94 | return "编号:" +this.getId() +"\t" + "姓名:" +this.getName() +"\t" + "年龄:" + this.getAge()+"\t" + "性别:" +this.getSex()+ "\t" + 95 | "地址"+this.getAddress(); 96 | } 97 | 98 | } 99 | 100 | ``` 101 | 102 | 103 | 104 | ```java 105 | public class Test { 106 | public static void main(String[] args) { 107 | //集合储存学生信息 108 | List list =new ArrayList(); 109 | //添加2个学员到集合中 110 | list.add(new Student("101", "张三", 20, "男", "深圳福田")); 111 | list.add(new Student("102", "李四", 23, "男", "深圳龙岗")); 112 | list.add(new Student("103", "王五", 22, "女", "深圳宝安")); 113 | 114 | //序列化集合对象储存学生信息 115 | ObjectOutputStream oos=null; 116 | try { 117 | oos=new ObjectOutputStream(new FileOutputStream("src//test2//test.txt")); 118 | // System.out.println(stu); 119 | oos.writeObject(list); 120 | } catch (IOException e) { 121 | // TODO Auto-generated catch block 122 | e.printStackTrace(); 123 | }finally { 124 | try { 125 | oos.close(); 126 | } catch (IOException e) { 127 | // TODO Auto-generated catch block 128 | e.printStackTrace(); 129 | } 130 | } 131 | } 132 | } 133 | ``` 134 | 135 | 136 | 137 | ![1541755604811](C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\1541755604811.png) 138 | 139 | # 反序列化对象 140 | 141 | 将刚才序列化的集合对象通过反序列化显示在控制台 142 | 143 | ```java 144 | ObjectInputStream ois=null; 145 | //反序列化显示集合中信息,得到新的集合 146 | ois=new ObjectInputStream(new FileInputStream("src//test2//test.txt")); 147 | @SuppressWarnings("unchecked") 148 | ArrayList list2=(ArrayList) ois.readObject(); 149 | //遍历集合 150 | for (int i = 0; i < list2.size(); i++) { 151 | Student stu=list.get(i); 152 | System.out.println(stu); 153 | } 154 | ``` 155 | 156 | 157 | 158 | ![1541756607896](C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\1541756607896.png) 159 | 160 | 161 | 162 | # 要深刻理解序列化和反序列化 163 | 164 | 165 | 166 | -------------------------------------------------------------------------------- /常用功能模块代码/JSP实现文件下载功能.md: -------------------------------------------------------------------------------- 1 | # JSP实现文件下载功能 2 | 3 | ```java 4 | package top.canghe.downloadDemo; 5 | 6 | import java.io.FileInputStream; 7 | import java.io.IOException; 8 | import java.io.InputStream; 9 | import java.net.URLEncoder; 10 | 11 | import javax.servlet.ServletException; 12 | import javax.servlet.ServletOutputStream; 13 | import javax.servlet.http.HttpServlet; 14 | import javax.servlet.http.HttpServletRequest; 15 | import javax.servlet.http.HttpServletResponse; 16 | 17 | import sun.misc.BASE64Encoder; 18 | 19 | public class DownLoadServlet extends HttpServlet { 20 | 21 | protected void doGet(HttpServletRequest request, HttpServletResponse response) 22 | throws ServletException, IOException { 23 | 24 | //*******文件名称是中文的下载******* 25 | 26 | 27 | //获得要下载的文件的名称 28 | String filename = request.getParameter("filename");//????.jpg 29 | //解决获得中文参数的乱码----下节课讲 30 | filename = new String(filename.getBytes("ISO8859-1"),"UTF-8");//美女.jpg 31 | 32 | 33 | //获得请求头中的User-Agent 34 | String agent = request.getHeader("User-Agent"); 35 | //根据不同浏览器进行不同的编码 36 | String filenameEncoder = ""; 37 | if (agent.contains("MSIE")) { 38 | // IE浏览器 39 | filenameEncoder = URLEncoder.encode(filename, "utf-8"); 40 | filenameEncoder = filenameEncoder.replace("+", " "); 41 | } else if (agent.contains("Firefox")) { 42 | // 火狐浏览器 43 | BASE64Encoder base64Encoder = new BASE64Encoder(); 44 | filenameEncoder = "=?utf-8?B?" 45 | + base64Encoder.encode(filename.getBytes("utf-8")) + "?="; 46 | } else { 47 | // 其它浏览器 48 | filenameEncoder = URLEncoder.encode(filename, "utf-8"); 49 | } 50 | 51 | 52 | 53 | //要下载的这个文件的类型-----客户端通过文件的MIME类型去区分类型 54 | response.setContentType(this.getServletContext().getMimeType(filename)); 55 | //告诉客户端该文件不是直接解析 而是以附件形式打开(下载)----filename="+filename 客户端默认对名字进行解码 56 | response.setHeader("Content-Disposition", "attachment;filename="+filenameEncoder); 57 | 58 | //获取文件的绝对路径 59 | String path = this.getServletContext().getRealPath("download/"+filename); 60 | //获得该文件的输入流 61 | InputStream in = new FileInputStream(path); 62 | //获得输出流---通过response获得的输出流 用于向客户端写内容 63 | ServletOutputStream out = response.getOutputStream(); 64 | //文件拷贝的模板代码 65 | int len = 0; 66 | byte[] buffer = new byte[1024]; 67 | while((len=in.read(buffer))>0){ 68 | out.write(buffer, 0, len); 69 | } 70 | 71 | in.close(); 72 | //out.close(); 73 | 74 | } 75 | 76 | protected void doPost(HttpServletRequest request, HttpServletResponse response) 77 | throws ServletException, IOException { 78 | doGet(request, response); 79 | } 80 | } 81 | ``` 82 | 83 | -------------------------------------------------------------------------------- /常用功能模块代码/ajax/ajax表单验证/ajax-demo/WebContent/META-INF/MANIFEST.MF: -------------------------------------------------------------------------------- 1 | Manifest-Version: 1.0 2 | Class-Path: 3 | 4 | -------------------------------------------------------------------------------- /常用功能模块代码/ajax/ajax表单验证/ajax-demo/WebContent/WEB-INF/web.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | 8 | 9 | 10 | checkUserName 11 | com.servlet.user.CheckUserName 12 | 13 | 14 | checkUserName 15 | /checkUserName 16 | 17 | 18 | 19 | 20 | index.jsp 21 | 22 | -------------------------------------------------------------------------------- /常用功能模块代码/ajax/ajax表单验证/ajax-demo/WebContent/css/style.css: -------------------------------------------------------------------------------- 1 | @charset "utf-8"; 2 | 3 | *{padding:0; margin:0;} 4 | 5 | .login{ 6 | width: 400px; 7 | margin: 50px auto; 8 | padding: 30px; 9 | } 10 | 11 | .login table tr:last-child td:last-child { 12 | color: red; 13 | } 14 | 15 | .welcome{ 16 | height: 600px; 17 | background-color: #d1d1d1; 18 | text-align: center; 19 | line-height: 150px; 20 | } 21 | .info{ 22 | margin: 10px; 23 | } 24 | .info legend{ 25 | margin-left: 20px; 26 | } 27 | 28 | .list table{ 29 | width: 100%; 30 | } 31 | .list table tr:first-child{ 32 | background-color: yellow; 33 | font-weight: bold; 34 | } 35 | .list table tr{ 36 | text-align: center; 37 | } 38 | .list table tr:last-child td:first-child{ 39 | text-align: left; 40 | } 41 | .list table tr:last-child td:last-child{ 42 | text-align: right; 43 | } 44 | 45 | .left{ 46 | width: 200px; 47 | background: linear-gradient(to bottom, #e6fdff, #00ffec, #e6fdff); 48 | height: 600px; 49 | } 50 | 51 | .left ul li{ 52 | line-height: 30px; 53 | text-indent: 30px; 54 | } 55 | 56 | .left ul li:hover{ 57 | border-radius: 15px; 58 | background-color:orange; 59 | color: white; 60 | cursor: pointer; 61 | } 62 | 63 | .left ul li a:link{ 64 | text-decoration: none; 65 | } 66 | 67 | .top{ 68 | position: relative; 69 | line-height: 50px; 70 | background-color: #00ffec; 71 | } 72 | 73 | .top div:first-child { 74 | position: relative; 75 | left: 30px; 76 | } 77 | .top div:last-child { 78 | position: absolute; 79 | top: 0px; 80 | right: 30px; 81 | } 82 | 83 | .bottom{ 84 | background-color: #00ffec; 85 | text-align: center; 86 | line-height: 50px; 87 | } 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | -------------------------------------------------------------------------------- /常用功能模块代码/ajax/ajax表单验证/ajax-demo/WebContent/index.jsp: -------------------------------------------------------------------------------- 1 | <%@page language="java" contentType="text/html; charset=utf-8" %> 2 | 3 | 4 | 5 | 6 | 示例 7 | 8 | 9 | 10 | 11 | jsp模板 12 | 13 | 14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /常用功能模块代码/ajax/ajax表单验证/ajax-demo/WebContent/js/page.js: -------------------------------------------------------------------------------- 1 | /* 声明变量 */ 2 | var curr, //当前页 3 | total, //总页数 4 | size; //页面大小 5 | 6 | /* 分页js */ 7 | $("[value='首页']").bind("click", function() { 8 | // location = webroot + "/query?currPage=1"; 9 | queryByPage(1); 10 | }); 11 | $("[value='上一页']").bind("click", function() { 12 | // location = webroot + "/query?currPage="+(curr-1); 13 | queryByPage(curr-1); 14 | }); 15 | $("[value='下一页']").bind("click", function() { 16 | // location = webroot + "/query?currPage="+(curr+1); 17 | queryByPage(curr+1); 18 | }); 19 | $("[value='尾页']").bind("click", function() { 20 | // location = webroot + "/query?currPage="+total; 21 | queryByPage(total); 22 | }); 23 | $(".list table tr:last select:last").bind("change", function() { 24 | //读取当前页 25 | curr = $(".list table tr:last select:last option:selected").val(); 26 | //跳转 27 | // location = webroot + "/query?currPage="+curr; 28 | queryByPage(curr); 29 | }); 30 | $(".list table tr:last select:first").bind("change", function() { 31 | //读取当前页 32 | // curr = $(".list table tr:last select:last option:selected").val(); 33 | //读取页面大小 34 | size = $(".list table tr:last select:first option:selected").val(); 35 | //跳转 36 | // location = webroot + "/query?currPage="+curr + "&pageSize=" + size; 37 | queryByPage(curr, size); 38 | }); 39 | 40 | /* 分页函数 */ 41 | function queryByPage(target, pageSize) { 42 | 43 | //判断, target 和 size 是否为null 44 | if(!target){ 45 | target = curr; 46 | } 47 | if(!pageSize){ 48 | pageSize = size; 49 | } 50 | //跳转 51 | location = webroot + "/query?currPage="+target + "&pageSize=" + pageSize; 52 | } 53 | 54 | -------------------------------------------------------------------------------- /常用功能模块代码/ajax/ajax表单验证/ajax-demo/WebContent/js/project.js: -------------------------------------------------------------------------------- 1 | //工程根目录变量 2 | var webroot; 3 | -------------------------------------------------------------------------------- /常用功能模块代码/ajax/ajax表单验证/ajax-demo/WebContent/js/registe.js: -------------------------------------------------------------------------------- 1 | //为注册按钮添加单击事件 2 | $("[value='注册']").bind("click", function(){ 3 | //跳转到注册页 4 | location = webroot+"/page/user/registe.jsp"; 5 | }); 6 | //为取消按钮添加单击事件 7 | $("[value='取消']").bind("click", function(){ 8 | //alert(webroot); 9 | //跳转到注册页 10 | location = webroot+"/login.jsp"; 11 | }); -------------------------------------------------------------------------------- /常用功能模块代码/ajax/ajax表单验证/ajax-demo/WebContent/registe.jsp: -------------------------------------------------------------------------------- 1 | <%@page language="java" contentType="text/html; charset=utf-8" %> 2 | 3 | 4 | 5 | 6 | 注册页 7 | 8 | 9 | 10 | 11 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 147 | 148 | 149 | 150 | 151 | 152 | 153 | 154 | 155 | 156 | 157 | -------------------------------------------------------------------------------- /常用功能模块代码/ajax/ajax表单验证/ajax-demo/src/ajax.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/freestylefly/CodeCanvas/bff2dea45228c0e247109c4b628ebadbc2024b3b/常用功能模块代码/ajax/ajax表单验证/ajax-demo/src/ajax.txt -------------------------------------------------------------------------------- /常用功能模块代码/ajax/ajax表单验证/ajax-demo/src/com/bean/User.java: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/freestylefly/CodeCanvas/bff2dea45228c0e247109c4b628ebadbc2024b3b/常用功能模块代码/ajax/ajax表单验证/ajax-demo/src/com/bean/User.java -------------------------------------------------------------------------------- /常用功能模块代码/ajax/ajax表单验证/ajax-demo/src/com/dao/BaseData.java: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/freestylefly/CodeCanvas/bff2dea45228c0e247109c4b628ebadbc2024b3b/常用功能模块代码/ajax/ajax表单验证/ajax-demo/src/com/dao/BaseData.java -------------------------------------------------------------------------------- /常用功能模块代码/ajax/ajax表单验证/ajax-demo/src/com/dao/UserData.java: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/freestylefly/CodeCanvas/bff2dea45228c0e247109c4b628ebadbc2024b3b/常用功能模块代码/ajax/ajax表单验证/ajax-demo/src/com/dao/UserData.java -------------------------------------------------------------------------------- /常用功能模块代码/ajax/ajax表单验证/ajax-demo/src/com/servlet/user/CheckUserName.java: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/freestylefly/CodeCanvas/bff2dea45228c0e247109c4b628ebadbc2024b3b/常用功能模块代码/ajax/ajax表单验证/ajax-demo/src/com/servlet/user/CheckUserName.java -------------------------------------------------------------------------------- /常用功能模块代码/为数据库批量添加测试数据/AddData.java: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/freestylefly/CodeCanvas/bff2dea45228c0e247109c4b628ebadbc2024b3b/常用功能模块代码/为数据库批量添加测试数据/AddData.java -------------------------------------------------------------------------------- /常用功能模块代码/利用cookie获取最近一次访问页面时间/LastCookieTimeServlet.java: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/freestylefly/CodeCanvas/bff2dea45228c0e247109c4b628ebadbc2024b3b/常用功能模块代码/利用cookie获取最近一次访问页面时间/LastCookieTimeServlet.java -------------------------------------------------------------------------------- /常用功能模块代码/防盗链/RefererServlet.java: -------------------------------------------------------------------------------- 1 | package com.ithiema.header; 2 | 3 | import java.io.IOException; 4 | import javax.servlet.ServletException; 5 | import javax.servlet.http.HttpServlet; 6 | import javax.servlet.http.HttpServletRequest; 7 | import javax.servlet.http.HttpServletResponse; 8 | 9 | public class RefererServlet extends HttpServlet { 10 | 11 | protected void doGet(HttpServletRequest request, HttpServletResponse response) 12 | throws ServletException, IOException { 13 | 14 | //对该新闻的来源的进行判断 15 | String header = request.getHeader("referer"); 16 | if(header!=null&&header.startsWith("http://localhost")){ 17 | //是从我自己的网站跳转过来的 可以看新闻 18 | response.setContentType("text/html;charset=UTF-8"); 19 | response.getWriter().write("中国确实已经拿到100块金牌...."); 20 | }else{ 21 | response.getWriter().write("你是盗链者,可耻!!"); 22 | } 23 | 24 | 25 | } 26 | 27 | protected void doPost(HttpServletRequest request, HttpServletResponse response) 28 | throws ServletException, IOException { 29 | doGet(request, response); 30 | } 31 | } -------------------------------------------------------------------------------- /常用工具和环境/Git&GitHub/Git&GitHub.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/freestylefly/CodeCanvas/bff2dea45228c0e247109c4b628ebadbc2024b3b/常用工具和环境/Git&GitHub/Git&GitHub.pdf -------------------------------------------------------------------------------- /常用工具和环境/Git&GitHub/关于GitHub的一些经验总结(包括README文件的编写目录的自动生成).md: -------------------------------------------------------------------------------- 1 | ## 一、README.md上传图片 2 | 需要注意的是一定要图片先上传到图床,我这边用的有两个 3 | 1、[图床](https://imgchr.com/) 4 | 2、[七牛云](https://www.qiniu.com/) 5 | 关于七牛云我会出另外一篇文章细说 6 | 注意:不管是截图的图片还是本地上传的图片都要上传到图床上,,然后复制URL才可以在GitHub中显示 7 | 8 | ## 二、README.md自动生成目录 9 | 不能用Markdown的【TCG】自动生成目录,在GitHub上是不显示的 10 | 我的办法是: 11 | 1、[点开网站](https://sleepeatcode.com/ghtoc) 12 | 2、将GitHub的README.md的URL复制,自动生成目录,但是这是不全的 13 | 3、复制目录到README.md文件,需要在后面的括号处加上#文件名,这个是我能找到的比较简单的办法了,比手动敲简单 14 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20190331070938177.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQzMjcwMDc0,size_16,color_FFFFFF,t_70) 15 | 特别注意:#后面不要加任何特殊字符和数字,目录不要编号,否则不成功,内部跳转不成功的很大部分原因也是因为内部编号了。 16 | 17 | ## >三、我的GitHub 18 | https://github.com/freestylefly/javaStudy#ajax 19 | 期待你的加入!,有什么不懂的可以在GitHub上留言问我。 20 | 21 | -------------------------------------------------------------------------------- /常用工具和环境/Git&GitHub/分布式版本控制工具——Git.md: -------------------------------------------------------------------------------- 1 |  2 | ## 目录 3 | - [一、写在前面](#一写在前面) 4 | - [二、Git的优势](#二git的优势) 5 | - [三、Git的基本结构](#三git的基本结构) 6 | - [四、本地库和远程库](#四本地库和远程库) 7 | - [五、本地库初始化](#五本地库初始化) 8 | - [六、设置签名](#六设置签名) 9 | - [七、常用命令](#七常用命令) 10 | - [八、历史记录](#八历史记录) 11 | - [九、版本前进后退](#九版本前进后退) 12 | 13 | 14 | ## 一、写在前面 15 | 16 | Git是一个开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目。发明人就是大名鼎鼎的Linus ,发明初衷为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制软件。需要知道的是Git底层文件验证采用的是SHA-1,(SHA-1)哈希算法可以被用来验证文件。哈希算法有如下特点: 17 | 1、不管输入数据的数据量有多大,输入同一个哈希算法,得到的加密结果长度固定 18 | 2、哈希算法确定,输入数据确定,输出数据能够保证不变 19 | 3、哈希算法确定,输入数据有变化,输出数据一定有变化,而且通常变化很大 20 | 4、哈希算法不可逆 21 | ## 二、Git的优势 22 | 23 | 1. 大部分在本地完成,不用联网 24 | 2. 完整性保证 25 | 3. 尽可能添加数据而不是删除和修改数据 26 | 4. 分支操作非常快速刘闯 27 | 5. 和Linux命令全面兼容 28 | ## 三、Git的基本结构 29 | 工作区:写代码的地方 30 | 暂存区:Git临时存储的地方 31 | 本地库:Git存放的历史版本 32 | ## 四、本地库和远程库 33 | 局域网:GitLab 34 | 外网:GitHub、码云 35 | 1、团队内部协作: 36 | push:本地库提交到远程库 37 | pull:拉取远程库代码到本地库,包括两个操作fetch(拉取)+merge(合并)拉取并合并,就是将远程库的代码更新到本地库 38 | clone:将远程库所有东西下载到本地,并且建立本地库 39 | 2、跨团队协作 40 | 如需要在被人的GitHub仓库提交自己的修改,跨团队协作 41 | fork:复制一份别人的代码在自己的远程库 42 | pull request:拉取请求,发送自己的修改 43 | merge:合并保存 44 | ## 五、本地库初始化 45 | ”命令:git init 46 | 注意:.git目录不能删除 47 | ## 六、设置签名 48 | 1、作用:在你提交代码的时候作为一个标识,代表这是你提交的代码,这里的签名和远程库上面的账号和密码没有任何关系 49 | 2、命令 50 | ```java 51 | 命令 52 | git comfig user.name 你的签名 53 | git config user.email 你的邮箱 54 | 55 | ``` 56 | 3、注意:签名分两种: 57 | 项目级别:也叫仓库级别,仅在当前本地库范围内有效,git gonfig命令 58 | 系统级别:当前操作系统的用户有效,git config --global 59 | **优先级:就近原则 60 | 4、查看签名 61 | 62 | ```java 63 | 仓库级别: 64 | cat .git/config 65 | 系统级别: 66 | cat `/.gitconfig 67 | ``` 68 | ## 七、常用命令 69 | 70 | ```java 71 | git status:查看工作区、暂存区状态 72 | git add 文件名:添加文件到暂存区 73 | git add *:添加所有文件到暂存区 74 | git rm --cached 文件名:将暂存区恢复到工作区 75 | git commit -m"提交日志" 文件名:提交文件到本地库 76 | git commit -a -m"提交日志" :添加所有文件到本地库 77 | 78 | ``` 79 | ## 八、历史记录 80 | 1、查看历史记录 81 | git log 82 | git reflog 简洁的查看历史记录,HEAD值简单化 83 | 2、多层显示控制方式 84 | 空格向下切换 85 | b向上翻页 86 | q退出 87 | ## 九、版本前进后退 88 | 1、基于索引值操作 89 | git reset --hard 索引值 90 | git help 具体命令:查看帮助 91 | 92 | 2、reset命令的三个参数对比 93 | --sert:仅仅在本地库移动HEAD指针 94 | --mixed:从本地库移动指针,重置暂存区 95 | --hard:本地库移动指针,重置暂存区,重置工作区 96 | ## 十、删除后找回 97 | 一定要明确一点就是,你从本地库或者工作区删除了文件,一定要将删除的操作add和commit 到本地库才可以找回相关文件。 98 | git reset--hard 指针位置 99 | ## 十一、比较文件差异 100 | git diff:工作区和暂存区比较 101 | git diff HEAD 文件名:本地库和历史版本比较,不带文件名是比较多个文件 102 | ## 十二、git的分支 103 | 1、什么是分支 104 | 版本控制中, 使用多条分支同时推进多个任务 105 | 2、查看所有分支 106 | git branch -v 107 | 3、创建分支 108 | git branch 分支名 109 | 4、切换分支 110 | gitcheckout 分支名 111 | 5、合并分支 112 | 第一步L切换到被合并分支 113 | 第二步:执行git merge 分支名 114 | 6、解决分支冲突 115 | 删掉相关标记 116 | git add 文件名:标记为已解决 117 | git commit -m“”“”:提交解决冲突 118 | 注意:提交的时候不能带文件名 119 | ## 十三、GitHub 120 | 1、给远程库URL新建别名 121 | git remote add 别名 远程仓库URL 122 | 2、查看远程仓库地址别名 123 | git remote -v 124 | 3、推送到远程库 125 | git push 别名 分支名 126 | 4、克隆远程仓库内容到本地 127 | git clone 远程地址别名 128 | 注意:克隆会晚会智能的把远程库下载到本地,创建origin远程地址的别名,并且会初始化本地库 129 | 5、抓取:将远程分支放到本地 130 | git fetch 别名 分支名 131 | 6、合并 132 | 将远程分支合并到本地库 133 | git merge 悲鸣/分支名 134 | 7、抓取并合并 135 | git pull 别名 分支名 136 | ## 十四、ssh免密登录和eclipse下的git操作 137 | 这个可以直接访问仓库,对应资源可以下载 138 | https://github.com/freestylefly/javaStudy/tree/master/Git%26GitHub 139 | ## 十五、写在最后 140 | 如果有想要学习资源的话欢迎评论咨询! 141 | 142 | 143 | -------------------------------------------------------------------------------- /常用工具和环境/InteliJ_IDEA/idea下新建的spring boot项目,无法导入依赖以及idea基础回顾.md: -------------------------------------------------------------------------------- 1 | # 一、问题描述 2 | 最近在idea中导入spring boot项目的依赖时,无论怎么也无法导入依赖,如图所示: 3 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20190420225355958.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQzMjcwMDc0,size_16,color_FFFFFF,t_70) 4 | 总是显示:Project 'org.springframework.boot:spring-boot-starter-parent:1.5.9.RELEASE' not found 5 | 一开始以为是maven配置的不对,重新修改配置还是不对 6 | # 二、问题解决 7 | 原来是因为每次用idea新建项目, 二进制版本都是1.5或1.6。只需要修改settings——build Execution Deploment——Compler——java Compler里面修改,如图: 8 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20190420225831122.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQzMjcwMDc0,size_16,color_FFFFFF,t_70) 9 | 修改成JDK1.8即可,刚开始默认是1.5的,也不知道为啥1.5就不能自动导入项目需要的依赖。反正问题就解决了。 10 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20190420225941307.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQzMjcwMDc0,size_16,color_FFFFFF,t_70) 11 | # 三、补充idea基础 12 | ## 1、进入settings,目录结构 13 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20190420230504104.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQzMjcwMDc0,size_16,color_FFFFFF,t_70) 14 | 15 | ## 2、设置主题 16 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20190420230601414.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQzMjcwMDc0,size_16,color_FFFFFF,t_70) 17 | 这里默认提供了三套主题:IntelliJ,Darcula,Windows。这里可以根据自己的喜好进行选择。 18 | ## 3、设置窗体及菜单的字体及字体大小 19 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20190420230725605.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQzMjcwMDc0,size_16,color_FFFFFF,t_70) 20 | ## 4、Ctrl + 鼠标滚轮 快捷键来控制代码字体大小显示 21 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20190420230853739.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQzMjcwMDc0,size_16,color_FFFFFF,t_70) 22 | ## 5、设置鼠标悬浮提示 23 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20190420230924713.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQzMjcwMDc0,size_16,color_FFFFFF,t_70) 24 | ## 6、设置自动导包功能 25 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20190420230958526.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQzMjcwMDc0,size_16,color_FFFFFF,t_70) 26 | Add unambiguous imports on the fly:自动导入不明确的结构 27 | Optimize imports on the fly:自动帮我们优化导入的包# 28 | ## 7、设置显示行号和方法间的分隔符 29 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20190420231217341.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQzMjcwMDc0,size_16,color_FFFFFF,t_70) 30 | 如上图红圈所示,可以勾选 Show line numbers:显示行数。我建议一般这个要勾选上 31 | 如上图红圈所示,可以勾选 Show method separators: 显示方法分隔线。这种线有助于我们区分开方法,所以建议勾选上 32 | 33 | ## 8、忽略大小写提示 34 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20190420231348255.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQzMjcwMDc0,size_16,color_FFFFFF,t_70) 35 | ## 9、设置取消单行显示 tabs 的操作 36 | 37 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20190420231428292.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQzMjcwMDc0,size_16,color_FFFFFF,t_70) 38 | 39 | ## 10、设置默认的字体、字体大小、字体行间距 40 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20190420231504625.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQzMjcwMDc0,size_16,color_FFFFFF,t_70) 41 | ## 11、修改类头的文档注释信息 42 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20190420231703634.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQzMjcwMDc0,size_16,color_FFFFFF,t_70) 43 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20190420231623228.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQzMjcwMDc0,size_16,color_FFFFFF,t_70) 44 | 45 | ## 12、设置项目文件编码 46 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20190420231839193.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQzMjcwMDc0,size_16,color_FFFFFF,t_70) 47 | # 四、关于我 48 | ------ 49 | # 本文章已同步至我的GitHub仓库:Javastudy,期待您的加入:blush: 50 | 51 | 52 | # 本文章已同步至苍何的个人博客,可以直接在博客上留言哦:blush: 53 | 54 | 55 | # 来我的微信公众号玩耍呗:blush: 56 | 57 | 58 | # 扫码无套路关注我的CSDN博客:blush: 59 | -------------------------------------------------------------------------------- /常用工具和环境/InteliJ_IDEA/settings.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/freestylefly/CodeCanvas/bff2dea45228c0e247109c4b628ebadbc2024b3b/常用工具和环境/InteliJ_IDEA/settings.jar -------------------------------------------------------------------------------- /常用工具和环境/InteliJ_IDEA/尚硅谷_宋红康_IntelliJIDEA的安装、配置与使用.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/freestylefly/CodeCanvas/bff2dea45228c0e247109c4b628ebadbc2024b3b/常用工具和环境/InteliJ_IDEA/尚硅谷_宋红康_IntelliJIDEA的安装、配置与使用.pdf -------------------------------------------------------------------------------- /常用工具和环境/InteliJ_IDEA/激活码.txt: -------------------------------------------------------------------------------- 1 | T3ACKYHDVF-eyJsaWNlbnNlSWQiOiJUM0FDS1lIRFZGIiwibGljZW5zZWVOYW1lIjoi5bCP6bifIOeoi+W6j+WRmCIsImFzc2lnbmVlTmFtZSI6IiIsImFzc2lnbmVlRW1haWwiOiIiLCJsaWNlbnNlUmVzdHJpY3Rpb24iOiIiLCJjaGVja0NvbmN1cnJlbnRVc2UiOmZhbHNlLCJwcm9kdWN0cyI6W3siY29kZSI6IklJIiwiZmFsbGJhY2tEYXRlIjoiMjAxOS0wNi0xMyIsInBhaWRVcFRvIjoiMjAyMC0wNi0xMiJ9LHsiY29kZSI6IkFDIiwiZmFsbGJhY2tEYXRlIjoiMjAxOS0wNi0xMyIsInBhaWRVcFRvIjoiMjAyMC0wNi0xMiJ9LHsiY29kZSI6IkRQTiIsImZhbGxiYWNrRGF0ZSI6IjIwMTktMDYtMTMiLCJwYWlkVXBUbyI6IjIwMjAtMDYtMTIifSx7ImNvZGUiOiJQUyIsImZhbGxiYWNrRGF0ZSI6IjIwMTktMDYtMTMiLCJwYWlkVXBUbyI6IjIwMjAtMDYtMTIifSx7ImNvZGUiOiJHTyIsImZhbGxiYWNrRGF0ZSI6IjIwMTktMDYtMTMiLCJwYWlkVXBUbyI6IjIwMjAtMDYtMTIifSx7ImNvZGUiOiJETSIsImZhbGxiYWNrRGF0ZSI6IjIwMTktMDYtMTMiLCJwYWlkVXBUbyI6IjIwMjAtMDYtMTIifSx7ImNvZGUiOiJDTCIsImZhbGxiYWNrRGF0ZSI6IjIwMTktMDYtMTMiLCJwYWlkVXBUbyI6IjIwMjAtMDYtMTIifSx7ImNvZGUiOiJSUzAiLCJmYWxsYmFja0RhdGUiOiIyMDE5LTA2LTEzIiwicGFpZFVwVG8iOiIyMDIwLTA2LTEyIn0seyJjb2RlIjoiUkMiLCJmYWxsYmFja0RhdGUiOiIyMDE5LTA2LTEzIiwicGFpZFVwVG8iOiIyMDIwLTA2LTEyIn0seyJjb2RlIjoiUkQiLCJmYWxsYmFja0RhdGUiOiIyMDE5LTA2LTEzIiwicGFpZFVwVG8iOiIyMDIwLTA2LTEyIn0seyJjb2RlIjoiUEMiLCJmYWxsYmFja0RhdGUiOiIyMDE5LTA2LTEzIiwicGFpZFVwVG8iOiIyMDIwLTA2LTEyIn0seyJjb2RlIjoiUk0iLCJmYWxsYmFja0RhdGUiOiIyMDE5LTA2LTEzIiwicGFpZFVwVG8iOiIyMDIwLTA2LTEyIn0seyJjb2RlIjoiV1MiLCJmYWxsYmFja0RhdGUiOiIyMDE5LTA2LTEzIiwicGFpZFVwVG8iOiIyMDIwLTA2LTEyIn0seyJjb2RlIjoiREIiLCJmYWxsYmFja0RhdGUiOiIyMDE5LTA2LTEzIiwicGFpZFVwVG8iOiIyMDIwLTA2LTEyIn0seyJjb2RlIjoiREMiLCJmYWxsYmFja0RhdGUiOiIyMDE5LTA2LTEzIiwicGFpZFVwVG8iOiIyMDIwLTA2LTEyIn0seyJjb2RlIjoiUlNVIiwiZmFsbGJhY2tEYXRlIjoiMjAxOS0wNi0xMyIsInBhaWRVcFRvIjoiMjAyMC0wNi0xMiJ9XSwiaGFzaCI6IjEzMzgwMDA0LzAiLCJncmFjZVBlcmlvZERheXMiOjcsImF1dG9Qcm9sb25nYXRlZCI6ZmFsc2UsImlzQXV0b1Byb2xvbmdhdGVkIjpmYWxzZX0=-nTBuZDiAOuM4IHXNkS7GbCvZVZFo4EcHf9hHzfhaPYsaCGQjuCVJFEboopbPuEHn16yT9Zvf7yRuM5WGlGmpcOJnWLpCmGm65S6wHtZdX0kfSNIqnqdS1MhIHpftsAGxSswuQksrm09tltbO4nATeavGs1BIMafsCJVen+BvDFvYL7+3crkRI7AwdyMb2miLLYJcEVPhiVKZnzJUzT9uA8/4Q02BqsvX5oSJg8cLw3w7Cd0ISrn1i8uENe/1z3T/Ede0STM7eOekFaVEdO9cgzYME3iIFzi2TZXMSqIuBpJqF4NFb6M0039tEGy6EHqcksMyDTdCAASquqcDcHrUUA==-MIIElTCCAn2gAwIBAgIBCTANBgkqhkiG9w0BAQsFADAYMRYwFAYDVQQDDA1KZXRQcm9maWxlIENBMB4XDTE4MTEwMTEyMjk0NloXDTIwMTEwMjEyMjk0NlowaDELMAkGA1UEBhMCQ1oxDjAMBgNVBAgMBU51c2xlMQ8wDQYDVQQHDAZQcmFndWUxGTAXBgNVBAoMEEpldEJyYWlucyBzLnIuby4xHTAbBgNVBAMMFHByb2QzeS1mcm9tLTIwMTgxMTAxMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxcQkq+zdxlR2mmRYBPzGbUNdMN6OaXiXzxIWtMEkrJMO/5oUfQJbLLuMSMK0QHFmaI37WShyxZcfRCidwXjot4zmNBKnlyHodDij/78TmVqFl8nOeD5+07B8VEaIu7c3E1N+e1doC6wht4I4+IEmtsPAdoaj5WCQVQbrI8KeT8M9VcBIWX7fD0fhexfg3ZRt0xqwMcXGNp3DdJHiO0rCdU+Itv7EmtnSVq9jBG1usMSFvMowR25mju2JcPFp1+I4ZI+FqgR8gyG8oiNDyNEoAbsR3lOpI7grUYSvkB/xVy/VoklPCK2h0f0GJxFjnye8NT1PAywoyl7RmiAVRE/EKwIDAQABo4GZMIGWMAkGA1UdEwQCMAAwHQYDVR0OBBYEFGEpG9oZGcfLMGNBkY7SgHiMGgTcMEgGA1UdIwRBMD+AFKOetkhnQhI2Qb1t4Lm0oFKLl/GzoRykGjAYMRYwFAYDVQQDDA1KZXRQcm9maWxlIENBggkA0myxg7KDeeEwEwYDVR0lBAwwCgYIKwYBBQUHAwEwCwYDVR0PBAQDAgWgMA0GCSqGSIb3DQEBCwUAA4ICAQAF8uc+YJOHHwOFcPzmbjcxNDuGoOUIP+2h1R75Lecswb7ru2LWWSUMtXVKQzChLNPn/72W0k+oI056tgiwuG7M49LXp4zQVlQnFmWU1wwGvVhq5R63Rpjx1zjGUhcXgayu7+9zMUW596Lbomsg8qVve6euqsrFicYkIIuUu4zYPndJwfe0YkS5nY72SHnNdbPhEnN8wcB2Kz+OIG0lih3yz5EqFhld03bGp222ZQCIghCTVL6QBNadGsiN/lWLl4JdR3lJkZzlpFdiHijoVRdWeSWqM4y0t23c92HXKrgppoSV18XMxrWVdoSM3nuMHwxGhFyde05OdDtLpCv+jlWf5REAHHA201pAU6bJSZINyHDUTB+Beo28rRXSwSh3OUIvYwKNVeoBY+KwOJ7WnuTCUq1meE6GkKc4D/cXmgpOyW/1SmBz3XjVIi/zprZ0zf3qH5mkphtg6ksjKgKjmx1cXfZAAX6wcDBNaCL+Ortep1Dh8xDUbqbBVNBL4jbiL3i3xsfNiyJgaZ5sX7i8tmStEpLbPwvHcByuf59qJhV/bZOl8KqJBETCDJcY6O2aqhTUy+9x93ThKs1GKrRPePrWPluud7ttlgtRveit/pcBrnQcXOl1rHq7ByB8CFAxNotRUYL9IF5n3wJOgkPojMy6jetQA5Ogc8Sm7RG6vg1yow== -------------------------------------------------------------------------------- /常用工具和环境/InteliJ_IDEA/这几款 idea 插件让效率起飞!_new.md: -------------------------------------------------------------------------------- 1 | > **作者:**苍何,前大厂高级 Java 工程师,阿里云专家博主,CSDN 2023 年 实力新星,土木转码,现任部门技术 leader,专注于互联网技术分享,职场经验分享。 2 | > 🔥**热门文章推荐:** 3 | > - (1)[对程序员来说,技术能力和业务逻辑哪个更重要?](https://canghe.blog.csdn.net/article/details/133632205?spm=1001.2014.3001.5502) 4 | > - (2)[搭建GitHub免费个人网站(详细教程)](https://canghe.blog.csdn.net/article/details/95392429?spm=1001.2014.3001.5502) 5 | > - (3)[itchat实现微信聊天机器人](https://canghe.blog.csdn.net/article/details/92232985?spm=1001.2014.3001.5502) 6 | > - (4)[嗖嗖移动业务大厅(源码下载+注释全 值得收藏)](https://canghe.blog.csdn.net/article/details/83204418?spm=1001.2014.3001.5502) 7 | 8 | 9 | ![2023年12月01日-idea效率插件.png](https://yupi-picture-1256524210.cos.ap-shanghai.myqcloud.com/22922/1701437740873-60aa0f66-05e3-44de-b8d3-9738b7cd1732.png) 10 | 11 | 大家好,我是苍何。工欲善其事必先利其器,在实际开发中,谁能很好的使用工具,谁将会更加高效。今天分享苍何在实际开发中觉得很不错的 idea 插件,用的好直接让效率起飞。 12 | 13 | 废话不多说,直接上干货。 14 | # 一、JRebel 15 | 16 | JRebel 是由一爱沙尼亚公司 ZeroTurnaround 开发的 Java 应用热部署插件。也是目前市场面最好的热部署插件之一。 17 | > 热部署即是在开发中修改代码无需重启应用,能实时应用代码变更。 18 | 19 | 20 | ![JRebel](https://yupi-picture-1256524210.cos.ap-shanghai.myqcloud.com/22922/1701427400694-1ecee253-2e85-4a2d-996c-bcbe66528723.png "JRebel") 21 | 22 | JRebel 是付费产品,网上有不少 pojie 的教程,也可以直接某宝上花几块钱购买正版授权。我就是采用的第二种方式(主要省的麻烦,哈哈)。 23 | 24 | 安装激活后,需要对其进行配置。 25 | 26 | 1、配置离线模式和自动加载时间 27 | 28 | ![配置离线模式和自动加载时间](https://yupi-picture-1256524210.cos.ap-shanghai.myqcloud.com/22922/1701432754200-dbb1d476-28e0-439c-94b7-8a5269ceff12.png "配置离线模式和自动加载时间") 29 | 30 | 2、设置项目自动构建 31 | 32 | ![设置项目自动构建](https://yupi-picture-1256524210.cos.ap-shanghai.myqcloud.com/22922/1701432878088-d7bdb34a-275c-4cbc-b787-f9900bbf9262.png "设置项目自动构建") 33 | 34 | 3、设置自动编译 35 | 36 | ![设置自动编译](https://yupi-picture-1256524210.cos.ap-shanghai.myqcloud.com/22922/1701432989562-e9d9b539-93fe-48aa-ad7a-47a08d7cafb2.png "设置自动编译") 37 | 38 | 4、启动项目的时候 run 或 dubug 就可以开启热部署了。 39 | ![开启热部署](https://yupi-picture-1256524210.cos.ap-shanghai.myqcloud.com/22922/1701433115488-e594ab19-ba44-417c-aa2f-4e940d1f35c6.png "开启热部署") 40 | 当在 service 层写业务代码时,无需再次重启应用,直接就可以加载最新的配置,效率杠杠的。 41 | 42 | # 二、GitHub Copilot 43 | 44 | 可以说是目前最好用的的编程助手之一了,同时 openai 大模型的支持使得该 AI 助手更能理解我们实际 code 的诉求。 45 | 46 | ![GitHub Copilot](https://yupi-picture-1256524210.cos.ap-shanghai.myqcloud.com/22922/1701433424306-62992709-b0dd-4f87-9e7d-f37ec918f367.png "GitHub Copilot") 47 | 48 | 插件市场搜索后安装,需要登录自己的 GitHub 账号,可以免费试用一个月,之后是 10 刀一个月。如果你有学生身份认证或者 GitHub 有开源项目,可以申请免费使用。也可以某宝直接买个破解版的使用。 49 | 50 | 一些使用小技巧: 51 | 1、通过注释自动生成代码 52 | 53 | ![通过注释自动生成代码](https://yupi-picture-1256524210.cos.ap-shanghai.myqcloud.com/22922/1701434028082-197131f6-2d21-42e7-9761-d0e610fd14de.png "通过注释自动生成代码") 54 | 55 | ![通过注释自动生成代码](https://yupi-picture-1256524210.cos.ap-shanghai.myqcloud.com/22922/1701434070612-dc2c06e4-217a-40a6-b9c6-632afd9b5866.png "通过注释自动生成代码") 56 | 57 | 2、自动生成测试代码 58 | 59 | ![自动生成测试代码](https://yupi-picture-1256524210.cos.ap-shanghai.myqcloud.com/22922/1701433855239-9c4b08d2-a091-40ba-a9fa-43ef83331549.png "自动生成测试代码") 60 | 61 | 3、直接生成 SQL 62 | 63 | ![直接生成 SQL](https://yupi-picture-1256524210.cos.ap-shanghai.myqcloud.com/22922/1701434256938-ba2fd495-3a85-44eb-a0ea-ec6a838c50b7.png "直接生成 SQL") 64 | 65 | 4、和 AI 对话(内侧中) 66 | 这个功能目前在 idea 中还属于内侧阶段,在 vscode 中使用体验,还是很爽的,直接通过快捷键唤起助手,随时随地提问,并能很好的帮助你 code。 67 | 68 | 5、编写必要的注释 69 | 不写注释的程序猿不是好程序猿,但写注释通常是很花费时间的,大部分情况我们都想偷懒,以前偷懒不写,经常在 CR 的时候被说,现在有了 Copilot,直接让他帮我们写注释吧。 70 | 71 | 6、可以询问业务逻辑 72 | 对于历史项目想快速的了解直接丢给他好了,绝对比我们一行一行的看代码快上数倍。 73 | 74 | # 三、Free MyBatis Tool 75 | 76 | 如果你的项目是 MyBatis 项目,强烈建议安装这个插件,他能让你迅速的直接跳转到 xml 中的具体 sql,而不需要到 mapper。且在 service 中直接可以跳转到 xml 中的 sql 实现。 77 | 78 | 点击绿色箭头就可以无缝跳转,别提多方便。 79 | 80 | ![Free MyBatis Tool](https://yupi-picture-1256524210.cos.ap-shanghai.myqcloud.com/22922/1701434796492-2c50f3dc-e419-47cf-bc07-7889c994ab23.png "Free MyBatis Tool") 81 | 82 | ![MyBatis便捷跳转](https://yupi-picture-1256524210.cos.ap-shanghai.myqcloud.com/22922/1701434874312-34e13fbc-9412-4102-bdb3-d467c1ccf2e0.png "MyBatis便捷跳转") 83 | 84 | # 四、Apifox Helper 85 | 86 | 我不允许还有人不知道 Apifox 这款良心国产软件,完全平替 postman 。我们团队所有项目的接口都在上面进行方便的管理,同时他也支持集成测试和 mock 数据,在前后端、测试、产品间把 AIP 接口玩的 6 的飞起。 87 | 88 | ![Apifox](https://yupi-picture-1256524210.cos.ap-shanghai.myqcloud.com/22922/1701435150783-230b3c18-e0d3-4973-beca-8f84fa6107ac.png "Apifox") 89 | 90 | 91 | 管理接口有了他,更方便。那么对开发来说,写好接口后,就想一键同步接口到 Apifox 就好了,官方给我们提供了 idea 插件,支持一键同步。 92 | 93 | ![Apifox Helper](https://yupi-picture-1256524210.cos.ap-shanghai.myqcloud.com/22922/1701435299516-7328d61c-a940-4e9b-9877-ae38397491d8.png "Apifox Helper") 94 | 95 | 按照官方文档进行简单配置后,在项目中,直接右键就可以将接口同步到Apifox,省去了很多导入导出的工作。 96 | 97 | # 五、Apipost-Helper-2.0 98 | 99 | 这是可以直接在 idea 中调用请求的插件,虽然有不少插件也能做到,比如 restful,但我比较喜欢他的界面以及丝滑的操作。 100 | 101 | ![Apipost-Helper-2.0](https://yupi-picture-1256524210.cos.ap-shanghai.myqcloud.com/22922/1701435506581-710e59fb-489c-4a2a-8ab0-d85a8dd4aa7d.png "Apipost-Helper-2.0") 102 | 103 | ![Apipost发送请求](https://yupi-picture-1256524210.cos.ap-shanghai.myqcloud.com/22922/1701435581651-5994162c-0c73-41aa-8f94-43d1ce7098a3.png "Apipost发送请求") 104 | 105 | 可以配置默认请求头和前缀。 106 | 107 | ![配置默认请求头和前缀](https://yupi-picture-1256524210.cos.ap-shanghai.myqcloud.com/22922/1701436588514-a943cdb9-dbaa-4a4f-a16f-a903c1bdffb7.png "配置默认请求头和前缀") 108 | 109 | 不用在 idea 和 apifox 中来回切换,大大提高了效率,也能我们更专心 code。 110 | 111 | 以上是 5 个插件的内容,朋友们,你们都用哪些提效的插件啊? 112 | 113 | ![苍何个人介绍.png](https://yupi-picture-1256524210.cos.ap-shanghai.myqcloud.com/22922/1696255868903-dd1f63ce-d8a4-40d3-bb7a-2879c1d331a1.png) 114 | 115 | > 创作不易,如果本文对你有帮助,欢迎点赞、收藏加关注,你的支持和鼓励,是我创作的最大动力。 116 | > ![文章最下方关注图片.gif](https://yupi-picture-1256524210.cos.ap-shanghai.myqcloud.com/22922/1695892885868-ec6c1fdb-e043-40e0-8b57-079a6050abd6.gif) 117 | 118 | 119 | -------------------------------------------------------------------------------- /常用工具和环境/Linux/Linux命令大全(修改版).chm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/freestylefly/CodeCanvas/bff2dea45228c0e247109c4b628ebadbc2024b3b/常用工具和环境/Linux/Linux命令大全(修改版).chm -------------------------------------------------------------------------------- /常用工具和环境/Linux/Linux操作系统.md: -------------------------------------------------------------------------------- 1 | ## 一、Linux概述 2 | Linux和Windows均属于操作系统的范畴,和windows不同的是,他没有像Windows有图形化界面,可以鼠标点点点,Linux所有操作都是命令行操作,Linux不同于Windows,是个开源的操作系统,全世界有很多的开发者都参与到Linux的建设中。 3 | Linux可安装在各种计算机硬件设备中,比如手机、平板电脑、路由器、台式计算机。 4 | Linux是由芬兰赫尔辛基大学学生Linus Torvalds和后来加入的众多爱好者共同开发完成,Linux之父Linus Torvalds于19年宣布退休。 5 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20191110162754370.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQzMjcwMDc0,size_16,color_FFFFFF,t_70) 6 | ## 二、Linux目录结构 7 | bin (binaries)存放二进制可执行文件 8 | sbin (super user binaries)存放二进制可执行文件,只有root才能访问 9 | etc (etcetera)存放系统配置文件 10 | usr (unix shared resources)用于存放共享的系统资源 11 | home 存放用户文件的根目录 12 | root 超级用户目录 13 | dev (devices)用于存放设备文件 14 | lib (library)存放跟文件系统中的程序运行所需要的共享库及内核模块 15 | mnt (mount)系统管理员安装临时文件系统的安装点 16 | boot 存放用于系统引导时使用的各种文件 17 | tmp (temporary)用于存放各种临时文件 18 | var (variable)用于存放运行时需要改变数据的文件 19 | ## 三、java开发用到的Linux命令 20 | 21 | 操作文件或目录常用命令 22 | ``` 23 | pwd 显示当前工作目录(print working directory) 24 | touch 创建空文件 25 | mkdir 创建目录(make directoriy) 26 | -p 父目录不存在情况下先生成父目录 (parents) 27 | cp 复制文件或目录(copy) 28 | -r 递归处理,将指定目录下的文件与子目录一并拷贝(recursive) 29 | mv 移动文件或目录、文件或目录改名(move) 30 | 31 | rm 删除文件(remove) 32 | -r 同时删除该目录下的所有文件(recursive) 33 | -f 强制删除文件或目录(force) 34 | rmdir 删除空目录(remove directoriy) 35 | cat显示文本文件内容 (catenate) 36 | more、less 分页显示文本文件内容 37 | head、tail查看文本中开头或结尾部分的内容 38 | haed -n 5 a.log 查看a.log文件的前5行 39 | tail -F b.log 循环读取(follow) 40 | 41 | ``` 42 | 常用命令 43 | ``` 44 | wc 统计文本的行数、字数、字符数(word count) 45 | -m 统计文本字符数 46 | -w 统计文本字数 47 | -l 统计文本行数 48 | find 在文件系统中查找指定的文件 49 | find /etc/ -name "aaa" 50 | grep 在指定的文本文件中查找指定的字符串 51 | ln 建立链接文件(link) 52 | -s 对源文件建立符号连接,而非硬连接(symbolic) 53 | 54 | top 显示当前系统中耗费资源最多的进程 55 | ps 显示瞬间的进程状态 56 | -e /-A 显示所有进程,环境变量 57 | -f 全格式 58 | -a 显示所有用户的所有进程(包括其它用户) 59 | -u 按用户名和启动时间的顺序来显示进程 60 | -x 显示无控制终端的进程 61 | kill 杀死一个进程 62 | kill -9 pid 63 | df 显示文件系统磁盘空间的使用情况 64 | 65 | du 显示指定的文件(目录)已使用的磁盘空间的总 66 | -h文件大小以K,M,G为单位显示(human-readable) 67 | -s只显示各档案大小的总合(summarize) 68 | free 显示当前内存和交换空间的使用情况 69 | netstat 显示网络状态信息 70 | -a 显示所有连接和监听端口 71 | -t (tcp)仅显示tcp相关选项 72 | -u (udp)仅显示udp相关选项 73 | -n 拒绝显示别名,能显示数字的全部转化成数字。 74 | -p 显示建立相关链接的程序名 75 | ifconfig 网卡网络配置详解 76 | ping 测试网络的连通性 77 | 78 | 79 | ``` 80 | 备份压缩命令 81 | ``` 82 | gzip 压缩(解压)文件或目录,压缩文件后缀为gz 83 | bzip2 压缩(解压)文件或目录,压缩文件后缀为bz2 84 | tar 文件、目录打(解)包 85 | 86 | ``` 87 | gzip命令 88 | ``` 89 | 命令格式:bzip2 [-cdz] 文档名 90 | -c将压缩的过程产生的数据输出到屏幕上 91 | -d解压缩的参数(decompress) 92 | -z压缩的参数(compress) 93 | -num 用指定的数字num调整压缩的速度,-1或--fast表示最快压缩方法(低压缩比),-9或--best表示最慢压缩方法(高压缩比)。系统缺省值为6 94 | ``` 95 | tar命令 96 | ``` 97 | -c 建立一个压缩文件的参数指令(create) 98 | -x 解开一个压缩文件的参数指令(extract) 99 | -z 是否需要用 gzip 压缩 100 | -j 是否需要用 bzip2 压缩 101 | -v 压缩的过程中显示文件(verbose) 102 | -f 使用档名,在 f 之后要立即接档名(file) 103 | 104 | ``` 105 | 关机/重启命令 106 | ``` 107 | shutdown系统关机 108 | -r 关机后立即重启 109 | -h 关机后不重新启动 110 | halt 关机后关闭电源 shutdown -h 111 | reboot 重新启动 shutdown -r 112 | ``` 113 | ## 四、Linux文档 114 | 可以参考这篇文档 115 | https://blog.csdn.net/syt8945/article/details/50838679 116 | -------------------------------------------------------------------------------- /常用工具和环境/Linux/linux入门.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/freestylefly/CodeCanvas/bff2dea45228c0e247109c4b628ebadbc2024b3b/常用工具和环境/Linux/linux入门.pdf -------------------------------------------------------------------------------- /常用工具和环境/Linux/操作系统的作用.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/freestylefly/CodeCanvas/bff2dea45228c0e247109c4b628ebadbc2024b3b/常用工具和环境/Linux/操作系统的作用.png -------------------------------------------------------------------------------- /常用工具和环境/Maven/Maven依赖管理.md: -------------------------------------------------------------------------------- 1 | ## 一、什么是Maven 2 | maven是一个管理依赖的工具,我们项目中常用maven来管理jar包,并且可以管理jar包的依赖,有了maven,无论是引用别人的jar包还是自己项目需要打 包都变得极其简单。 3 | maven仓库就是存放jar包的仓库,分为本地库、远程库和私有库。 4 | 本地库是本地计算机存放jar包的地方,本地仓库需要到私有库去拉取jar包,私有库一般是公司自己存放jar的仓库,会有专门的人员进行维护,远程库就是公有库,里面涵盖了很多的jar包,可以直接下载,但是需要外网权限。 5 | ## 二、Maven安装 6 | 超级简单,直接百度,或者访问这个博客: 7 | https://blog.csdn.net/m1234ilu/article/details/84261888 8 | ## 三、坐标 9 | pom.xml里,使用下面三个向量,在仓库中唯一定位一个Maven工程,每一个坐标代表这个工程所在的位置。 10 | groupId 公司或者组织的域名倒序+项目名 com.dfr.TestMaven 11 | artifactId 模块名 Hello 12 | version 版本 0.0.1-SNAPSHOT 13 | ## 四、仓库管理 14 | 15 | 本地仓库:当前电脑上部署的 仓库目录 16 | 私服:架设在局域网环境中,为局域网范围内 的所有Maven工程服务 17 | 中央仓库:架设在Internet上,为全世界的Maven工程服务 18 | 中央仓库镜像:架设在各大洲,为了分担中央仓库的流量,更快响应用户 19 | ## 五、生命周期 20 | 生命周期定义:一套生命周期,就是把许多的构建过程,有序的排列。形成一套有序的构建过程集合。 21 | 生命周期特性:无论执行该生命周期的哪个阶段,它前面的所有阶段都会被按顺序执行。 22 | Maven有三套独立的生命周期: 23 | Clean LifeCycle 真正构建前,先清理 24 | Default LifeCycle 核心的构建部分:编译,测试,打包,安装,部署等 25 | Site LifeCycle 生成项目报告,站点,发布站点 26 | 以Default 生命周期为例,并列举部分常用的的阶段:compile -> test-compile -> test -> package -> install -> deploy 27 | 28 | 若执行 test-compile阶段,则真正被执行的有 compile -> test-compi 29 | ## 六、插件和目标 30 | Maven核心程序只是定义了生命周期的各个阶段,以及每个阶段需要去执行哪个插件的哪个模块。 31 | 32 | 所以真正去执行时,会依赖本地仓库中的插件。Maven核心程序中并没有这些插件。 33 | 34 | 生命周期阶段 调用插件 调用插件的目标(模块) 35 | compile maven-compiler-plugin compile 36 | test-compile maven-compiler-plugin testCompile 37 | ## 七、依赖的排除 38 | 定义:工程A依赖工程B,工程B依赖b.jar。若工程A中不想要b.jar,则需要配置依赖的排除信息。 39 | 配置信息 40 | ``` 41 | 42 | 43 | 44 | 45 | 46 | 47 | ``` 48 | 49 | -------------------------------------------------------------------------------- /常用工具和环境/eclipse/Eclipse调用方法放回值快捷键.md: -------------------------------------------------------------------------------- 1 | 有时候条用某个方法,知道返回值类型,需要用变量接收的时候,要手动去创建变量很麻烦,比如: 2 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20181221175401829.png) 3 | 当调用getServletContext方法我们鼠标放在方法上可以显示返回值是:ServletContext ,这个时候怎么样快速用一个饮用型变量接收呢? 4 | 方法很简单 5 | 6 | 在";"分号后面按住Ctrl+1,选择第一个即可有变量类型以及自动取好名字: 7 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20181221175637113.png) 8 | 9 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20181221175655916.png) 10 | 还可以对变量名选择,一般情况变量名和变量类型一致,只是首字母不要大写即可 11 | ,如果Ctrl+1后选择第二个,需要你自己手动输入变量名,一般Ctrl+1,然后选第一个就OK; 12 | ------ 13 | # 本文章已同步至GitHub仓库:Javastudy,期待您的加入:blush: 14 | 15 | 16 | # 本文章已同步至苍何的个人博客,可以直接在博客上留言哦:blush: 17 | 18 | 19 | # 来我的微信公众号玩耍呗:blush: 20 | 21 | 22 | # 扫码无套路关注我的CSDN博客:blush: 23 | 24 | -------------------------------------------------------------------------------- /常用工具和环境/eclipse/Eclipse配置Servlet模板.md: -------------------------------------------------------------------------------- 1 | 有时候新建servlet时候会生成很多我们不是想要的东西,每一次都去复制黏贴,手动删除我们不想要的东西,那么如何设置专属自己的模板呢?只需要输入短短几个字,然后ALT+/即可: 2 | 3 | 这里以Eclipse4.5.2版本为例: 4 | 5 | 1.打开Eclilpse,Window->Preferences 6 | 7 | 2.Java->Editor->Templates->New 8 | 9 | 配置如图: 10 | 11 | 12 | 13 | Pattern内容如下: 14 | ```java 15 | package ${enclosing_package}; 16 | import java.io.IOException; 17 | import javax.servlet.ServletException; 18 | import javax.servlet.http.HttpServlet; 19 | import javax.servlet.http.HttpServletRequest; 20 | import javax.servlet.http.HttpServletResponse; 21 | 22 | public class ${primary_type_name} extends HttpServlet { 23 | 24 | public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 25 | response.getWriter().write("hello haohao..."); 26 | } 27 | 28 | public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 29 | doGet(request, response); 30 | } 31 | } 32 | ``` 33 | 勾选上“Use code formatter”->Apply->OK 34 | 3.重启Eclipse 35 | 36 | 4.使用Alt+/来快速匹配出模板,创建出简单清晰的Servlet 37 | 38 | 原文:https://blog.csdn.net/czkct/article/details/78750478 39 | ------ 40 | # 本文章已同步至GitHub仓库:Javastudy,期待您的加入:blush: 41 | 42 | 43 | # 本文章已同步至苍何的个人博客,可以直接在博客上留言哦:blush: 44 | 45 | 46 | # 来我的微信公众号玩耍呗:blush: 47 | 48 | 49 | # 扫码无套路关注我的CSDN博客:blush: 50 | 51 | 52 | -------------------------------------------------------------------------------- /常用工具和环境/eclipse/eclipse中tomcat-advanced以及插件的使用.md: -------------------------------------------------------------------------------- 1 | # 一、问题背景 2 | 今天新需求,需要用到eclipse的tomcat插件,且项目的编译环境为JDK1.7及以下,而我电脑之前的JDK为1.8,tomcat为8,现在也就是要切换JDK版本为1.7且tomcat为7,搞来搞去,搞了一天,必须记录下 3 | # 二、同一电脑安装不同版本的JDK和tomcat 4 | ## 1、网上很多都很玄学 5 | 百度了下,很多说的很玄学,其实很简单。 6 | ## 2、不同版本JDK 7 | 同样的安装,只是环境变量配置的时候,修改JAVA_HOME为对应的JDK的安装目录即可,当然还有更简单的切换方法,比如配置AVA_HOME7和AVA_HOME8,然后用AVA_HOME=%AVA_HOME7%这样的方式,告诉你,亲测,没什么软用 8 | ## 3、不同版本tomcat 9 | 环境变量替换即可 10 | # 三、eclipse的tomcat插件配置 11 | 找到eclipse配置下的tomcat,然后选7x,选择tomcat的安装路径,然后下面的apache-tomcat-7.0.41\conf\Catalina\localhost将xml文件加进来,因为公司项目已经配好,具体怎么搞看自己 12 | 13 | 14 | 注意:当项目死活启动说缺少相应jar包,排除其他问题,那么可以考虑,是不是tomcat-advanced这里没有依赖给引进来。
15 | 我就是因为这个点,最后项目启动了半天,还是有经验的同事告诉我才解决这个问题。 16 | eclipse真是个神奇的东西,各种错误都某明奇妙,走IDEA了准备。 17 | ------ 18 | # 本文章已同步至GitHub仓库:Javastudy,期待您的加入:blush: 19 | 20 | 21 | # 本文章已同步至苍何的个人博客,可以直接在博客上留言哦:blush: 22 | 23 | 24 | # 来我的微信公众号玩耍呗:blush: 25 | 26 | 27 | # 扫码无套路关注我的CSDN博客:blush: 28 | -------------------------------------------------------------------------------- /常用工具和环境/eclipse/eclipse中配置XML提示.md: -------------------------------------------------------------------------------- 1 | ## 一、问题原油 2 | 当我们在eclipse中编写XML时,需要出来提示信息(前提是没有联网),那么就需要进行用户自定义配置相关信息、 3 | ## 二、步骤 4 | 这里我以配置Hibernate框架 中的XML为例子 5 | ### 1、将网络地址复制 6 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20190127142330842.png) 7 | ### 2、打开windows下的个性设置profenrencese 8 | 如图,依次找到用户自定义设置 9 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20190127142602526.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQzMjcwMDc0,size_16,color_FFFFFF,t_70) 10 | 点击add 11 | ### 3、add页面配置 12 | 将刚复制的网络URI地址放入keys中,type类型选择URI,location路径选择对应的路径,比如我这里对应的是hibernate-mapping-3.0的路径,需要在hibernate的jar包中找到该配置文件 13 | ### 4、完成配置 14 | ------ 15 | # 本文章已同步至GitHub仓库:Javastudy,期待您的加入:blush: 16 | 17 | 18 | # 本文章已同步至苍何的个人博客,可以直接在博客上留言哦:blush: 19 | 20 | 21 | # 来我的微信公众号玩耍呗:blush: 22 | 23 | 24 | # 扫码无套路关注我的CSDN博客:blush: 25 | 26 | 27 | -------------------------------------------------------------------------------- /常用工具和环境/eclipse/解决在Eclipse新建web项目没有自动生成web.xml和在新建servlet的时候自动生成web.xml配置.md: -------------------------------------------------------------------------------- 1 | ## 一、在Eclipse新建web项目没有自动生成web.xml解决办法 2 | ## 方法一:在Eclipse新建web项目的时候重要参数上打勾 3 | 1、file--new-Dynamic Web Project 4 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20181214160226360.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQzMjcwMDc0,size_16,color_FFFFFF,t_70) 5 | 2、next下一步 6 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20181214160315960.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQzMjcwMDc0,size_16,color_FFFFFF,t_70) 7 | 8 | 3、next下一步 9 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20181214160348211.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQzMjcwMDc0,size_16,color_FFFFFF,t_70) 10 | 11 | 4、关键:这里一定要打勾,默认是没有打勾的![在这里插入图片描述](https://img-blog.csdnimg.cn/20181214160416976.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQzMjcwMDc0,size_16,color_FFFFFF,t_70) 12 | 13 | 5、建好后可以点开就有web.xml了 14 | 15 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20181214160544786.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQzMjcwMDc0,size_16,color_FFFFFF,t_70) 16 | 17 | ## 方法二:在已经建好的项目上加上web.xml 18 | 1.项目名称右键-->Properties: 19 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20181214160700888.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQzMjcwMDc0,size_16,color_FFFFFF,t_70) 20 | 2.点击Project Facets,取消选中Dynamic Web Module,点击Apply 21 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20181214160730677.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQzMjcwMDc0,size_16,color_FFFFFF,t_70) 22 | 3.重新选中Dynamic Web Module后,会出现Further configuration available... 23 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20181214160754808.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQzMjcwMDc0,size_16,color_FFFFFF,t_70) 24 | 25 | 4.点击Further configuration available...,选中Generate web.xml deployment descriptor,点击ok,Apply后,在WEB-INF下生成了web.xml。 26 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20181214160812893.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQzMjcwMDc0,size_16,color_FFFFFF,t_70) 27 | 28 | ## Eclipse在新建servlet的时候自动生成web.xml配置 29 | 在新建web项目的时候: 30 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20181214161006245.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQzMjcwMDc0,size_16,color_FFFFFF,t_70) 31 | 我们新建默认用的是Tomact7.0,里面用的是servlet3.0版本默认的是使用注解配置,在新建dynamic web project 时,dynamic web module version选择2.5就ok了。 32 | 选择2.6即可 33 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20181214161120451.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQzMjcwMDc0,size_16,color_FFFFFF,t_70) 34 | 这样就自动生成了servlet的文本.xml的自动配置t 35 | ------ 36 | # 本文章已同步至GitHub仓库:Javastudy,期待您的加入:blush: 37 | 38 | 39 | # 本文章已同步至苍何的个人博客,可以直接在博客上留言哦:blush: 40 | 41 | 42 | # 来我的微信公众号玩耍呗:blush: 43 | 44 | 45 | # 扫码无套路关注我的CSDN博客:blush: 46 | -------------------------------------------------------------------------------- /微信读书/自动同步笔记/IP之道——30家国内一线创新公司的知识产权是如何运营的.md: -------------------------------------------------------------------------------- 1 | --- 2 | doc_type: weread-highlights-reviews 3 | bookId: "3300022120" 4 | author: 柯晓鹏 5 | cover: https://cdn.weread.qq.com/weread/cover/20/3300022120/t7_3300022120.jpg 6 | reviewCount: 1 7 | noteCount: 0 8 | readingStatus: 未标记 9 | progress: 25% 10 | totalReadDay: 1 11 | readingTime: 0小时1分钟 12 | readingDate: 2024-02-21 13 | isbn: 9787516415924 14 | lastReadDate: 2024-02-21 15 | 16 | --- 17 | # 元数据 18 | > [!abstract] IP之道——30家国内一线创新公司的知识产权是如何运营的 19 | > - ![ IP之道——30家国内一线创新公司的知识产权是如何运营的|200](https://cdn.weread.qq.com/weread/cover/20/3300022120/t7_3300022120.jpg) 20 | > - 书名: IP之道——30家国内一线创新公司的知识产权是如何运营的 21 | > - 作者: 柯晓鹏 22 | > - 简介: 由柯晓鹏、林炮勤主编并由三十多位资深知识产权经理人共同撰写的这本书共分成“从零开始做知识产权”“跨部门合作”“知识产权分析”“知识产权布局”“知识产权策略”“知识产权质量管控”“知识产权风险管控”“知识产权无效诉讼”“知识产权综合管理”九个部分。本书并不讲究体系化,也不追求系统性,这九个部分并不是严格设计的提纲挈领,只是从这九个方面随机展示了企业知识产权运营中的些许春风秋雨和几抹夏云冬雪。然而,顾名思义,望题生义,这些方面可以说涉及了企事业单位知识产权经营管理的“开门九件事”,这些方面也可以说都是企业实施知识产权战略、策略与韬略的落地举措和实践经验。企事业单位的知识产权运营实战经验,一般总是“纸上得来终觉浅,绝知此事要躬行”。难能可贵的是,本书中围绕着九个方面的那些故事多是作为资深知识产权经理人的作者们身体力行、亲力亲为的职业轨迹和历史脚印,记录着他们从事知识产权运营的“三十六计”和从事智慧财产管理的“十八般武艺”。也正因为如此,本书对企业的知识产权经营管理具有更现实的指导意义和参考价值。 23 | > - 出版时间 2017-01-01 00:00:00 24 | > - ISBN: 9787516415924 25 | > - 分类: 经济理财-管理 26 | > - 出版社: 企业管理出版社有限公司 27 | > - PC地址:https://weread.qq.com/web/reader/d4732680813ab6f24g010737 28 | 29 | # 高亮划线 30 | 31 | # 读书笔记 32 | 33 | # 本书评论 34 | 35 | ## 书评 No.1 36 | 适合初入行小白读 ^67716103-7P9uwt2zd 37 | ⏱ 2024-02-21 21:30:50 38 | -------------------------------------------------------------------------------- /微信读书/自动同步笔记/Spring Cloud微服务和分布式系统实践.md: -------------------------------------------------------------------------------- 1 | --- 2 | doc_type: weread-highlights-reviews 3 | bookId: "31473970" 4 | author: 杨开振 5 | cover: https://cdn.weread.qq.com/weread/cover/28/YueWen_31473970/t7_YueWen_31473970.jpg 6 | reviewCount: 1 7 | noteCount: 0 8 | readingStatus: 未标记 9 | progress: 1% 10 | totalReadDay: 1 11 | readingTime: 0小时4分钟 12 | readingDate: 2020-08-29 13 | isbn: 9787115532206 14 | lastReadDate: 2020-08-29 15 | 16 | --- 17 | # 元数据 18 | > [!abstract] Spring Cloud微服务和分布式系统实践 19 | > - ![ Spring Cloud微服务和分布式系统实践|200](https://cdn.weread.qq.com/weread/cover/28/YueWen_31473970/t7_YueWen_31473970.jpg) 20 | > - 书名: Spring Cloud微服务和分布式系统实践 21 | > - 作者: 杨开振 22 | > - 简介: 《Spring Cloud微服务和分布式系统实践》从企业的真实需求出发,理论结合实际,深入讲解Spring Cloud微服务和分布式系统的知识。书中既包括Spring Cloud微服务的各类常用组件的讲解,又包括分布式系统的常用知识的介绍。Spring Cloud组件方面主要讲解服务注册和服务发现(Eureka)、服务调用(Ribbon和OpenFeign)、断路器(Hystrix和Resilience4j)、网关(Zuul和Gateway)、配置(Config)、全链路追踪(Sleuth)、微服务的监控(Admin)等;分布式系统方面主要讲解分布式数据库、分布式缓存、会话和权限以及发号机制等。本书的实践部分通过Apache Thrift讲解了远程过程调用(RPC)在分布式系统中的应用,并且分析了处理高并发的一些常用方法,最后还通过一个简单的实例讲解了微服务系统的搭建。 本书适合想要学习Spring Cloud微服务、分布式系统开发的各类Java开发人员阅读,包括初学者和开发工程师。本书对架构师也有一定的帮助。 23 | > - 出版时间 2020-05-01 00:00:00 24 | > - ISBN: 9787115532206 25 | > - 分类: 计算机-计算机综合 26 | > - 出版社: 人民邮电出版社 27 | > - PC地址:https://weread.qq.com/web/reader/2fe329c071e041322feb53d 28 | 29 | # 高亮划线 30 | 31 | # 读书笔记 32 | 33 | # 本书评论 34 | 35 | ## 书评 No.1 36 | ^67716103-7jXACW5fJ 37 | ⏱ 2020-08-29 12:43:06 38 | -------------------------------------------------------------------------------- /微信读书/自动同步笔记/一人企业:一个人也能赚钱的商业新模式.md: -------------------------------------------------------------------------------- 1 | --- 2 | doc_type: weread-highlights-reviews 3 | bookId: "35276968" 4 | author: 保罗·贾维斯 5 | cover: https://cdn.weread.qq.com/weread/cover/4/YueWen_35276968/t7_YueWen_35276968.jpg 6 | reviewCount: 5 7 | noteCount: 1 8 | readingStatus: 读完 9 | progress: 99% 10 | totalReadDay: 16 11 | readingTime: 4小时42分钟 12 | readingDate: 2023-08-18 13 | finishedDate: 2024-02-25 14 | isbn: 9787121398377 15 | lastReadDate: 2024-02-28 16 | 17 | --- 18 | # 元数据 19 | > [!abstract] 一人企业:一个人也能赚钱的商业新模式 20 | > - ![ 一人企业:一个人也能赚钱的商业新模式|200](https://cdn.weread.qq.com/weread/cover/4/YueWen_35276968/t7_YueWen_35276968.jpg) 21 | > - 书名: 一人企业:一个人也能赚钱的商业新模式 22 | > - 作者: 保罗·贾维斯 23 | > - 简介: 一人企业是一种新颖的经营方法,专注于变得更好而不是更大,维持小规模进而带来自由。每个人都应该成为自己的CEO,一人企业是每个人在新的科技条件下的商业新模式。选好自己的商业模式,一个人负责。保持小规模,保持变好,而非盲目扩张变大。"一人企业”是数字经济下,个体创业新模式。一人企业认为个体可以以小而美的方式实现个人商业增长。并对一人企业,如何发展,如何吸引客户,如何发挥个体优势,同大企业竞争,获得稳定的回头客,持续的经济利润增长,而非盲目扩大规模。实现变好才是真的增长。一、小是新的大,并非所有增长都是真增长;二、定义增长:新的增长是一种高效的纯利增长;三、一人公司是一种生活方式。三句话概括本书所传递的保持小体格模型:始于垒土,定义增长,学无止境。 24 | > - 出版时间 2020-11-01 00:00:00 25 | > - ISBN: 9787121398377 26 | > - 分类: 经济理财-管理 27 | > - 出版社: 电子工业出版社 28 | > - PC地址:https://weread.qq.com/web/reader/af832260721a48a8af8d064 29 | 30 | # 高亮划线 31 | 32 | ### 第九章 教授别人你所知道的一切 33 | 34 | > 📌 脱 35 | > ⏱ 2024-02-10 13:23:18 ^35276968-14-6679-6680 36 | 37 | # 读书笔记 38 | 39 | ## 第一部分 开创一人企业 40 | 41 | ### 划线评论 42 | > 📌 一开始要尽量轻装上阵,在增加新的内容、让企业变得更复杂时要保持警觉。将自己打造成“一人企业”,最大限度发挥自己的能力去解决现有问题,适应不断出现的新问题。这样做的话,结果可能是你最终收购了被你的精简远远甩在身后的一个大规模经营的竞争对手。 ^67716103-7OI6p6ybe 43 | - 💭 创业公司最怕一开始就所谓的宏伟目标,这也做那也做,最后发现什么也做不好 44 | - ⏱ 2024-02-03 21:22:27 45 | 46 | ## 第二章 将保持小规模作为终极目标 47 | 48 | ### 划线评论 49 | > 📌 的想法不一定有利于一个企业的终端客户。资金注入会让一个企业失去控制力、适应力、速度和维持简单经营的能力,而这些也正是“一人企业”所必需的特征。 ^67716103-7OQAxN5aw 50 | - 💭 投资人有时候会带偏企业,因为其关注的永远是资本而不是真正从公司角度思考问题 51 | - ⏱ 2024-02-09 11:16:02 52 | 53 | ## 第十二章 关系的潜在价值 54 | 55 | ### 划线评论 56 | > 📌 为人类最基本的需求是大错特错的。相反,理伯曼认为,被马斯洛定义为心理需求的归属感和联系是我们最基本的需求,应该放在金字塔最底端,因为人类是需要相互联系的 ^67716103-7P4znOUn3 57 | - 💭 相互联系才能产生更大的价值,比如微信的地位一直无法撼动,因为他是一个联系生态 58 | - ⏱ 2024-02-18 15:51:41 59 | 60 | ### 划线评论 61 | > 📌 不做孤狼 62 | 请记住,为自己打工并不意味着事必躬亲。就像与受众或客户建立联系很重要一样,与同行建立联系也很重要。 ^67716103-7PbYZi3NG 63 | - 💭 不做孤狼 64 | 请记住,为自己打工并不意味着事必躬亲。就像与受众或客户建立联系很重要一样,与同行建立联系也很重要。 65 | - ⏱ 2024-02-23 12:49:20 66 | 67 | # 本书评论 68 | 69 | ## 书评 No.1 70 | 机缘巧合下读的这本书,被其中的「一人企业」所吸引,去年开始大火的 AI,和今年文生视频大模型的出现,越来越觉得,传统企业的范式将被颠覆。新的时代,将会是「超级个体」的时代。你很难想象,强如 openai 的员工数目也才几百号人,去年 AI 视频大火并融资数千万美元的 Pika 公司,员工数目也才只有 4 人,其中还包括两位华裔女老板,一人企业会越来越盛行。 71 | 以前人们或许会觉得,企业越大越好,但本书作者的观点认为,企业不是越大越好,对“一人企业”来说,要回答的问题永远是“我要怎样做才能让我的企业变得更好”,而不是“我要怎样做才能让我的企业变大”。变大后不受控制的事情会变更多,比如来自投资人的压力往往会让你的公司失去最开始的方向。 72 | 传统的工作方式(有着严格规定和等级制度的企业)正向自由灵活、自主度更高的工作模式转变,商业世界正不断被新的工作模式和技术所颠覆。这是一件好事,改变工作方式让我们有机会用最小的投资、人力和时间成本来发展。 73 | 对于我们每一个普通人来说,现在正是最好的时候,我们需要充分放大我们的优势,要知道,在如今的世界,不是只有按部就班地上学、拿学位、找到一份稳定的工作做到退休这一条路,没有什么工作或者职业像几十年前那样稳定了。很明显,让 60 岁的人退休,给他们发放体面的养老金的年代已经一去不复返了。 74 | 一人企业追求的是极致的自由,想象一下,你可以选择你不喜欢的项目,可以对不喜欢的客户说「不」,你可以连续休息 3 个月,和妻子一起穿越美国的沙漠进行露营旅行,一起去哈尔滨看雪滑冰,你可以选择下一步的工作,而不是不得不做别人给你的工作。甚至如果你喜欢你可以在周六工作,在周三徒步,你是为自己工作,也为自己而活。 75 | 无论你现在是学生,还是打工族,亦或是创业者,我觉得先要找到自己的热情所在,如果你努力工作,那么热情可能会随之而来。热情不是创造成功的催化剂,而常常是成功所带来的结果。从现在起,扩大自己的影响力,多去输出,表达,为别人提供专业的能力,相信,时机成熟的那天,你的一人企业也就成熟了。我也是,同样在努力工作的同时在扩大自己的影响力,用更多专业的知识去帮助别人。 76 | 此为一点读书感悟,与诸君共勉! ^67716103-7PjInydXc 77 | ⏱ 2024-02-28 14:49:07 78 | -------------------------------------------------------------------------------- /微信读书/自动同步笔记/半小时漫画中国哲学史2.md: -------------------------------------------------------------------------------- 1 | --- 2 | doc_type: weread-highlights-reviews 3 | bookId: "37209430" 4 | author: 陈磊·半小时漫画团队 5 | cover: https://cdn.weread.qq.com/weread/cover/98/YueWen_37209430/t7_YueWen_37209430.jpg 6 | reviewCount: 3 7 | noteCount: 0 8 | readingStatus: 读完 9 | progress: 99% 10 | totalReadDay: 5 11 | readingTime: 2小时10分钟 12 | readingDate: 2023-06-10 13 | finishedDate: 2024-01-05 14 | isbn: 9787559452467 15 | lastReadDate: 2024-01-05 16 | 17 | --- 18 | # 元数据 19 | > [!abstract] 半小时漫画中国哲学史2 20 | > - ![ 半小时漫画中国哲学史2|200](https://cdn.weread.qq.com/weread/cover/98/YueWen_37209430/t7_YueWen_37209430.jpg) 21 | > - 书名: 半小时漫画中国哲学史2 22 | > - 作者: 陈磊·半小时漫画团队 23 | > - 简介: 《半小时漫画中国哲学史2》是全网1500万粉丝的知识类公众号群创始人陈磊(笔名:混子哥)及其团队的全新作品,继《半小时漫画中国哲学史》后推出的又一科普大作!其实是一本严谨的国学入门书!孔孟老庄、程朱陆王,国学各大门派爆笑登场!儒家就像HR,最会处理人际关系,把国家秩序安排得明明白白!道家向往自由,推崇无为而治,offer送到手里都不接!法家都是职业经理人,他们用开公司的套路,把国家一步步做大做强!玄学就是摸鱼哲学,清谈就像在公司例会上扯淡!理学是儒学的全新款式,说社会秩序也是自然规律,要追求“天理”!心学专门跟理学抬杠,说人心就是“天理”,要知行合一,追求“良知”! 24 | > - 出版时间 2020-12-01 00:00:00 25 | > - ISBN: 9787559452467 26 | > - 分类: 哲学宗教-东方哲学 27 | > - 出版社: 江苏凤凰文艺出版社 28 | > - PC地址:https://weread.qq.com/web/reader/39f32a507237c55639f1690 29 | 30 | # 高亮划线 31 | 32 | # 读书笔记 33 | 34 | ## 五、北宋五子的理学:新款儒学上市 35 | 36 | ### 划线评论 37 | > 📌 所以说你觉得它苦,那是你的主观视角,咱们看世界要客观,站在别人的角度看, ^67716103-7NZkCuuTu 38 | - 💭 所以说你觉得它苦,那是你的主观视角,咱们看世界要客观,站在别人的角度看, 39 | - ⏱ 2024-01-05 10:59:20 40 | 41 | ### 划线评论 42 | > 📌 了 ^67716103-7O00XpR1o 43 | - 💭 把一个东西往死里研究,让它露出最本质的原理,就获得知识了。 44 | - ⏱ 2024-01-05 21:45:47 45 | 46 | # 本书评论 47 | 48 | ## 书评 No.1 49 | 混子哥用图解漫画的形式讲述了中国哲学史,从天命到诸子百家,到程朱理学,再到王阳明的心学,知行合一,书很有趣,把一些晦涩的历史讲的很有趣,配合上一些漫画表达,我也想学习这种风格! ^67716103-7O07eongE 50 | ⏱ 2024-01-05 23:21:35 51 | -------------------------------------------------------------------------------- /微信读书/自动同步笔记/史蒂夫·乔布斯传.md: -------------------------------------------------------------------------------- 1 | --- 2 | doc_type: weread-highlights-reviews 3 | bookId: "217327" 4 | author: 沃尔特·艾萨克森 5 | cover: https://wfqqreader-1252317822.image.myqcloud.com/cover/327/217327/t7_217327.jpg 6 | reviewCount: 4 7 | noteCount: 0 8 | readingStatus: 读完 9 | progress: 66% 10 | totalReadDay: 28 11 | readingTime: 10小时46分钟 12 | readingDate: 2020-06-30 13 | finishedDate: 2024-01-03 14 | isbn: 9787508630069 15 | lastReadDate: 2020-08-29 16 | 17 | --- 18 | # 元数据 19 | > [!abstract] 史蒂夫·乔布斯传 20 | > - ![ 史蒂夫·乔布斯传|200](https://wfqqreader-1252317822.image.myqcloud.com/cover/327/217327/t7_217327.jpg) 21 | > - 书名: 史蒂夫·乔布斯传 22 | > - 作者: 沃尔特·艾萨克森 23 | > - 简介: 史蒂夫·乔布斯是一位极具创造力的企业家,史蒂夫·乔布斯有如过山车般精彩的人生和犀利激越的性格,充满追求完美和誓不罢休的激情,史蒂夫·乔布斯创造出个人电脑、动画电影、音乐、手机、平板电脑以及数字出版等6大产业的颠覆性变革。史蒂夫·乔布斯的个性经常让周围的人愤怒和绝望,但其所创造出的产品也与这种个性息息相关,全然不可分割的,正如苹果的硬件和软件一样。两年多的时间,与史蒂夫·乔布斯40多次的面对面倾谈…… 24 | > - 出版时间 2011-10-01 00:00:00 25 | > - ISBN: 9787508630069 26 | > - 分类: 经济理财-商业 27 | > - 出版社: 中信出版集团 28 | > - PC地址:https://weread.qq.com/web/reader/3b4321905350ef3b4f14672 29 | 30 | # 高亮划线 31 | 32 | # 读书笔记 33 | 34 | ## 第八章 施乐和丽萨 35 | 36 | ### 划线评论 37 | > 📌 预见未来最好的方式就是亲手创造未来” ^67716103-7iNcermnl 38 | - 💭 创造未来 39 | - ⏱ 2020-07-12 22:30:20 40 | 41 | ## 第十四章 斯卡利来了 42 | 43 | ### 划线评论 44 | > 📌 乔布斯向斯卡利坦言,他觉得自己年轻的时候就会死去,因此他需要尽快取得成就,在硅谷的历史中留下自己的名字。“我们在地球的时间都很短,”那天早上围坐在桌旁的时候,乔布斯告诉斯卡利,“我们或许只有机会做几件真正伟大的事情,并把它们做好。我们谁也不知道自己能活多长时间,我也不知道,但是我感觉必须趁着自己年轻,多取得一些成就。” ^67716103-7iPyr5DKq 45 | - 💭 在有限的生命里能做哪怕一件伟大的事 46 | - ⏱ 2020-07-14 11:42:43 47 | 48 | # 本书评论 49 | 50 | ## 书评 No.1 51 | 人这一生至少有一次为了梦想而活 ^67716103-7jXzSQHlo 52 | ⏱ 2020-08-29 12:31:46 53 | 54 | ## 书评 No.2 55 | ^67716103-7j00VKYEb 56 | ⏱ 2020-07-21 08:44:30 57 | -------------------------------------------------------------------------------- /微信读书/自动同步笔记/天堂旅行团.md: -------------------------------------------------------------------------------- 1 | --- 2 | doc_type: weread-highlights-reviews 3 | bookId: "40726893" 4 | author: 张嘉佳 5 | cover: https://wfqqreader-1252317822.image.myqcloud.com/cover/893/40726893/t7_40726893.jpg 6 | reviewCount: 1 7 | noteCount: 0 8 | readingStatus: 读完 9 | progress: 100% 10 | totalReadDay: 4 11 | readingTime: 3小时50分钟 12 | readingDate: 2021-12-05 13 | finishedDate: 2021-12-07 14 | isbn: 9787572602825 15 | lastReadDate: 2021-12-07 16 | 17 | --- 18 | # 元数据 19 | > [!abstract] 天堂旅行团 20 | > - ![ 天堂旅行团|200](https://wfqqreader-1252317822.image.myqcloud.com/cover/893/40726893/t7_40726893.jpg) 21 | > - 书名: 天堂旅行团 22 | > - 作者: 张嘉佳 23 | > - 简介: 生命的终章,我踏上了一段旅途。开着破烂的面包车,穿越几十座城市,撕开雨天,潜入他乡,尽头是天堂。浅蓝的天光,泛紫的云层,路灯嵌进夕阳。山间道路弥漫着一万吨水汽,密林卷来风声,我闯进无止境的夜里。她说,天总会亮的。那么,我们一起记录下,凌晨前的人生。 24 | > - 出版时间 2021-08-01 00:00:00 25 | > - ISBN: 9787572602825 26 | > - 分类: 精品小说-情感小说 27 | > - 出版社: 湖南文艺出版社 28 | > - PC地址:https://weread.qq.com/web/reader/1cc32510726d716d1cc2484 29 | 30 | # 高亮划线 31 | 32 | # 读书笔记 33 | 34 | # 本书评论 35 | 36 | ## 书评 No.1 37 | 眼泪止不住的流,人活着有时候不是为自己活的,珍惜当下,莫问前程。 ^67716103-7vmX3sC1L 38 | ⏱ 2021-12-07 13:21:40 39 | -------------------------------------------------------------------------------- /微信读书/自动同步笔记/我曾走在崩溃的边缘:俞敏洪亲述新东方创业发展之路.md: -------------------------------------------------------------------------------- 1 | --- 2 | doc_type: weread-highlights-reviews 3 | bookId: "25242026" 4 | author: 俞敏洪 5 | cover: https://cdn.weread.qq.com/weread/cover/47/YueWen_25242026/t7_YueWen_25242026.jpg 6 | reviewCount: 5 7 | noteCount: 0 8 | readingStatus: 读完 9 | progress: 100% 10 | totalReadDay: 8 11 | readingTime: 6小时49分钟 12 | readingDate: 2023-09-26 13 | finishedDate: 2024-01-02 14 | isbn: 9787521703078 15 | lastReadDate: 2024-01-02 16 | 17 | --- 18 | # 元数据 19 | > [!abstract] 我曾走在崩溃的边缘:俞敏洪亲述新东方创业发展之路 20 | > - ![ 我曾走在崩溃的边缘:俞敏洪亲述新东方创业发展之路|200](https://cdn.weread.qq.com/weread/cover/47/YueWen_25242026/t7_YueWen_25242026.jpg) 21 | > - 书名: 我曾走在崩溃的边缘:俞敏洪亲述新东方创业发展之路 22 | > - 作者: 俞敏洪 23 | > - 简介: 这本书是作者俞敏洪第一次完整、深度地讲述新东方从0到1、从1到N的创业历程,披露了诸多不为人知的细节,让人看到带领着新东方从一个培训班发展成为上市集团的创业者,以及他的团队曾经经过的至暗时刻,甚至曾走到崩溃的边缘。创业维艰,1/4个世纪的风雨征程,完整地被记录,激荡地再现了新东方创始团队及新东方人,在时代的光辉中砥砺前行的身影。延着内容主线,“三驾马车”的光阴故事已经留存,新生代的管理团队已在快速发展的互联网时代中开拓进取,搏出广阔天地,而今,人工智能浪潮下,新东方又将向何处进发,仍是新东方故事的待续篇章。相信这本书,定能让读者在作者个人一贯的幽默叙事方式中,在个人发展、组织建设、企业管理等多个方面受到启发和激励。 24 | > - 出版时间 2019-04-01 00:00:00 25 | > - ISBN: 9787521703078 26 | > - 分类: 经济理财-管理 27 | > - 出版社: 中信出版集团 28 | > - PC地址:https://weread.qq.com/web/reader/48632fa0718129aa4868f11 29 | 30 | # 高亮划线 31 | 32 | # 读书笔记 33 | 34 | ## 新东方在线,发展过程中的是是非非 35 | 36 | ### 划线评论 37 | > 📌 做事情必须要正,必须做好的,违法乱纪的事情绝对不做 ^67716103-7NTVtgZNP 38 | - 💭 贪图一时的利益是走不长远的,必须正! 39 | - ⏱ 2024-01-01 21:42:00 40 | 41 | ## 大愚出版,为新东方品牌助力 42 | 43 | ### 划线评论 44 | > 📌 如果纯粹搞运营、背后没有内容的话,那么无疑是留不住用户的 ^67716103-7NTXSakW6 45 | - 💭 放眼如今多数的产品和服务依旧是内容为王,纯粹的运营是留不住用户的,对个人ip同样如此,只是靠运营而不注重生产优质的内容是和粉丝之间产生不了信任的 46 | - ⏱ 2024-01-01 22:18:40 47 | 48 | ## 如何看待人才的流动和发展 49 | 50 | ### 划线评论 51 | > 📌 且要让后起之秀不断地赢得三个“台”:工作的舞台、发展的平台、可靠的后台 ^67716103-7NVs3NH2u 52 | - 💭 员工为什么走?一个是钱没给到位,一个是心里憋屈了,这和俞老师的三个台如出一辙,钱没给到位就是没有好的工作的舞台和可靠的后台,心里憋屈了是发展的平台没做好 53 | - ⏱ 2024-01-02 21:46:16 54 | 55 | ### 划线评论 56 | > 📌 须要有更大的潜力。也就是说,不能说出去的人出去了,而进来的人还不如出去的人,比出去的人还要没有想法,这样就变成了矮子和矬子在一起的状态。所以,必须要选拔越来越能干的人加入公司的组织结构,这样才能使组织结构永远保持年轻和活力,永远保持有新鲜血液在流动。 57 | 这里面就有 ^67716103-7NVsfdFq8 58 | - 💭 对于一个开放的企业来说,人是可以出去的,但这些人出去以后,招进来的人必须要有更大的潜力。也就是说,不能说出去的人出去了,而进来的人还不如出去的人,比出去的人还要没有想法,这样就变成了矮子和矬子在一起的状态。所以,必须要选拔越来越能干的人加入公司的组织结构,这样才能使组织结构永远保持年轻和活力,永远保持有新鲜血液在流动。 59 | - ⏱ 2024-01-02 21:49:05 60 | 61 | # 本书评论 62 | 63 | ## 书评 No.1 64 | ^67716103-7NVtPbL4G 65 | ⏱ 2024-01-02 22:13:12 66 | -------------------------------------------------------------------------------- /微信读书/自动同步笔记/明朝那些事儿(全集).md: -------------------------------------------------------------------------------- 1 | --- 2 | doc_type: weread-highlights-reviews 3 | bookId: "822995" 4 | author: 当年明月 5 | cover: https://cdn.weread.qq.com/weread/cover/97/yuewen_822995/t7_yuewen_8229951695023669.jpg 6 | reviewCount: 0 7 | noteCount: 0 8 | readingStatus: 未标记 9 | progress: 5% 10 | totalReadDay: 5 11 | readingTime: 3小时23分钟 12 | readingDate: 2021-12-12 13 | isbn: 9787213046339 14 | lastReadDate: 2024-01-28 15 | 16 | --- 17 | # 元数据 18 | > [!abstract] 明朝那些事儿(全集) 19 | > - ![ 明朝那些事儿(全集)|200](https://cdn.weread.qq.com/weread/cover/97/yuewen_822995/t7_yuewen_8229951695023669.jpg) 20 | > - 书名: 明朝那些事儿(全集) 21 | > - 作者: 当年明月 22 | > - 简介: 《明朝那些事儿》主要讲述的是从1344年到1644年这三百年间关于明朝的一些故事。以史料为基础,以年代和具体人物为主线,并加入了小说的笔法,语言幽默风趣。对明朝十七帝和其他王公权贵和小人物的命运进行全景展示,尤其对官场政治、战争、帝王心术着墨最多,并加入对当时政治经济制度、人伦道德的演义。它以一种网络语言向读者娓娓道出明朝三百多年的历史故事、人物。其中原本在历史中陌生、模糊的历史人物在书中一个个变得鲜活起来。《明朝那些事儿》为我们解读历史中的另一面,让历史变成一部活生生的生活故事。 23 | > - 出版时间 2011-12-01 00:00:00 24 | > - ISBN: 9787213046339 25 | > - 分类: 历史-中国古代 26 | > - 出版社: 浙江人民出版社 27 | > - PC地址:https://weread.qq.com/web/reader/a57325c05c8ed3a57224187 28 | 29 | # 高亮划线 30 | 31 | ## 第21章 复仇(4) 32 | 33 | > 📌 这真是个多才多艺的人啊。 34 | 35 | 王保保上岸后,望着对岸的景色,悲痛欲绝。在不久之前,他还有一支庞大的军队,现在却只剩下了自己和老婆孩子。 36 | 37 | 十万大军,毁于一旦! 38 | 39 | 向对岸遥拜后,他骑上马向和林(今蒙古乌兰巴托西南)奔去,在那里他还能够东山再起。 40 | 41 | 事情还没有完,我还有机会的。 42 | 43 | 在王保保溃败的同时,李文忠部正在帮元顺帝搬家。他自出居庸关以后,五月初,连续击败阻挡他的元太尉蛮子(不是外号)、平章沙不丁朵耳只八剌(名字比较长),并再次攻克开平。 44 | > ⏱ 2024-01-28 19:59:36 ^822995-23-1336 45 | 46 | # 读书笔记 47 | 48 | # 本书评论 49 | -------------------------------------------------------------------------------- /微信读书/自动同步笔记/沉默的大多数.md: -------------------------------------------------------------------------------- 1 | --- 2 | doc_type: weread-highlights-reviews 3 | bookId: "30766471" 4 | author: 王小波 5 | cover: https://cdn.weread.qq.com/weread/cover/48/YueWen_30766471/t7_YueWen_30766471.jpg 6 | reviewCount: 0 7 | noteCount: 7 8 | readingStatus: 在读 9 | progress: 12% 10 | totalReadDay: 4 11 | readingTime: 1小时19分钟 12 | readingDate: 2024-07-19 13 | isbn: 9787506384131 14 | lastReadDate: 2024-07-22 15 | 16 | --- 17 | # 元数据 18 | > [!abstract] 沉默的大多数 19 | > - ![ 沉默的大多数|200](https://cdn.weread.qq.com/weread/cover/48/YueWen_30766471/t7_YueWen_30766471.jpg) 20 | > - 书名: 沉默的大多数 21 | > - 作者: 王小波 22 | > - 简介: 自从我辈成人以来,所见到的一切全是颠倒着的。在一个喧嚣的话语圈下面,始终有个沉默的大多数。——王小波。王小波以卓越的文采,众醉独醒的姿态对社会道德伦理、国学与新儒家、个体尊严以及小说、艺术等方面进行了酣畅淋漓的剖析,表达了有理有趣的观点。时隔二十年,依然如同清流一般,读来让人沉思,让人捧腹,让人拍案叫绝。王小波说:我活在世上,无非想要明白些道理,遇见些有趣的事。倘能如我所愿,我的一生就算成功。我开始得太晚了,很可能做不成什么,但我总得申明我的态度,所以就有了这本书——为我自己,也代表沉默的大多数。 23 | > - 出版时间 2016-11-01 00:00:00 24 | > - ISBN: 9787506384131 25 | > - 分类: 文学-散文杂著 26 | > - 出版社: 作家出版社 27 | > - PC地址:https://weread.qq.com/web/reader/84632ce071d57587846de1c 28 | 29 | # 高亮划线 30 | 31 | ## 序言 32 | 33 | > 📌 我活在世上,无非想要明白些道理,遇见些有趣的事。倘能如我所愿,我的一生就算成功 34 | > ⏱ 2024-07-19 21:08:48 ^30766471-96-2683-2722 35 | 36 | ## 沉默的大多数 37 | 38 | > 📌 从我懂事的年龄起,就常听人们说:我们这一代,生于一个神圣的时代,多么幸福;而且肩负着解放天下三分之二受苦人的神圣使命,等等 39 | > ⏱ 2024-07-20 21:00:58 ^30766471-97-2661-2722 40 | 41 | > 📌 。但不管怎么说吧,人来到世间,仿佛是来游泳的,迟早要跳进去。 42 | > ⏱ 2024-07-20 21:10:46 ^30766471-97-3210-3240 43 | 44 | > 📌 但是在这世界上的一切人之中,我最希望予以提升的一个,就是我自己。这话很卑鄙,很自私,也很诚实。 45 | > ⏱ 2024-07-20 21:44:02 ^30766471-97-10415-10462 46 | 47 | ## 思维的乐趣 48 | 49 | > 📌 一个人倘若需要从思想中得到快乐,那么他的第一个欲望就是学习。 50 | > ⏱ 2024-07-20 21:47:07 ^30766471-98-1261-1291 51 | 52 | > 📌 知识虽然可以带来幸福,但假如把它压缩成药丸子灌下去,就丧失了乐趣。 53 | > ⏱ 2024-07-22 20:25:34 ^30766471-98-3370-3403 54 | 55 | > 📌 更何况那些高尚和低下完全是以他们自己的立场来度量的,假如我全盘接受,无异于请那些善良的思想母鸡到我脑子里下蛋,而我总不肯相信,自己的脖子上方,原来是长了一座鸡窝。 56 | > ⏱ 2024-07-22 20:27:55 ^30766471-98-3953-4034 57 | 58 | # 读书笔记 59 | 60 | # 本书评论 61 | -------------------------------------------------------------------------------- /微信读书/自动同步笔记/海边的卡夫卡.md: -------------------------------------------------------------------------------- 1 | --- 2 | doc_type: weread-highlights-reviews 3 | bookId: "24918942" 4 | author: 【日】村上春树 5 | cover: https://wfqqreader-1252317822.image.myqcloud.com/cover/942/24918942/t7_24918942.jpg 6 | reviewCount: 1 7 | noteCount: 9 8 | readingStatus: 在读 9 | progress: 44% 10 | totalReadDay: 19 11 | readingTime: 5小时44分钟 12 | readingDate: 2024-05-31 13 | isbn: 9787532777617 14 | lastReadDate: 2024-06-23 15 | 16 | --- 17 | # 元数据 18 | > [!abstract] 海边的卡夫卡 19 | > - ![ 海边的卡夫卡|200](https://wfqqreader-1252317822.image.myqcloud.com/cover/942/24918942/t7_24918942.jpg) 20 | > - 书名: 海边的卡夫卡 21 | > - 作者: 【日】村上春树 22 | > - 简介: 《海边的卡夫卡》是村上春树重要的长篇小说,比肩《挪威的森林》的成熟之作,迄今已译成逾五十种语言,销量超百万。书中特别收录村上春树首次为中国读者所作序言。本书以村上独特风格的两条平行线展开,一条描写少年“田村卡夫卡”立志成为世界上最坚韧的人,离开家乡踏上旅途,在一座旧图书馆遭遇一系列奇异事件,一条描写一名失忆老人在一桩离奇杀人事件以后走上逃亡之路,在汽车司机星野的帮助下恢复遥远的战争记忆。书中在构建魔幻现实世界、编织精巧复杂情节的同时,也对日本军国主义的复活表达了忧虑,对日本的文化传统作出了反思。译者林少华教授对译文作了修订,纠正了部分误译、漏译。并新写了译序,对作品的含义进行了深入的解析。 23 | > - 出版时间 2018-06-01 00:00:00 24 | > - ISBN: 9787532777617 25 | > - 分类: 文学-外国文学 26 | > - 出版社: 上海译文出版社 27 | > - PC地址:https://weread.qq.com/web/reader/6eb32020717c3b9e6ebcaf6 28 | 29 | # 高亮划线 30 | 31 | ## 另一种精神救赎之旅(译序) 32 | 33 | > 📌 只有文学和宗教才能使人的灵魂获得安顿和救赎,进而得到升华和超度。 34 | > ⏱ 2024-05-31 07:29:27 ^24918942-60-900-932 35 | 36 | > 📌 我是认为人生基本是孤独的。人们总是进入自己一个人的世界,进得很深很深。而在进得最深的地方就会产生‘连带感’。就是说,在人人都是孤独的这一层面产生人人相连的‘连带感’。只要明确认识到自己是孤独的,那么就能与别人分享这一认识。也就是说,只要我把它作为故事完整地写出来,就能在自己和读者之间产生‘连带感’。其实这也就是所谓创作欲。不错,人人都是孤独的。但不能因为孤独而切断同众人的联系,彻底把自己孤立起来。而应该深深挖洞。只要一个劲儿地往下深挖,就会在某处同别人连在一起。一味沉浸于孤独之中用墙把自己围起来是不行的。这是我的基本想法 37 | > ⏱ 2024-05-31 07:42:16 ^24918942-60-13907-14170 38 | 39 | ## 叫乌鸦的少年 40 | 41 | > 📌 某种情况下,命运这东西类似不断改变前进方向的局部沙尘暴 42 | > ⏱ 2024-05-31 07:49:24 ^24918942-61-3424-3451 43 | 44 | ## 第7章 45 | 46 | > 📌 百年之后,置身此处的人们(也包括我)应该从地上荡然无存,化为尘埃化为灰烬。如此一想,我产生了一种不可思议的心情。这里所有的人或物都显得虚无缥缈,仿佛即将被风吹散消失。我伸开自己双手定定地细看。我到底为了什么如此东奔西窜呢?何苦这么苦苦挣扎求生呢? 47 | > ⏱ 2024-06-12 08:36:56 ^24918942-68-3414-3537 48 | 49 | ## 第12章 50 | 51 | > 📌 日常生活支配了我们的心,诸多大事如冰冷古老的星球退往意识外围。我们有太多必须日常思考的琐事,有太多必须从头学习的东西:新的样式、新的知识、新的技术、新的话语……可是与此同时,也有的东西无论经历多长时间无论其间发生什么也是绝对忘却不了的。有磨损不掉的记忆,有要石一般存留心中的场景。 52 | > ⏱ 2024-06-20 08:51:47 ^24918942-73-2690-2934 53 | 54 | > 📌 有能力的孩子有时因其有能力而一个又一个冲击本应由身边大人达成的目标,这样一来,就会由于过多处理眼前的现实性课题而渐渐失去其中作为孩子应有的新鲜的激动和成就感。处于如此环境的孩子,不久就将牢牢关闭心扉,将心情的自然流露封在里面,而重新开启这种关闭的心扉则需要漫长的岁月和努力。孩子们的心很柔弱,可以被扭曲成任何样子,而一旦扭曲变硬,就很难复原,很多时候都无可奈何 55 | > ⏱ 2024-06-20 12:02:21 ^24918942-73-6613-6793 56 | 57 | ## 第13章 58 | 59 | > 📌 可是人这东西是要把自己附在什么上面才能生存的 60 | > ⏱ 2024-06-20 12:36:14 ^24918942-74-3117-3139 61 | 62 | > 📌 在这个世界上,不单调的东西让人很快厌倦,不让人厌倦的大多是单调的东西。向来如此 63 | > ⏱ 2024-06-20 17:50:27 ^24918942-74-9344-9383 64 | 65 | ## 第17章 66 | 67 | > 📌 我们的人生有个至此再后退不得的临界点,另外虽然情况十分少见,但至此再前进不得的点也是有的。那个点到来的时候,好也罢坏也罢,我们都只能默默接受。我们便是这样活着。 68 | > ⏱ 2024-06-23 09:02:29 ^24918942-78-11895-11975 69 | 70 | # 读书笔记 71 | 72 | ## 第10章 73 | 74 | ### 划线评论 75 | > 📌 “哪里,一点儿小事。我平时也总是跟附近非傻即呆的猫们说话,说不到一块儿去,弄得心焦意躁。所以偶尔若能跟通情达理的人慢慢聊上一会儿,深感茅塞顿开。” ^67716103-7S0LZNMeg 76 | - 💭 一只特立独行的猫 77 | - ⏱ 2024-06-17 10:38:19 78 | 79 | # 本书评论 80 | -------------------------------------------------------------------------------- /微信读书/自动同步笔记/程序员的底层思维.md: -------------------------------------------------------------------------------- 1 | --- 2 | doc_type: weread-highlights-reviews 3 | bookId: "3300053062" 4 | author: 张建飞 5 | cover: https://cdn.weread.qq.com/weread/cover/21/cpplatform_jj1czpx4mwbpef3a748n99/t7_cpplatform_jj1czpx4mwbpef3a748n991679298569.jpg 6 | reviewCount: 1 7 | noteCount: 0 8 | readingStatus: 未标记 9 | progress: 6% 10 | totalReadDay: 5 11 | readingTime: 0小时45分钟 12 | readingDate: 2024-01-05 13 | isbn: 9787121429774 14 | lastReadDate: 2024-01-06 15 | 16 | --- 17 | # 元数据 18 | > [!abstract] 程序员的底层思维 19 | > - ![ 程序员的底层思维|200](https://cdn.weread.qq.com/weread/cover/21/cpplatform_jj1czpx4mwbpef3a748n99/t7_cpplatform_jj1czpx4mwbpef3a748n991679298569.jpg) 20 | > - 书名: 程序员的底层思维 21 | > - 作者: 张建飞 22 | > - 简介: 本书涵盖程序员应知应会的16种思维能力,共18章,分为三部分。第一部分主要介绍抽象思维、逻辑思维、结构化思维、批判性思维、维度思维、分类思维、分治思维、简单思维,以及成长型思维等解决日常问题的基础思维能力。第二部分结合软件行业的特点,主要介绍解耦思维、契约思维、模型思维、工具化思维、量化思维、数据思维,以及产品思维等专业思维能力。第三部分主要是对上述思维能力的综合运用实践。 23 | > - 出版时间 2022-02-01 00:00:00 24 | > - ISBN: 9787121429774 25 | > - 分类: 计算机-计算机综合 26 | > - 出版社: 电子工业出版社 27 | > - PC地址:https://weread.qq.com/web/reader/dac32720813ab7b3ag012a22 28 | 29 | # 高亮划线 30 | 31 | # 读书笔记 32 | 33 | ## 前言 34 | 35 | ### 划线评论 36 | > 📌 “你的成功可以复制吗 ^67716103-7O0GPTnl6 37 | - 💭 有规律和方法论的成功也就可复制,非偶然性成功,这问题挺能考验人能力的 38 | - ⏱ 2024-01-06 08:25:14 39 | 40 | # 本书评论 41 | -------------------------------------------------------------------------------- /微信读书/自动同步笔记/纳瓦尔宝典.md: -------------------------------------------------------------------------------- 1 | --- 2 | doc_type: weread-highlights-reviews 3 | bookId: "44026191" 4 | author: 埃里克·乔根森 5 | cover: https://cdn.weread.qq.com/weread/cover/89/YueWen_44026191/t7_YueWen_44026191.jpg 6 | reviewCount: 1 7 | noteCount: 0 8 | readingStatus: 读完 9 | progress: 91% 10 | totalReadDay: 6 11 | readingTime: 3小时10分钟 12 | readingDate: 2023-07-23 13 | finishedDate: 2024-01-04 14 | isbn: 9787521741124 15 | lastReadDate: 2023-07-29 16 | 17 | --- 18 | # 元数据 19 | > [!abstract] 纳瓦尔宝典 20 | > - ![ 纳瓦尔宝典|200](https://cdn.weread.qq.com/weread/cover/89/YueWen_44026191/t7_YueWen_44026191.jpg) 21 | > - 书名: 纳瓦尔宝典 22 | > - 作者: 埃里克·乔根森 23 | > - 简介: 致富不是靠运气,幸福也不是从天而降的。积累财富和幸福生活是我们可以学习的技能。这本书收集整理了硅谷投资人纳瓦尔在过去十年里通过推特、播客和采访等方式分享的人生智慧,向读者分享了纳瓦尔关于财富积累和幸福人生的原则与方法。纳瓦尔不仅告诉读者怎样致富,他还告诉读者怎样看待人生,怎样获得幸福。他对财富、人生的思考将帮助你走自己独特的道路,过上更富有、更幸福的生活。 24 | > - 出版时间 2022-05-01 00:00:00 25 | > - ISBN: 9787521741124 26 | > - 分类: 经济理财-理财 27 | > - 出版社: 中信出版集团 28 | > - PC地址:https://weread.qq.com/web/reader/e1e32b00729fc94fe1e824d 29 | 30 | # 高亮划线 31 | 32 | # 读书笔记 33 | 34 | # 本书评论 35 | 36 | ## 书评 No.1 37 | ^67716103-7K48mKU32 38 | ⏱ 2023-07-29 13:51:17 39 | -------------------------------------------------------------------------------- /微信读书/自动同步笔记/认知觉醒:开启自我改变的原动力.md: -------------------------------------------------------------------------------- 1 | --- 2 | doc_type: weread-highlights-reviews 3 | bookId: "33628204" 4 | author: 周岭 5 | cover: https://cdn.weread.qq.com/weread/cover/86/YueWen_33628204/t7_YueWen_33628204.jpg 6 | reviewCount: 7 7 | noteCount: 0 8 | readingStatus: 读完 9 | progress: 99% 10 | totalReadDay: 26 11 | readingTime: 12小时48分钟 12 | readingDate: 2024-02-29 13 | finishedDate: 2024-04-15 14 | isbn: 9787115543424 15 | lastReadDate: 2024-04-08 16 | 17 | --- 18 | # 元数据 19 | > [!abstract] 认知觉醒:开启自我改变的原动力 20 | > - ![ 认知觉醒:开启自我改变的原动力|200](https://cdn.weread.qq.com/weread/cover/86/YueWen_33628204/t7_YueWen_33628204.jpg) 21 | > - 书名: 认知觉醒:开启自我改变的原动力 22 | > - 作者: 周岭 23 | > - 简介: 为什么我们做事总是急于求成、避难趋易?所谓有耐心,就是要“咬牙坚持、死磕到底”?如何不再用“三分钟热情”和“打鸡血”的方式做事?如何保持极度专注?如何消除焦虑?如何提高学习能力?这是一部可以穿透时间的个人成长方法论。7大底层概念,20个成长关键词,助你彻底走出焦虑与迷茫,拥有清醒的认知、清楚的目标、清晰的路径、清爽的情绪。通过“大脑构造、潜意识、元认知”等思维规律,你将真正看清自己;通过“深度学习、关联、反馈”等事物规律,你将真正看清世界,提升自控力、专注力、学习力……只有洞悉底层的内在规律,我们才能真正开启自我改变的原动力。 24 | > - 出版时间 2020-06-01 00:00:00 25 | > - ISBN: 9787115543424 26 | > - 分类: 心理-认知与行为 27 | > - 出版社: 人民邮电出版社 28 | > - PC地址:https://weread.qq.com/web/reader/6a732ce07201202c6a7b30a 29 | 30 | # 高亮划线 31 | 32 | # 读书笔记 33 | 34 | ## 第二章 潜意识——生命留给我们的彩蛋 35 | 36 | ### 划线评论 37 | > 📌 恐惧就是一个欺软怕硬的货色,你躲避它,它就张牙舞爪,你正视它,它就原形毕露 ^67716103-7PKUbCN2Y 38 | - 💭 恐惧就是一个欺软怕硬的货色,你躲避它,它就张牙舞爪,你正视它,它就原形毕露 39 | - ⏱ 2024-03-17 11:49:30 40 | 41 | ## 第三章 元认知——人类的终极能能力 42 | 43 | ### 划线评论 44 | > 📌 很多学习能力、运算能力超强的学霸,他们的理智脑虽然同样强大,但未必能过好自己的人生。所以,我们要想办法锻炼自己的元认知,就像锻炼我们的肌肉一样,只要经常锻炼,它们就会越来越强,能被轻易激活。 ^67716103-7Q0bLWYq7 45 | - 💭 过好人生这个比较宽泛,世俗眼里的过好并不一定就是个体的过好,只要他觉得过好那就是过好 46 | - ⏱ 2024-03-27 12:58:04 47 | 48 | ### 划线评论 49 | > 📌 综上所述,成为思维舵手有3种方法。 50 | ·针对当下的时间,保持觉知,审视第一反应,产生明确的主张; 51 | ·针对全天的日程,保持清醒,时刻明确下一步要做的事情; 52 | ·针对长远的目标,保持思考,想清楚长远意义和内在动机。 ^67716103-7Q1rTfP7g 53 | - 💭 做计划我做了一些时间,但如果不列出优先级和定期复盘,效果会比较差 54 | - ⏱ 2024-03-28 08:50:51 55 | 56 | ## 第五章 学习力——学习不是一味地努力 57 | 58 | ### 划线评论 59 | > 📌 普通人觉得要是不把书读完,实在是对不起作者或是自己花出去的钱,但经济学家考文却觉得他这样做很划算。因为只有真正和自己有关的内容才对自己有用,在这个注意力非常匮乏的时代,没有必要把所有的书或是书中所有的内容都读完。 ^67716103-7Q6O614Rz 60 | - 💭 确实如此,不应该为了读书而读书,取其精华,去其糟粕 61 | - ⏱ 2024-03-31 21:23:15 62 | 63 | ### 划线评论 64 | > 📌 寻找触动点 ^67716103-7Q6OO7YB7 65 | - 💭 或许可以改变我之前做法,以前读完一本书做好记录,做好读书笔记就认为是读完一本书了,正如作者所说,如果没有触动点,那其实是读的失败的! 66 | - ⏱ 2024-03-31 21:34:07 67 | 68 | ### 划线评论 69 | > 📌 我建议每一个想成长的人都去进行每日反思,因为它可以提高自己对生活细节的感知能力,不会让日子像流水一样哗哗流过而什么都没留下。不过,和一般的日志不同,每日反思不是记流水账,而是留意每天最触动自己的那件事,不管是好的启发还是坏的体验,都写下来复盘,写得越细越好。一个触动点若是能转化成一个认知晶体,我们的生命质量和密度将远远超过那些不反思的人。面对生活中信息的滚滚洪流,触动真是最好的筛选器,它能让我们免受洪流的冲击,从容而体面地行走在人间。 ^67716103-7Q6P8PB8X 70 | - 💭 去年开始我就有在写人生小记,经过这么久的沉淀,我发现光是记录生活的琐事其实就是流水账日记,这对成长并不大,为什么要记录呢?记录是为了记录那些触动的瞬间,那些小小的成就,并锻炼自己提炼总结的能力,这是一种需要积累才能复利的能力,所以,这也让我更明确了,小记我更愿意当成是一种复盘,而不是流水账日记! 71 | - ⏱ 2024-03-31 21:39:13 72 | 73 | # 本书评论 74 | 75 | ## 书评 No.1 76 | 《认知觉醒》是我读过最贴近现实讲干货的成长类书籍,用浅显易懂的语言结合生活中很多人遇到的实际困境,让我的认知提高了一个档次。 77 | 纵观全书,主要围绕「大脑天性、学习、阅读、运动、反思、写作」展开,下面分享一些我从中学到的点,正如作者所言,如果不用自己的语言表达出读完书后的感想,不去付出实践,那读再多的书也是枉然。 78 | 1、关于大脑天性 79 | 人类大脑一共可以分为 3 块,分别是本能脑、情绪脑、理智脑。其中本能脑和情绪脑是属于天性部分,本能脑和情绪脑的基因一直被生存压力塑造着,所以它们的天性自然成了目光短浅、即时满足。又因它们主导着大脑的决策,所以这些天性也就成了人类的默认天性,这就可以理解为何我们总是急功近利、趋利避害、目光短浅,贪图享受,因为天性如此。 80 | 理智脑是后天形成的,也是需要不断训练才能发挥最大价值,这也是提升认知最重要的一点之一。 81 | 2、关于学习和阅读 82 | 书中有一个观点,印象很深,那就是「教即是学」,在学习知识或者阅读的时候,怎么样衡量我们对知识是否理解透彻掌握呢?那就是把这些知识用自己的话给别人讲一遍,用教别人知识来鞭策自己更好的学习和阅读,如果别人能听懂你讲的知识,表明理解到位了。 83 | 作者提出了四点高效学习方法; 84 | 1,有定义明确的目标 85 | 2,学习时极度专注:要学就学个踏实,要玩就玩个痛快 86 | 3,能获得有效的反馈 87 | 4,始终在拉伸区练习 88 | 我理解的是,在学习前要明确目标,比如我要学关于 VUE 相关的知识,我的目标就是要尽快能上手做项目,而不是深入去研究其底层技术;当下学习保持足够的专注,不同时又去学微服务的知识,并且学的过程中及时做好笔记,有可能的话发布博客或者到朋友圈,输出自己对这块知识的了解,获得有效的反馈特别是正向反馈对学习是有很强的激励作用的。不要一味的压榨自己,保持学习的舒适感最重要,比如今天实在是不想学了,效率不高,倒不如好好休息下,没必要为了完成任务而死磕。 89 | rethink: 90 | 我感觉自己不够专注,做 A 事情的时候有个好的点子想到了要做 B 事情,于是又去研究 B,半天下来发现会用到 C 技术,于是又去研究 C,最后下来,发现完成 A 耗费了大量的时间,其中大部分时间是浪费在了 B、C 上。发现自己同时要做的事情很多,这个也没完成,那个也没完成,导致自己处于一种很焦虑的状态,总想着快点完成 A,好继续做 B,最后发现什么都没做好,这是极度不专注最好的体现。 91 | action: 92 | 按照作者的观点,我决定做出计划改变: 93 | ● 严格使用番茄专注法,25 分钟一个循环,先在工作和学习中使用至少一个月,提升专注力 94 | ● 改变观念,目标是少做事而不是多做事,这个事情不做,今天最坏的后果是什么?明确任务优先级,对于高优先级任务需要完成,低优先级的甚至可以设定时间段或者放在计划清单中. 95 | ● 建立计划清单,非紧急的任务可以放在任务清单中 96 | ● 学习到的知识或者新看的书写的读书笔记,用自己的语言输出成文,并做分享 97 | ● 做减法,坚持「少就是多」的原则,同一时间减去其他的目标,避免同一时间做很多事 98 | 3、关于反思 99 | 以前我一度认为,每天花时间来做反思是一件浪费时间的事情,甚至对「吾日三省吾身」这种观点不理解,不明白他们做反思有什么作用。直到看了这本书,才明白其精髓。反思最大的作用是能让自己更好地看清问题并发生改变,这也是成长的内驱力啊。 100 | rethink: 101 | 从去年开始每天有写「人生小记」,但写着写着写成了日记的流水账,每天做什么列出来,我发现,这种对自己提高并不大,单纯的流水账,并不能看出自己触动点,大部分可能在碎碎恋罢了。 102 | action: 103 | 针对「人生小记」做出优化,以触动点出发,留意每天生活中最触动自己的点。不管这个点是令人欣喜的感悟,还是令人难受的困惑,只要它在心头燃起火花,就把它摘取下来,记录到文档里复盘。复盘方式采用如下 3 点: 104 | ①描述经过——以便日后回顾时能想起当时的场景; 105 | ②分析原因——多问几个为什么,直到有深度的启发; 106 | ③改进措施——尽可能提炼出一个认知点或行动点 107 | 不在乎形式的完美 108 | 4、关于写作 109 | 写作的内在动机一定不能是流量,而一定是要基于「让自己变好」的写作动机,培养长期的乐趣比一味的追求流量迎和平台,不注重质量要更长久,前者最终并没有很大的成长。 110 | 关于如何写作,作者认为要领就 2 个,一个是用简单的语言讲外行人都能听到懂的道理,另外一个就是多用比喻来做解释是唯一好的修饰手法。像和人聊天一样的方式去写作,会让写作这件事瞬间变得不一样。 111 | rethink: 112 | 虽说有几年的自媒体平台写作经验,但反思自己的文章,缺乏主观的表达,以及太过于干,有一种为了讲知识而讲的意思,也没用简单的语言和形象的比喻来描述知识本身,且自己在写作上一直都没形成自己的风格,这也是一大问题。 113 | action: 114 | 针对写作上的问题结合书中观点,做出一些改变,以后的文章中多加入一些个人的主观观点,像聊天一样的方式去用简单的语言加上形象的比喻,讲好知识本身,慢慢形成自己的写作风格。 115 | 5、如何保持心智富足 116 | 书中有如下观点: 117 | 1,保持目标觉知,少就是多 118 | 2,保持欲望觉知,脑子里存在大量任务和念头的时候,往往是我们行动力最弱的时候 119 | 真正的行动力高手不是有能耐在同一时间做很多事的人,而是会想办法避免同时做很多事的人。 120 | 3,保持情绪觉知,谨慎决定。不要在最兴奋的时候做决定,也不要在最愤怒的时候做决定 121 | 4、保持闲余觉知,自我设限 122 | 其实核心还是在于专注和控制好情绪,在适当的时候给自己设限,拒绝躺平,更拒绝内耗,做到精神世界的丰富,也即心智富足。 123 | 最后,书中的观点再好,当下觉得再有道理,如果不付出改变和行动,都是枉然。一起加油! ^67716103-7QiyWR0Ac 124 | ⏱ 2024-04-08 14:52:01 125 | -------------------------------------------------------------------------------- /微信读书/自动同步笔记/长安的荔枝.md: -------------------------------------------------------------------------------- 1 | --- 2 | doc_type: weread-highlights-reviews 3 | bookId: "3300003224" 4 | author: 马伯庸 5 | cover: https://cdn.weread.qq.com/weread/cover/75/cpPlatform_dbb14284a55f1e733b60202b0777255d/t7_cpPlatform_dbb14284a55f1e733b60202b0777255d.jpg 6 | reviewCount: 2 7 | noteCount: 0 8 | readingStatus: 读完 9 | progress: 100% 10 | totalReadDay: 8 11 | readingTime: 4小时25分钟 12 | readingDate: 2024-03-09 13 | finishedDate: 2024-03-16 14 | isbn: 9787572608582 15 | lastReadDate: 2024-03-17 16 | 17 | --- 18 | # 元数据 19 | > [!abstract] 长安的荔枝 20 | > - ![ 长安的荔枝|200](https://cdn.weread.qq.com/weread/cover/75/cpPlatform_dbb14284a55f1e733b60202b0777255d/t7_cpPlatform_dbb14284a55f1e733b60202b0777255d.jpg) 21 | > - 书名: 长安的荔枝 22 | > - 作者: 马伯庸 23 | > - 简介: 同名实体书新鲜上市,马伯庸历史短小说“见微”系列神作! 24 | 大唐天宝十四年,长安城小吏李善德突然接到一个任务:要在贵妃诞日之前,从岭南运来新鲜荔枝。荔枝保鲜期只有三天,而岭南距长安五千余里,山水迢迢,这是个不可能完成的任务。为了家人,李善德只得放手一搏…… 25 | 古装版社畜求生记,帝国夹缝中的小人物史诗。 26 | > - 出版时间 2022-10-01 00:00:00 27 | > - ISBN: 9787572608582 28 | > - 分类: 历史-历史小说 29 | > - 出版社: 湖南文艺出版社 30 | > - PC地址:https://weread.qq.com/web/reader/cc932860813ab67c2g014597 31 | 32 | # 高亮划线 33 | 34 | # 读书笔记 35 | 36 | ## 第五章 37 | 38 | ### 划线评论 39 | > 📌 流程那种东西,是弱者才要遵循的规矩 ^67716103-7PIsuNd0G 40 | - 💭 弱者才看流程 41 | - ⏱ 2024-03-15 21:13:21 42 | 43 | # 本书评论 44 | 45 | ## 书评 No.1 46 | 职场中,基层管理者。读完感触颇深。 47 | 就为了满足贵妃想吃新鲜荔枝的欲望,不惜动用全国之力,甚至牺牲了无数的小人物,主人公又何尝不是个在此牺牲的小人物。 48 | 49 | 上头的一道命令,下面的人得忙活上半天,有大量琐碎的事务需要处理,在IT行业,感触最深的是领导的一句话需求,开发个APP看起来是一句话简单的事情,但落实到基层员工,有太多的事情需要处理,产品定义,产品文档,需求评审,测试开发,部署上线,修复优化迭代,有太多的细节,有时候就为了满足上头的一句话需求。 50 | 51 | 所以说,千古艰难难做事,一事功成万头秃。 52 | 53 | 小人物的大喜大悲,在历史面前显得无足轻重,但喜欢的一段话献给每一个努力生活的你:这世道或许严酷黑暗,但是希望你们能够摆脱冷漠,只向上走, 54 | 追求美好生活的同时,也要拒绝利益的诱惑,不必与宵小之辈同流,守 55 | 护好自己的初心,哪怕只是像萤火一样,也要在黑暗中发出一点光,无 56 | 需等到炬火,如果此后没有炬火,你们便是唯一的光。 57 | 58 | 59 | 转书友的一段感悟: 60 | 1.不管收到什么文件,都要仔细核对。这也是本书故事起因,因李善德收到了荔枝领,没有仔细核对,导致事后想去讨要说法,却没人搭理。 61 | 2\. “和光同尘,雨露均沾,花花轿子众人齐”。这也让我想起家中长辈告诉的一句话“发表文章,要将领导名字放前面,自己的名字放最后;取得成绩,先感谢领导提携,其次感谢同事帮助”。李德善去岭南当地遇到各种阻拦,最后终于明白,要想办成一件事,需要带上每个部门才行,让大家都能从中获益,才最终才能将事情办成办好。 62 | 3\. 学会借势,不要一味依靠自身力量。李善德没有得到杨国忠帮助时,被人当个皮球踢来踢去,办不成事还积了一肚子的气,但有了杨国忠的“银牌”,官员立马转了态度。我们平时办事也一定要先和领导请示,再去办的时候就说领导交代的,大家不要相互为难。 63 | 4\. 自己的想法,不要轻易告诉别人。“就算你和他交际,好歹留上一手啊!如今倒好,他拿了荔枝转运法,为何不照葫芦画瓢,自去岭南取了新鲜荔枝回来?这份功劳,跟你半点关系也没有了!”李善德因为把自己的荔枝转运法告诉了别人,导致差点被抢了功劳。我们在职场也是一样,少说话多做事,特别是和利益相关的,绝对闭口不谈,别人问起就转移话题。 64 | 5.不要轻易给别人承诺。李善德答应富商将荔枝转运的差事交给他们商队,回京城后发现这事自己说了不算,最后失去了朋友,也失去了保存荔枝的容器,差点误了运送荔枝。 65 | 6.规则都是为弱者设立的。“流程,是弱者才要遵循的规矩”。李善德他按照规矩办事,处处碰壁,而靠着“银牌”却畅行无阻。 ^67716103-7PKW0Us2b 66 | ⏱ 2024-03-17 12:17:24 67 | -------------------------------------------------------------------------------- /物联网和嵌入式开发/C语言入门(1)——特点及关键字.md: -------------------------------------------------------------------------------- 1 | ## 1、C特点及与Java区别 2 | 3 | 1.1、C特点 4 | 面向过程 5 | 一般用于嵌入式开发、编写最底层的程序、操作系统 6 | 可以直接操作内存 7 | 可以封装动态库 8 | 不容易跨平台 9 | 有指针 10 | 可以直接操作串口 11 | 线程更加灵活 12 | 和硬件打交道速度是最快的 13 | 14 | 1.2、和Java区别 15 | C++是C的增强版,增加了一些新的特性,如面向对象 C#跟 C/C++ 完全不同,是微软开发的语言,用于.net, 16 | 从时间先后上说,他们之间最早出现的是C,然后是c++,最后是c#。c++是为了解决软件危机而引入面向对象, 17 | c#为了实现平台统一和java争夺市场下的产物 18 | 类别 C Java 19 | 运行方式上 面向过程 面向对象 20 | 用途 嵌入式、操作系统 应用软件、web 21 | 语法不同 内存、指针、动态库 jar包 22 | 跨平台 不支持(c#支持) 支持 23 | 24 | ## 2、关键字 25 | 26 | 2.1、数据类型相关的关键字 27 | 定义变量的方式:类型 变量名 28 | 变量名属于标识符,标识符命名规则:①只能以数字、字母、下划线命名、②首字母不能是数字,③不能与关键字相同,⑥严格区分大小写 29 | 1、char 30 | 字符型,占一个字节 31 | 有符号:-2`7-2`7-1 32 | 无符号:0-2`8-1 33 | 2、short 34 | 短整型,占2个字节 35 | 有符号:-2`15-2`15-1 36 | 无符号:0-2`16-1 37 | 3、int 38 | 整型,在32位系统以上占4个字节 39 | 有符号:-2`31-2`31-1 40 | 无符号:0-2`32-1 41 | 4、long 42 | 长整型,在32位系统占4个字节,64位系统占8个字节 43 | 5、float 44 | 单浮点型,占4个字节 45 | 6、double 46 | 双浮点型,占8个字节 47 | 7、union 48 | 与共同体(联合体)相关的关键字 49 | 8、enum 50 | 与枚举相关关键字 51 | 9、signed 52 | 代表是有符号的意思,默认省略代表有符号的 53 | 10、unsigned 54 | 代表是无符号类型,只能保存正数和0 55 | 11、void 56 | 代表函数没有返回值,不能定义变量 57 | 58 | 2.2、存储相关关键字 59 | 1、register 60 | 61 | 2、static 62 | 修饰全局变量、局部变量、函数 63 | 修饰的变量保存在内存的静态区空间中 64 | 65 | 3、const 66 | 67 | 4、auto 68 | 基本不用 69 | 5、extern 70 | 一般用于函数和全局变量的声明 71 | 72 | 2.3、控制语句相关的关键字 73 | 1、条件控制语句 74 | if else 75 | swtch case default 76 | 2、循环控制语句 77 | for 78 | while 79 | do 80 | goto 81 | 3、辅助控制语句 82 | break continue 83 | 84 | 2.4、其他关键字 85 | 1、sizeof 86 | 使用来测变量、数组的占用存储空间的大小(字节数) 87 | 2、typedef 88 | 89 | 重命名相关的关键字,给一个已有的类型,重新起个类型名 90 | typedef short int INT16 91 | 3、volatile 92 | 93 | -------------------------------------------------------------------------------- /物联网和嵌入式开发/边缘计算与云边协同.md: -------------------------------------------------------------------------------- 1 | ## 1、什么是边缘计算 2 | 边缘计算是指在靠近物或数据源头的一侧,融合网络、计算、存储、应用核心能力的分布式开放平台,就近提供边缘计算服务,满足应用的实时性和数据保护等方面的需求。 3 | 4 | 边缘计算已经存在了一些年,近年随着云计算的飞速发展,边缘计算也在快速兴起,未来几年将迎来爆发式的增长。边缘计算主要是为了配合通信、存储或安全等应用而存在的,它在实际应用过程中可能形成一些新的产品。 5 | 6 | 边缘计算与云计算各有所长,云计算擅长全局性、非实时、长周期的大数据处理与分析,能够在长期维护、业务决策支撑等领域发挥优势;而边缘计算更适用局部性、实时、短周期数据的处理与分析,能更好的支持本地业务的实时智能化决策。 7 | 8 | 边缘计算的出现就是为了弥补现阶段云计算所面临的一些短板,配合、促进云计算的发展。因此,边缘计算与云计算之间不是替代关系,而是互补协同关系。 9 | 10 | 边缘计算与云计算需要通过紧密协同工作才能更好的满足各种需求场景的匹配,从而放大边缘计算和云计算两者的应用价值。 11 | 12 | ![在这里插入图片描述](https://canghe666.oss-cn-chengdu.aliyuncs.com/canghe/7ae39676a7eb4c7fab70a3e315e90ab6.png) 13 | 14 | ## 2、边缘计算产品 15 | ● 亚马逊推出AWS Greengrass功能软件,将 AWS 扩展到设备上,在本地处理终端生成的数据,同时仍然可以使用云来进行管理,进行数据分析和持久的存储; 16 | ● 微软发布 Azure IoT Edge 边缘侧产品,将云分析扩展到边缘设备,支持离线使用,同时聚焦边缘侧人工智能应用; 17 | ● 谷歌也在2018年推出了硬件芯片 Edge TPU和软件堆栈Cloud IoT Edge,可将数据处理和机器学习功能扩展到边缘设备,使设备能够对来自其传感器的数据进行实时操作,并在本地进行结果预测。 18 | ● 阿里推出Link IoT Edge平台,它可以部署在不同量级的智能设备和计算节点中。通过定义物体模型来连接不同协议、不同数据格式的设备,提供安全可靠、低延时、低成本、易扩展的本地计算服务。 19 | ● 腾讯针对边缘计算推出了CDN Edge,将数据中心的服务下沉至CDN边缘节点,以最低的延迟响应终端用户,同时降低用户数据中心的计算压力和网络负载。 20 | 21 | ## 3、云边协同技术 22 | 以物联网场景举例。物联网中的设备产生大量的数据,数据都上传到云端进行处理,会对云端造成巨大的压力,为分担中心云节点的压力,边缘计算节点可以负责自己范围内的数据计算和存储工作。 23 | 24 | 然而,大多数的数据并不是一次性数据,那些经过处理的数据仍需要从边缘节点汇聚到中心云,中心云做大数据分析挖掘、数据共享,同时进行算法模型的训练和升级,升级后的算法推送到前端,使前端设备更新和升级,完成自主学习闭环。同时,这些数据也有备份的需要,当边缘计算过程中出现意外情况,存储在云端的数据也不会丢失。 25 | 26 | ![在这里插入图片描述](https://canghe666.oss-cn-chengdu.aliyuncs.com/canghe/d8bb0be2779941cc82044d53aee02375.png) 27 | 对于边缘计算来说,不同于把大量的资源整合的云计算平台,边缘云平台更是一个分布式的平台,因此云边协同的特征是边缘计算的主要特征之一,而云边协同包含了各种协议和功能,涉及到了云计算的方方面面,因此在边缘计算的发展过程中,云边协同的功能实现情况成了影响边缘计算的重要因素。 28 | 29 | 边缘计算和云计算并不是互相排斥的关系,二者相互促进,共同发展的,边缘计算在未来的发展中会与云计算相互融合,进入到云边协同的新阶段,在中心端学习,在边缘端执行来处理复杂的问题,在处理好安全性、带宽、复杂性等方面的问题后,云边协同势必在生产中占据举足轻重的位置,大放异彩! 30 | 31 | 32 | -------------------------------------------------------------------------------- /经验总结/如何做好技术架构选型.md: -------------------------------------------------------------------------------- 1 | 大家好呀,我是苍何。 2 | 3 | 在牛客上看到一条帖子,说“计算机就业,别卷绩点,这是最大的信息差”。觉得挺有感触的。 4 | 5 | ![牛客讨论区](https://cdn.nlark.com/yuque/0/2024/png/29495295/1716343335279-6eeff207-3342-4c75-8b2c-3a692756ae93.png#averageHue=%23f9f8f8&clientId=u5cc9b45f-2014-4&from=ui&id=u5648fb0f&originHeight=1433&originWidth=1170&originalType=binary&ratio=2&rotation=0&showTitle=true&size=340750&status=done&style=none&taskId=udf04ffdd-f934-4337-888e-672c61ad1ec&title=%E7%89%9B%E5%AE%A2%E8%AE%A8%E8%AE%BA%E5%8C%BA "牛客讨论区") 6 | 7 | 强如牛友次次上课第一排,年年奖学金,绩点高达 3.94,成绩甚至冲到了年级前三,在找工作时,一样面临**学历**、**项目经历**、**实习经历**的拷打,但唯独不问绩点,不问分数。 8 | 9 | 我觉得如果是单纯就业的话,大可不必去卷绩点,冲排名,因为大部分企业根本不会问你成绩,主要还是看**项目经历**,**实习经历**或者在校期间得过什么奖之类的。(当然如果是考研、留学这些绩点就有很大作用了)。 10 | 11 | 所以在学校有明确的规划就很重要了,是先就业还是考研,留学,这些最好在大一大二就做好规划,如果选择的是就业,在校期间我建议把重点放在**项目经历**上来,简历上也要多从项目上下手,**别卷分数**。 12 | 13 | 这次我们就以开源实战校招项目 PmHub 的技术架构选型开始说起,聊一聊在实际业务项目中如何做好架构的选型。 14 | 15 | # 我的实践 16 | PmHub 开源项目一共经历了 2 次技术架构选型,因为一开始它是个单体 SpringBoot 版本应用,其采用 **SOA 模块化**架构设计,即按照不同的业务范围分不同的 Moudle,这也是单体应用中现在常见的设计思路。 17 | 18 | 后面我把他升级到了**微服务**版本,架构复杂性自然也飙升了一截。需要考虑服务网关、服务调用、服务认证、服务注册、熔断降级、监控及分布式事务等一系列问题。 19 | 20 | 经过慎重的思考和架构选型,最终确定如下系统架构: 21 | 22 | ![系统架构图](https://cdn.nlark.com/yuque/0/2024/png/29495295/1716346367491-98ab2c34-dd3b-455c-b9cc-d388aec3a0f4.png#averageHue=%23e6a45a&clientId=u5cc9b45f-2014-4&from=drop&id=dIBQd&originHeight=1173&originWidth=914&originalType=binary&ratio=2&rotation=0&showTitle=true&size=850675&status=done&style=none&taskId=u43b78c48-12a5-422d-986a-da98bd42270&title=%E7%B3%BB%E7%BB%9F%E6%9E%B6%E6%9E%84%E5%9B%BE "系统架构图") 23 | 24 | 服务中使用到的一些后端技术列表如下: 25 | 26 | | | 技术 | 名称 | 版本 | 官网 | 27 | | --- | --- | --- | --- | --- | 28 | | 1 | Spring Boot | 基础框架 | 2.7.18 | [https://spring.io/projects/spring-boot](https://spring.io/projects/spring-boot) | 29 | | 2 | SpringCloud | 微服务框架 | 2021.0.8 | [https://spring.io/projects/spring-cloud](https://spring.io/projects/spring-cloud) | 30 | | 3 | SpringCloud Alibaba | 阿里微服务框架 | 2021.0.5.0 | [https://github.com/alibaba/spring-cloud-alibaba](https://github.com/alibaba/spring-cloud-alibaba) | 31 | | 4 | SpringCloud Gateway | 服务网关 | 3.1.8 | [https://spring.io/projects/spring-cloud-gateway](https://spring.io/projects/spring-cloud-gateway) | 32 | | 5 | MyBatis-Plus | 持久层框架 | 3.5.1 | [https://baomidou.com](https://baomidou.com) | 33 | | 6 | Redis | 分布式缓存数据库 | Latest | [https://redis.io](https://redis.io) | 34 | | 7 | RocketMQ | 消息队列 | 2.2.3 | [https://rocketmq.apache.org](https://rocketmq.apache.org) | 35 | | 8 | HuTool | 小而全的工具集项目 | 5.8.11 | [https://hutool.cn](https://hutool.cn) | 36 | | 9 | Maven | 项目构建管理 | 3.9.1 | [http://maven.apache.org](http://maven.apache.org) | 37 | | 10 | Sentinel | 流控防护框架 | 1.8.6 | [https://github.com/alibaba/Sentinel](https://github.com/alibaba/Sentinel) | 38 | 39 | 40 | 明确了项目最终使用的技术架构选型,你是否好奇我是如何做技术架构选型的呢?下面浅谈一些自己的经验。 41 | # 明确业务需求 42 | 业务项目一定是用来**满足业务需求**的,而技术架构是为了更好更**高效**的完成业务项目,所以业务需求是技术架构选型中**最为关键**的一步,直接决定了技术选型的方向和重点。 43 | 44 | 一般公司业务,需要了解公司所在**行业的现状**、趋势和竞争态势。例如,电商、金融、医疗等不同领域的需求和侧重点会有所不同。 45 | 46 | 还要理解**业务模式**,明确公司的业务模式, 是B2B、B2C 还是 C2C 等,这会影响系统的设计和功能需求。 47 | 48 | 拿 PmHub 为例,因为我们是开源项目,业务比较简单,主要是项目管理和流程管理相结合。那需要深入理解业务,还要从业务目标和功能需求入手。 49 | ## 分析业务目标 50 | 业务目标大体为为**长期目标**和**短期目标**,长期目标是公司在未来3-5年内的战略规划是什么?如扩展国际市场、推出新产品等。 51 | 52 | 而短期目标是公司在短期内希望通过技术实现哪些目标?如提高销售、用户增长、提升用户体验等。 53 | 54 | 拿 PmHub 来说,短期目标是能尽快实现**微服务改造**落地,并能闭环现有所有业务功能,长期目标,是能更好的**帮助学生将此项目写入简历,帮助他们拿到一个好的 offer**。 55 | ## 确定功能需求 56 | 功能可以分为基本功能和非功能需求。 57 | #### 基本功能 58 | 59 | - **核心功能**:定义系统必须实现的核心功能,如用户注册登录、产品展示、购物车、订单处理等。 60 | - **辅助功能**:定义增强用户体验的辅助功能,如推荐系统、优惠券、用户评价等。 61 | 62 | #### 非功能需求 63 | 64 | - **性能要求**:定义系统在响应时间、吞吐量、并发用户数等方面的性能指标。例如,页面加载时间不超过2秒,支持每秒1000次交易等。 65 | - **安全要求**:定义系统的安全需求,如数据加密、身份验证、权限管理、漏洞防护等。 66 | - **可用性要求**:定义系统的可用性指标,如99.9%的系统可用率、故障恢复时间等。 67 | - **扩展性要求**:定义系统的扩展性需求,以便未来能轻松添加新功能或处理更多用户。 68 | 69 | PmHub 这个项目的基本功能是一套完整的 CRM 系统,而核心业务功能是**项目管理**和**流程管控**,其他的如日志管理、系统管理等均属于辅助功能。 70 | # 技术分析 71 | 下图是典型的技术架构选型图: 72 | 73 | ![典型技术架构选型图](https://cdn.nlark.com/yuque/0/2024/png/29495295/1716348530851-8265e33c-d600-41b8-bb0c-9edb6483371e.png#averageHue=%23ebe1a1&clientId=u8b05cda5-3037-4&from=drop&id=u1d298150&originHeight=1173&originWidth=1029&originalType=binary&ratio=2&rotation=0&showTitle=true&size=37219&status=done&style=none&taskId=ufebb6d1e-b7f4-42fc-b56e-a638b5a638d&title=%E5%85%B8%E5%9E%8B%E6%8A%80%E6%9C%AF%E6%9E%B6%E6%9E%84%E9%80%89%E5%9E%8B%E5%9B%BE "典型技术架构选型图") 74 | 75 | 所以大部分情况下,在做技术分析的时候大体也需要围绕经典技术架构来做分析和选型。 76 | ## 考察技术栈 77 | 对于不同的场景,需要至少罗列 2 种以上技术栈,并需要分析其之间的优缺点和适用场景,如果是在公司团队,还需要评估现有团队的**技术能力**和**学习曲线**。 78 | 79 | 如果是个人,需要看哪个技术是**自己擅长的**, 或者**学习成本低的**,我们在做技术选型的时候,并不是完全会选择那些很时髦的但没经过验证的技术,也大概率不会选择自己不熟悉的技术。 80 | 81 | 真要选择这种自己不熟悉的技术,一定是要先去学习这个技术才行的。 82 | 83 | 拿 PmHub 中的用户鉴权来举例,现成的技术框架有 Spring Security 和 Shiro 完全可以实现我的需求,且我对这两个技术也比较熟悉,所以在 monitor 监控中心的鉴权,我就直接用了 Spring Security。 84 | 85 | 而微服务的整体鉴权,我却选择了自定义注解配合网关鉴权,其实是有目的的,因为该项目的长期目标是帮助学生体现在简历上,所以需要**增加亮点**, 86 | 87 | 另外通过自己实现鉴权,也能更加理解鉴权框架的内部原理了,其实都差不多的。 88 | ## 可扩展性和性能 89 | 选择技术选型的时候,需要选择能够支持业务增长的架构,而且确保所选技术能够满足性能需求,例如高并发、低延迟等。 90 | ## 安全性和可靠性 91 | 选择技术框架是必须满足安全性和可靠性,一些有严重漏洞的框架,我们是坚决不会选的。 92 | 93 | - 确保技术架构符合行业安全标准和法规要求。 94 | - 评估技术的可靠性,避免单点故障。 95 | 96 | # 架构设计原则 97 | ## 模块化和分层设计 98 | 99 | - 采用模块化设计,确保系统的可维护性和可扩展性。 100 | - 使用分层架构,例如MVC模式,明确各层的职责。 101 | ## 松耦合和高内聚 102 | 103 | - 保持各组件之间的松耦合,减少相互依赖。 104 | - 确保每个模块内部具有高内聚性,实现特定功能。 105 | # 资源评估 106 | 设计架构的时候,需要考虑实际的资源成本,考虑开发和部署的初始成本,包括硬件、软件和人力成本。评估长期运营和维护成本,例如服务器费用、第三方服务费用等。 107 | 108 | 比如在 PmHub 中,文件存储,我就没使用阿里云存储 OSS,而是自己实现了一套**分布式文件存储系统**,主要还是为了节省成本。 109 | 110 | 做架构设计是一件复杂的事情,有人觉得这是架构师该做的事情,但其实我觉得,架构设计是每一个开发都必须掌握的技能,通过架构设计,我们才明白我们做的系统究竟如何**体现价值**。 111 | 112 | 以上是关于技术架构选型的一些个人经验,感谢您的阅读。 113 | 114 | 115 | 116 | 117 | 118 | 119 | --------------------------------------------------------------------------------