├── .gitattributes ├── Git使用教程:最详细、最傻瓜、最浅显、真正手把手教.md ├── Java笔记 ├── JVM内存管理.jpeg ├── Tips │ ├── Maven相关内容学习.md │ ├── _vnote.json │ ├── assets │ │ └── 20191020153916868_1651964039.png │ └── finally语句如何执行.md ├── _vnote.json ├── assets │ ├── 1551267436382.png │ ├── 1551268923990.png │ ├── 1551271953665.png │ ├── 1551512824910.png │ ├── 1551517542209.png │ ├── 1551626172914.png │ ├── 1551628646433.png │ ├── 1551708631498.png │ ├── 1551859303006.png │ ├── 1552270512675.png │ ├── 1552270979760.png │ ├── 1552274222807.png │ ├── 22f72b18415405c3e0207925a8de74fa_hd.jpg │ ├── 640-1551860568789.webp │ ├── 640-1551878862223.webp │ ├── 640-1551955088595.webp │ ├── 640-1551958892751.webp │ ├── 640.webp │ ├── Collection.jpg │ └── thread.jpg ├── java并发编程的艺术.md ├── java核心技术卷计划.md ├── 深入理解Java虚拟机.md ├── 设计模式 │ ├── _vnote.json │ ├── code │ │ ├── Singleton.java │ │ └── Singleton1.java │ └── 单例模式.md └── 读一读JVM.md ├── LICENSE ├── Linux命令及Shell脚本学习笔记 ├── Linux大棚命令百篇(上) │ ├── _vnote.json │ ├── assets │ │ ├── 20191007182630566_2108786728.png │ │ ├── 20191008220031920_1820220481.png │ │ ├── 20191008220315271_1564072186.png │ │ ├── 20191025111117600_875492706.png │ │ ├── 20191025111321005_1206297223.png │ │ ├── 20191025111736272_44758469.png │ │ ├── 20191025112205069_1587054822.png │ │ └── 20191025121416871_1717319503.png │ └── 什么是Shell.md ├── README.md ├── Vi快捷操作学习.md ├── Windows转Linux之常用命令学习(一).md ├── Windows转Linux之常用命令学习(二).md ├── Windows转Linux之常用命令学习(二).md.vswp ├── _vnote.json ├── assets │ ├── 1546870348043.png │ ├── 1546872241318.png │ ├── apt使用.png │ ├── crontab.png │ ├── df.png │ ├── du-0.png │ ├── du-exclude.png │ ├── du-h.png │ ├── du-maxdepth.png │ ├── fdisk.png │ ├── gb18030.png │ ├── history.png │ ├── selinux.png │ ├── ssh连接失败.png │ ├── vi常用命令.png │ └── 系统信息.png ├── rpm命令使用.md ├── 包管理工具apt使用.md ├── 包管理工具yum使用.md ├── 终端常用快捷键.md └── 韩顺平_Linux (大数据 javaEE Python 开发通用版).pdf ├── Linux系统下开发环境搭建 ├── (可参考)Deepin 15.4 Win10双系统安装教程.pdf ├── AppImage打包方式及相关Linux游戏站推荐.md ├── Deepin15.8下搭建Python开发环境.md ├── Deepin下如何科-学(地)上-网.md ├── Deepin下搭建Hadoop、Spark等大数据开发环境.md ├── Deepin下源码编译安装配置git.md ├── Deepin使用体验、资源及问题归纳贴.md ├── Deepin常用快捷键及快捷其他操作.md ├── Deepin自定义右键新建文件模版.md ├── Deepin设置开机自启动脚本问题.md ├── IDEA常用快捷键.md ├── Linux中文件系统各个目录的作用.md ├── Linux应用推荐.md ├── README.md ├── Win10下双系统Deepin15.8安装.md ├── _vnote.json ├── assets │ ├── 1547104601035.png │ ├── 1547122130325.png │ ├── 1547122270694.png │ ├── 1547122288560.png │ ├── 1547122720202.png │ ├── 1547122847689.png │ ├── 1547122893538.png │ ├── 1547123056508.png │ ├── 1547123559546.png │ ├── 1547123614467.png │ ├── 1547123742916.png │ ├── 1547123811269.png │ ├── 1547123827216.png │ ├── 1547123852762.png │ ├── 1547123928107.png │ ├── 1547124309030.png │ ├── 1547127856260.png │ ├── 1549802209141.png │ ├── 1549802355287.png │ ├── 1549804313390.png │ ├── 190111521.jpg │ ├── 20190120220106492.png │ ├── 20190123162839.png │ ├── 20190517182502290_970489846.png │ ├── add.png │ ├── dropins.png │ ├── eclipse下载.png │ ├── eclipse安装.png │ ├── folder选择.png │ ├── gitconfig.png │ ├── hadoop配置.png │ ├── hdfs.png │ ├── insert.png │ ├── java-v.png │ ├── java环境配置.png │ ├── maven源.png │ ├── maven配置.png │ ├── metadata.png │ ├── mvnsetting.png │ ├── mysql安装.png │ ├── mysql驱动.png │ ├── pip下载在哪里.png │ ├── pycharm中运行jupyter.png │ ├── pycharm安装00.png │ ├── pycharm安装01.png │ ├── pycharm安装02.png │ ├── pycharm安装03.png │ ├── pycharm桌面.png │ ├── pycharm虚拟环境00.png │ ├── scalalocation.png │ ├── scala插件.png │ ├── select.png │ ├── slave2.png │ ├── slave文件.png │ ├── sparkslave.png │ ├── ssh免密.png │ ├── startspark.png │ ├── toolsdownload.png │ ├── tools安装出错.png │ ├── venv.png │ ├── vm.png │ ├── vmtools.png │ ├── vm使用.png │ ├── vm启动失败.png │ ├── vm安装.png │ ├── vm网络设置.png │ ├── wHive.png │ ├── yarn.png │ ├── 传输公钥.png │ ├── 创建git.png │ ├── 发送masterpub.png │ ├── 取消scala.png │ ├── 启动musqld.png │ ├── 启动venv.png │ ├── 复制vm.png │ ├── 字段.png │ ├── 安装.png │ ├── 安装scala插件.png │ ├── 查看.png │ ├── 查看mysql.png │ ├── 深度截图_选择区域_20190219225738.png │ ├── 解压.png │ ├── 触摸板手势.png │ └── 重命名.png └── requirements.txt ├── README.md ├── README.md.20190124222838.bak ├── Spring-Boot-Learning ├── README.md ├── _vnote.json └── assets │ ├── 20191022153424858_1878326502.png │ ├── 20191022153632597_151903268.png │ ├── 20191022154456020_407860967.png │ ├── 20191022154845144_995881766.png │ ├── 20191022160835093_168811412.png │ ├── 20191022161225973_1331719954.png │ ├── 20191022161346956_1117468288.png │ ├── 20191022201407698_1597655336.png │ ├── 20191022210336626_1331334869.png │ ├── 20191024095409385_232974006.png │ ├── 20191024172348188_2081525319.png │ ├── 20191028232512518_312968216.png │ ├── 20191029202018852_969396943.png │ ├── 20191029205135984_418441085.png │ ├── 20191029224401689_359358011.png │ ├── 20191029225826769_1169318871.png │ └── 20191029230019588_1482385818.png ├── _vnote.json ├── assets ├── 1547472870163.png ├── 1547472895580.png ├── 1556878717809.png ├── 1556882392939.png ├── 1556883671229.png ├── 1556883688122.png ├── 1556883986766.png ├── 1556884056058.png ├── 1556884308437.png ├── 1556884626871.png ├── 1556884677828.png ├── 1556884770319.png ├── 1556885297319.png ├── 1556885669473.png ├── 1556885795335.png ├── 1556885939394.png ├── 1556886206847.png ├── 1556886589539.png ├── 1556886824092.png ├── 1556887053275.png ├── 1556887129427.png ├── 1556944982177.png ├── 1556945256521.png ├── 1556945314176.png ├── 1556945414408.png ├── 1556945533185.png ├── 1556945641117.png ├── 1556945756926.png ├── 1556945820141.png ├── 20190503174907.png ├── 20190822110758971_764642917.png ├── 20190822110907672_847619643.png ├── 20190822110937662_1548052493.png └── githubLicense.png ├── eBook ├── HBase系列 │ └── HBase实战.pdf ├── JAVA核心知识点整理.pdf ├── Python │ ├── Python3数据分析与挖掘.txt │ ├── Python升级3.6 强力Django+杀手级Xadmin打造在线教育平台.txt │ └── 分布式爬虫打造搜索引擎.txt ├── README.md ├── Spark系列 │ ├── 01-基于Spark2.x新闻网大数据实时分析可视化系统项目.txt │ ├── 02-Spark离线和实时电影推荐系统直播回放(视频+文档+代码).txt │ ├── 03-Spark项目实战:爱奇艺用户行为实时分析系统.txt │ ├── 04-Spark企业级实战项目:道路交通实时流量监控预测系统.txt │ ├── 05-Spark企业级实战项目:知名手机厂商用户行为实时分析系统.txt │ ├── 06-Spark大型项目实战:电商用户行为分析大数据平台.txt │ └── 07-Spark 2.0从入门到精通245讲.txt ├── _vnote.json ├── 代码审核.md ├── 算法及其余基础书籍 │ ├── 数据库和分布式 │ │ ├── 20个数据库常见面试题讲解 - 搜云库技术团队.pdf │ │ ├── 『浅入深出』MySQL 中事务的实现.pdf │ │ ├── 分布式系统一致性(ACID、CAP、BASE、二段提交、三段提交、TCC、幂等性)原理详解.pdf │ │ ├── 分布式锁实现(基于redis-mysql).pdf │ │ ├── 数据库两大神器【索引和锁】.pdf │ │ └── 理解分布式事务 -贝聊科技.pdf │ └── 牛客网算法.txt └── 面试技术岗,你真能讲明白技术吗?.md ├── git团队协作项目操作说明.md ├── toc.py ├── 大数据 ├── DataFun技术年货大数据篇.pdf ├── DataFun技术年货搜索推荐篇.pdf ├── DataFun技术年货风控反欺诈.pdf ├── _vnote.json ├── hadoop系列 │ ├── 01MapReduce编程初步及源码分析.md │ ├── 02【MapReduce详解及源码解析(一)】——分片输入、Mapper及Map端Shuffle过程.md │ ├── _vnote.json │ ├── assets │ │ └── copycode.gif │ ├── hadoop和hive的一些面试题.zip │ ├── 使用Java API对HDFS进行系列操作.md │ ├── 大数据 │ │ ├── HDFS名词.jpg │ │ ├── MapReduce_coding.png │ │ ├── SecNamenode.jpg │ │ ├── mapreduce.jpg │ │ └── metadata.jpg │ ├── 数据倾斜解决(MR、Hive、Spark).md │ ├── 认识HDFS.md │ └── 转载 │ │ ├── HDFS 架构学习总结 _ Matt's Blog.pdf │ │ ├── YARN 架构学习总结 _ Matt's Blog.pdf │ │ └── 唯品会HDFS性能挑战和优化实践.pdf ├── spark系列 │ ├── Intel-Spark SQL优化实践.pdf │ ├── Koalas:让 pandas 轻松切换 Apache Spark,在大数据中规模应用.md │ ├── RDD完整.pdf │ ├── Spark SQL最佳实践.pdf │ ├── SparkSQL子查询源码阅读.pdf │ ├── Spark大数据相关面试.pdf │ └── _vnote.json ├── 京东大数据技术白皮书-2018.12-120页.pdf ├── 今日头条推荐系统+架构设计实践.pdf ├── 快看漫画大数据平台的模型思维与用户增长实践.pdf ├── 有赞百亿级日志系统架构设计.pdf ├── 流式数据处理在百度数据工厂应用与实践.pdf └── 用户画像相关资料 │ ├── 《奔跑吧兄弟2》电视直播观看人群用户画像报告.pdf │ ├── 《用户画像分析》专题分享.pptx │ ├── 基于用户画像的大数据挖掘实践 .pdf │ ├── 用户画像举例.pdf │ ├── 用户画像和精准化平台系统实践案例.pdf │ ├── 用户画像实战应用.pdf │ ├── 用户画像很重要-那你知道是怎么画出来的吗?.pdf │ ├── 用户画像数据建模方法.docx │ ├── 用户画像数据建模方法.pdfx.pdf │ ├── 用户画像构建.docx │ ├── 用户画像的方法、实践与行业应用.docx │ └── 用户画像的构建及应用.pdf └── 算法和数据结构 ├── LeetCode刷题心得 ├── LeetCode刷题心得.md ├── _vnote.json └── assets │ ├── Cycle.png │ ├── reverseList.png │ └── 奇偶链表.png ├── _vnote.json └── 剑指Offer ├── _vnote.json ├── 字符串.md └── 链表.md /.gitattributes: -------------------------------------------------------------------------------- 1 | # Auto detect text files and perform LF normalization 2 | * text=auto 3 | -------------------------------------------------------------------------------- /Java笔记/JVM内存管理.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/josonle/Coding-Now/32b963ff23af1e957099d03cb9f935a32cbc9373/Java笔记/JVM内存管理.jpeg -------------------------------------------------------------------------------- /Java笔记/Tips/Maven相关内容学习.md: -------------------------------------------------------------------------------- 1 | # Maven相关内容学习 2 | 3 | 我这里安装的是 maven 3.6.0 版本的,在idea中也安装了相关插件 4 | ![](assets/20191020153916868_1651964039.png) 5 | 6 | ## pom.xml文件如何配置 7 | 我这里先粘一个模版 8 | 9 | ```xml 10 | 11 | 14 | 4.0.0 15 | 16 | com.dlut.sparkLearning 17 | sparkSql 18 | 1.0-SNAPSHOT 19 | jar 20 | 21 | 22 | 2.4.0 23 | ... 24 | 25 | 26 | 27 | 28 | 29 | 30 | org.apache.spark 31 | spark-core_2.11 32 | ${spark.version} 33 | provided 34 | 35 | 36 | ... 37 | 38 | 39 | ... 40 | ... 41 | ... 42 | 43 | ... 44 | ... 45 | 46 | ``` 47 | ### 基本配置 48 | - **每个项目都只有一个pom.xml文件** 49 | - 第一行规定了xml文档的版本和编码 50 | - project是pom.xml文件的根元素,规定了一些pom相关的命名空间及xsd元素 51 | - 基本配置 52 | - modelVersion规定了pom模型的版本,maven2和3只能是4.0.0 53 | - groupId、artifactId、version是用来区分项目的基本元素,规定了项目属于哪个项目组,项目在组中唯一id,项目版本 54 | - packaging规定了项目打包方式,默认是jar。可选pom, jar, maven-plugin, ejb, war, ear, rar, par 55 | 56 | ### 依赖配置 57 | 58 | - 依赖配置 59 | - properties定义pom中的常量,比如上面定义spark版本为2.4.0,引用时通过`${spark.version}`调用即可 60 | - dependencies定义了项目中需要的一些依赖 61 | - 父项目中的依赖会被子项目所引用,通常用来申明一些公共依赖,比如java版本啥的 62 | - 我通常会在 https://mvnrepository.com 查找一些依赖jar的dependency写法 63 | - dependency详细应用在下面展开 64 | - parent用来确定父项目位置,如下 65 | - groupId、artifactId、version和上文一样,但指定的是父项目的 66 | - relativePath,maven首先在当前项目中找父项目,然后在文件系统的这个位置(relativePath),然后在本地仓库,再在远程仓库找 67 | > 仓库是个啥?可以看下这篇文章的介绍:https://juejin.im/post/5a4a5e2bf265da4322418d7f 68 | ```xml 69 | 70 | com.dlut.Bigdata 71 | spark-parent 72 | 73 | 0.0.1-SNAPSHOT 74 | 75 | ``` 76 | - dependencyManagement一般是在父项目中写,写法同dependencies。父项目定义了依赖,子项目不会直接使用相应依赖,只有子项目需要使用才引用,但无需写相关版本。可能没讲请 77 | ```xml 78 | 79 | 80 | 81 | 82 | org.apache.spark 83 | spark-core_2.11 84 | ${spark.version} 85 | provided 86 | 87 | 88 | 89 | 90 | 91 | 92 | org.apache.spark 93 | spark-core_2.11 94 | 95 | ``` 96 | - models是一些maven项目会拆分成若干模快,暂时不太清楚 97 | 98 | #### 细说依赖dependency 99 | ```xml 100 | 101 | ... 102 | ... 103 | ... 104 | 依赖类型 105 | 依赖范围 106 | 依赖是否可选 107 | 108 | 109 | 110 | 111 | 112 | 113 | 114 | 115 | ``` 116 | **我通常会在 https://mvnrepository.com 查找一些依赖jar的dependency写法** 117 | 118 | 1. groupId、artifactId和上面讲的一样,不用管 119 | 2. version是你需要考虑的,选择适合的版本 120 | 3. type是类型,默认是jar,和上面讲的packaging是一样的,不用管 121 | 4. scope是范围 122 | 1. 有*compile*(默认)、*provided*、*test*、*runtime*、*system*选项 123 | 2. 不写scope时默认是compile 124 | > | 依赖范围 | / | 125 | >| :------- | :------------------------------------------------------------------------------------------- | 126 | >| compile | 编译、测试、运行时都会用到该依赖(该依赖会编译打到jar包内,默认) | 127 | >| provided | 编译、测试时用到该依赖(运行环境中有该依赖时适用) | 128 | >| test | 编译测试代码和运行测试代码时会用到该依赖 | 129 | >| runtime | 测试、运行时用到该依赖,但编译时不会用到 | 130 | >| system | 和provided一样,但需要通过systemPath来指明依赖在系统中位置,谨慎使用,毕竟移到其他系统下位置可能不一样 | 131 | > 132 | >```xml 133 | > 134 | > 135 | > 136 | > org.apache.spark 137 | > spark-hive_2.11 138 | > 2.4.0 139 | > system 140 | > /home/xxx/Jars/spark-hive_2.11-2.4.0.jar 141 | > 142 | > ``` 143 | 5. optional可选依赖,有true和false选择 144 | 1. `true`,还是针对A->B->C这种传递依赖,如果在B的pom文件中写明C依赖是`true`,则A不会引入C依赖。如果A需要C依赖的话,需要显示添加C依赖;或者将optional设为false或去掉 145 | 2. **optional选项在统一控制版本的情况下会失效** 146 | ```xml 147 | 148 | 149 | A 150 | A 151 | 1.0-SNAPSHOT 152 | 153 | 154 | 155 | 156 | joda-time 157 | joda-time 158 | 2.9.9 159 | true 160 | 161 | 162 | 163 | 164 | B 165 | B 166 | 1.0-SNAPSHOT 167 | 168 | 169 | A 170 | A 171 | 1.0-SNAPSHOT 172 | 173 | 174 | 175 | 176 | 177 | joda-time 178 | joda-time 179 | 180 | 181 | ``` 182 | 6. exclusions用来排除传递性依赖,主动排除子项目传递过来的依赖 183 | > 传递性依赖,项目A依赖B,B中又对C有依赖,所以A也间接对C依赖,有传递之意。不用管那么多,Maven会解析各个直接依赖的pom文件,将那些必要的间接依赖,以传递性依赖的形式引入到当前的项目中 184 | > 不过有一点要记得,compile依赖范围选项会把该依赖打进jar包中,所以该依赖是直接打进项目还是借助环境中现有的依赖要考虑清除 185 | 186 | - 只需要groupId和artifactId 187 | - 排除一些不适合的版本的依赖 188 | ```xml 189 | 190 | ... 191 | ... 192 | ... 193 | 194 | 195 | 196 | A 197 | A 198 | 199 | 200 | 201 | 202 | 203 | A 204 | A 205 | ... 206 | ... 207 | 208 | ``` 209 | 210 | 211 | ### 构建配置 212 | 213 | - 构建配置 214 | - 215 | ## setting.xml文件如何配置 216 | 217 | 218 | ### 参考文章 219 | - https://www.jianshu.com/p/0e3a1f9c9ce7 220 | - https://juejin.im/post/5a4a5e2bf265da4322418d7f -------------------------------------------------------------------------------- /Java笔记/Tips/_vnote.json: -------------------------------------------------------------------------------- 1 | { 2 | "created_time": "2019-05-17T09:44:08Z", 3 | "files": [ 4 | { 5 | "attachment_folder": "", 6 | "attachments": [ 7 | ], 8 | "created_time": "2019-05-17T09:44:08Z", 9 | "modified_time": "2019-05-17T09:44:08Z", 10 | "name": "finally语句如何执行.md", 11 | "tags": [ 12 | ] 13 | }, 14 | { 15 | "attachment_folder": "", 16 | "attachments": [ 17 | ], 18 | "created_time": "2019-10-20T07:37:29Z", 19 | "modified_time": "2019-10-21T15:18:16Z", 20 | "name": "Maven相关内容学习.md", 21 | "tags": [ 22 | ] 23 | } 24 | ], 25 | "sub_directories": [ 26 | ], 27 | "version": "1" 28 | } 29 | -------------------------------------------------------------------------------- /Java笔记/Tips/assets/20191020153916868_1651964039.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/josonle/Coding-Now/32b963ff23af1e957099d03cb9f935a32cbc9373/Java笔记/Tips/assets/20191020153916868_1651964039.png -------------------------------------------------------------------------------- /Java笔记/Tips/finally语句如何执行.md: -------------------------------------------------------------------------------- 1 | ## finally语句如何执行 2 | 一般是在try...catch...finally中配对使用finally,多用来释放资源。虽然这个点很简单,但还是有些地方需要注意的。 3 | - 无论try是否发生异常,finally语句都会执行 4 | - 如果try/catch中包含控制转移语句(return、continue、break),finally都会在这些控制语句前执行 5 | - 但是像try/catch中有`System.exit(0)`退出JVM,或者Daemon线程退出(也就是线程被中断,被kill),finally语句都不会执行 6 | 7 | ```java 8 | public class testFinally{ 9 | public static int test(){ 10 | try{ 11 | Integer.parseInt("execption"); 12 | System.out.println("block 0"); 13 | }catch (Exception e){ 14 | System.out.println("block 1"); 15 | //System.exit(0);//取消的话直接退出 16 | return iamReturn(); 17 | }finally{ 18 | System.out.println("block 2"); 19 | return 2; 20 | } 21 | } 22 | public static int iamReturn() { 23 | System.out.println("return block"); 24 | return 666; 25 | } 26 | public static void main(String[] args){ 27 | System.out.println(test()); 28 | } 29 | } 30 | ``` 31 | 输出: 32 | > block 1 33 | return block 34 | block 2 35 | 2 36 | 37 | ```java 38 | public class testFinally1{ 39 | public static int test(){ 40 | try{ 41 | System.out.println("block 0"); 42 | return 1; 43 | }catch (Exception e){ 44 | System.out.println("block 1"); 45 | //return 2; 46 | }finally{ 47 | System.out.println("block 2"); 48 | //return 3; 49 | } 50 | return 4;//小心这里,可能会出现不可达的情况,比如finally中有return,或者try/catch都有return 51 | } 52 | 53 | public static void main(String[] args){ 54 | System.out.println(test()); 55 | } 56 | } 57 | ``` 58 | 输出: 59 | > block 0 60 | block 2 61 | 1 62 | 63 | ```java 64 | public class testFinally2{ 65 | public static int test(){ 66 | int i = 0; 67 | try{ 68 | return i; 69 | }finally{ 70 | i++;//++i也罢 71 | } 72 | } 73 | public static void main(String[] args){ 74 | System.out.println(test()); 75 | } 76 | } 77 | ``` 78 | 输出: 79 | > 0 80 | 81 | 这个还是输出0,不是1,即使finally会先于try种的return执行,这个涉及jvm如何编译finally语句 82 | > Java 虚拟机会把 finally 语句块作为 subroutine(对于这个 subroutine 不知该如何翻译为好,干脆就不翻译了,免得产生歧义和误解。)直接插入到 try 语句块或者 catch 语句块的控制转移语句之前。但是,还有另外一个不可忽视的因素,那就是在执行 subroutine(也就是 finally 语句块)之前,try 或者 catch 语句块会保留其返回值到本地变量表(Local Variable Table)中。待 subroutine 执行完毕之后,再恢复保留的返回值到操作数栈中,然后通过 return 或者 throw 语句将其返回给该方法的调用者(invoker)。请注意,前文中我们曾经提到过 return、throw 和 break、continue 的区别,对于这条规则(保留返回值),只适用于 return 和 throw 语句,不适用于 break 和 continue 语句,因为它们根本就没有返回值。 83 | 84 | 这个还是挺秀的,之前都没注意过,今天看到提到了就记下来了 -------------------------------------------------------------------------------- /Java笔记/_vnote.json: -------------------------------------------------------------------------------- 1 | { 2 | "created_time": "2019-05-17T09:44:08Z", 3 | "files": [ 4 | { 5 | "attachment_folder": "", 6 | "attachments": [ 7 | ], 8 | "created_time": "2019-05-17T09:44:08Z", 9 | "modified_time": "2019-05-17T09:44:08Z", 10 | "name": "java并发编程的艺术.md", 11 | "tags": [ 12 | ] 13 | }, 14 | { 15 | "attachment_folder": "", 16 | "attachments": [ 17 | ], 18 | "created_time": "2019-05-17T09:44:08Z", 19 | "modified_time": "2019-05-17T09:44:08Z", 20 | "name": "java核心技术卷计划.md", 21 | "tags": [ 22 | ] 23 | }, 24 | { 25 | "attachment_folder": "", 26 | "attachments": [ 27 | ], 28 | "created_time": "2019-05-17T09:44:08Z", 29 | "modified_time": "2019-05-17T09:44:08Z", 30 | "name": "深入理解Java虚拟机.md", 31 | "tags": [ 32 | ] 33 | }, 34 | { 35 | "attachment_folder": "", 36 | "attachments": [ 37 | ], 38 | "created_time": "2019-05-17T09:44:08Z", 39 | "modified_time": "2019-05-17T09:44:08Z", 40 | "name": "读一读JVM.md", 41 | "tags": [ 42 | ] 43 | } 44 | ], 45 | "sub_directories": [ 46 | { 47 | "name": "Tips" 48 | }, 49 | { 50 | "name": "设计模式" 51 | } 52 | ], 53 | "version": "1" 54 | } 55 | -------------------------------------------------------------------------------- /Java笔记/assets/1551267436382.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/josonle/Coding-Now/32b963ff23af1e957099d03cb9f935a32cbc9373/Java笔记/assets/1551267436382.png -------------------------------------------------------------------------------- /Java笔记/assets/1551268923990.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/josonle/Coding-Now/32b963ff23af1e957099d03cb9f935a32cbc9373/Java笔记/assets/1551268923990.png -------------------------------------------------------------------------------- /Java笔记/assets/1551271953665.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/josonle/Coding-Now/32b963ff23af1e957099d03cb9f935a32cbc9373/Java笔记/assets/1551271953665.png -------------------------------------------------------------------------------- /Java笔记/assets/1551512824910.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/josonle/Coding-Now/32b963ff23af1e957099d03cb9f935a32cbc9373/Java笔记/assets/1551512824910.png -------------------------------------------------------------------------------- /Java笔记/assets/1551517542209.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/josonle/Coding-Now/32b963ff23af1e957099d03cb9f935a32cbc9373/Java笔记/assets/1551517542209.png -------------------------------------------------------------------------------- /Java笔记/assets/1551626172914.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/josonle/Coding-Now/32b963ff23af1e957099d03cb9f935a32cbc9373/Java笔记/assets/1551626172914.png -------------------------------------------------------------------------------- /Java笔记/assets/1551628646433.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/josonle/Coding-Now/32b963ff23af1e957099d03cb9f935a32cbc9373/Java笔记/assets/1551628646433.png -------------------------------------------------------------------------------- /Java笔记/assets/1551708631498.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/josonle/Coding-Now/32b963ff23af1e957099d03cb9f935a32cbc9373/Java笔记/assets/1551708631498.png -------------------------------------------------------------------------------- /Java笔记/assets/1551859303006.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/josonle/Coding-Now/32b963ff23af1e957099d03cb9f935a32cbc9373/Java笔记/assets/1551859303006.png -------------------------------------------------------------------------------- /Java笔记/assets/1552270512675.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/josonle/Coding-Now/32b963ff23af1e957099d03cb9f935a32cbc9373/Java笔记/assets/1552270512675.png -------------------------------------------------------------------------------- /Java笔记/assets/1552270979760.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/josonle/Coding-Now/32b963ff23af1e957099d03cb9f935a32cbc9373/Java笔记/assets/1552270979760.png -------------------------------------------------------------------------------- /Java笔记/assets/1552274222807.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/josonle/Coding-Now/32b963ff23af1e957099d03cb9f935a32cbc9373/Java笔记/assets/1552274222807.png -------------------------------------------------------------------------------- /Java笔记/assets/22f72b18415405c3e0207925a8de74fa_hd.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/josonle/Coding-Now/32b963ff23af1e957099d03cb9f935a32cbc9373/Java笔记/assets/22f72b18415405c3e0207925a8de74fa_hd.jpg -------------------------------------------------------------------------------- /Java笔记/assets/640-1551860568789.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/josonle/Coding-Now/32b963ff23af1e957099d03cb9f935a32cbc9373/Java笔记/assets/640-1551860568789.webp -------------------------------------------------------------------------------- /Java笔记/assets/640-1551878862223.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/josonle/Coding-Now/32b963ff23af1e957099d03cb9f935a32cbc9373/Java笔记/assets/640-1551878862223.webp -------------------------------------------------------------------------------- /Java笔记/assets/640-1551955088595.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/josonle/Coding-Now/32b963ff23af1e957099d03cb9f935a32cbc9373/Java笔记/assets/640-1551955088595.webp -------------------------------------------------------------------------------- /Java笔记/assets/640-1551958892751.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/josonle/Coding-Now/32b963ff23af1e957099d03cb9f935a32cbc9373/Java笔记/assets/640-1551958892751.webp -------------------------------------------------------------------------------- /Java笔记/assets/640.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/josonle/Coding-Now/32b963ff23af1e957099d03cb9f935a32cbc9373/Java笔记/assets/640.webp -------------------------------------------------------------------------------- /Java笔记/assets/Collection.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/josonle/Coding-Now/32b963ff23af1e957099d03cb9f935a32cbc9373/Java笔记/assets/Collection.jpg -------------------------------------------------------------------------------- /Java笔记/assets/thread.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/josonle/Coding-Now/32b963ff23af1e957099d03cb9f935a32cbc9373/Java笔记/assets/thread.jpg -------------------------------------------------------------------------------- /Java笔记/java并发编程的艺术.md: -------------------------------------------------------------------------------- 1 | ## Java提供的四种常用线程池解析 2 | 3 | 既然楼主踩坑就是使用了 JDK 的默认实现,那么再来看看这些默认实现到底干了什么,封装了哪些参数。简而言之 Executors 工厂方法Executors.newCachedThreadPool() 提供了无界线程池,可以进行自动线程回收;Executors.newFixedThreadPool(int) 提供了固定大小线程池,内部使用无界队列;Executors.newSingleThreadExecutor() 提供了单个后台线程。 4 | 5 | 详细介绍一下上述四种线程池。 6 | 7 | ### newCachedThreadPool 8 | 9 | ```text 10 | public static ExecutorService newCachedThreadPool() { 11 | return new ThreadPoolExecutor(0, Integer.MAX_VALUE, 12 | 60L, TimeUnit.SECONDS, 13 | new SynchronousQueue()); 14 | } 15 | ``` 16 | 17 | 在newCachedThreadPool中如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。 18 | 初看该构造函数时我有这样的疑惑:核心线程池为0,那按照前面所讲的线程池策略新任务来临时无法进入核心线程池,只能进入 SynchronousQueue中进行等待,而SynchronousQueue的大小为1,那岂不是第一个任务到达时只能等待在队列中,直到第二个任务到达发现无法进入队列才能创建第一个线程? 19 | 这个问题的答案在上面讲SynchronousQueue时其实已经给出了,要将一个元素放入SynchronousQueue中,必须有另一个线程正在等待接收这个元素。因此即便SynchronousQueue一开始为空且大小为1,第一个任务也无法放入其中,因为没有线程在等待从SynchronousQueue中取走元素。因此第一个任务到达时便会创建一个新线程执行该任务。 20 | 21 | ### newFixedThreadPool 22 | 23 | ```text 24 | public static ExecutorService newFixedThreadPool(int nThreads) { 25 | return new ThreadPoolExecutor(nThreads, nThreads, 26 | 0L, TimeUnit.MILLISECONDS, 27 | new LinkedBlockingQueue()); 28 | } 29 | ``` 30 | 31 | 看代码一目了然了,线程数量固定,使用无限大的队列。再次强调,楼主就是踩的这个无限大队列的坑。 32 | 33 | ### newScheduledThreadPool 34 | 35 | 创建一个定长线程池,支持定时及周期性任务执行。 36 | 37 | ```text 38 | public static ScheduledExecutorService newScheduledThreadPool(int corePoolSize) { 39 | return new ScheduledThreadPoolExecutor(corePoolSize); 40 | } 41 | ``` 42 | 43 | 在来看看ScheduledThreadPoolExecutor()的构造函数 44 | 45 | ```text 46 | public ScheduledThreadPoolExecutor(int corePoolSize) { 47 | super(corePoolSize, Integer.MAX_VALUE, 0, NANOSECONDS, 48 | new DelayedWorkQueue()); 49 | } 50 | ``` 51 | 52 | ScheduledThreadPoolExecutor的父类即ThreadPoolExecutor,因此这里各参数含义和上面一样。值得关心的是DelayedWorkQueue这个阻塞对列,在上面没有介绍,它作为静态内部类就在ScheduledThreadPoolExecutor中进行了实现。简单的说,DelayedWorkQueue是一个无界队列,它能按一定的顺序对工作队列中的元素进行排列。 53 | 54 | ### newSingleThreadExecutor 55 | 56 | 创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行。 57 | 58 | ```text 59 | public static ScheduledExecutorService newSingleThreadScheduledExecutor() { 60 | return new DelegatedScheduledExecutorService 61 | (new ScheduledThreadPoolExecutor(1)); 62 | } 63 | ``` 64 | 65 | 首先new了一个线程数目为 1 的ScheduledThreadPoolExecutor,再把该对象传入DelegatedScheduledExecutorService中,看看DelegatedScheduledExecutorService的实现代码: 66 | 67 | ```text 68 | DelegatedScheduledExecutorService(ScheduledExecutorService executor) { 69 | super(executor); 70 | e = executor; 71 | } 72 | ``` 73 | 74 | 在看看它的父类 75 | 76 | ```text 77 | DelegatedExecutorService(ExecutorService executor) { 78 | e = executor; 79 | } 80 | ``` 81 | 82 | 其实就是使用装饰模式增强了ScheduledExecutorService(1)的功能,不仅确保只有一个线程顺序执行任务,也保证线程意外终止后会重新创建一个线程继续执行任务。 83 | 84 | > 见: -------------------------------------------------------------------------------- /Java笔记/深入理解Java虚拟机.md: -------------------------------------------------------------------------------- 1 | ### JVM堆内存分布 2 | 3 | 4 | 5 | ### JVM堆内存分配策略 6 | 7 | 分新生代、老年代、永久代(jdk 1.8之后替换成了Metaspace) 8 | 9 | - 新生代 【8:1:1】 10 | 11 | - Eden区+Survivor1区+Survivor2区,Eden和Survivor默认8:1,两块Survivor一样大(读完本书可以知道是因为新生代多采取复制清除GC算法) 12 | - 对象优先在 Eden 分配 13 | 14 | - 老年代 【新生代:老年代=1:2】 15 | 16 | - 大对象直接放入老年代 17 | 18 | - 长期存活的对象晋入老年代 19 | 20 | > 动态对象年龄判断: 21 | > 22 | > 对象最新进入Eden区,进过第一次MinorGC后如果该对象任然存活,移入Survivor区,并维护一个年龄计数器,设为1。后续如果再次经过一次MinorGC,还没死亡的话年龄计数器自增1,如果年龄超过15,自动晋入老年代。或者相同年龄的对象超过Survivor内存区域一般时,也会自动把这些对象移入老年代 23 | 24 | - 永久代在jdk 1.8中被Metaspace元空间取代 25 | 26 | - 参考:[Java8内存模型—永久代(PermGen)和元空间(Metaspace)](https://www.cnblogs.com/paddix/p/5309550.html) 27 | - 可由**-XX:MaxPermSize**进行设置,永久代也称为方法区 ,用来存放类的信息、常量池、方法数据、方法代码等 28 | - 元空间不再是存放在虚拟机中了,而是直接使用本地内存 29 | 30 | > 永久代也是会发生垃圾回收的,但有三点条件: 31 | > 32 | > 1. 该类的实例都被回收。 33 | > 34 | > 2. 加载该类的classLoader已经被回收 35 | > 36 | > 3. 该类不能通过反射访问到其方法,而且该类的java.lang.class没有被引用 37 | > 38 | > 满足这三个条件可以回收,但回不回收还得看jvm 39 | > 40 | > 但很少说永久代垃圾回收,垃圾回收侧重新生代、永久代 41 | 42 | #### 堆内存各区域比例及相关控制参数 43 | 44 | 总的来说,堆可分为新生代+老年代,可由参数**–Xms(初始堆大小)、-Xmx(最大堆大小)**来控制大小,新生代大小由参数**-Xmn**控制,新生代三块分区比例可由**–XX:SurvivorRatio**控制,新生代和老年代比例可由参数**–XX:NewRatio**控制 45 | 46 | 47 | 48 | ### 如何判断对象已死亡? 49 | 50 | #### 引用计数法 51 | 52 | 最容易想到的就是这种,每有一个引用指向对象,引用计数器就加一,引用失效就减一。一旦引用计数器为0,表明对象已死亡,可回收。 53 | 54 | **问题是如果两个对象相互引用,引用计数器始终不会为0** 55 | 56 | 57 | 58 | #### 可达性分析算法 59 | 60 | 提出一个GC Roots 对象的概念,GC Roots为起点向下搜索,所走过的路径为引用链,如果没有GC Roots对象到该对象的引用链,表明该对象可回收 61 | 62 | - GC Roots对象包含哪些? 63 | - JVM虚拟机栈中引用的对象(栈帧是对象调用方法时生成的,具体说是局部变量表中引用的对象) 64 | - 本地方法栈中的JNI引用的对象(Java Native Interface缩写,Native方法是jav调用其他语言的方法,多用来提高效率、和底层硬件、小做系统交互) 65 | - 方法区中静态变量、常量引用的对象 66 | 67 | ![img](assets/22f72b18415405c3e0207925a8de74fa_hd.jpg) 68 | 69 | [图片引自:Gityuan的回答 - 知乎](https://www.zhihu.com/question/21539353/answer/95667088) 70 | 71 | 如图,像对象实例1、2、4、6是GC Roots可达的,3和5是可被回收的 72 | 73 | 74 | 75 | > 这里有个问题是,搜索时是采用广度优先还是深度优先搜索?搞不清 76 | 77 | ### 什么时候会进行垃圾回收GC? 78 | 79 | 垃圾回收不能像C++似的手动进行,java中是由JVM自动判断进行GC的,但System.gc()可以提示进行GC 80 | 81 | 82 | 83 | - 新生代内存空间不足时,会进行Minor GC 84 | - 长期存活的对象由新生代晋升入老年代时,老年代内存空间不足的话也会进行full GC 85 | 86 | #### 看下对象的引用 87 | 88 | 引用分为四种:强引用、软引用、弱引用、虚引用 89 | 90 | - 强引用:强引用存在的话,即使内存不够,也不会对强引用对象回收。`P p = new P()`就是强引用 91 | - 软引用:内存空间足够时,不会回收;不足时才会对其回收。**可用来实现内存敏感的高速缓存** 92 | - 弱引用:垃圾回收器扫描到弱引用对象时就会对其回收,无论内存空间足不足 93 | - 虚引用:“虚”字可知,表明该引用可有可无。该虚引用对象被垃圾回收器回收时候,系统能够接收到一个通知 94 | 95 | 96 | 97 | ### GC 算法有哪些? 98 | 99 | - 标志-清除法 100 | - 适合老年代 101 | - 问题:标记和清除效率不高、内存空间碎片化的问题 102 | - 标志-整理法 103 | - 适合老年代 104 | - 也是为了解决碎片问题,标志同上,但会将所有存活的对象向一端移动,再回收 105 | - 复制清除法 106 | - 适合新生代 107 | - 两块一样大小的内存,每次用一块,这也是它的缺点(内存只使用一半) 108 | - 每次只对一块内存空间回收,效率高,不会出现空间碎片 109 | - 分代收集法 【用的最多的GC算法】 110 | - 根据新生代和老年代对象的性质,采取新生代使用复制清除法,老年代使用标志-清除/整理法 111 | - 新生代会有大量对象死亡,所以Minor GC发生频率高,而老年代中对象存活率高,GC没那么频繁 112 | 113 | ### 垃圾回收器 114 | 115 | #### Serial回收器 116 | 117 | 单线程、独占式GC 118 | 119 | #### ParNew回收器 120 | 121 | 多线程的Serial 122 | 123 | #### CMS回收器 124 | 125 | 126 | 127 | #### G1回收器 128 | 129 | 130 | 131 | ### 补充 132 | 133 | 看到一篇博客提到了死亡对象如何搜索BFS、DFS,有点兴趣,[见此](http://blog.jobbole.com/109833/) 134 | 135 | > 为什么新生代用广度搜索,老生代用深度搜索? 136 | > 137 | > 深度优先DFS一般采用递归方式实现,处理tracing的时候,可能会导致栈空间溢出,所以一般采用广度优先来实现tracing(递归情况下容易爆栈)。 138 | > 广度优先的拷贝顺序使得GC后对象的空间局部性(memory locality)变差(相关变量散开了)。 139 | > 广度优先搜索法一般无回溯操作,即入栈和出栈的操作,所以运行速度比深度优先搜索算法法要快些。 140 | > 深度优先搜索法占内存少但速度较慢,广度优先搜索算法占内存多但速度较快。 141 | > 142 | > 结合深搜和广搜的实现,以及新生代移动数量小,老生代数量大的情况,我们可以得到了解答。 -------------------------------------------------------------------------------- /Java笔记/设计模式/_vnote.json: -------------------------------------------------------------------------------- 1 | { 2 | "created_time": "2019-05-17T09:44:08Z", 3 | "files": [ 4 | { 5 | "attachment_folder": "", 6 | "attachments": [ 7 | ], 8 | "created_time": "2019-05-17T09:44:08Z", 9 | "modified_time": "2019-05-17T09:44:08Z", 10 | "name": "单例模式.md", 11 | "tags": [ 12 | ] 13 | } 14 | ], 15 | "sub_directories": [ 16 | ], 17 | "version": "1" 18 | } 19 | -------------------------------------------------------------------------------- /Java笔记/设计模式/code/Singleton.java: -------------------------------------------------------------------------------- 1 | public class Singleton{ 2 | private Singleton() {}; 3 | //懒汉式 4 | private static Singleton single = null; 5 | //解决线程安全问题 6 | public static Synchronized Singleton getInstance(){ 7 | if(single==null){ 8 | single = new Singleton(); 9 | } 10 | return single; 11 | } 12 | ` //双重检查锁定 13 | private volatile static Singleton single1 = null; 14 | public static Singleton getInstance(){ 15 | if(single1==null){ 16 | synchronized(Singleton.class){ 17 | if(single1==null) 18 | single1 = new Singleton(); 19 | } 20 | } 21 | return single; 22 | } 23 | //静态内部类方式 24 | //final解决多线程问题,也减去了判断single是否实例化的性能 25 | public static class LazyHolder{ 26 | private static final Singleton ISTANCE = new Singleton(); 27 | } 28 | public static Singleton getInstance(){ 29 | return LazyHolder.INSTANCE; 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /Java笔记/设计模式/code/Singleton1.java: -------------------------------------------------------------------------------- 1 | public class Singleton1{ 2 | public static final Singleton1 single = new Singleton(); 3 | private Singleton1() {}; 4 | 5 | public static Singleton1 getInstance(){ 6 | return single; 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /Java笔记/设计模式/单例模式.md: -------------------------------------------------------------------------------- 1 | ### 懒汉式单例模式 2 | 3 | ```java 4 | public class Singleton{ 5 | private Singleton(){}; 6 | private static Singleton single = null; 7 | //存在线程安全问题 8 | public static Singleton getInstance(){ 9 | if(single==null) 10 | single = new Singleton(); 11 | return single; 12 | } 13 | } 14 | ``` 15 | 16 | ```java 17 | public class Singleton{ 18 | private Singleton() {}; 19 | //懒汉式 20 | private static Singleton single = null; 21 | //解决线程安全问题 22 | public static Synchronized Singleton getInstance(){ 23 | if(single==null){ 24 | single = new Singleton(); 25 | } 26 | return single; 27 | } 28 | } 29 | ``` 30 | 31 | ```java 32 | public class Singleton{ 33 | private Singleton() {}; 34 | //双重检查锁定 35 | private volatile static Singleton single1 = null; 36 | public static Singleton getInstance(){ 37 | if(single1==null){ 38 | synchronized(Singleton.class){ 39 | if(single1==null) 40 | single1 = new Singleton(); 41 | } 42 | } 43 | return single; 44 | } 45 | } 46 | ``` 47 | 双重检查锁定有一个地方要注意,single要用volatile修饰,因为JMM模型的特点,要保证内存的可见性,以及避免无序写入 48 | > 参考:https://www.iteye.com/topic/652440 49 | 50 | ```java 51 | public class Singleton{ 52 | private Singleton(){}; 53 | //静态内部类方式 54 | //final解决多线程问题,也减去了判断single是否实例化的性能 55 | public static class LazyHolder{ 56 | private static final Singleton ISTANCE = new Singleton(); 57 | } 58 | public static Singleton getInstance(){ 59 | return LazyHolder.INSTANCE; 60 | } 61 | } 62 | ``` 63 | 用内部类实现延迟加载 64 | 65 | ### 饿汉式单例模式 66 | 区别于懒汉式是类初始化时就会生成实例对象,而懒汉式是调用getInstance方法时才会生成实例 67 | 68 | ```java 69 | public class Singleton{ 70 | //final修饰,线程安全,且唯一 71 | private final static Singleton single = new Singleton(); 72 | 73 | private Singleton(){}; 74 | public static Singleton getInstance(){ 75 | return single; 76 | } 77 | } 78 | ``` 79 | ### 登记式单例模式 80 | 省略 81 | 82 | ### 懒汉和饿汉比较 83 | 除了实例对象创建的时间,还有懒汉是非线程安全的只有自己实现,而饿汉是线程安全的。饿汉式无论用不用该实例都已经分配了内存,但第一次调用时速度也更快。 84 | 其次是,上面懒汉式的几种写法区别。 85 | - `public static Synchronized Singleton getInstance()`是同步的,效率会低,毕竟大多数时并不需要同步 86 | - 相比而言,双重检查锁定会先判断single是否空来减少同步保证,但也实现了线程安全 87 | - 静态内部类方式利用了classloader的机制来保证初始化instance时只有一个线程 88 | 89 | ### 参考 90 | - https://blog.csdn.net/jason0539/article/details/23297037 91 | - https://www.iteye.com/topic/652440 -------------------------------------------------------------------------------- /Java笔记/读一读JVM.md: -------------------------------------------------------------------------------- 1 | ### Class文件和类结构 2 | 3 | 类初始化时会谈及加载、验证过程,后者会检查class文件是否符合JVM的规定。JVM规范严格定义了CLASS文件的格式 4 | 5 | ### 类加载过程 6 | 7 | 类是怎样被JVM使用的?JVM会先找到类的入口,也就是main方法,通过JNI方法和Class类对象沟通 8 | 9 | #### 加载 10 | 11 | 第一步就是**加载**:首先是找到类(通过类的全限定名来获取定义该类的二进制流),然后通过**类加载器**将类装载到JVM实例中(具体是通过IO从硬盘或者网络读取读取Class二进制文件,将字节流中的静态存储结构转为方法区中运行时数据结构,并在内存中生成一个该类的Class对象作为类中数据结构的入口)。本质上就是把class文件读取到内存中 12 | 13 | > #### 聊下类加载器和双亲委派机制 14 | > 15 | > JVM启动时会把JRE默认的一些类加载到内存,这部分类(JRE提供的底层所需的类)使用的加载器是JVM默认内置的由C/C++实现 16 | > 17 | > - Bootstrap ClassLoader:包含在JVM内的,由C++实现,负责加载`JAVA_HOME/lib`下或者`-Xbootclasspath`指定路径下的类(实际是 `/jre/lib`下的类) 18 | > 19 | > > `URL[] urls = sun.misc.Launcher.getBootstrapClassPath().getURLs();` 20 | > 21 | > - Extension ClassLoader:独立于JVM外,Java实现的,加载`JAVA_HOME/lib/ext`下或者`java.ext.dirs`系统变量指定的路径下的类(实际打印可以发现是`jre/lib/ext`下的类) 22 | > 23 | > ![](assets/深度截图_选择区域_20190509091416.png) 24 | > 25 | > - Application ClassLoader:独立于JVM外,java实现,加载`-classpath`用户路径下的类(具体类加载器是`sun.misc.Launcher$AppClassLoader`) 26 | > 27 | > - 用户自定义类加载器:加载第三方类,具体是继承ClassLoader类,重写findClass和loadClass方法来自定义获取CLASS文件的目的 28 | > 29 | > ```java 30 | > //ClassLoader中loadClass方法 31 | > protected Class loadClass(String name, boolean resolve) 32 | > throws ClassNotFoundException 33 | > { 34 | > synchronized (getClassLoadingLock(name)) { 35 | > // First, check if the class has already been loaded,看缓存有没有没有才去找 36 | > Class c = findLoadedClass(name); 37 | > if (c == null) { 38 | > long t0 = System.nanoTime(); 39 | > try { 40 | > //先看是不是最顶层,如果不是则parent为空,然后获取父类 41 | > if (parent != null) { 42 | > c = parent.loadClass(name, false); 43 | > } else { 44 | > //如果为空则说明应用启动类加载器,让它去加载 45 | > c = findBootstrapClassOrNull(name); 46 | > } 47 | > } catch (ClassNotFoundException e) { 48 | > // ClassNotFoundException thrown if class not found 49 | > // from the non-null parent class loader 50 | > } 51 | > if (c == null) { 52 | > // If still not found, then invoke findClass in order 53 | > //如果还是没有就调用自己的方法,确保调用自己方法前都使用了父类方法,如此递归三次到顶 54 | > long t1 = System.nanoTime(); 55 | > c = findClass(name); 56 | > // this is the defining class loader; record the stats 57 | > sun.misc.PerfCounter.getParentDelegationTime().addTime(t1 - t0); 58 | > sun.misc.PerfCounter.getFindClassTime().addElapsedTimeFrom(t1); 59 | > sun.misc.PerfCounter.getFindClasses().increment(); 60 | > } 61 | > } 62 | > if (resolve) { 63 | > resolveClass(c); 64 | > } 65 | > return c; 66 | > } 67 | > } 68 | > protected Class findClass(String name) throws ClassNotFoundException { 69 | > throw new ClassNotFoundException(name); 70 | > } 71 | > ``` 72 | > 73 | > 74 | > 75 | > - 双亲委派模型 76 | > 77 | > 定义不细说,就是类加载器优先把类加载请求交付给父类加载器去加载,层层递归,直到父类加载器无法加载才尝试自己加载该类(最多迭代三次可达到BootStrap ClassLoader)。 78 | > 79 | > 好处是类有了层次性划分,不重复加载已有的类以及维护类的唯一性,因为**类本身和加载这个类的类加载器来确定这个类在JVM中的唯一性**,比如书中举例`java.lang.Object`层层交付会由BootStrap ClassLoader加载(到JAVA_HOME/lib下rt.jar中去找),哪怕你自己写了个`java.lang.Object`还是会层层交付最终还是BootStrap ClassLoader来加载,使得JVM中只会出现一个`java.lang.Object`对象。如果不双亲委派可能会出现多个Object对象,整个系统就乱套了 80 | > 81 | > - 破坏双亲委派机制 82 | 83 | - 何时会触发类加载器加载class文件 84 | 85 | 继承场景,子类的创建触发父类加载;反射场景,通过对象反射获取类对象;类作为入口场景,即包含main方法的类首先会被加载;通过new创建对象、直接调用static属性、方法、代码块的场景(getstatic/putstatic/invokestatic字节码指令) 86 | 87 | #### 验证、准备、解析 【归属于链接阶段】 88 | 89 | class文件被加载到内存中后并非直接使用,想想就知道,要是不符合规范不就是留了个后门安全隐患 90 | 91 | - 验证不通过会报VerifyError。 `- Xverify:none `参数可以关闭验证,可见验证阶段非强制的 92 | - 准备,即验证通过后为static变量分配内存并赋零值(0、null这些),不过遇到静态常量时会赋初值。准备阶段更不一定会发生,比如没有static变量 93 | - 解析,引用字面量转化为直接变量空间 【??????**具体干啥待细看**】 94 | 95 | 96 | 97 | #### 初始化 98 | 99 | 把变量的初始值和构造方法的内容初始化到变量的空间里面 100 | 101 | #### 使用 102 | 103 | #### 卸载 104 | 105 | ### JMM(运行时内存分布) 106 | 107 | 108 | 109 | ### 垃圾回收 110 | 111 | ### 对象的四种引用及使用场景 112 | 113 | 强(**StrongReference**)、软(**SoftReference**)、弱(**WeakReference**)、虚(**PhantomReference**)引用 114 | 115 | 强引用,`A a = new A();`引用对象a就是强引用,不管内存够不够都不会被GC回收 116 | 117 | 软引用,`SoftReference softReference = new SoftReference(new Object());`常用于本地缓存,内存不足时会被回收 118 | 119 | 弱引用,`WeakReference weakReference = new WeakReference(new Object());`一旦发生GC就会被回收,也可用于本地缓存(**但多不用,因为弱引用会导致GC升高,软引用在内存足够时对GC无影响**,本地cache的场景下尽量使用软引用减少对GC产生的影响) 120 | 121 | > ### 解决引用导致GC升高问题 122 | > 123 | > `-XX:+PrintReferenceGC`可以查看哪种引用处理时间长 124 | > 125 | > `jmap -dump`再通过dump堆内内存镜像,后续通过MAT查找相关引用并定位到相关代码,对代码优化 126 | > 127 | > `-XX:+ParallelRefProcEnabled`无法优化代码时,可通过该参数来加快引用处理 128 | 129 | 虚引用,这种引用好比没有,其意义也就是在引用对象回收时返回一个信息,多用来跟踪对象何时被回收,防止资源泄露等 130 | 131 | 引用对象的回收不是一次GC就能解决的,像软、弱、虚引用都会对应一个引用队列,GC第一次扫描会将引用对象放入队列中,第二次GC时才会回收引用对象 132 | 133 | #### 参考 134 | 135 | - [从一个Young GC变慢的案例来聊聊finalize方法]() 136 | - 看不太懂,涉及gc的分析,没有实际经验 137 | - [你确定你真的了解Java四种引用(强引用、弱引用、软引用、虚引用)了吗?]() 138 | 139 | 140 | 141 | ### JDK自带的命令行工具 142 | 143 | 144 | 145 | ### JVM问题分析和调优 146 | 147 | 148 | 149 | #### 参考 150 | 151 | - [JVM问题分析处理手册]() -------------------------------------------------------------------------------- /Linux命令及Shell脚本学习笔记/Linux大棚命令百篇(上)/_vnote.json: -------------------------------------------------------------------------------- 1 | { 2 | "created_time": "2019-10-06T07:44:00Z", 3 | "files": [ 4 | { 5 | "attachment_folder": "", 6 | "attachments": [ 7 | ], 8 | "created_time": "2019-10-07T10:12:52Z", 9 | "modified_time": "2019-10-26T06:24:26Z", 10 | "name": "什么是Shell.md", 11 | "tags": [ 12 | ] 13 | } 14 | ], 15 | "sub_directories": [ 16 | ], 17 | "version": "1" 18 | } 19 | -------------------------------------------------------------------------------- /Linux命令及Shell脚本学习笔记/Linux大棚命令百篇(上)/assets/20191007182630566_2108786728.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/josonle/Coding-Now/32b963ff23af1e957099d03cb9f935a32cbc9373/Linux命令及Shell脚本学习笔记/Linux大棚命令百篇(上)/assets/20191007182630566_2108786728.png -------------------------------------------------------------------------------- /Linux命令及Shell脚本学习笔记/Linux大棚命令百篇(上)/assets/20191008220031920_1820220481.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/josonle/Coding-Now/32b963ff23af1e957099d03cb9f935a32cbc9373/Linux命令及Shell脚本学习笔记/Linux大棚命令百篇(上)/assets/20191008220031920_1820220481.png -------------------------------------------------------------------------------- /Linux命令及Shell脚本学习笔记/Linux大棚命令百篇(上)/assets/20191008220315271_1564072186.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/josonle/Coding-Now/32b963ff23af1e957099d03cb9f935a32cbc9373/Linux命令及Shell脚本学习笔记/Linux大棚命令百篇(上)/assets/20191008220315271_1564072186.png -------------------------------------------------------------------------------- /Linux命令及Shell脚本学习笔记/Linux大棚命令百篇(上)/assets/20191025111117600_875492706.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/josonle/Coding-Now/32b963ff23af1e957099d03cb9f935a32cbc9373/Linux命令及Shell脚本学习笔记/Linux大棚命令百篇(上)/assets/20191025111117600_875492706.png -------------------------------------------------------------------------------- /Linux命令及Shell脚本学习笔记/Linux大棚命令百篇(上)/assets/20191025111321005_1206297223.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/josonle/Coding-Now/32b963ff23af1e957099d03cb9f935a32cbc9373/Linux命令及Shell脚本学习笔记/Linux大棚命令百篇(上)/assets/20191025111321005_1206297223.png -------------------------------------------------------------------------------- /Linux命令及Shell脚本学习笔记/Linux大棚命令百篇(上)/assets/20191025111736272_44758469.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/josonle/Coding-Now/32b963ff23af1e957099d03cb9f935a32cbc9373/Linux命令及Shell脚本学习笔记/Linux大棚命令百篇(上)/assets/20191025111736272_44758469.png -------------------------------------------------------------------------------- /Linux命令及Shell脚本学习笔记/Linux大棚命令百篇(上)/assets/20191025112205069_1587054822.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/josonle/Coding-Now/32b963ff23af1e957099d03cb9f935a32cbc9373/Linux命令及Shell脚本学习笔记/Linux大棚命令百篇(上)/assets/20191025112205069_1587054822.png -------------------------------------------------------------------------------- /Linux命令及Shell脚本学习笔记/Linux大棚命令百篇(上)/assets/20191025121416871_1717319503.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/josonle/Coding-Now/32b963ff23af1e957099d03cb9f935a32cbc9373/Linux命令及Shell脚本学习笔记/Linux大棚命令百篇(上)/assets/20191025121416871_1717319503.png -------------------------------------------------------------------------------- /Linux命令及Shell脚本学习笔记/Linux大棚命令百篇(上)/什么是Shell.md: -------------------------------------------------------------------------------- 1 | # 什么是Shell 2 | 3 | - 查看当前系统安装了哪些Shell 4 | 5 | `/etc/shells`文件中有记录 6 | ```shell 7 | [josonlee@josonlee-PC:~/Desktop/Shell-Learning]$ cat /etc/shells 8 | # /etc/shells: valid login shells 9 | /bin/sh 10 | /bin/bash 11 | /bin/rbash 12 | /bin/dash 13 | ``` 14 | - 查看当前系统采用的Shell 15 | ```shell 16 | [josonlee@josonlee-PC:~/Desktop/Shell-Learning]$ echo $SHELL 17 | /bin/bash 18 | ``` 19 | 用的多的主要是bash和zsh,bash是主流采用的,zsh功能更强大,还完全兼容bash 20 | 21 | ```shell 22 | apt-get install zsh 23 | chsh -s /bin/zsh 24 | ``` 25 | 可以安装zsh,并切换Shell类型为zsh(重新登陆才会生效) 26 | 27 | # 用export来展示Shell环境变量 28 | 29 | 自己在Linux下配过java环境或是其他环境的话,都会遇过export这个命令吧,一般会在`~/.bashrc`文件中通过它把环境变量导入系统,比如常见的`$PATH`。直接export可以查看所有的Shell的环境变量,下面截了部分图 30 | ![](assets/20191007182630566_2108786728.png) 31 | 32 | 除了export,还有env、set、declare可以查看Shell的环境变量,区别是export/env是显示当前用户的环境变量,set/declare是显示当前的环境变量和用户自定义变量,但又有些不一样的地方。我感觉具体啥也不用管,知道如何修改设置Shell环境变量就可以了 33 | 34 | - 通过export设置环境变量 35 | 36 | 之前说的`$PATH`这个环境变量,代表的是绝对路径,如果一条命令运行时没指定其绝对路径,系统就会去`$PATH`申明下的路径去找 37 | 38 | ```shell 39 | # $PATH变量的值由通过冒号分隔的多个路径组成 40 | # 如下是添加scala的绝对路径 41 | export PATH=$SCALA_HOME/:$PATH 42 | ``` 43 | > 通过export设置的变量是环境变量,没使用而是直接定义的是自定义变量。 44 | > 环境变量可以在其进程的子进程中继续生效,自定义变量不能 45 | 46 | # 需要知道的Linux命令 47 | ## cat命令 48 | 49 | ![](assets/20191008220315271_1564072186.png) 50 | ## 用read来读取键盘或者文件输入 51 | ![](assets/20191008220031920_1820220481.png) 52 | 53 | ## 不仅仅是计算的expr 54 | 55 | - 四则运算 56 | - 每项用空格分隔开 57 | - 对Shell中的特殊字符需要转义,像`*`、`()`等 58 | - 对包含空格和其他特殊字符的字符要用引号括起来 59 | 60 | ```shell 61 | [josonlee@josonlee-PC:~/Desktop/Shell-Learning]$ expr 1+1 62 | 1+1 63 | [josonlee@josonlee-PC:~/Desktop/Shell-Learning]$ expr 1 + 1 64 | 2 65 | [josonlee@josonlee-PC:~/Desktop/Shell-Learning]$ expr 1 / 1 66 | 1 67 | [josonlee@josonlee-PC:~/Desktop/Shell-Learning]$ expr 1 - 1 68 | 0 69 | [josonlee@josonlee-PC:~/Desktop/Shell-Learning]$ expr 1 * 2 70 | expr: 语法错误 71 | [josonlee@josonlee-PC:~/Desktop/Shell-Learning]$ expr 1 \* 2 72 | 2 73 | [josonlee@josonlee-PC:~/Desktop/Shell-Learning]$ expr \( 1 + 1 \) \* 2 74 | 4 75 | ``` 76 | 77 | - 字符串操作 78 | - match匹配(返回) 79 | - substr截取(要注意默认的下标是从1开始) 80 | - index起始位置(要注意默认的下标是从1开始) 81 | - length字串长度 82 | ```shell 83 | [josonlee@josonlee-PC:~/Desktop/Shell-Learning]$ expr length "abcde" 84 | 5 85 | [josonlee@josonlee-PC:~/Desktop/Shell-Learning]$ expr index "abcde" "cd" 86 | 3 87 | [josonlee@josonlee-PC:~/Desktop/Shell-Learning]$ expr substr "abcde" 1 2 88 | ab 89 | [josonlee@josonlee-PC:~/Desktop/Shell-Learning]$ expr match "abcde" ".*d" 90 | 4 91 | ``` 92 | 93 | ## history历史相关的命令 94 | 就是查看历史输入命令,有几点需要注意: 95 | - `!+行号`就是执行历史输入的命令,还可以用`Ctrl+r`搜索 96 | ![](assets/20191025111117600_875492706.png) 97 | 98 | - `history -c`清空内存中的历史输入记录,但是记录任然保存在`~/.bash_history`文件中 99 | ![](assets/20191025111321005_1206297223.png) 100 | 101 | - `history -cw`先清空内存中的记录,再覆盖掉`~/.bash_history`文件,才能彻底清除 102 | - `history -d offset` 清除内存中第offset条记录 103 | - history的配置项 104 | - 比如设置历史记录的时间,`export HISTTIMEFORMAT='%F %T'` 105 | ![](assets/20191025111736272_44758469.png) 106 | - `export HISTSIZE=1000`设置内存中保存的历史记录条数 107 | - `export HISTFILESIZE=50000`设置文件中保存的历史记录条数 108 | - 避免记录重要隐式命令,比如密码啥的 109 | ![](assets/20191025112205069_1587054822.png) 110 | 111 | ## xargs读取标准输入中你想要的内容 112 | 113 | > 书里是这样写的:“xargs,是execute arguments的缩写,它的作用是从标准输入中读取内容,并将 114 | 此内容传递给它要协助的命令,并作为那个命令的参数来执行” 115 | 116 | 和管道符`|`非常相似,但区别在于`|`只能把前面的标准输出作为后面命令的标准输入,但这个输入无法作为后面命令的参数,而xargs的强处在于将标准输入作为其后命令的参数 117 | ![](assets/20191025121416871_1717319503.png) 118 | 119 | > 注意:xargs的标准输入中出现的换行符、空格、制表符都会被空格取代 120 | 121 | -------------------------------------------------------------------------------- /Linux命令及Shell脚本学习笔记/README.md: -------------------------------------------------------------------------------- 1 | Linux学习参考自: 2 | 3 | - 北风网的一个视频,好早前的 4 | - B站的一个视频,你可以在B站上搜索"Linux 韩顺平"找到。我后来又找到了这门课的课件,见《韩顺平_Linux(大数据 javaEE python 开发通用版).pdf》 5 | - Linux公社的博文 6 | - 其他博客 -------------------------------------------------------------------------------- /Linux命令及Shell脚本学习笔记/Vi快捷操作学习.md: -------------------------------------------------------------------------------- 1 | - vi/vim使用 【了解些简单使用即可,现在不都是用编辑器的多嘛】 2 | - [Vim初学者入门指南](https://linux.cn/article-8143-1.html) 3 | - [Vim 快捷键速查表](https://linux.cn/article-8144-1.html) 4 | - [5 个针对有经验用户的 Vim 技巧](https://linux.cn/article-8148-1.html) 5 | - [3 个针对高级用户的 Vim 编辑器有用技巧](https://linux.cn/article-8149-1.html) 6 | - 补充一些操作 7 | - 如何显示行号?按Esc后`:set nu`,取消显示`:set nu!` 8 | - 修改vi的配置文件,比如上面的显示行号可以设置为永久 9 | ``` 10 | set number #显示行号 11 | set ruler #右下方显示光标当前位置 12 | set autoindent #设置自动缩进对齐 13 | set showmatch #设置匹配模式,类似当输入一个左括号时会匹配相应的右括号 14 | set ai! #设置自动缩进 15 | syntax on #设置语法高亮 16 | ``` 17 | > 修改vimrc文件,可以通过`locate vimrc`查询文件在哪里,我这里是在`/etc/vim/vimrc`,直接把上面的内容添加到末尾即可 18 | 19 | - 复制粘贴一定要学 20 | - 光标移到要复制的行,esc,如输入y2(复制当前和下面的两行),再移动光标到要粘贴的位置,按p即可 21 | - 或者esc,按v进入可视模式,移动光标选中要复制的多行,按y,然后移动光标到要粘贴的位置,按p即可 22 | - 今天看到一个,`esc`,`:`,然后`9,12 copy 13`指的是9到12行内容复制到第13行(copy可用move替换) 23 | > esc下按u可以取消更改 24 | 25 | - 删除 26 | - `dd`删除一行 27 | - `ndd`删除以当前行开始的n行 28 | - `dw`删除以当前字符开始的一个字符 29 | - `ndw`删除以当前字符开始的n个字符 30 | - `d$、D`删除以当前字符开始的一行字符 31 | - `d)`删除到下一句的开始 32 | - `d}`删除到下一段的开始 33 | - `d回车`删除2行 34 | 35 | > 参考:[在vim中快速复制粘贴多行](https://www.cnblogs.com/MMLoveMeMM/articles/3707287.html) -------------------------------------------------------------------------------- /Linux命令及Shell脚本学习笔记/_vnote.json: -------------------------------------------------------------------------------- 1 | { 2 | "created_time": "2019-05-17T09:44:08Z", 3 | "files": [ 4 | { 5 | "attachment_folder": "", 6 | "attachments": [ 7 | ], 8 | "created_time": "2019-05-17T09:44:08Z", 9 | "modified_time": "2019-05-17T09:44:08Z", 10 | "name": "README.md", 11 | "tags": [ 12 | ] 13 | }, 14 | { 15 | "attachment_folder": "", 16 | "attachments": [ 17 | ], 18 | "created_time": "2019-05-17T09:44:08Z", 19 | "modified_time": "2019-05-17T09:44:08Z", 20 | "name": "rpm命令使用.md", 21 | "tags": [ 22 | ] 23 | }, 24 | { 25 | "attachment_folder": "", 26 | "attachments": [ 27 | ], 28 | "created_time": "2019-05-17T09:44:08Z", 29 | "modified_time": "2019-10-09T12:38:14Z", 30 | "name": "Vi快捷操作学习.md", 31 | "tags": [ 32 | ] 33 | }, 34 | { 35 | "attachment_folder": "", 36 | "attachments": [ 37 | ], 38 | "created_time": "2019-05-17T09:44:08Z", 39 | "modified_time": "2019-05-17T09:44:08Z", 40 | "name": "Windows转Linux之常用命令学习(一).md", 41 | "tags": [ 42 | ] 43 | }, 44 | { 45 | "attachment_folder": "", 46 | "attachments": [ 47 | ], 48 | "created_time": "2019-05-17T09:44:08Z", 49 | "modified_time": "2019-07-03T02:44:46Z", 50 | "name": "Windows转Linux之常用命令学习(二).md", 51 | "tags": [ 52 | ] 53 | }, 54 | { 55 | "attachment_folder": "", 56 | "attachments": [ 57 | ], 58 | "created_time": "2019-05-17T09:44:08Z", 59 | "modified_time": "2019-05-17T09:44:08Z", 60 | "name": "包管理工具apt使用.md", 61 | "tags": [ 62 | ] 63 | }, 64 | { 65 | "attachment_folder": "", 66 | "attachments": [ 67 | ], 68 | "created_time": "2019-05-17T09:44:08Z", 69 | "modified_time": "2019-05-17T09:44:08Z", 70 | "name": "包管理工具yum使用.md", 71 | "tags": [ 72 | ] 73 | }, 74 | { 75 | "attachment_folder": "", 76 | "attachments": [ 77 | ], 78 | "created_time": "2019-05-17T09:44:08Z", 79 | "modified_time": "2019-05-17T09:44:08Z", 80 | "name": "终端常用快捷键.md", 81 | "tags": [ 82 | ] 83 | } 84 | ], 85 | "sub_directories": [ 86 | { 87 | "name": "Linux大棚命令百篇(上)" 88 | } 89 | ], 90 | "version": "1" 91 | } 92 | -------------------------------------------------------------------------------- /Linux命令及Shell脚本学习笔记/assets/1546870348043.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/josonle/Coding-Now/32b963ff23af1e957099d03cb9f935a32cbc9373/Linux命令及Shell脚本学习笔记/assets/1546870348043.png -------------------------------------------------------------------------------- /Linux命令及Shell脚本学习笔记/assets/1546872241318.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/josonle/Coding-Now/32b963ff23af1e957099d03cb9f935a32cbc9373/Linux命令及Shell脚本学习笔记/assets/1546872241318.png -------------------------------------------------------------------------------- /Linux命令及Shell脚本学习笔记/assets/apt使用.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/josonle/Coding-Now/32b963ff23af1e957099d03cb9f935a32cbc9373/Linux命令及Shell脚本学习笔记/assets/apt使用.png -------------------------------------------------------------------------------- /Linux命令及Shell脚本学习笔记/assets/crontab.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/josonle/Coding-Now/32b963ff23af1e957099d03cb9f935a32cbc9373/Linux命令及Shell脚本学习笔记/assets/crontab.png -------------------------------------------------------------------------------- /Linux命令及Shell脚本学习笔记/assets/df.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/josonle/Coding-Now/32b963ff23af1e957099d03cb9f935a32cbc9373/Linux命令及Shell脚本学习笔记/assets/df.png -------------------------------------------------------------------------------- /Linux命令及Shell脚本学习笔记/assets/du-0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/josonle/Coding-Now/32b963ff23af1e957099d03cb9f935a32cbc9373/Linux命令及Shell脚本学习笔记/assets/du-0.png -------------------------------------------------------------------------------- /Linux命令及Shell脚本学习笔记/assets/du-exclude.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/josonle/Coding-Now/32b963ff23af1e957099d03cb9f935a32cbc9373/Linux命令及Shell脚本学习笔记/assets/du-exclude.png -------------------------------------------------------------------------------- /Linux命令及Shell脚本学习笔记/assets/du-h.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/josonle/Coding-Now/32b963ff23af1e957099d03cb9f935a32cbc9373/Linux命令及Shell脚本学习笔记/assets/du-h.png -------------------------------------------------------------------------------- /Linux命令及Shell脚本学习笔记/assets/du-maxdepth.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/josonle/Coding-Now/32b963ff23af1e957099d03cb9f935a32cbc9373/Linux命令及Shell脚本学习笔记/assets/du-maxdepth.png -------------------------------------------------------------------------------- /Linux命令及Shell脚本学习笔记/assets/fdisk.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/josonle/Coding-Now/32b963ff23af1e957099d03cb9f935a32cbc9373/Linux命令及Shell脚本学习笔记/assets/fdisk.png -------------------------------------------------------------------------------- /Linux命令及Shell脚本学习笔记/assets/gb18030.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/josonle/Coding-Now/32b963ff23af1e957099d03cb9f935a32cbc9373/Linux命令及Shell脚本学习笔记/assets/gb18030.png -------------------------------------------------------------------------------- /Linux命令及Shell脚本学习笔记/assets/history.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/josonle/Coding-Now/32b963ff23af1e957099d03cb9f935a32cbc9373/Linux命令及Shell脚本学习笔记/assets/history.png -------------------------------------------------------------------------------- /Linux命令及Shell脚本学习笔记/assets/selinux.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/josonle/Coding-Now/32b963ff23af1e957099d03cb9f935a32cbc9373/Linux命令及Shell脚本学习笔记/assets/selinux.png -------------------------------------------------------------------------------- /Linux命令及Shell脚本学习笔记/assets/ssh连接失败.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/josonle/Coding-Now/32b963ff23af1e957099d03cb9f935a32cbc9373/Linux命令及Shell脚本学习笔记/assets/ssh连接失败.png -------------------------------------------------------------------------------- /Linux命令及Shell脚本学习笔记/assets/vi常用命令.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/josonle/Coding-Now/32b963ff23af1e957099d03cb9f935a32cbc9373/Linux命令及Shell脚本学习笔记/assets/vi常用命令.png -------------------------------------------------------------------------------- /Linux命令及Shell脚本学习笔记/assets/系统信息.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/josonle/Coding-Now/32b963ff23af1e957099d03cb9f935a32cbc9373/Linux命令及Shell脚本学习笔记/assets/系统信息.png -------------------------------------------------------------------------------- /Linux命令及Shell脚本学习笔记/包管理工具apt使用.md: -------------------------------------------------------------------------------- 1 | 2 | 包管理工具 `apt` 的常用命令如下: 3 | ``` 4 | sudo apt install #安装软件包 5 | sudo apt search #搜索软件包 6 | sudo apt purge #卸载软件包 7 | sudo dpkg -l #显示已安装的软件包列表 8 | sudo dpkg -l | grep #查找指定的软件包 9 | sudo dpkg -i .deb #安装软件包 10 | sudo dpkg -r #仅卸载软件包 11 | sudo dpkg -P #卸载软件包并删除其配置文件 12 | ``` 13 | 14 | dpkg是Debian Package的简写,是为Debian 专门开发的套件管理系统,方便软件的安装、更新及移除。Debian的Linux发行版都使用dpkg,例如Ubuntu、Deepin 15 | 16 | 1. 下载的软件包存放位置:/var/cache/apt/archives 17 | 18 | 2. 安装后软件默认位置:/usr/share 19 | 20 | 3. 可执行文件位置:/usr/bin 21 | 22 | 4. 配置文件位置:/etc 23 | 24 | 5. lib文件位置:/usr/lib 25 | 26 | ``` 27 | # Written by com.deepin.daemon.Grub2 28 | DEEPIN_GFXMODE_DETECT=2 29 | GRUB_CMDLINE_LINUX="" 30 | GRUB_CMDLINE_LINUX_DEFAULT="splash quiet " 31 | GRUB_DEFAULT=0 32 | GRUB_DISTRIBUTOR="`/usr/bin/lsb_release -d -s 2>/dev/null || echo Deepin`" 33 | GRUB_GFXMODE=1366x768,1360x768,1280x720,1024x768,auto 34 | GRUB_THEME=/boot/grub/themes/deepin-fallback/theme.txt 35 | GRUB_TIMEOUT=5 36 | nouveau.modeset=0 37 | ``` 38 | 39 | 清理apt下载的软件包缓存和不再需要的软件包、卸载软件后的残留配置文件 40 | 41 | ``` 42 | #清理旧版本的软件缓存 43 | sudo apt-get autoclean 44 | #清理所有软件缓存 45 | sudo apt-get clean 46 | #删除系统不再使用的孤立软件 47 | sudo apt-get autoremove 48 | #清除所有已删除包的残馀配置文件 49 | dpkg -l |grep ^rc|awk '{print $2}' |sudo xargs dpkg -P 50 | ``` -------------------------------------------------------------------------------- /Linux命令及Shell脚本学习笔记/包管理工具yum使用.md: -------------------------------------------------------------------------------- 1 | ## yum命令使用 2 | ### yum的命令形式一般是如下: 3 | 4 | ``` 5 | yum [options] [command] [package ...] 6 | ``` 7 | [options]是可选的,选项包括-h(帮助),-y(当安装过程提示选择全部为"yes"),-q(不显示安装的过程)等等。[command]为所要进行的操作,[package ...]是操作的对象。 8 | 9 | ### 常用的命令包括: 10 | 11 | ``` 12 | #自动搜索最快镜像插件: 13 | yum install yum-fastestmirror 14 | #安装yum图形窗口插件: 15 | yum install yumex 16 | #查看可能批量安装的列表: 17 | yum grouplist 18 | ``` 19 | 20 | ### 安装 21 | 22 | ``` 23 | yum install //全部安装 24 | yum install package1 //安装指定的安装包package1 25 | yum groupinsall group1 //安装程序组group1 26 | ``` 27 | 28 | ### 更新和升级 29 | 30 | ``` 31 | yum update //全部更新 32 | yum update package1 //更新指定程序包package1 33 | yum check-update //检查可更新的程序 34 | yum upgrade package1 //升级指定程序包package1 35 | yum groupupdate group1 //升级程序组group1 36 | ``` 37 | 38 | ### 查找和显示 39 | 40 | ``` 41 | yum info package1 //显示安装包信息package1 42 | yum list //显示所有已经安装和可以安装的程序包 43 | yum list package1 //显示指定程序包安装情况package1 44 | yum groupinfo group1 //显示程序组group1信息 45 | yum search string //根据关键字string查找安装包 46 | ``` 47 | ### 删除程序 48 | 49 | ``` 50 | yum remove | erase package1 //删除程序包package1 51 | yum groupremove group1 //删除程序组group1 52 | yum deplist package1 //查看程序package1依赖情况 53 | ``` 54 | 55 | ### 清除缓存 56 | 57 | ``` 58 | yum clean packages //清除缓存目录下的软件包 59 | yum clean headers //清除缓存目录下的 headers 60 | yum clean oldheaders //清除缓存目录下旧的 headers 61 | yum clean, yum clean all (= yum clean packages; yum clean oldheaders) //清除缓存目录下的 62 | ``` 63 | 64 | *** 65 | 66 | **1.yum的一切配置信息都储存在一个叫yum.conf的配置文件中,通常位于/etc目 录下,这是整个yum系统的重中之重。** 67 | 看下这个文件: 68 | 69 | ``` 70 | $ sudo more /etc/yum.conf 71 | [main] 72 | cachedir=/var/cache/yum 73 | keepcache=0 74 | debuglevel=2 75 | logfile=/var/log/yum.log 76 | exactarch=1 77 | obsoletes=1 78 | gpgcheck=1 79 | plugins=1 80 | metadata_expire=1800 81 | # PUT YOUR REPOS HERE OR IN separate files named file.repo 82 | # in /etc/yum.repos.d 83 | ``` 84 | 85 | 下面简单的对这一文件作简要的说明: 86 | 87 | > cachedir:yum缓存的目录,yum在此存储下载的rpm包和数据库,一般是/var/cache/yum。 88 | > debuglevel:除错级别,0──10,默认是2 89 | > logfile:yum的日志文件,默认是/var/log/yum.log。 90 | > exactarch,有两个选项1和0,代表是否只升级和你安装软件包cpu体系一致的包,如果设为1,则如你安装了一个i386的rpm,则yum不会用686的包来升级。 91 | > gpgchkeck= 有1和0两个选择,分别代表是否是否进行gpg校验,如果没有这一项,默认好像也是检查的。 92 | 93 | **2.好了,接下来就是yum的使用了,首先用yum来升级软件,yum的操作大都须有超级用户的权限,当然可以用sudo。** 94 | `yum update`,这一步是必须的,yum会从服务器的header目录下载rpm的header,放在本地的缓存中,这可能会花费一定的时间,但比起yum 给我们带来方便,这些时间的花费又算的了什么呢? 95 | header下载完毕,yum会判断是否有可更新的软件包,如果有,它会询问你的意见,是否更新,选择更新,这时yum开始下载软件包并使用调用rpm安装,这可能要一定时间,取决于要更新软件的数目和网络状况,万一网络断了,也没关系,再 进行一次就可以了。 96 | 升级完毕,以后每天只要使用`yum check-update`检查一下有无跟新,如果有,就用`yum update`进行跟新,时刻保持系统为最新,堵住一切发现的漏洞。 97 | 用**yum update packagename** 对某个单独包进行升级。 98 | 99 | 现在简单的把yum软件升级的一些命令罗列一下: 100 | (更新:我在安装wine的时候是用rpm一个一个安装的,先安装以来关系,然后在安装wine的主包,但是刚刚在论坛上发现来一个好的帖子,就yum的本地安装。参数是-localinstall 101 | `$yum localinstall wine-*` 102 | 这样的话,yum会自动安装所有的依赖关系,而不用rpm一个一个的安装了,省了好多工作。还有一个与他类似的参数: 103 | `$yum localupdate wine-*` 104 | 如果有wine的新版本,而且你也下载到来本地,就可以这样本地更新wine了。) 105 | 106 | ``` 107 | 1. 列出所有可更新的软件清单 108 | 命令:yum check-update 109 | 2. 安装所有更新软件 110 | 命令:yum update 111 | 3. 仅安装指定的软件 112 | 命令:yum install 113 | 4. 仅更新指定的软件 114 | 命令:yum update 115 | 5. 列出所有可安裝的软件清单 116 | 命令:yum list 117 | ``` 118 | 119 | **3. 使用yum安装和卸载软件,有个前提是yum安装的软件包都是rpm格式的。** 120 | 安装的命令是,yum install xxx, 121 | yum会查询数据库,有无这一软件包,如果有软件包,则检查其依赖冲突关系。如果没有依赖冲突,那么下载安装;如果有依赖冲突,则会给出提示,询问是否要同时安装依赖,或删除冲突的包,你可以自己作出判断 122 | 删除的命令是,`yum remove xxx`,同安装一样,yum也会查询数据库,给出解决依赖关系的提示。 123 | 124 | ``` 125 | 1.用YUM安装软件包 126 | 命令:yum install 127 | 2.用YUM删除软件包 128 | 命令:yum remove 129 | ``` 130 | 131 | **4.用yum查询想安装的软件** 132 | 我们常会碰到这样的情况,想要安装一个软件,只知道它和某方面有关,但又不能确切知道它的名字。这时yum的查询功能就起作用了。 133 | 你可以用`yum search keyword`这样的命令来进行搜索,比如我们要则安装一个`Instant Messenger`,但又不知到底有哪些,这时不妨用 `yum search messenger`这样的指令进行搜索,yum会搜索所有可用rpm的描述,列出所有描述中和messeger有关的rpm包,于是我们可能得到 gaim,kopete等等,并从中选择。 134 | 有时我们还会碰到安装了一个包,但又不知道其用途,我们可以用`yum info packagename`这个指令来获取信息。 135 | 136 | ``` 137 | 1.使用YUM查找软件包 138 | 命令:yum search 139 | 2.列出所有可安装的软件包 140 | 命令:yum list 141 | 3.列出所有可更新的软件包 142 | 命令:yum list updates 143 | 4.列出所有已安装的软件包 144 | 命令:yum list installed 145 | 5.列出所有已安装但不在 Yum Repository 內的软件包 146 | 命令:yum list extras 147 | 6.列出所指定的软件包 148 | 命令:yum list 149 | 7.使用YUM获取软件包信息 150 | 命令:yum info 151 | 8.列出所有软件包的信息 152 | 命令:yum info 153 | 9.列出所有可更新的软件包信息 154 | 命令:yum info updates 155 | 10.列出所有已安裝的软件包信息 156 | 命令:yum info installed 157 | 11.列出所有已安裝但不在 Yum Repository 內的软件包信息 158 | 命令:yum info extras 159 | 12.列出软件包提供哪些文件 160 | 命令:yum provides 161 | ``` 162 | 163 | **5. 清除YUM缓存** 164 | yum 会把下载的软件包和header存储在cache中,而不会自动删除。 165 | 如果我们觉得它们占用了磁盘空间,可以使用yum clean指令进行清除,更精确的用法是yum clean headers清除header,yum clean packages清除下载的rpm包,yum clean all 清除所有 166 | 167 | ``` 168 | 1.清除缓存目录(/var/cache/yum)下的软件包 169 | 命令:yum clean packages 170 | 2.清除缓存目录(/var/cache/yum)下的 headers 171 | 命令:yum clean headers 172 | 3.清除缓存目录(/var/cache/yum)下旧的 headers 173 | 命令:yum clean oldheaders 174 | 4.清除缓存目录(/var/cache/yum)下的软件包及旧的headers 175 | 命令:yum clean, yum clean all (= yum clean packages; yum clean oldheaders) 176 | ``` 177 | 178 | > 引自:https://www.jianshu.com/p/0cf2c57bd61b -------------------------------------------------------------------------------- /Linux命令及Shell脚本学习笔记/终端常用快捷键.md: -------------------------------------------------------------------------------- 1 | ## 终端常用快捷键归纳 2 | 3 | 我感觉用的多的还是tab、Ctrl+C/Z、Ctrl+A/E/U/W、Ctrl+R 4 | 5 | 1. Tab 6 | 这是你不能没有的 Linux 快捷键。它将节省你 Linux 命令行中的大量时间。 7 | 8 | 只需要输入一个命令,文件名,目录名甚至是命令选项的开头,并敲击 tab 键。 它将自动完成你输入的内容,或为你显示全部可能的结果。 9 | 10 | 如果你只记一个快捷键,这将是必选的一个。 11 | 12 | 2. Ctrl + C 13 | 这些是为了在终端上中断命令或进程该按的键。它将立刻终止运行的程序。 14 | 15 | 如果你想要停止使用一个正在后台运行的程序,只需按下这对组合键。 16 | 17 | 3. Ctrl + Z 18 | 该快捷键将正在运行的程序送到后台。 通常,你可以在使用 & 选项运行程序前之完成该操作, 但是如果你忘记使用选项运行程序,就使用这对组合键。 19 | 20 | 4. Ctrl + D 21 | 这对键盘快捷键将使你退出当前终端。如果你使用 SSH 连接,它将会关闭。 如果你直接使用一个终端,该应用将会立刻关闭。 22 | 23 | 把它当成“退出”命令。 24 | 25 | 5. Ctrl + L 26 | 你怎么清空你的终端屏幕?我猜是用 clear 命令。 27 | 28 | 你可以使用 Ctrl+L 清空终端,代替输入 C-L-E-A-R。得心应手,不是吗? 29 | 30 | 6. Ctrl + A 31 | 该快捷键将移动光标到所在行首。 32 | 33 | 假设你在终端输入了一个很长的命令或路径,并且你想要回到它的开头, 使用方向键移动光标将花费大量时间。注意你无法使用鼠标移动光标到行首。 34 | 35 | 这是 Ctrl+A 节省时间的地方。 36 | 37 | 7. Ctrl + E 38 | 这对快捷键与 Ctrl+A 相反。 Ctrl+A 送光标到行首,反之 Ctrl+E 移动光标到行尾。 39 | 40 | 8. Ctrl + U 41 | 输入了错误的命令? 代替用退格键来丢弃当前命令,使用 Linux 终端中的 Ctrl+U 快捷键。 该快捷键会擦除从当前光标位置到行首的全部内容。 42 | 43 | 9. Ctrl + K 44 | 这对和 Ctrl+U 快捷键有点像。 唯一的不同在于不是行首,它擦除的是从当前光标位置到行尾的全部内容。 45 | 46 | 10. Ctrl + W 47 | 你刚才了解了擦除到行首和行尾的文本。 但如果你只需要删除一个单词呢?使用 Ctrl+W 快捷键。 48 | 49 | 使用 Ctrl+W 快捷键,你可以擦除光标位置前的单词。 如果光标在一个单词本身上,它将擦除从光标位置到词首的全部字母。 50 | 51 | 最好的方法是用它移动光标到要删除单词后的一个空格上, 然后使用 Ctrl+W 键盘快捷键。 52 | 53 | 11. Ctrl + Y 54 | 这将粘贴使用 Ctrl+W,Ctrl+U 和 Ctrl+K 快捷键擦除的文本。 如果你删除了错误的文本或需要在某处使用已擦除的文本,这将派上用场。 55 | 56 | 12. Ctrl + P 57 | 你可以使用该快捷键来查看上一个命令。 你可以反复按该键来返回到历史命令。 在很多终端里,使用 PgUp 键来实现相同的功能。 58 | 59 | 13. Ctrl + N 60 | 你可以结合 Ctrl+P 使用该快捷键。Ctrl+N 显示下一个命令。 如果使用 Ctrl+P 查看上一条命令,你可以使用 Ctrl+N 来回导航。 许多终端都把此快捷键映射到 PgDn 键。 61 | 62 | 14. Ctrl + R 63 | 你可以使用该快捷键来搜索历史命令。 -------------------------------------------------------------------------------- /Linux命令及Shell脚本学习笔记/韩顺平_Linux (大数据 javaEE Python 开发通用版).pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/josonle/Coding-Now/32b963ff23af1e957099d03cb9f935a32cbc9373/Linux命令及Shell脚本学习笔记/韩顺平_Linux (大数据 javaEE Python 开发通用版).pdf -------------------------------------------------------------------------------- /Linux系统下开发环境搭建/(可参考)Deepin 15.4 Win10双系统安装教程.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/josonle/Coding-Now/32b963ff23af1e957099d03cb9f935a32cbc9373/Linux系统下开发环境搭建/(可参考)Deepin 15.4 Win10双系统安装教程.pdf -------------------------------------------------------------------------------- /Linux系统下开发环境搭建/AppImage打包方式及相关Linux游戏站推荐.md: -------------------------------------------------------------------------------- 1 | ### 2 | 3 | 其实我平时玩的也少,一般手游就可以对付。这里我也不是推销怎么在Linux下玩游戏,而是推荐一种Linux的打包方式——AppImage。【基于AppImage方式的游戏:[Linux 游戏站](https://www.linuxgame.cn/)】 4 | 5 | > 下载一个应用程序,给予运行权限,双击运行!无需安装!不需要改变依赖或系统配置。使用AppImage格式分发Linux桌面应用程序,让所有常见发行版的用户运行它。 一次打包,到处运行。 覆盖所有主流桌面系统。 6 | > 7 | > #### 简单. 8 | > 9 | > AppImage的核心思想是**一个应用程序 = 一个文件** 。每个AppImage都包含应用程序以及应用程序运行所需的所有文件。换句话说,除了操作系统本身的基础组件,Appimage不需要依赖包即可运行。 10 | > 11 | > #### 可靠. 12 | > 13 | > AppImage是**上游应用打包**的理想选择,这意味着你可以直接从开发者那里获取软件,而不需要任何中间步骤,这完全符合开发者意图。非常迅速。 14 | > 15 | > #### 快速. 16 | > 17 | > AppImage应用可以直接下载并且运行,**无需安装**,并且不需要root权限。 18 | 19 | ### 如何运行AppImage文件? 20 | 21 | - 命令行下赋予可执行权限,`chmod a+x xxx.AppImage` 22 | - 双击即可运行 23 | - 桌面图标啥的是一样创建的,具体见:[Deepin如何在启动项及桌面添加快捷方式](https://github.com/josonle/Coding-Now/blob/master/Linux%E7%B3%BB%E7%BB%9F%E4%B8%8B%E5%BC%80%E5%8F%91%E7%8E%AF%E5%A2%83%E6%90%AD%E5%BB%BA/Deepin%E4%BD%BF%E7%94%A8%E4%BD%93%E9%AA%8C%E3%80%81%E8%B5%84%E6%BA%90%E5%8F%8A%E9%97%AE%E9%A2%98%E5%BD%92%E7%BA%B3%E8%B4%B4.md#deepin%E5%A6%82%E4%BD%95%E5%9C%A8%E5%90%AF%E5%8A%A8%E9%A1%B9%E5%8F%8A%E6%A1%8C%E9%9D%A2%E6%B7%BB%E5%8A%A0%E5%BF%AB%E6%8D%B7%E6%96%B9%E5%BC%8F) 24 | 25 | ### 网址收纳 26 | 27 | 以下网址会对你有帮助的: 28 | 29 | - [Linux 游戏站](https://www.linuxgame.cn/) 30 | - [AppImage中文文档](https://doc.appimage.cn/docs/home/) 31 | - [AppImage官网](https://www.appimage.org/) 32 | - [已有AppImage应用归纳](https://appimage.github.io/) 33 | 34 | -------------------------------------------------------------------------------- /Linux系统下开发环境搭建/Deepin15.8下搭建Python开发环境.md: -------------------------------------------------------------------------------- 1 | 以下操作都在终端进行,针对Deepin15.8版本,`Ctrl+Alt+t`打开终端,或者随便哪鼠标右键即可打开 2 | `sudo su`可以切换root用户权限 3 | 4 | ### 安装pip3和pip 5 | 6 | python2.7和python3.6都已经安装好了,但是没有pip,执行下面指令 7 | 8 | ``` 9 | sudo apt install python3-pip //安装pip3 10 | sudo apt install python-pip //安装pip(对应Python2) 11 | ``` 12 | 13 | 你也可以不装pip,但有的地方还是有python2.7的需求 14 | 15 | ### 其余第三包的安装 16 | 17 | 毕竟pip都安装好了,其他的包通过 `pip install`安装即可 18 | 19 | pip版本老旧更新问题:命令行下输入:`pip install --upgrade pip` 即可 20 | 21 | 还有就是这里pip源在国外,下载巨慢。可以参考这个:https://bbs.deepin.org/forum.php?mod=viewthread&tid=167144 22 | 在用户目录下配置下pip源即可,我这里选的是阿里云的,也推荐中科大的速度也很快 23 | 24 | ``` 25 | mkdir ~/.pip //创建一个.pip目录 26 | vi ~/.pip/pip.conf //创建并修改旗下的pip.conf文件 27 | 28 | #写入下面内容 29 | [global] 30 | index-url = https://mirrors.aliyun.com/pypi/simple/ 31 | 32 | [install] 33 | trusted-host=mirrors.aliyun.com 34 | ``` 35 | > 阿里云:http://mirrors.aliyun.com/pypi/simple 36 | 中科大:https://pypi.mirrors.ustc.edu.cn/simple/ 37 | 豆瓣:http://pypi.douban.com/simple/ 38 | 39 | 40 | ### pycharm安装 41 | - 官网下载linux版本的pycharm,我这里下的是专业版(pycharm-professional-2018.3.3.tar.gz,我有edu账号) 42 | - 解压到`/home/用户/`目录下,`tar -zxvf pycharm-professional-2018.3.3.tar.gz -C ~` 43 | - 解压会产生一个pycharm-2018.3.3文件夹,其下bin目录中会有一个pycharm.sh脚本,`./pycharm.sh`执行即可安装 44 | - 安装过程依据提示进行,大多是默认选项,下一步即可。 45 | 46 | ![](assets/pycharm安装00.png) 47 | 这个是接受用户协议,之后就是激活步骤了(省略),完成后就是如下图进行安装 48 | ![](assets/pycharm安装01.png) 49 | 50 | #### 如何添加桌面快捷方式和启动器快捷方式 51 | 52 | ![](assets/pycharm安装02.png) 53 | ![](assets/pycharm安装03.png) 54 | **按图片上创建桌面快捷方式可能没用** 55 | 56 | 怎么说呢,我的deepin是15.8版本的,安装后启动器里就已经有pycharm的图标了。没有的话,你可以命令行下: 57 | ``` 58 | ls /usr/share/applications //看下有没有一个jetbrains-pycharm.desktop 59 | ``` 60 | 它默认给我生成的jetbrains-pycharm.desktop中内容如下: 61 | ![](assets/pycharm桌面.png) 62 | 63 | 没有的话,你可以在新建一个pycharm.desktop,然后`sudo vi pycharm.desktop` 64 | ``` 65 | [Desktop Entry] 66 | Version=1.0 67 | Type=Application 68 | Name=PyCharm Professional Edition 69 | Icon=/home/josonlee/pycharm-2018.3.3/bin/pycharm.svg 70 | Exec="/home/josonlee/pycharm-2018.3.3/bin/pycharm.sh" %f 71 | Comment=Python IDE for Professional Developers 72 | Categories=Development;IDE; 73 | Terminal=false 74 | StartupWMClass=jetbrains-pycharm 75 | X-Deepin-CreatedBy=com.deepin.dde.daemon.Launcher 76 | X-Deepin-AppID=jetbrains-pycharm 77 | ``` 78 | **主要是Exec、Icon改成你pycharm安装的位置**,然后启动器里会有pycharm图标,你右键给发送到桌面即可 79 | 80 | ### 开发环境配置 81 | - numpy 82 | - pandas 83 | - scipy 84 | - matplotlib 85 | - seaborn 86 | - scikit-learn(sklearn) 87 | - Pillow(3.x好像是自带的) 88 | - jupyter notebook 89 | 90 | 以上常用,需要啥装啥吧。不知道是不是,好像linux下不用考虑这些包之间的依赖关系(比如说sklearn依赖numpy、pandas),也就是版本是否对应上,因为我每次安装时依赖的包会被重新下载安装 91 | 92 | #### 如何快速导出及安装项目依赖的的包 93 | 94 | 经常可以看到有些项目中会有requirements.txt文件,这就是这个项目依赖的第三方包,如下命令行中: 95 | ``` 96 | # 导出 97 | pip freeze > requirements.txt 98 | # 快速安装 99 | pip install -r requirements.txt 100 | ``` 101 | 我在项目中付了一个我最初安装时的[requirements.txt文件](https://github.com/josonle/Coding-Now/blob/master/Linux%E7%B3%BB%E7%BB%9F%E4%B8%8B%E5%BC%80%E5%8F%91%E7%8E%AF%E5%A2%83%E6%90%AD%E5%BB%BA/requirements.txt)配置 102 | 103 | **其次是我建议单独创建一个虚拟环境来安装这些包,和本地的环境隔离,便于开发及版本间切换等等** 104 | 105 | ### 通过pycharm创建虚拟环境 106 | ![](assets/pycharm虚拟环境00.png) 107 | 如图所示,创建环境时选择创建虚拟环境。第三步两个选择:第一个是使用本地的第三方包,不选的话完全和本地环境隔离。第二个是表示该虚拟环境也适用于其他项目 108 | 109 | ### Jupyter Notebook安装配置 110 | 强烈建议pycharm不要和Jupyter一起使用(即在pycharm中打开jupyter),不仅页面难看,而且快捷键什么的都操作不方便 111 | 如图是大概地怎样在pycharm中运行jupyter 112 | 113 | ![](assets/pycharm中运行jupyter.png) 114 | 115 | 然后在第一个cell里输入一些内容,然后shift+return(或者点击运行),pycharm就会弹框提示 116 | 117 | 注意!如果要在其他服务器上运行notebook,这时候你可以填写你所使用的服务器地址;但一般情况下,我们只是想本地编辑notebook,这里我们点击“cancel”。接着pycharm会提示”Cannot connect to Jupyter Notebook. Run Jupyter Notebook”。利用这个提示,我们在pycharm中启动本地的notebook服务器 118 | 119 | 然后,点击”Run Jupyter Notebook”,pycharm就会在本地运行notebook。 120 | 121 | 如上步骤很繁琐吧,不推荐,直接命令行下执行就可以了,见下文 122 | 123 | ### 命令行下进入pycharm创建好的虚拟环境并运行jupyter notebook 124 | 当然,你可以打开Pycharm后在下面打开Terminal后默认就进入了venv,但是pycharm太占内存了,又想用jupyter的话,还是命令行方便 125 | ![](assets/venv.png) 126 | 如图,我创建的虚拟环境DataProcessing,其下有一个`venv/bin`目录,我划红线的一个是进入虚拟环境,一个是启动jupyter的命令 127 | 128 | 如下图,`source activate`进入虚拟环境了,然后jupyter-notebook就能打开jupyter了 129 | 130 | ![](assets/启动venv.png) 131 | ### 注意事项 132 | #### pip下载的包安装在哪里? 133 | 比如说下的numpy,你直接命令行下如图输入 134 | ![](assets/pip下载在哪里.png) 135 | 可以看到在这里:`Location: /home/josonlee/.local/lib/python3.6/site-packages` 136 | -------------------------------------------------------------------------------- /Linux系统下开发环境搭建/Deepin下如何科-学(地)上-网.md: -------------------------------------------------------------------------------- 1 | 推荐这个项目,具体干嘛用的我不多说,你自己看 2 | **1. 使用截图** 3 | 4 | ![1547127856260](assets/1547127856260.png) 5 | 6 | **2. 优点介绍** 7 | ​ **1. 支持全局模式和pac双模式** 8 | ​ **2. 开机自动后自动依附在托盘(ss-qt5开机自启会弹出烦人的配置弹窗,然后手动点连接才可以)** 9 | ​ **3. 支持导入导出配置、二维码等高级功能** 10 | 11 | ![img](http://images.lolimay.cn/18-8-19/6792796.jpg) 12 | **3. 项目地址** [https://github.com/lolimay/](https://github.com/lolimay) -------------------------------------------------------------------------------- /Linux系统下开发环境搭建/Deepin下源码编译安装配置git.md: -------------------------------------------------------------------------------- 1 | ### 下载源码包 2 | 3 | 因为通过apt install方式安装的git版本不算很新,所以选择编译安装,也方便指定位置 4 | 到这里[git各个发行版本](https://github.com/git/git/tags)下载最新tar.gz源码包 5 | 6 | ### 编译安装 7 | 1. 解压 8 | `tar -zxvf git-2.21.0.tar.gz -C ~/tools` 我这里是指定解压到用户目录下的tools目录下 9 | 2. 编译安装 10 | 2.1 配置(configure) 11 | ``` 12 | make configure 13 | # 配置git安装位置,方便以后卸载(直接把/opt/git删除即可) 14 | ./configure prefix=/opt/git 15 | ``` 16 | 2.2 编译(make) 17 | ``` 18 | sudo make 19 | ``` 20 | 如果编译时候报错,如/bin/sh: autoconf: command not found,提示缺少什么就安装什么,如sudo apt install autoconf 21 | 2.3 安装(make install) 22 | ``` 23 | sudo make install 24 | ``` 25 | 3. 在bash中添加git命令 26 | ``` 27 | vi /etc/profile 28 | # 追加git的环境 29 | export PATH=$PATH:/opt/git/bin 30 | ``` 31 | 32 | 4. 使用 33 | ``` 34 | [josonlee@josonlee-PC:~]$ git --version 35 | git version 2.21.0 36 | ``` 37 | git使用可以看目录README.md中所列举几篇文章 38 | 39 | 5. 问题 40 | 我这里碰到了些问题,git在push或pull时,无法通过https方式,会被拒绝。 41 | 解决办法是直接通过ssh方式————在添加仓库时,比如`git@github.com:josonle/Coding-Now.git`,可在仓库的`.git/config`中看到 42 | `git remote set-url origin git@github.com:josonle/Coding-Now.git` 43 | 44 | ### 配置git 45 | `git-2.21.0/contrib/completion/`目录下有以下脚本 46 | 47 | - 自动tab键补齐命令 git-completion.bash 自动补全 48 | - 显示当前分支状态 git-prompt.sh 高亮显示当前分支名称 49 | 50 | 将git-completion.bash复制到用户目录`cp git-completion.bash ~/.git-completion.bash`,git-prompt.sh文件同理 51 | 52 | ``` 53 | source ~/.git-completion.bash 54 | 55 | GIT_PS1_SHOWDIRTYSTATE=true 56 | GIT_PS1_SHOWCOLORHINTS=true 57 | if [ -f ~/.git-completion.bash ]; then 58 | source ~/.git-prompt.sh 59 | PROMPT_COMMAND='__git_ps1 "[\u@\h:\w]" "\\\$ "' 60 | fi 61 | ``` -------------------------------------------------------------------------------- /Linux系统下开发环境搭建/Deepin使用体验、资源及问题归纳贴.md: -------------------------------------------------------------------------------- 1 | - 【向Linux迁移记录】Win10下双系统Deepin15.8安装记录:https://blog.csdn.net/lzw2016/article/details/86260546 2 | - 【向Linux迁移记录】快速入门学习Linux之常用命令:https://blog.csdn.net/lzw2016/article/details/86534753 3 | - 【向Linux迁移记录】Java和大数据开发环境搭建:https://blog.csdn.net/lzw2016/article/details/86566873 4 | - 【向Linux迁移记录】Deepin下Python开发环境搭建:https://blog.csdn.net/lzw2016/article/details/86567436 5 | - [【向Linux迁移记录】Deepin Linux下快速Hadoop完全分布式集群搭建](https://blog.csdn.net/lzw2016/article/details/86618345) 6 | - [【向Linux迁移记录】基于Hadoop集群的Hive安装与配置详解](https://blog.csdn.net/lzw2016/article/details/86631115) 7 | 8 | 9 | 10 | ### Win10+Deepin 双系统安装后要不要开启 安全启动 和 快速启动 11 | 12 | 我控制变量都试过了,发现安全启动是可以再开启的,快速启动也能开启,但会遇到有时在Deepin下对Windows下的磁盘分区只有读取权限不能写入删除等。这和win10的快速启动有关系,它并没有完全关机,而是将机器启动的相关信息写入磁盘,下次再次启动时加载该部分内容以到达快速效果,但为了避免其他系统试图修改这部分内容,所以会附以只读权限 13 | 14 | 15 | 16 | ### Deepin如何在启动项及桌面添加快捷方式 17 | 18 | `/usr/share/applications`该目录下配置 19 | 20 | 可以参考我如何配置eclipse的快捷方式:[配置eclipse启动图标并添加到桌面](https://github.com/josonle/Coding-Now/blob/master/Linux%E7%B3%BB%E7%BB%9F%E4%B8%8B%E5%BC%80%E5%8F%91%E7%8E%AF%E5%A2%83%E6%90%AD%E5%BB%BA/Deepin%E4%B8%8B%E6%90%AD%E5%BB%BAHadoop%E3%80%81Spark%E7%AD%89%E5%A4%A7%E6%95%B0%E6%8D%AE%E5%BC%80%E5%8F%91%E7%8E%AF%E5%A2%83.md#配置eclipse启动图标并添加到桌面) 21 | 22 | > 补充一点,用户目录下的.local/share/applications 也可以配置,有些应用会自动安装启动图标在此位置 23 | 24 | > 再补充一点,一般应用图标最好是放在`/usr/share/Icons/`下,这样的话应用打开时省的dock栏上没有图标显示 25 | 26 | ### Deepin Linux 安装启动scala报错 java.lang.NumberFormatException: For input string: "0x100" 解决 27 | 28 | java版本是jdk1.8.0_191,scala是2.11.12版本,该错误不影响scala运行 29 | 30 | ```scala 31 | josonlee@josonlee-PC:~$ scala 32 | Welcome to Scala 2.11.12 (Java HotSpot(TM) 64-Bit Server VM, Java 1.8.0_191). 33 | Type in expressions for evaluation. Or try :help. 34 | [ERROR] Failed to construct terminal; falling back to unsupported 35 | java.lang.NumberFormatException: For input string: "0x100" 36 | at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65) 37 | at java.lang.Integer.parseInt(Integer.java:580) 38 | at java.lang.Integer.valueOf(Integer.java:766) 39 | at jline.internal.InfoCmp.parseInfoCmp(InfoCmp.java:59) 40 | at jline.UnixTerminal.parseInfoCmp(UnixTerminal.java:242) 41 | at jline.UnixTerminal.(UnixTerminal.java:65) 42 | at jline.UnixTerminal.(UnixTerminal.java:50) 43 | at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) 44 | at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) 45 | at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) 46 | at java.lang.reflect.Constructor.newInstance(Constructor.java:423) 47 | at java.lang.Class.newInstance(Class.java:442) 48 | at jline.TerminalFactory.getFlavor(TerminalFactory.java:211) 49 | at jline.TerminalFactory.create(TerminalFactory.java:102) 50 | at jline.TerminalFactory.get(TerminalFactory.java:186) 51 | at jline.TerminalFactory.get(TerminalFactory.java:192) 52 | at jline.console.ConsoleReader.(ConsoleReader.java:243) 53 | at jline.console.ConsoleReader.(ConsoleReader.java:235) 54 | at jline.console.ConsoleReader.(ConsoleReader.java:223) 55 | at scala.tools.nsc.interpreter.jline.JLineConsoleReader.(JLineReader.scala:64) 56 | at scala.tools.nsc.interpreter.jline.InteractiveReader.(JLineReader.scala:33) 57 | at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) 58 | at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) 59 | at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) 60 | at java.lang.reflect.Constructor.newInstance(Constructor.java:423) 61 | at scala.tools.nsc.interpreter.ILoop$$anonfun$scala$tools$nsc$interpreter$ILoop$$instantiater$1$1.apply(ILoop.scala:858) 62 | at scala.tools.nsc.interpreter.ILoop$$anonfun$scala$tools$nsc$interpreter$ILoop$$instantiater$1$1.apply(ILoop.scala:855) 63 | at scala.tools.nsc.interpreter.ILoop.scala$tools$nsc$interpreter$ILoop$$mkReader$1(ILoop.scala:862) 64 | at scala.tools.nsc.interpreter.ILoop$$anonfun$22$$anonfun$apply$10.apply(ILoop.scala:873) 65 | at scala.tools.nsc.interpreter.ILoop$$anonfun$22$$anonfun$apply$10.apply(ILoop.scala:873) 66 | at scala.util.Try$.apply(Try.scala:192) 67 | at scala.tools.nsc.interpreter.ILoop$$anonfun$22.apply(ILoop.scala:873) 68 | at scala.tools.nsc.interpreter.ILoop$$anonfun$22.apply(ILoop.scala:873) 69 | at scala.collection.immutable.Stream.map(Stream.scala:418) 70 | at scala.tools.nsc.interpreter.ILoop.chooseReader(ILoop.scala:873) 71 | at scala.tools.nsc.interpreter.ILoop$$anonfun$process$1$$anonfun$newReader$1$1.apply(ILoop.scala:893) 72 | at scala.tools.nsc.interpreter.ILoop$$anonfun$process$1.newReader$1(ILoop.scala:893) 73 | at scala.tools.nsc.interpreter.ILoop$$anonfun$process$1.scala$tools$nsc$interpreter$ILoop$$anonfun$$preLoop$1(ILoop.scala:897) 74 | at scala.tools.nsc.interpreter.ILoop$$anonfun$process$1$$anonfun$startup$1$1.apply(ILoop.scala:964) 75 | at scala.tools.nsc.interpreter.ILoop$$anonfun$process$1.apply$mcZ$sp(ILoop.scala:990) 76 | at scala.tools.nsc.interpreter.ILoop$$anonfun$process$1.apply(ILoop.scala:891) 77 | at scala.tools.nsc.interpreter.ILoop$$anonfun$process$1.apply(ILoop.scala:891) 78 | at scala.reflect.internal.util.ScalaClassLoader$.savingContextLoader(ScalaClassLoader.scala:97) 79 | at scala.tools.nsc.interpreter.ILoop.process(ILoop.scala:891) 80 | at scala.tools.nsc.MainGenericRunner.runTarget$1(MainGenericRunner.scala:74) 81 | at scala.tools.nsc.MainGenericRunner.run$1(MainGenericRunner.scala:87) 82 | at scala.tools.nsc.MainGenericRunner.process(MainGenericRunner.scala:98) 83 | at scala.tools.nsc.MainGenericRunner$.main(MainGenericRunner.scala:103) 84 | at scala.tools.nsc.MainGenericRunner.main(MainGenericRunner.scala) 85 | 86 | scala> 87 | ``` 88 | 89 | 解决办法:https://blog.csdn.net/lzw2016/article/details/86618570 90 | 91 | 92 | 93 | ### java使用的一个warning:Picked up _JAVA_OPTIONS: -Dawt.useSystemAAFontSettings=gasp 94 | 95 | ``` 96 | # sudo vi /etc/profile 97 | 98 | ... 99 | unset _JAVA_OPTIONS 100 | # java环境配置 101 | export JAVA_HOME=/opt/jdk1.8.0_191 102 | ... 103 | 104 | # source /etc/profile 105 | ``` 106 | 107 | 建议是/etc/profile和~/.bashrc下都设置这个 108 | 109 | 110 | 111 | ### VMware tools安装问题 112 | 113 | vmware安装成功,但是启动时显示系统内核和vmware的编译接口不匹配需要更新,但是vmware tools一直安装不成功。 114 | 115 | 如何安装: 116 | 117 | 1. 虚拟机内安装open-vm-tools:`sudo apt-get install open-vm-tools open-vm-tools-desktop open-vm-tools-dkms` 118 | 2. 参考这篇文章:[Ubuntu18.04系统下全程图解安装VMware Tools的方法](https://ywnz.com/linuxjc/3144.html) 119 | 120 | 121 | 122 | 报错解决:VMware Tools - There was a problem updating a software component. Try again later and if the problem persists, contact VMware Support 123 | 124 | > 参考这个讨论:https://bbs.deepin.org/forum.php?mod=viewthread&tid=167661&extra 125 | 126 | 127 | 128 | ### 如何设置Deepin开机自启动脚本 129 | 130 | 参考: 131 | 132 | - https://bbs.deepin.org/forum.php?mod=viewthread&tid=141107&page=1#pid342463 133 | - [deepin中实现开机脚本自启的三种方法](https://www.lolimay.cn/2018/10/14/autostart-in-deepin/) 134 | 135 | ### 如何自定义鼠标右键新建文件模板,比如说markdown文件 136 | 137 | 见:[Deepin自定义右键新建文件模版.md](https://github.com/josonle/Coding-Now/blob/master/Linux%E7%B3%BB%E7%BB%9F%E4%B8%8B%E5%BC%80%E5%8F%91%E7%8E%AF%E5%A2%83%E6%90%AD%E5%BB%BA/Deepin%E8%87%AA%E5%AE%9A%E4%B9%89%E5%8F%B3%E9%94%AE%E6%96%B0%E5%BB%BA%E6%96%87%E4%BB%B6%E6%A8%A1%E7%89%88.md) 138 | 139 | 140 | 141 | ### Linux下如何玩游戏问题 142 | 143 | 其实我平时玩的也少,一般手游就可以对付。这里我也不是推销怎么在Linux下玩游戏,而是推荐一种Linux的打包方式——AppImage。【基于AppImage方式的游戏:[Linux 游戏站](https://www.linuxgame.cn/)】 144 | 145 | > 下载一个应用程序,给予运行权限,双击运行!无需安装!不需要改变依赖或系统配置。使用AppImage格式分发Linux桌面应用程序,让所有常见发行版的用户运行它。 一次打包,到处运行。 覆盖所有主流桌面系统。 146 | > 147 | > #### 简单. 148 | > 149 | > AppImage的核心思想是**一个应用程序 = 一个文件** 。每个AppImage都包含应用程序以及应用程序运行所需的所有文件。换句话说,除了操作系统本身的基础组件,Appimage不需要依赖包即可运行。 150 | > 151 | > #### 可靠. 152 | > 153 | > AppImage是**上游应用打包**的理想选择,这意味着你可以直接从开发者那里获取软件,而不需要任何中间步骤,这完全符合开发者意图。非常迅速。 154 | > 155 | > #### 快速. 156 | > 157 | > AppImage应用可以直接下载并且运行,**无需安装**,并且不需要root权限。 158 | 159 | 以下网址会对你有帮助的: 160 | 161 | - [Linux 游戏站](https://www.linuxgame.cn/) 162 | - [AppImage中文文档](https://doc.appimage.cn/docs/home/) 163 | - [AppImage官网](https://www.appimage.org/) 164 | - [已有AppImage应用归纳](https://appimage.github.io/) 165 | 166 | ### Deepin wifi密码存储在哪里? 167 | `/etc/NetworkManager/system-connections`,密码是明文存储的 168 | 169 | `/etc/network/interfaces`,这里是deepin网络相关配置的文件,像ip、网关、路由等 170 | -------------------------------------------------------------------------------- /Linux系统下开发环境搭建/Deepin常用快捷键及快捷其他操作.md: -------------------------------------------------------------------------------- 1 | 以下只在Deepin下使用成立,有些命令是其他Linux子系统也适用的 2 | 3 | 4 | 5 | ## 常用快捷键 6 | 7 | - 命令行下使用深度编辑器打开文件 `dedit fileName` 8 | - 命令行下使用默认应用程序打开文件 `dde-open fileName` 9 | 10 | 先说明键盘上的Windows图标在deepin中是Super键 11 | - Super+s 显示工作区 12 | - 在工作区中使用Ctrl+alt+数字a,可以切换到第a个工作区 13 | - 工作区间中使用Ctrl+Tab可以依次切换其中的任务 14 | - Super+a 显示所以工作区的窗口 15 | - Super+shift+<-和->可把当前窗口起到左右工作区 16 | - Super+<-和->切换左右工作区 17 | 18 | - Super+d 显示桌面 19 | - Super+e 打开文件管理器 20 | - Super 打开启动器 21 | 22 | - Ctrl+Alt+T 打开终端 23 | 24 | > **在深度终端界面上**,按下键盘上的 Ctrl + Shift + ? 组合键来查看快捷键 25 | 26 | > 在深度终端界面,点击鼠标右键。 27 | - 点击 纵向分屏,界面被分为左右两个部分。 28 | - 点击 横向分屏,界面被分为上下两个部分。 29 | tips :您也可以按下键盘上的 Ctrl+Shift+J 组合键来纵向分屏,按下键盘上的 Ctrl+Shift+H 组合键来横向分屏 30 | 31 | > 按F11键可以全屏显示终端,再按F11会退出全屏 32 | 33 | 34 | - Ctrl+Alt+A 截图 35 | - Ctrl+Alt+Delete 注销登录 36 | 37 | > 经常出现界面“卡顿”,这个时候可以按注销键(Ctrl + Alt +Delete)注销用户,而不是直接去按“电源键”,重新开机 38 | 39 | - Super+L 锁屏 40 | 41 | ## 触摸板手势使用 42 | 终端执行 43 | ``` 44 | sudo modprobe psmouse ##启用触摸板 45 | sudo rmmod psmouse ##禁用触摸板 46 | ``` 47 | 默认情况下: 48 | - 三指下滑最大化窗口 49 | - 三指左右滑窗口左右半屏幕 50 | - 三指缩放可以显示所有窗口 51 | - 二指点击相当于鼠标右键 52 | - 还有其他,如图 53 | ![](assets/触摸板手势.png) 54 | 55 | > 默认的配置文件在 /usr/share/dde-daemon/gesture.json 56 | > 不好说,我联想的本子在win10上是支持4/5指的,但deepin上不行,而且我也尝试修改配置文件,没有毛用啊 57 | 58 | 59 | 60 | ## [linux(deepin)在启动器上制作启动图标](https://blog.csdn.net/zhangjingao/article/details/76546363) 61 | 62 | -------------------------------------------------------------------------------- /Linux系统下开发环境搭建/Deepin自定义右键新建文件模版.md: -------------------------------------------------------------------------------- 1 | ### 如何重命名时修改后缀名 2 | 3 | 当然,linux下不应该叫什么后缀不后缀的,一切皆文件。但界面鼠标操作时还是会依据后缀名选择不同默认程序打开,所有能修改后缀也是有需求的。如图,Deepin Linux中在文件管理器设置里,找到该选项取消即可 4 | 5 | ![1549802209141](assets/1549802209141.png) 6 | 7 | ### 如何自定义添加右键新建文件模版 8 | 9 | 当然你可以直接命令行通过touch命令来新建,但要打开小黑框没有直接鼠标操作快,如图 10 | 11 | ![1549802355287](assets/1549802355287.png) 12 | 13 | - 方法一:在`/usr/share/templates` 新建markdown-template.desktop (我这里以markdown模版为例),添加如下内容 14 | 15 | ``` 16 | [Desktop Entry] 17 | Name=Markdown Doc 18 | Name[zh_CN]=Markdown文档 19 | Comment=Enter MD filename: 20 | Comment[zh_CN]=请输入Markdown文档名称: 21 | Type=Link 22 | URL=.source/markdown-template.md 23 | ``` 24 | 25 | Name是右键新建时显示的名称,Comment是此类型文件的新名称的标签,URL是模版文件所具有的初始内容的文件的路径。这些模版通常位于templates文件夹下的隐藏.source文件夹中,因此请使用以.source /开头的相对路径 (没有的话自己新建一个.source文件夹,然后在其中添加markdown-template.md),`Type=Link`是固定的。还有一个Icon图标,但原有的模版选项没有显示图标,所以这里也不设置 26 | 27 | 然后关闭所有文件管理器,再次打开就可以看到新的可选模版 28 | 29 | - 方法二:在用户目录下的`~/.Templates` 新建一个markdown.md即可 30 | 31 | 同样是关闭所有文管,再次打开后就可以看到。不过这种方法只适合当前用户,同时也会多一个图标 32 | 33 | ![1549804313390](assets/1549804313390.png) 34 | 35 | 参考:[Adding an entry to the Create New menu](https://userbase.kde.org/Adding_an_entry_to_the_Create_New_menu) -------------------------------------------------------------------------------- /Linux系统下开发环境搭建/Deepin设置开机自启动脚本问题.md: -------------------------------------------------------------------------------- 1 | ### 如何设置Deepin开机自启动脚本 2 | 3 | 参考: 4 | 5 | - https://bbs.deepin.org/forum.php?mod=viewthread&tid=141107&page=1#pid342463 6 | - [deepin中实现开机脚本自启的三种方法](https://www.lolimay.cn/2018/10/14/autostart-in-deepin/) 7 | 8 | -------------------------------------------------------------------------------- /Linux系统下开发环境搭建/IDEA常用快捷键.md: -------------------------------------------------------------------------------- 1 | # IDEA常用快捷键 2 | 从Eclipse变更到IDEA上开发了,快捷键这一块真的是头疼啊,重新熟悉一遍吧 3 | ## 常用 4 | > 如果记不清了,敲Ctrl+j,然后输几个模糊的字母,有提示 5 | 6 | - `sout`:System.out.println() 7 | - `fori`:for循环 8 | - `iter`:foreach循环 9 | - `itit`:遍历Iterator 10 | - `itli`:遍历List,反正`it`打头的是遍历xxx 11 | - `psvm`:main方法,它这个用的是单词首字母,像静态常量方法可以敲`psf` 12 | - `pi`:hashCode方法 13 | - `ps`:toString方法 14 | - `psfi`:public static final int 15 | - `ifn/inn`:判断null/非null 16 | 17 | - `Ctrl+Alt+L`:一键格式化代码,同eclipse的`Shift+Alt+F` 18 | - 如果冲突了,查下其他软件(搜狗输入法、qq、网易云等)的快捷键是否占用,像我这里被网易云音乐占用了,取消就行了 19 | - `Ctrl+Shift+Enter`:补全末尾的;或者语句的花括号{} 20 | - `Ctrl+Alt+Enter`:在当前行上方插入新行 21 | - `Shift+Enter`:在当前行下方插入新行 22 | - `Ctrl+Shift+上下箭头`:将当前行代码上下移动 23 | - `Ctrl+W`:选中一个单词 24 | - `Ctrl+X`:剪切,没有Ctrl+D了 25 | - 注释 26 | - `Ctrl+/`:// 27 | - `Ctrl+Shift+/`:/**/ 28 | - `/**+Enter`:Javadoc注释,类的属性、方法,类 29 | - `Alt+Enter`:给方法、变量、类加上注释,不过光标要放对位置,比如放在方法名上 30 | - 还能更改类的访问控制符,像改成private 31 | - `Shift+F6`:重命名 32 | - `Ctrl+F6`:改变函数签名(访问控制符、返回类型、函数名、参数) -------------------------------------------------------------------------------- /Linux系统下开发环境搭建/Linux中文件系统各个目录的作用.md: -------------------------------------------------------------------------------- 1 | **/ 根目录** 2 | 3 |   包含了几乎所的文件目录。相当于中央系统 4 | 5 | **/boot 引导程序,内核等存放的目录** 6 | 7 | 这个目录,包括了在引导过程中所必需的文件。在最开始的启动阶段,通过引导程序将内核加载到内存,完成内核的启动(这个时候,[虚拟文件系统](https://www.baidu.com/s?wd=%E8%99%9A%E6%8B%9F%E6%96%87%E4%BB%B6%E7%B3%BB%E7%BB%9F&tn=44039180_cpr&fenlei=mv6quAkxTZn0IZRqIHckPjm4nH00T1Yvn1-WuymsPHw-m1DdP1ck0ZwV5Hcvrjm3rH6sPfKWUMw85HfYnjn4nH6sgvPsT6KdThsqpZwYTjCEQLGCpyw9Uz4Bmy-bIi4WUvYETgN-TLwGUv3EP1f4P1RLPWc)还不存在,加载的内核虽然是从硬盘读取的,但是没经过Linux的[虚拟文件系统](https://www.baidu.com/s?wd=%E8%99%9A%E6%8B%9F%E6%96%87%E4%BB%B6%E7%B3%BB%E7%BB%9F&tn=44039180_cpr&fenlei=mv6quAkxTZn0IZRqIHckPjm4nH00T1Yvn1-WuymsPHw-m1DdP1ck0ZwV5Hcvrjm3rH6sPfKWUMw85HfYnjn4nH6sgvPsT6KdThsqpZwYTjCEQLGCpyw9Uz4Bmy-bIi4WUvYETgN-TLwGUv3EP1f4P1RLPWc),这是比较底层的东西来实现的。然后内核自己创建好[虚拟文件系统](https://www.baidu.com/s?wd=%E8%99%9A%E6%8B%9F%E6%96%87%E4%BB%B6%E7%B3%BB%E7%BB%9F&tn=44039180_cpr&fenlei=mv6quAkxTZn0IZRqIHckPjm4nH00T1Yvn1-WuymsPHw-m1DdP1ck0ZwV5Hcvrjm3rH6sPfKWUMw85HfYnjn4nH6sgvPsT6KdThsqpZwYTjCEQLGCpyw9Uz4Bmy-bIi4WUvYETgN-TLwGUv3EP1f4P1RLPWc),并且从虚拟文件系统的其他子目录中(例如/sbin 和 /etc加载需要在开机启动的其他程序或者服务或者特定的动作(部分可以由用户自己在相应的目录中修改相应的文件来配制。如果我们的机器中包含多个操作系统,那么可以通过修改这个目录中的某个配置文件(例如grub.conf来调整启动的默认操作系统,系统启动的择菜单,以及启动延迟等参数。 8 | 9 | 10 | 11 | **/sbin 超级用户可以使用的命令的存放目录** 12 | 13 | 存放大多涉及[系统管理](https://www.baidu.com/s?wd=%E7%B3%BB%E7%BB%9F%E7%AE%A1%E7%90%86&tn=44039180_cpr&fenlei=mv6quAkxTZn0IZRqIHckPjm4nH00T1Yvn1-WuymsPHw-m1DdP1ck0ZwV5Hcvrjm3rH6sPfKWUMw85HfYnjn4nH6sgvPsT6KdThsqpZwYTjCEQLGCpyw9Uz4Bmy-bIi4WUvYETgN-TLwGUv3EP1f4P1RLPWc)的命令(例如引导系统的init程序,是超级权限用户root的可执行命令存放地,普通用户无权限执行这个目录下的命令(但是有时普通用户也可能会用到。)我们要记住,凡是目录sbin中包含的都是[root权限](https://www.baidu.com/s?wd=root%E6%9D%83%E9%99%90&tn=44039180_cpr&fenlei=mv6quAkxTZn0IZRqIHckPjm4nH00T1Yvn1-WuymsPHw-m1DdP1ck0ZwV5Hcvrjm3rH6sPfKWUMw85HfYnjn4nH6sgvPsT6KdThsqpZwYTjCEQLGCpyw9Uz4Bmy-bIi4WUvYETgN-TLwGUv3EP1f4P1RLPWc)才能执行的。 14 | 15 | 16 | 17 | **/bin 普通用户可以使用的命令的存放目录** 18 | 系统所需要的那些命令位于此目录,比如ls、cp、mkdir等命令;类似的目录还/usr/bin,/usr/local/bin等等。这个目录中的文件都是可执行的、普通用户都可以使用的命令。作为基础系统所需要的最基础的命令就是放在这里。 19 | 20 | 21 | **/lib 根目录下的所程序的共享库目录** 22 | 此目录下包含系统引导和在根用户执行命令时候所必需用到的共享库。做个不太好但是比较形象的比喻,点类似于Windows上面的system32目录。理说,这里存放的文件应该是/bin目录下程序所需要的库文件的存放地,也不排除一些例外的情况。类似的目录还/usr/lib,/usr/local/lib等等。 23 | 24 | 25 | 26 | **/dev 设备文件目录** 27 | 在Linux中设备都是以文件形式出现,这里的设备可以是硬盘,键盘,鼠标,网卡,终端,等设备,通过访问这些文件可以访问到相应的设备。设备文件可以使用mknod命令来创建;而为了将对这些设备文件的访问转化为对设备的访问,需要向相应的设备提供设备驱动模块(一般将设备驱动编译之后,生成的结果是一个*.ko类型的二进制文件,在内核启动之后,再通过insmod等命令加载相应的设备驱动之后,我们就可以通过设备文件来访问设备了。一般来说,想要Linux系统支持某个设备,需要 相应的硬件设备,支持硬件的驱动模块,以及相应的设备文件。 28 | 29 | 30 | 31 | **/home 普通用户的家目录** 32 | 在Linux机器上,用户主目录通常直接或间接地置在此目录下。其结构通常由本地机的管理员来决定。通常而言,系统的每个用户都自己的家目录,目录以用户名作为名字存放在/home下面(例如josonlee用户,其家目录的名字为/home/josonlee。该目录中保存了绝大多数的用户文件(用户自己的配置文件,定制文件,文档,数据等), 33 | 34 | 35 | 36 | **/root 用户root的$HOME目录** 37 | 系统管理员(就是root用户或超级用户)的主目录比较特殊,不存放在/home中,而是直接放在/root目录下了。 38 | 39 | 40 | 41 | **/etc 全局的配置文件存放目录。** 42 | 系统和程序一般都可以通过修改相应的配置文件,来进行配置。例如,要配置系统开机的时候启动那些程序,配置某个程序启动的时候显示什么样的风格等等。通常这些配置文件都集中存放在/etc目录中,所以想要配置什么东西的话,可以在/etc下面寻找我们可能需要修改的文件。 43 | 44 | 1. /etc/rc或/etc/rc.d或/etc/rc?.d  45 | 启动、或改变运行级时运行的脚本或脚本的目录。  46 | 2. /etc/passwd  47 | 用户数据库,其中的域给出了用户名、真实姓名、用户起始目录、加密口令和用户的其  48 | 他信息。  49 | 3. /etc/fdprm  50 | 软盘参数表,用以说明不同的软盘格式。可用setfdprm 进行设置。更多的信息见setfdprm  51 | 的帮助页。  52 | 4. /etc/fstab  53 | 指定启动时需要自动安装的文件系统列表。也包括用swapon -a启用的s w a p区的信息。  54 | 5. /etc/group  55 | 类似/etc/passwd ,但说明的不是用户信息而是组的信息。包括组的各种数据。  56 | 6. /etc/inittab  57 | init 的配置文件。  58 | 7. /etc/issue  59 | 包括用户在登录提示符前的输出信息。通常包括系统的一段短说明或欢迎信息。具体内  60 | 容由系统管理员确定。  61 | 8. /etc/magic  62 | “file”的配置文件。包含不同文件格式的说明,“file”基于它猜测文件类型。  63 | 9. /etc/motd  64 | motd是message of the day的缩写,用户成功登录后自动输出。内容由系统管理员确定。  65 | 常用于通告信息,如计划关机时间的警告等。  66 | 10. /etc/mtab  67 | 当前安装的文件系统列表。由脚本(scritp)初始化,并由mount 命令自动更新。当需要一  68 | 个当前安装的文件系统的列表时使用(例如df 命令)。  69 | 11. /etc/shadow  70 | 在安装了影子(shadow)口令软件的系统上的影子口令文件。影子口令文件将/etc/passwd  71 | 文件中的加密口令移动到/etc/shadow中,而后者只对超级用户(root)可读。这使破译口令更困  72 | 难,以此增加系统的安全性。  73 | 12. /etc/login.defs  74 | login命令的配置文件。  75 | 13. /etc/printcap  76 | 类似/etc/termcap ,但针对打印机。语法不同。  77 | 14. /etc/profile/etc/csh.login、/etc/csh.cshrc  78 | 登录或启动时bourne或c shells执行的文件。这允许系统管理员为所有用户建立全局缺省环境。  79 | 15. /etc/securetty  80 | 确认安全终端,即哪个终端允许超级用户(root)登录。一般只列出虚拟控制台,这样就不  81 | 可能(至少很困难)通过调制解调器(modem)或网络闯入系统并得到超级用户特权。  82 | 16. /etc/shells  83 | 列出可以使用的shell。chsh 命令允许用户在本文件指定范围内改变登录的shell。提供一  84 | 台机器f t p服务的服务进程ftpd 检查用户s h e l l是否列在/etc/shells 文件中,如果不是,将不允  85 | 许该用户登录。  86 | 17. /etc/termcap  87 | 终端性能数据库。说明不同的终端用什么“转义序列”控制。写程序时不直接输出转义  88 | 序列(这样只能工作于特定品牌的终端),而是从/etc/termcap 中查找要做的工作的正确序列。  89 | 这样,多数的程序可以在多数终端上运行。 90 | 91 | 92 | 93 | 94 | **/usr 这个目录中包含了命令库文件和在通常操作中不会修改的文件。** 95 | 这个目录对于系统来说也是一个非常重要的目录,其地位类似Windows上面的”Program Files”目录(安装程序的时候,默认就是安装在此文件内部某个子文件夹内。输入命令后系统默认执行/usr/bin下的程序(当然,前提是这个目录的路径已经被添加到了系统的环境变量中。此目录通常也会挂载一个独立的磁盘分区,它应保存共享只读类文件,这样它可以被运行Linux的不同主机挂载。 96 | 97 | **/usr/lib** 98 | 目标库文件,包括动态连接库加上一些通常不是直接调用的可执行文件的存放位置。 99 | 这个目录功能类似/lib目录,理说,这里存放的文件应该是/bin目录下程序所需要的库文件的存放地,也不排除一些例外的情况。 100 | 101 | **/usr/bin** 102 | 一般使用者使用并且不是系统自检等所必需可执行文件的目录。 103 | 此目录相当于根文件系统下的对应目录(/bin,非启动系统,非修复系统以及非本地安装的程序一般都放在此目录下。 104 | 105 | **/usr/sbin** 106 | 管理员使用的非系统必须的可执行文件存放目录。 107 | 此目录相当于根文件系统下的对应目录(/sbin,保存系统管理程序的二进制文件,并且这些文件不是系统启动或文件系统挂载 /usr 目录或修复系统所必需的。 108 | 109 | **/usr/share** 110 | 存放共享文件的目录。 111 | 在此目录下不同的子目录中保存了同一个操作系统在不同构架下工作时特定应用程序的共享数据(例如程序文档信息)。使用者可以找到通常放在 /usr/doc 或 /usr/lib 或 /usr/man 目录下的这些类似数据。 112 | 113 | **/usr/include** 114 | C程序语言编译使用的头文件。 115 | linux下开发和编译应用程序所需要的头文件一般都存放在这里,通过头文件来使用某些库函数。默认来说这个路径被添加到了环境变量中,这样编译开发程序的时候编译器会自动搜索这个路径,从中找到你的程序中可能包含的头文件。 116 | 117 | **/usr/local** 118 | 安装本地程序的一般默认路径。 119 | 当我们下载一个程序源代码,编译并且安装的时候,如果不特别指定安装的程序路径,那么默认会将程序相关的文件安装到这个目录的对应目录下。也就是说,这个目录存放的内容,一般都是我们后来自己安装的软件的默认路径,如果择了这个默认路径作为软件的安装路径,被安装的软件的所文件都限制在这个目录中,其中的子目录就相应于根目录的子目录。 120 | 121 | 122 | 123 | **/proc 特殊文件目录** 124 | 这个目录采用一种特殊的文件系统格式(proc格式,内核支持这种格式。其中包含了全部虚拟文件。它们并不保存在磁盘中,也不占据磁盘空间(尽管命令ls -c会显示它们的大小)。当您查看它们时,您实际上看到的是内存里的信息,这些文件助于我们了解系统内部信息。例如: 125 | 126 | 127 | 1/ 关于进程1的信息目录。每个进程在/proc 下一个名为其进程号的目录。 128 | cpuinfo 处理器信息,如类型、制造商、型号和性能。 129 | devices 当前运行的核心配置的设备驱动的列表。 130 | dma 显示当前使用的DMA通道。 131 | filesystems 核心配置的文件系统。 132 | interrupts 显示使用的中断,and how many of each there have been. 133 | ioports 当前使用的I/O端口。 134 | kcore 系统物理内存映象。与物理内存大小一样,但实际不占这么多内存; 135 | kmsg 核心输出的消息。也被送到syslog 。 136 | ksyms 核心符号表。 137 | loadavg 系统”平均负载”;3个没意义的指示器指出系统当前的工作量。 138 | meminfo 存储器使用信息,包括物理内存和swap。 139 | modules 当前加载了哪些核心模块。 140 | net 网络协议状态信息。 141 | self 到查看/proc 的程序的进程目录的符号连接。 142 | stat 系统的不同状态 143 | uptime 系统启动的时间长度。 144 | version 核心版本。 145 | 146 | 147 | **/opt 可择的文件目录** 148 | 这个目录表示的是可择的意思,些自定义软件包或者第方工具,就可以安装在这里。 149 | 150 | 151 | 152 | **/mnt 临时挂载目录** 153 | 这个目录一般是用于存放挂载储存设备的挂载目录的,比如磁盘,光驱,网络文件系统等,当我们需要挂载某个磁盘设备的时候,可以把磁盘设备挂载到这个目录上去,这样我们可以直接通过访问这个目录来访问那个磁盘了。一般来说,我们最好在/mnt目录下面多建立几个子目录,挂载的时候挂载到这些子目录上面,因为通常我们可能不仅仅是挂载一个设备吧? 154 | 155 | 156 | 157 | **/media 挂载的媒体设备目录** 158 | 挂载的媒体设备目录,一般外部设备挂载到这里,例如cdrom等。比如我们插入一个U盘,我们一般会发现,Linux自动在这个目录下建立一个disk目录,然后把U盘挂载到这个disk目录上,通过访问这个disk来访问U盘。 159 | 160 | 161 | 162 | **/var 内容经常变化的目录** 163 | 此目录下文件的大小可能会改变,如缓冲文件,日志文件,缓存文件,等一般都存放在这里。 164 | 165 | 166 | 167 | **/tmp 临时文件目录** 168 | 该目录存放系统中的一些临时文件,文件可能会被系统自动清空。 169 | 170 | 171 | 172 | **/lost+found 恢复文件存放的位置** 173 | 当系统崩溃的时候,在系统修复过程中需要恢复的文件,可能就会在这里被找到了,这个目录一般为空。 174 | 175 | 176 | 177 | **另外,有些目录容易混淆,这里简单区分一下:** 178 | /bin,/sbin与/usr/bin,/usr/sbin: 179 | /bin一般存放对于用户和系统来说“必须”的程序(二进制文件)。 180 | /sbin一般存放用于系统管理的“必需”的程序(二进制文件),一般普通用户不会使用,根用户使用。 181 | /usr/bin一般存放的只是对用户和系统来说“不是必需的”程序(二进制文件)。 182 | /usr/sbin一般存放用于系统管理的系统管理的不是必需的程序(二进制文件)。 183 | 184 | /lib与/usr/lib: 185 | /lib和/usr/lib的区别类似/bin,/sbin与/usr/bin,/usr/sbin。 186 | /lib一般存放对于用户和系统来说“必须”的库(二进制文件)。 187 | /usr/lib一般存放的只是对用户和系统来说“不是必需的”库(二进制文件)。 188 | 189 | 190 | 191 | ### 应用数据存放在哪? 192 | 193 | deepin 系统中应用的数据主要存放在 `~/.config/` 路径下,开发者可以将应用的配置文件、缓存文件以及其它数据文件存放在该路径下。常见的路径格式为 `~/.config/<开发者名称或公司名称>/<应用名称>/` 或 `~/.config/<应用名称>/` 194 | 195 | 桌面实际上也是一个文件夹,将一个可执行文件的发送到桌面的过程实际上是创建这个可执行文件的 `.desktop` 文件并将这个 `.desktop` 文件移动至 `~/Desktop` 路径下 -------------------------------------------------------------------------------- /Linux系统下开发环境搭建/Linux应用推荐.md: -------------------------------------------------------------------------------- 1 | 2 | 先推荐几款AppImage打包方式的应用 3 | 4 | ### [GitNote](https://gitnoteapp.com/zh/) 5 | 6 | 使用 Git 来管理内容的免费跨平台日记笔记软件,感觉挺好的,主要是笔记存储在自己的git仓库里,不用担心数据被别人掌握 7 | 8 | ### [VNote](https://github.com/tamlok/vnote) 9 | 10 | 使用一次后会发现非常的好用,这是一款Markdown笔记管理应用,如果熟悉vim的话用起来非常顺手。我觉得可以完全代替Typora(Typora不能打开多个文件夹,而且启动时出现缓慢问题),而且VNote可以控制图片大小 11 | 12 | 这里顺便记录几个快捷键: 13 | - Ctrl + j/k:上下移动 14 | - Ctrl + h/w/u:删除一个字母/一个单词/一整行 15 | - Ctrl + i/b:斜体/粗体 16 | - Ctrl + m:插入代码 17 | - Ctrl + l/ ':插入链接/图片 18 | - Ctrl + ;:选择剪贴版中的内容粘贴 19 | - Ctrl + t:编辑/阅读 20 | - Ctrl + e,e:扩大编辑区 21 | - Ctrl + q:退出 22 | - Ctrl+Shift+T:恢复上一个关闭的文件 23 | - Ctrl+Alt+N:当前文件夹下新建文件 24 | 25 | 阅读模式下快捷键: 26 | - j/k:上下移动 27 | - /或?是搜索,然后回车后通过n或者Shift+n上下跳转 28 | ![标题跳转](assets/20190517182502290_970489846.png =248x) 29 | ### [Book_Manager](https://appimage.github.io/Book_Manager/) 30 | 31 | 私人图书管理应用,记录笔记、进度等 32 | 33 | -------------------------------------------------------------------------------- /Linux系统下开发环境搭建/README.md: -------------------------------------------------------------------------------- 1 | 如上文件,顺序如下: 2 | 3 | - [Win10下双系统Deepin15.8安装.md](https://github.com/josonle/Coding-Now/blob/master/Linux%E7%B3%BB%E7%BB%9F%E4%B8%8B%E5%BC%80%E5%8F%91%E7%8E%AF%E5%A2%83%E6%90%AD%E5%BB%BA/Win10%E4%B8%8B%E5%8F%8C%E7%B3%BB%E7%BB%9FDeepin15.8%E5%AE%89%E8%A3%85.md) 4 | 5 | - 可参考pdf:Deepin 15.4 Win10双系统安装教程 6 | 7 | - [Linux中文件系统各个目录的作用.md](https://github.com/josonle/Coding-Now/blob/master/Linux%E7%B3%BB%E7%BB%9F%E4%B8%8B%E5%BC%80%E5%8F%91%E7%8E%AF%E5%A2%83%E6%90%AD%E5%BB%BA/Linux%E4%B8%AD%E6%96%87%E4%BB%B6%E7%B3%BB%E7%BB%9F%E5%90%84%E4%B8%AA%E7%9B%AE%E5%BD%95%E7%9A%84%E4%BD%9C%E7%94%A8.md) 8 | 9 | - [Deepin常用快捷键及快捷其他操作.md](https://github.com/josonle/Coding-Now/blob/master/Linux%E7%B3%BB%E7%BB%9F%E4%B8%8B%E5%BC%80%E5%8F%91%E7%8E%AF%E5%A2%83%E6%90%AD%E5%BB%BA/Deepin%E5%B8%B8%E7%94%A8%E5%BF%AB%E6%8D%B7%E9%94%AE%E5%8F%8A%E5%BF%AB%E6%8D%B7%E5%85%B6%E4%BB%96%E6%93%8D%E4%BD%9C.md) 10 | 11 | - [Deepin下源码编译安装配置git.md](https://github.com/josonle/Coding-Now/blob/master/Linux%E7%B3%BB%E7%BB%9F%E4%B8%8B%E5%BC%80%E5%8F%91%E7%8E%AF%E5%A2%83%E6%90%AD%E5%BB%BA/Deepin%E4%B8%8B%E6%BA%90%E7%A0%81%E7%BC%96%E8%AF%91%E5%AE%89%E8%A3%85%E9%85%8D%E7%BD%AEgit.md) 12 | > 如何源码编译安装应用(类似`tar.gz`这类压缩文件),可参考这篇 13 | > 具体可归纳为三步走,但前提要好好看下说明文档,一般会内附README.md文件。依赖缺少的问题解决是缺啥装啥 14 | 15 | - [Deepin15.8下搭建Python开发环境.md](https://github.com/josonle/Coding-Now/blob/master/Linux%E7%B3%BB%E7%BB%9F%E4%B8%8B%E5%BC%80%E5%8F%91%E7%8E%AF%E5%A2%83%E6%90%AD%E5%BB%BA/Deepin15.8%E4%B8%8B%E6%90%AD%E5%BB%BAPython%E5%BC%80%E5%8F%91%E7%8E%AF%E5%A2%83.md) 16 | - 含有如何在Deepin Linux下安装pip、pip3 17 | - 安装pycharm、jupyter notebook 18 | - 虚拟环境使用等 19 | 20 | - [Deepin下搭建(java)Hadoop、Spark等大数据开发环境.md](https://github.com/josonle/Coding-Now/blob/master/Linux%E7%B3%BB%E7%BB%9F%E4%B8%8B%E5%BC%80%E5%8F%91%E7%8E%AF%E5%A2%83%E6%90%AD%E5%BB%BA/Deepin%E4%B8%8B%E6%90%AD%E5%BB%BAHadoop%E3%80%81Spark%E7%AD%89%E5%A4%A7%E6%95%B0%E6%8D%AE%E5%BC%80%E5%8F%91%E7%8E%AF%E5%A2%83.md) 21 | - 含有如何在Deepin Linux下安装java、scala、VMware虚拟机、eclipse 22 | 23 | > Eclipse中Alt+F11可以全屏显示,IDEA、Pycharm啥的要自己配置全屏显示快捷键(我设置成了Alt+Shift+F11) 24 | > 25 | > ![](assets/深度截图_选择区域_20190219225738.png) 26 | 27 | - 如何搭建centos集群 28 | 29 | - 搭建hadoop、hive、hbase 30 | 31 | - 搭建spark 32 | 33 | - 待续 34 | 35 | - [Deepin下如何科-学(地)上-网.md](https://github.com/josonle/Coding-Now/blob/master/Linux%E7%B3%BB%E7%BB%9F%E4%B8%8B%E5%BC%80%E5%8F%91%E7%8E%AF%E5%A2%83%E6%90%AD%E5%BB%BA/Deepin%E4%B8%8B%E5%A6%82%E4%BD%95%E7%A7%91-%E5%AD%A6(%E5%9C%B0)%E4%B8%8A-%E7%BD%91.md) 36 | 37 | - [Deepin使用体验、资源及问题归纳贴.md](https://github.com/josonle/Coding-Now/blob/master/Linux%E7%B3%BB%E7%BB%9F%E4%B8%8B%E5%BC%80%E5%8F%91%E7%8E%AF%E5%A2%83%E6%90%AD%E5%BB%BA/Deepin%E4%BD%BF%E7%94%A8%E4%BD%93%E9%AA%8C%E3%80%81%E8%B5%84%E6%BA%90%E5%8F%8A%E9%97%AE%E9%A2%98%E5%BD%92%E7%BA%B3%E8%B4%B4.md) 38 | 39 | - [Deepin自定义右键新建文件模版.md](https://github.com/josonle/Coding-Now/blob/master/Linux%E7%B3%BB%E7%BB%9F%E4%B8%8B%E5%BC%80%E5%8F%91%E7%8E%AF%E5%A2%83%E6%90%AD%E5%BB%BA/Deepin%E8%87%AA%E5%AE%9A%E4%B9%89%E5%8F%B3%E9%94%AE%E6%96%B0%E5%BB%BA%E6%96%87%E4%BB%B6%E6%A8%A1%E7%89%88.md) 40 | 41 | - [Deepin设置开机自启动脚本问题.md](https://github.com/josonle/Coding-Now/blob/master/Linux%E7%B3%BB%E7%BB%9F%E4%B8%8B%E5%BC%80%E5%8F%91%E7%8E%AF%E5%A2%83%E6%90%AD%E5%BB%BA/Deepin%E8%AE%BE%E7%BD%AE%E5%BC%80%E6%9C%BA%E8%87%AA%E5%90%AF%E5%8A%A8%E8%84%9A%E6%9C%AC%E9%97%AE%E9%A2%98.md) 42 | 43 | - [AppImage打包方式、相关应用、相关Linux游戏站推荐](https://github.com/josonle/Coding-Now/blob/master/Linux%E7%B3%BB%E7%BB%9F%E4%B8%8B%E5%BC%80%E5%8F%91%E7%8E%AF%E5%A2%83%E6%90%AD%E5%BB%BA/AppImage%E6%89%93%E5%8C%85%E6%96%B9%E5%BC%8F%E5%8F%8A%E7%9B%B8%E5%85%B3Linux%E6%B8%B8%E6%88%8F%E7%AB%99%E6%8E%A8%E8%8D%90.md) 44 | - [【Deepin】最新XMind for Linux 破解版安装](https://blog.csdn.net/lzw2016/article/details/88622874) 45 | 46 | -------------------------------------------------------------------------------- /Linux系统下开发环境搭建/Win10下双系统Deepin15.8安装.md: -------------------------------------------------------------------------------- 1 | ## Win10下安装双系统Deepin 15.8 2 | 3 | ### Deepin介绍及下载 4 | 5 | deepin是一份致力于为全球用户提供美观、易用、安全、免费的使用环境的Linux发行。它不仅仅包括对全球优秀开源产品进行的集成和配置,还开发了基于Qt5技术的全新桌面环境、系统设置中心,以及音乐播放器、视频播放器、软件中心等一系列面向普通用户的应用程序。deepin非常注重易用的体验和美观的设计,便于安装和使用,也能够很好地代替Windows系统应用于工作及娱乐等各领域 6 | 7 | [深度科技社区](https://www.deepin.org/),建议安装前去社区论坛看看别人发的帖,好知道安装过程会有什么坑要填 8 | 9 | 之所以选择它,一是国产,理当支持一波。虽然不少人说它bug不少,谁知道呢,可能就是他们不会用;二是其对Windows上的一些应用支持很好,像QQ、微信、百度云,开发中难免要和别人沟通,我有不想花时间去配置这些,而且它界面UI确实不错,为啥不选Deepin呢?对吧 10 | 11 | 镜像下载,我这里选的是ISO创库,清华镜像站的,https://www.deepin.org/mirrors/releases/,你看情况选呗 12 | 13 | ![1547124309030](assets/1547124309030.png) 14 | 15 | ### 制作U盘启动盘 16 | 17 | U盘至少8g,因为过程中可能需要格式化u盘,提前备份好数据 18 | 19 | ![1547104601035](assets/1547104601035.png) 20 | 21 | 这里选择镜像文件后,下一步选择U盘,然后勾选**格式化U盘**【我勾了反而出错,无语】,然后确认即可 22 | 23 | 24 | 25 | ### 分区计划100G 26 | 27 | windows下磁盘管理,压缩一个空白券即可(分配多少空间依情况而定,我这里是100g)。只是压缩券,不要格式化,因为Linux下文件系统是ext4格式,Windows下不识别。下图是我事后截的图 28 | 29 | ![](assets/190111521.jpg) 30 | 31 | - 根目录`/`:20g 32 | - swap:4g 33 | - 其余都给home目录 34 | 35 | 36 | 37 | ### 进入bios进行相关设置 38 | 39 | - 如何进入bios,联想有的本子是按F2,有的是F12,你自己查一下看 40 | 41 | > 我这几个都进不去,最后是**一直按着shift键**,然后**重启**,会进入一个界面(如下),选择**疑难解答** 42 | > 43 | > ![1547122130325](assets/1547122130325.png) 44 | > 45 | > 然后点击高级选项->UEFI固件设置->点击重启按钮,就可以了 46 | > 47 | > ![1547122270694](assets/1547122270694.png) 48 | > 49 | > ![1547122288560](assets/1547122288560.png) 50 | > 51 | > 还有其他无法进入bios的方法:[win10系统bios进不去怎么办?](https://www.jb51.net/os/win10/382360.html) 52 | 53 | - 关闭安全启动项(Security->secure boot设置disabled) 54 | - bios里进入boot选择U盘为第一启动(**boot->efi下的一个什么UDisk什么的**) 55 | 56 | > 这里我也稀里糊涂的,因为我看官方论坛里,别人电脑是选择USB硬盘(UEFI)什么的。 57 | > 58 | > 我电脑是**联想天逸300**,进boot后只能看到三个启动选项,第一个是Windows,第二个是UDisk什么的,第三个不认识。看英文名只有UDisk和U盘接近,所以我就选了这个,没想到真的是这个。后来想了下,这个UDisk好像就是U盘的名字吧 59 | 60 | - 如上设置完成后,按下F10保存退出,就开始安装Deepin了 61 | 62 | 63 | 64 | ### 安装Deepin并分区 65 | 66 | 其他选择语言、地区、设置用户名密码啥的我就不说了,讲下Deepin该如何分区吧 67 | 68 | - 选择安装位置,点击上方的高级,进入如下操作模式 69 | 70 | ![1547122720202](assets/1547122720202.png) 71 | 72 | 如图,可以看见我选中的是100G的可用空间,鼠标箭头选中的地方,点击 73 | 74 | - 创建根目录分区`/`,和swap分区,其余都作为home分区 75 | 76 | ![1547122847689](assets/1547122847689.png) 77 | 78 | 选择挂载点为`/`,分配20g 79 | 80 | ![1547122893538](assets/1547122893538.png) 81 | 82 | 选择文件系统为 **交换分区**,分配4g即可。我看有地方说,如果内存超过8g可以不分配这个swap分区 83 | 84 | > swap分区是内存不够用时,作为虚拟内存使用的,不是越大越好,要适当 85 | 86 | 其余空间都选择挂载点为 `/home`作为home分区 87 | 88 | ![1547123056508](assets/1547123056508.png) 89 | 90 | 最终,如图,开始安装即可 91 | 92 | 安装大概花了10来分钟吧,和网络有关。安装完成后,**记得拔掉U盘**,然后重启,默认是直接进入Deepin的 93 | 94 | 95 | 96 | ### 重启没有Deepin启动项怎么办? 97 | 98 | 我还帮我朋友一起装了下双系统,他电脑上惠普的,启动时遇到了没有Deepin启动项,直接进入Win10。如下是解决办法: 99 | 100 | > 我这里也是参照别人的 101 | 102 | 1. windows下搜索**EasyUEFI** [官网](http://www.easyuefi.com/index-cn.html),下载安装 103 | 2. 点击管理 EFI 启动项 104 | 105 | ![1547123559546](assets/1547123559546.png) 106 | 107 | 108 | 109 | 3. 点红框框到的那个加号 110 | 111 | ![1547123614467](assets/1547123614467.png) 112 | 113 | 4. 创建一个名为deepin的启动项,如图 114 | 115 | ![1547123742916](assets/1547123742916.png) 116 | 117 | 5. 选择efi分区,点击Browser,选择efi引导文件 118 | 119 | ![1547123811269](assets/1547123811269.png) 120 | 121 | ![1547123827216](assets/1547123827216.png) 122 | 123 | ![1547123852762](assets/1547123852762.png) 124 | 125 | 6. 点击OK即可看见deepin引导项建立成了,红框框着的可以选择那个先启动 126 | 127 | ![1547123928107](assets/1547123928107.png) 128 | 129 | 7. 再次重启试试 130 | 131 | 以上方法,可能有用,仅供参考 132 | 133 | > 参考链接:[解决无 Deepin 启动项的问题](https://wiki.deepin.org/index.php?title=Deepin_15.4_Windows_10_%E5%8F%8C%E7%B3%BB%E7%BB%9F%E5%AE%89%E8%A3%85%E6%95%99%E7%A8%8B#.E8.A7.A3.E5.86.B3.E6.97.A0_Deepin_.E5.90.AF.E5.8A.A8.E9.A1.B9.E7.9A.84.E9.97.AE.E9.A2.98) 134 | 135 | 其实,以上过程可以在deepin的设置中,手动选择启动项顺序 136 | 137 | ### 后续 138 | 139 | [deepin如何寻找、安装非商店软件](https://bbs.deepin.org/forum.php?mod=viewthread&tid=157341&highlight=%E5%AE%89%E8%A3%85) 140 | 141 | [办公平台之字体安装](https://bbs.deepin.org/forum.php?mod=viewthread&tid=157250&highlight=%E5%AE%89%E8%A3%85) 142 | 143 | [Deepin下如何科学上网:小飞机 1.2.2 版本发布!](https://bbs.deepin.org/forum.php?mod=viewthread&tid=166962) 144 | 145 | 参考我接下来几篇如何搭建开发环境的文章 146 | 147 | -------------------------------------------------------------------------------- /Linux系统下开发环境搭建/_vnote.json: -------------------------------------------------------------------------------- 1 | { 2 | "created_time": "2019-05-17T09:44:08Z", 3 | "files": [ 4 | { 5 | "attachment_folder": "", 6 | "attachments": [ 7 | ], 8 | "created_time": "2019-05-17T09:44:08Z", 9 | "modified_time": "2019-05-17T09:44:08Z", 10 | "name": "AppImage打包方式及相关Linux游戏站推荐.md", 11 | "tags": [ 12 | ] 13 | }, 14 | { 15 | "attachment_folder": "", 16 | "attachments": [ 17 | ], 18 | "created_time": "2019-05-17T09:44:08Z", 19 | "modified_time": "2019-05-17T09:44:08Z", 20 | "name": "Deepin15.8下搭建Python开发环境.md", 21 | "tags": [ 22 | ] 23 | }, 24 | { 25 | "attachment_folder": "", 26 | "attachments": [ 27 | ], 28 | "created_time": "2019-05-17T09:44:08Z", 29 | "modified_time": "2019-05-17T09:44:08Z", 30 | "name": "Deepin下如何科-学(地)上-网.md", 31 | "tags": [ 32 | ] 33 | }, 34 | { 35 | "attachment_folder": "", 36 | "attachments": [ 37 | ], 38 | "created_time": "2019-05-17T09:44:08Z", 39 | "modified_time": "2019-05-17T09:44:08Z", 40 | "name": "Deepin下搭建Hadoop、Spark等大数据开发环境.md", 41 | "tags": [ 42 | ] 43 | }, 44 | { 45 | "attachment_folder": "", 46 | "attachments": [ 47 | ], 48 | "created_time": "2019-05-17T09:44:08Z", 49 | "modified_time": "2019-05-17T09:44:08Z", 50 | "name": "Deepin下源码编译安装配置git.md", 51 | "tags": [ 52 | ] 53 | }, 54 | { 55 | "attachment_folder": "", 56 | "attachments": [ 57 | ], 58 | "created_time": "2019-05-17T09:44:08Z", 59 | "modified_time": "2019-05-17T09:44:08Z", 60 | "name": "Deepin使用体验、资源及问题归纳贴.md", 61 | "tags": [ 62 | ] 63 | }, 64 | { 65 | "attachment_folder": "", 66 | "attachments": [ 67 | ], 68 | "created_time": "2019-05-17T09:44:08Z", 69 | "modified_time": "2019-05-17T09:44:08Z", 70 | "name": "Deepin常用快捷键及快捷其他操作.md", 71 | "tags": [ 72 | ] 73 | }, 74 | { 75 | "attachment_folder": "", 76 | "attachments": [ 77 | ], 78 | "created_time": "2019-05-17T09:44:08Z", 79 | "modified_time": "2019-05-17T09:44:08Z", 80 | "name": "Deepin自定义右键新建文件模版.md", 81 | "tags": [ 82 | ] 83 | }, 84 | { 85 | "attachment_folder": "", 86 | "attachments": [ 87 | ], 88 | "created_time": "2019-05-17T09:44:08Z", 89 | "modified_time": "2019-05-17T09:44:08Z", 90 | "name": "Deepin设置开机自启动脚本问题.md", 91 | "tags": [ 92 | ] 93 | }, 94 | { 95 | "attachment_folder": "", 96 | "attachments": [ 97 | ], 98 | "created_time": "2019-05-17T09:44:08Z", 99 | "modified_time": "2019-05-17T09:44:08Z", 100 | "name": "Linux中文件系统各个目录的作用.md", 101 | "tags": [ 102 | ] 103 | }, 104 | { 105 | "attachment_folder": "", 106 | "attachments": [ 107 | ], 108 | "created_time": "2019-05-17T09:44:08Z", 109 | "modified_time": "2019-06-04T05:15:52Z", 110 | "name": "Linux应用推荐.md", 111 | "tags": [ 112 | ] 113 | }, 114 | { 115 | "attachment_folder": "", 116 | "attachments": [ 117 | ], 118 | "created_time": "2019-05-17T09:44:08Z", 119 | "modified_time": "2019-06-04T05:02:06Z", 120 | "name": "README.md", 121 | "tags": [ 122 | ] 123 | }, 124 | { 125 | "attachment_folder": "", 126 | "attachments": [ 127 | ], 128 | "created_time": "2019-05-17T09:44:08Z", 129 | "modified_time": "2019-05-17T09:44:08Z", 130 | "name": "Win10下双系统Deepin15.8安装.md", 131 | "tags": [ 132 | ] 133 | }, 134 | { 135 | "attachment_folder": "", 136 | "attachments": [ 137 | ], 138 | "created_time": "2019-05-20T08:17:22Z", 139 | "modified_time": "2019-05-20T09:14:02Z", 140 | "name": "IDEA常用快捷键.md", 141 | "tags": [ 142 | ] 143 | } 144 | ], 145 | "sub_directories": [ 146 | ], 147 | "version": "1" 148 | } 149 | -------------------------------------------------------------------------------- /Linux系统下开发环境搭建/assets/1547104601035.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/josonle/Coding-Now/32b963ff23af1e957099d03cb9f935a32cbc9373/Linux系统下开发环境搭建/assets/1547104601035.png -------------------------------------------------------------------------------- /Linux系统下开发环境搭建/assets/1547122130325.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/josonle/Coding-Now/32b963ff23af1e957099d03cb9f935a32cbc9373/Linux系统下开发环境搭建/assets/1547122130325.png -------------------------------------------------------------------------------- /Linux系统下开发环境搭建/assets/1547122270694.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/josonle/Coding-Now/32b963ff23af1e957099d03cb9f935a32cbc9373/Linux系统下开发环境搭建/assets/1547122270694.png -------------------------------------------------------------------------------- /Linux系统下开发环境搭建/assets/1547122288560.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/josonle/Coding-Now/32b963ff23af1e957099d03cb9f935a32cbc9373/Linux系统下开发环境搭建/assets/1547122288560.png -------------------------------------------------------------------------------- /Linux系统下开发环境搭建/assets/1547122720202.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/josonle/Coding-Now/32b963ff23af1e957099d03cb9f935a32cbc9373/Linux系统下开发环境搭建/assets/1547122720202.png -------------------------------------------------------------------------------- /Linux系统下开发环境搭建/assets/1547122847689.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/josonle/Coding-Now/32b963ff23af1e957099d03cb9f935a32cbc9373/Linux系统下开发环境搭建/assets/1547122847689.png -------------------------------------------------------------------------------- /Linux系统下开发环境搭建/assets/1547122893538.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/josonle/Coding-Now/32b963ff23af1e957099d03cb9f935a32cbc9373/Linux系统下开发环境搭建/assets/1547122893538.png -------------------------------------------------------------------------------- /Linux系统下开发环境搭建/assets/1547123056508.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/josonle/Coding-Now/32b963ff23af1e957099d03cb9f935a32cbc9373/Linux系统下开发环境搭建/assets/1547123056508.png -------------------------------------------------------------------------------- /Linux系统下开发环境搭建/assets/1547123559546.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/josonle/Coding-Now/32b963ff23af1e957099d03cb9f935a32cbc9373/Linux系统下开发环境搭建/assets/1547123559546.png -------------------------------------------------------------------------------- /Linux系统下开发环境搭建/assets/1547123614467.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/josonle/Coding-Now/32b963ff23af1e957099d03cb9f935a32cbc9373/Linux系统下开发环境搭建/assets/1547123614467.png -------------------------------------------------------------------------------- /Linux系统下开发环境搭建/assets/1547123742916.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/josonle/Coding-Now/32b963ff23af1e957099d03cb9f935a32cbc9373/Linux系统下开发环境搭建/assets/1547123742916.png -------------------------------------------------------------------------------- /Linux系统下开发环境搭建/assets/1547123811269.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/josonle/Coding-Now/32b963ff23af1e957099d03cb9f935a32cbc9373/Linux系统下开发环境搭建/assets/1547123811269.png -------------------------------------------------------------------------------- /Linux系统下开发环境搭建/assets/1547123827216.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/josonle/Coding-Now/32b963ff23af1e957099d03cb9f935a32cbc9373/Linux系统下开发环境搭建/assets/1547123827216.png -------------------------------------------------------------------------------- /Linux系统下开发环境搭建/assets/1547123852762.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/josonle/Coding-Now/32b963ff23af1e957099d03cb9f935a32cbc9373/Linux系统下开发环境搭建/assets/1547123852762.png -------------------------------------------------------------------------------- /Linux系统下开发环境搭建/assets/1547123928107.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/josonle/Coding-Now/32b963ff23af1e957099d03cb9f935a32cbc9373/Linux系统下开发环境搭建/assets/1547123928107.png -------------------------------------------------------------------------------- /Linux系统下开发环境搭建/assets/1547124309030.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/josonle/Coding-Now/32b963ff23af1e957099d03cb9f935a32cbc9373/Linux系统下开发环境搭建/assets/1547124309030.png -------------------------------------------------------------------------------- /Linux系统下开发环境搭建/assets/1547127856260.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/josonle/Coding-Now/32b963ff23af1e957099d03cb9f935a32cbc9373/Linux系统下开发环境搭建/assets/1547127856260.png -------------------------------------------------------------------------------- /Linux系统下开发环境搭建/assets/1549802209141.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/josonle/Coding-Now/32b963ff23af1e957099d03cb9f935a32cbc9373/Linux系统下开发环境搭建/assets/1549802209141.png -------------------------------------------------------------------------------- /Linux系统下开发环境搭建/assets/1549802355287.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/josonle/Coding-Now/32b963ff23af1e957099d03cb9f935a32cbc9373/Linux系统下开发环境搭建/assets/1549802355287.png -------------------------------------------------------------------------------- /Linux系统下开发环境搭建/assets/1549804313390.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/josonle/Coding-Now/32b963ff23af1e957099d03cb9f935a32cbc9373/Linux系统下开发环境搭建/assets/1549804313390.png -------------------------------------------------------------------------------- /Linux系统下开发环境搭建/assets/190111521.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/josonle/Coding-Now/32b963ff23af1e957099d03cb9f935a32cbc9373/Linux系统下开发环境搭建/assets/190111521.jpg -------------------------------------------------------------------------------- /Linux系统下开发环境搭建/assets/20190120220106492.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/josonle/Coding-Now/32b963ff23af1e957099d03cb9f935a32cbc9373/Linux系统下开发环境搭建/assets/20190120220106492.png -------------------------------------------------------------------------------- /Linux系统下开发环境搭建/assets/20190123162839.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/josonle/Coding-Now/32b963ff23af1e957099d03cb9f935a32cbc9373/Linux系统下开发环境搭建/assets/20190123162839.png -------------------------------------------------------------------------------- /Linux系统下开发环境搭建/assets/20190517182502290_970489846.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/josonle/Coding-Now/32b963ff23af1e957099d03cb9f935a32cbc9373/Linux系统下开发环境搭建/assets/20190517182502290_970489846.png -------------------------------------------------------------------------------- /Linux系统下开发环境搭建/assets/add.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/josonle/Coding-Now/32b963ff23af1e957099d03cb9f935a32cbc9373/Linux系统下开发环境搭建/assets/add.png -------------------------------------------------------------------------------- /Linux系统下开发环境搭建/assets/dropins.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/josonle/Coding-Now/32b963ff23af1e957099d03cb9f935a32cbc9373/Linux系统下开发环境搭建/assets/dropins.png -------------------------------------------------------------------------------- /Linux系统下开发环境搭建/assets/eclipse下载.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/josonle/Coding-Now/32b963ff23af1e957099d03cb9f935a32cbc9373/Linux系统下开发环境搭建/assets/eclipse下载.png -------------------------------------------------------------------------------- /Linux系统下开发环境搭建/assets/eclipse安装.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/josonle/Coding-Now/32b963ff23af1e957099d03cb9f935a32cbc9373/Linux系统下开发环境搭建/assets/eclipse安装.png -------------------------------------------------------------------------------- /Linux系统下开发环境搭建/assets/folder选择.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/josonle/Coding-Now/32b963ff23af1e957099d03cb9f935a32cbc9373/Linux系统下开发环境搭建/assets/folder选择.png -------------------------------------------------------------------------------- /Linux系统下开发环境搭建/assets/gitconfig.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/josonle/Coding-Now/32b963ff23af1e957099d03cb9f935a32cbc9373/Linux系统下开发环境搭建/assets/gitconfig.png -------------------------------------------------------------------------------- /Linux系统下开发环境搭建/assets/hadoop配置.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/josonle/Coding-Now/32b963ff23af1e957099d03cb9f935a32cbc9373/Linux系统下开发环境搭建/assets/hadoop配置.png -------------------------------------------------------------------------------- /Linux系统下开发环境搭建/assets/hdfs.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/josonle/Coding-Now/32b963ff23af1e957099d03cb9f935a32cbc9373/Linux系统下开发环境搭建/assets/hdfs.png -------------------------------------------------------------------------------- /Linux系统下开发环境搭建/assets/insert.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/josonle/Coding-Now/32b963ff23af1e957099d03cb9f935a32cbc9373/Linux系统下开发环境搭建/assets/insert.png -------------------------------------------------------------------------------- /Linux系统下开发环境搭建/assets/java-v.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/josonle/Coding-Now/32b963ff23af1e957099d03cb9f935a32cbc9373/Linux系统下开发环境搭建/assets/java-v.png -------------------------------------------------------------------------------- /Linux系统下开发环境搭建/assets/java环境配置.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/josonle/Coding-Now/32b963ff23af1e957099d03cb9f935a32cbc9373/Linux系统下开发环境搭建/assets/java环境配置.png -------------------------------------------------------------------------------- /Linux系统下开发环境搭建/assets/maven源.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/josonle/Coding-Now/32b963ff23af1e957099d03cb9f935a32cbc9373/Linux系统下开发环境搭建/assets/maven源.png -------------------------------------------------------------------------------- /Linux系统下开发环境搭建/assets/maven配置.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/josonle/Coding-Now/32b963ff23af1e957099d03cb9f935a32cbc9373/Linux系统下开发环境搭建/assets/maven配置.png -------------------------------------------------------------------------------- /Linux系统下开发环境搭建/assets/metadata.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/josonle/Coding-Now/32b963ff23af1e957099d03cb9f935a32cbc9373/Linux系统下开发环境搭建/assets/metadata.png -------------------------------------------------------------------------------- /Linux系统下开发环境搭建/assets/mvnsetting.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/josonle/Coding-Now/32b963ff23af1e957099d03cb9f935a32cbc9373/Linux系统下开发环境搭建/assets/mvnsetting.png -------------------------------------------------------------------------------- /Linux系统下开发环境搭建/assets/mysql安装.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/josonle/Coding-Now/32b963ff23af1e957099d03cb9f935a32cbc9373/Linux系统下开发环境搭建/assets/mysql安装.png -------------------------------------------------------------------------------- /Linux系统下开发环境搭建/assets/mysql驱动.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/josonle/Coding-Now/32b963ff23af1e957099d03cb9f935a32cbc9373/Linux系统下开发环境搭建/assets/mysql驱动.png -------------------------------------------------------------------------------- /Linux系统下开发环境搭建/assets/pip下载在哪里.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/josonle/Coding-Now/32b963ff23af1e957099d03cb9f935a32cbc9373/Linux系统下开发环境搭建/assets/pip下载在哪里.png -------------------------------------------------------------------------------- /Linux系统下开发环境搭建/assets/pycharm中运行jupyter.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/josonle/Coding-Now/32b963ff23af1e957099d03cb9f935a32cbc9373/Linux系统下开发环境搭建/assets/pycharm中运行jupyter.png -------------------------------------------------------------------------------- /Linux系统下开发环境搭建/assets/pycharm安装00.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/josonle/Coding-Now/32b963ff23af1e957099d03cb9f935a32cbc9373/Linux系统下开发环境搭建/assets/pycharm安装00.png -------------------------------------------------------------------------------- /Linux系统下开发环境搭建/assets/pycharm安装01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/josonle/Coding-Now/32b963ff23af1e957099d03cb9f935a32cbc9373/Linux系统下开发环境搭建/assets/pycharm安装01.png -------------------------------------------------------------------------------- /Linux系统下开发环境搭建/assets/pycharm安装02.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/josonle/Coding-Now/32b963ff23af1e957099d03cb9f935a32cbc9373/Linux系统下开发环境搭建/assets/pycharm安装02.png -------------------------------------------------------------------------------- /Linux系统下开发环境搭建/assets/pycharm安装03.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/josonle/Coding-Now/32b963ff23af1e957099d03cb9f935a32cbc9373/Linux系统下开发环境搭建/assets/pycharm安装03.png -------------------------------------------------------------------------------- /Linux系统下开发环境搭建/assets/pycharm桌面.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/josonle/Coding-Now/32b963ff23af1e957099d03cb9f935a32cbc9373/Linux系统下开发环境搭建/assets/pycharm桌面.png -------------------------------------------------------------------------------- /Linux系统下开发环境搭建/assets/pycharm虚拟环境00.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/josonle/Coding-Now/32b963ff23af1e957099d03cb9f935a32cbc9373/Linux系统下开发环境搭建/assets/pycharm虚拟环境00.png -------------------------------------------------------------------------------- /Linux系统下开发环境搭建/assets/scalalocation.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/josonle/Coding-Now/32b963ff23af1e957099d03cb9f935a32cbc9373/Linux系统下开发环境搭建/assets/scalalocation.png -------------------------------------------------------------------------------- /Linux系统下开发环境搭建/assets/scala插件.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/josonle/Coding-Now/32b963ff23af1e957099d03cb9f935a32cbc9373/Linux系统下开发环境搭建/assets/scala插件.png -------------------------------------------------------------------------------- /Linux系统下开发环境搭建/assets/select.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/josonle/Coding-Now/32b963ff23af1e957099d03cb9f935a32cbc9373/Linux系统下开发环境搭建/assets/select.png -------------------------------------------------------------------------------- /Linux系统下开发环境搭建/assets/slave2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/josonle/Coding-Now/32b963ff23af1e957099d03cb9f935a32cbc9373/Linux系统下开发环境搭建/assets/slave2.png -------------------------------------------------------------------------------- /Linux系统下开发环境搭建/assets/slave文件.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/josonle/Coding-Now/32b963ff23af1e957099d03cb9f935a32cbc9373/Linux系统下开发环境搭建/assets/slave文件.png -------------------------------------------------------------------------------- /Linux系统下开发环境搭建/assets/sparkslave.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/josonle/Coding-Now/32b963ff23af1e957099d03cb9f935a32cbc9373/Linux系统下开发环境搭建/assets/sparkslave.png -------------------------------------------------------------------------------- /Linux系统下开发环境搭建/assets/ssh免密.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/josonle/Coding-Now/32b963ff23af1e957099d03cb9f935a32cbc9373/Linux系统下开发环境搭建/assets/ssh免密.png -------------------------------------------------------------------------------- /Linux系统下开发环境搭建/assets/startspark.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/josonle/Coding-Now/32b963ff23af1e957099d03cb9f935a32cbc9373/Linux系统下开发环境搭建/assets/startspark.png -------------------------------------------------------------------------------- /Linux系统下开发环境搭建/assets/toolsdownload.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/josonle/Coding-Now/32b963ff23af1e957099d03cb9f935a32cbc9373/Linux系统下开发环境搭建/assets/toolsdownload.png -------------------------------------------------------------------------------- /Linux系统下开发环境搭建/assets/tools安装出错.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/josonle/Coding-Now/32b963ff23af1e957099d03cb9f935a32cbc9373/Linux系统下开发环境搭建/assets/tools安装出错.png -------------------------------------------------------------------------------- /Linux系统下开发环境搭建/assets/venv.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/josonle/Coding-Now/32b963ff23af1e957099d03cb9f935a32cbc9373/Linux系统下开发环境搭建/assets/venv.png -------------------------------------------------------------------------------- /Linux系统下开发环境搭建/assets/vm.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/josonle/Coding-Now/32b963ff23af1e957099d03cb9f935a32cbc9373/Linux系统下开发环境搭建/assets/vm.png -------------------------------------------------------------------------------- /Linux系统下开发环境搭建/assets/vmtools.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/josonle/Coding-Now/32b963ff23af1e957099d03cb9f935a32cbc9373/Linux系统下开发环境搭建/assets/vmtools.png -------------------------------------------------------------------------------- /Linux系统下开发环境搭建/assets/vm使用.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/josonle/Coding-Now/32b963ff23af1e957099d03cb9f935a32cbc9373/Linux系统下开发环境搭建/assets/vm使用.png -------------------------------------------------------------------------------- /Linux系统下开发环境搭建/assets/vm启动失败.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/josonle/Coding-Now/32b963ff23af1e957099d03cb9f935a32cbc9373/Linux系统下开发环境搭建/assets/vm启动失败.png -------------------------------------------------------------------------------- /Linux系统下开发环境搭建/assets/vm安装.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/josonle/Coding-Now/32b963ff23af1e957099d03cb9f935a32cbc9373/Linux系统下开发环境搭建/assets/vm安装.png -------------------------------------------------------------------------------- /Linux系统下开发环境搭建/assets/vm网络设置.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/josonle/Coding-Now/32b963ff23af1e957099d03cb9f935a32cbc9373/Linux系统下开发环境搭建/assets/vm网络设置.png -------------------------------------------------------------------------------- /Linux系统下开发环境搭建/assets/wHive.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/josonle/Coding-Now/32b963ff23af1e957099d03cb9f935a32cbc9373/Linux系统下开发环境搭建/assets/wHive.png -------------------------------------------------------------------------------- /Linux系统下开发环境搭建/assets/yarn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/josonle/Coding-Now/32b963ff23af1e957099d03cb9f935a32cbc9373/Linux系统下开发环境搭建/assets/yarn.png -------------------------------------------------------------------------------- /Linux系统下开发环境搭建/assets/传输公钥.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/josonle/Coding-Now/32b963ff23af1e957099d03cb9f935a32cbc9373/Linux系统下开发环境搭建/assets/传输公钥.png -------------------------------------------------------------------------------- /Linux系统下开发环境搭建/assets/创建git.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/josonle/Coding-Now/32b963ff23af1e957099d03cb9f935a32cbc9373/Linux系统下开发环境搭建/assets/创建git.png -------------------------------------------------------------------------------- /Linux系统下开发环境搭建/assets/发送masterpub.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/josonle/Coding-Now/32b963ff23af1e957099d03cb9f935a32cbc9373/Linux系统下开发环境搭建/assets/发送masterpub.png -------------------------------------------------------------------------------- /Linux系统下开发环境搭建/assets/取消scala.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/josonle/Coding-Now/32b963ff23af1e957099d03cb9f935a32cbc9373/Linux系统下开发环境搭建/assets/取消scala.png -------------------------------------------------------------------------------- /Linux系统下开发环境搭建/assets/启动musqld.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/josonle/Coding-Now/32b963ff23af1e957099d03cb9f935a32cbc9373/Linux系统下开发环境搭建/assets/启动musqld.png -------------------------------------------------------------------------------- /Linux系统下开发环境搭建/assets/启动venv.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/josonle/Coding-Now/32b963ff23af1e957099d03cb9f935a32cbc9373/Linux系统下开发环境搭建/assets/启动venv.png -------------------------------------------------------------------------------- /Linux系统下开发环境搭建/assets/复制vm.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/josonle/Coding-Now/32b963ff23af1e957099d03cb9f935a32cbc9373/Linux系统下开发环境搭建/assets/复制vm.png -------------------------------------------------------------------------------- /Linux系统下开发环境搭建/assets/字段.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/josonle/Coding-Now/32b963ff23af1e957099d03cb9f935a32cbc9373/Linux系统下开发环境搭建/assets/字段.png -------------------------------------------------------------------------------- /Linux系统下开发环境搭建/assets/安装.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/josonle/Coding-Now/32b963ff23af1e957099d03cb9f935a32cbc9373/Linux系统下开发环境搭建/assets/安装.png -------------------------------------------------------------------------------- /Linux系统下开发环境搭建/assets/安装scala插件.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/josonle/Coding-Now/32b963ff23af1e957099d03cb9f935a32cbc9373/Linux系统下开发环境搭建/assets/安装scala插件.png -------------------------------------------------------------------------------- /Linux系统下开发环境搭建/assets/查看.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/josonle/Coding-Now/32b963ff23af1e957099d03cb9f935a32cbc9373/Linux系统下开发环境搭建/assets/查看.png -------------------------------------------------------------------------------- /Linux系统下开发环境搭建/assets/查看mysql.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/josonle/Coding-Now/32b963ff23af1e957099d03cb9f935a32cbc9373/Linux系统下开发环境搭建/assets/查看mysql.png -------------------------------------------------------------------------------- /Linux系统下开发环境搭建/assets/深度截图_选择区域_20190219225738.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/josonle/Coding-Now/32b963ff23af1e957099d03cb9f935a32cbc9373/Linux系统下开发环境搭建/assets/深度截图_选择区域_20190219225738.png -------------------------------------------------------------------------------- /Linux系统下开发环境搭建/assets/解压.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/josonle/Coding-Now/32b963ff23af1e957099d03cb9f935a32cbc9373/Linux系统下开发环境搭建/assets/解压.png -------------------------------------------------------------------------------- /Linux系统下开发环境搭建/assets/触摸板手势.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/josonle/Coding-Now/32b963ff23af1e957099d03cb9f935a32cbc9373/Linux系统下开发环境搭建/assets/触摸板手势.png -------------------------------------------------------------------------------- /Linux系统下开发环境搭建/assets/重命名.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/josonle/Coding-Now/32b963ff23af1e957099d03cb9f935a32cbc9373/Linux系统下开发环境搭建/assets/重命名.png -------------------------------------------------------------------------------- /Linux系统下开发环境搭建/requirements.txt: -------------------------------------------------------------------------------- 1 | asn1crypto==0.24.0 2 | backcall==0.1.0 3 | bleach==3.1.4 4 | certifi==2018.1.18 5 | cffi==1.11.5 6 | chardet==3.0.4 7 | cryptography==2.1.4 8 | cycler==0.10.0 9 | decorator==4.3.0 10 | defusedxml==0.5.0 11 | entrypoints==0.3 12 | idna==2.8 13 | ipykernel==5.1.0 14 | ipython==7.2.0 15 | ipython-genutils==0.2.0 16 | ipywidgets==7.4.2 17 | jedi==0.13.2 18 | Jinja2==2.10 19 | jsonschema==2.6.0 20 | jupyter==1.0.0 21 | jupyter-client==5.2.4 22 | jupyter-console==6.0.0 23 | jupyter-core==4.4.0 24 | kiwisolver==1.0.1 25 | MarkupSafe==1.1.0 26 | matplotlib==3.0.2 27 | mistune==0.8.4 28 | nbconvert==5.4.0 29 | nbformat==4.4.0 30 | notebook==5.7.4 31 | numpy==1.16.0 32 | pandas==0.23.4 33 | pandocfilters==1.4.2 34 | parso==0.3.1 35 | pexpect==4.6.0 36 | pickleshare==0.7.5 37 | Pillow==6.2.0 38 | prometheus-client==0.5.0 39 | prompt-toolkit==2.0.7 40 | ptyprocess==0.6.0 41 | pycparser==2.19 42 | Pygments==2.3.1 43 | pyparsing==2.3.1 44 | python-dateutil==2.7.5 45 | pytz==2018.9 46 | pyxdg==0.26 47 | pyzmq==17.1.2 48 | qtconsole==4.4.3 49 | requests==2.18.4 50 | scikit-learn==0.20.2 51 | scipy==1.2.0 52 | seaborn==0.9.0 53 | Send2Trash==1.5.0 54 | six==1.12.0 55 | sklearn==0.0 56 | terminado==0.8.1 57 | testpath==0.4.2 58 | tornado==5.1.1 59 | traitlets==4.3.2 60 | urllib3==1.22 61 | wcwidth==0.1.7 62 | webencodings==0.5.1 63 | widgetsnbextension==3.4.2 64 | -------------------------------------------------------------------------------- /Spring-Boot-Learning/_vnote.json: -------------------------------------------------------------------------------- 1 | { 2 | "created_time": "2019-10-22T07:29:42Z", 3 | "files": [ 4 | { 5 | "attachment_folder": "", 6 | "attachments": [ 7 | ], 8 | "created_time": "2019-10-22T07:30:05Z", 9 | "modified_time": "2019-10-29T15:08:51Z", 10 | "name": "README.md", 11 | "tags": [ 12 | ] 13 | } 14 | ], 15 | "sub_directories": [ 16 | ], 17 | "version": "1" 18 | } 19 | -------------------------------------------------------------------------------- /Spring-Boot-Learning/assets/20191022153424858_1878326502.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/josonle/Coding-Now/32b963ff23af1e957099d03cb9f935a32cbc9373/Spring-Boot-Learning/assets/20191022153424858_1878326502.png -------------------------------------------------------------------------------- /Spring-Boot-Learning/assets/20191022153632597_151903268.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/josonle/Coding-Now/32b963ff23af1e957099d03cb9f935a32cbc9373/Spring-Boot-Learning/assets/20191022153632597_151903268.png -------------------------------------------------------------------------------- /Spring-Boot-Learning/assets/20191022154456020_407860967.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/josonle/Coding-Now/32b963ff23af1e957099d03cb9f935a32cbc9373/Spring-Boot-Learning/assets/20191022154456020_407860967.png -------------------------------------------------------------------------------- /Spring-Boot-Learning/assets/20191022154845144_995881766.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/josonle/Coding-Now/32b963ff23af1e957099d03cb9f935a32cbc9373/Spring-Boot-Learning/assets/20191022154845144_995881766.png -------------------------------------------------------------------------------- /Spring-Boot-Learning/assets/20191022160835093_168811412.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/josonle/Coding-Now/32b963ff23af1e957099d03cb9f935a32cbc9373/Spring-Boot-Learning/assets/20191022160835093_168811412.png -------------------------------------------------------------------------------- /Spring-Boot-Learning/assets/20191022161225973_1331719954.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/josonle/Coding-Now/32b963ff23af1e957099d03cb9f935a32cbc9373/Spring-Boot-Learning/assets/20191022161225973_1331719954.png -------------------------------------------------------------------------------- /Spring-Boot-Learning/assets/20191022161346956_1117468288.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/josonle/Coding-Now/32b963ff23af1e957099d03cb9f935a32cbc9373/Spring-Boot-Learning/assets/20191022161346956_1117468288.png -------------------------------------------------------------------------------- /Spring-Boot-Learning/assets/20191022201407698_1597655336.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/josonle/Coding-Now/32b963ff23af1e957099d03cb9f935a32cbc9373/Spring-Boot-Learning/assets/20191022201407698_1597655336.png -------------------------------------------------------------------------------- /Spring-Boot-Learning/assets/20191022210336626_1331334869.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/josonle/Coding-Now/32b963ff23af1e957099d03cb9f935a32cbc9373/Spring-Boot-Learning/assets/20191022210336626_1331334869.png -------------------------------------------------------------------------------- /Spring-Boot-Learning/assets/20191024095409385_232974006.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/josonle/Coding-Now/32b963ff23af1e957099d03cb9f935a32cbc9373/Spring-Boot-Learning/assets/20191024095409385_232974006.png -------------------------------------------------------------------------------- /Spring-Boot-Learning/assets/20191024172348188_2081525319.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/josonle/Coding-Now/32b963ff23af1e957099d03cb9f935a32cbc9373/Spring-Boot-Learning/assets/20191024172348188_2081525319.png -------------------------------------------------------------------------------- /Spring-Boot-Learning/assets/20191028232512518_312968216.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/josonle/Coding-Now/32b963ff23af1e957099d03cb9f935a32cbc9373/Spring-Boot-Learning/assets/20191028232512518_312968216.png -------------------------------------------------------------------------------- /Spring-Boot-Learning/assets/20191029202018852_969396943.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/josonle/Coding-Now/32b963ff23af1e957099d03cb9f935a32cbc9373/Spring-Boot-Learning/assets/20191029202018852_969396943.png -------------------------------------------------------------------------------- /Spring-Boot-Learning/assets/20191029205135984_418441085.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/josonle/Coding-Now/32b963ff23af1e957099d03cb9f935a32cbc9373/Spring-Boot-Learning/assets/20191029205135984_418441085.png -------------------------------------------------------------------------------- /Spring-Boot-Learning/assets/20191029224401689_359358011.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/josonle/Coding-Now/32b963ff23af1e957099d03cb9f935a32cbc9373/Spring-Boot-Learning/assets/20191029224401689_359358011.png -------------------------------------------------------------------------------- /Spring-Boot-Learning/assets/20191029225826769_1169318871.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/josonle/Coding-Now/32b963ff23af1e957099d03cb9f935a32cbc9373/Spring-Boot-Learning/assets/20191029225826769_1169318871.png -------------------------------------------------------------------------------- /Spring-Boot-Learning/assets/20191029230019588_1482385818.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/josonle/Coding-Now/32b963ff23af1e957099d03cb9f935a32cbc9373/Spring-Boot-Learning/assets/20191029230019588_1482385818.png -------------------------------------------------------------------------------- /_vnote.json: -------------------------------------------------------------------------------- 1 | { 2 | "created_time": "2019-05-17T09:44:08Z", 3 | "files": [ 4 | { 5 | "attachment_folder": "", 6 | "attachments": [ 7 | ], 8 | "created_time": "2019-05-17T09:44:08Z", 9 | "modified_time": "2019-05-17T09:44:08Z", 10 | "name": "Git使用教程:最详细、最傻瓜、最浅显、真正手把手教.md", 11 | "tags": [ 12 | ] 13 | }, 14 | { 15 | "attachment_folder": "", 16 | "attachments": [ 17 | ], 18 | "created_time": "2019-05-17T09:44:08Z", 19 | "modified_time": "2019-05-17T09:44:08Z", 20 | "name": "git团队协作项目操作说明.md", 21 | "tags": [ 22 | ] 23 | }, 24 | { 25 | "attachment_folder": "", 26 | "attachments": [ 27 | ], 28 | "created_time": "2019-05-17T09:44:08Z", 29 | "modified_time": "2019-10-06T07:10:21Z", 30 | "name": "README.md", 31 | "tags": [ 32 | ] 33 | } 34 | ], 35 | "sub_directories": [ 36 | { 37 | "name": "eBook" 38 | }, 39 | { 40 | "name": "Java笔记" 41 | }, 42 | { 43 | "name": "Linux命令及Shell脚本学习笔记" 44 | }, 45 | { 46 | "name": "Linux系统下开发环境搭建" 47 | }, 48 | { 49 | "name": "大数据" 50 | }, 51 | { 52 | "name": "算法和数据结构" 53 | } 54 | ], 55 | "version": "1" 56 | } 57 | -------------------------------------------------------------------------------- /assets/1547472870163.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/josonle/Coding-Now/32b963ff23af1e957099d03cb9f935a32cbc9373/assets/1547472870163.png -------------------------------------------------------------------------------- /assets/1547472895580.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/josonle/Coding-Now/32b963ff23af1e957099d03cb9f935a32cbc9373/assets/1547472895580.png -------------------------------------------------------------------------------- /assets/1556878717809.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/josonle/Coding-Now/32b963ff23af1e957099d03cb9f935a32cbc9373/assets/1556878717809.png -------------------------------------------------------------------------------- /assets/1556882392939.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/josonle/Coding-Now/32b963ff23af1e957099d03cb9f935a32cbc9373/assets/1556882392939.png -------------------------------------------------------------------------------- /assets/1556883671229.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/josonle/Coding-Now/32b963ff23af1e957099d03cb9f935a32cbc9373/assets/1556883671229.png -------------------------------------------------------------------------------- /assets/1556883688122.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/josonle/Coding-Now/32b963ff23af1e957099d03cb9f935a32cbc9373/assets/1556883688122.png -------------------------------------------------------------------------------- /assets/1556883986766.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/josonle/Coding-Now/32b963ff23af1e957099d03cb9f935a32cbc9373/assets/1556883986766.png -------------------------------------------------------------------------------- /assets/1556884056058.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/josonle/Coding-Now/32b963ff23af1e957099d03cb9f935a32cbc9373/assets/1556884056058.png -------------------------------------------------------------------------------- /assets/1556884308437.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/josonle/Coding-Now/32b963ff23af1e957099d03cb9f935a32cbc9373/assets/1556884308437.png -------------------------------------------------------------------------------- /assets/1556884626871.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/josonle/Coding-Now/32b963ff23af1e957099d03cb9f935a32cbc9373/assets/1556884626871.png -------------------------------------------------------------------------------- /assets/1556884677828.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/josonle/Coding-Now/32b963ff23af1e957099d03cb9f935a32cbc9373/assets/1556884677828.png -------------------------------------------------------------------------------- /assets/1556884770319.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/josonle/Coding-Now/32b963ff23af1e957099d03cb9f935a32cbc9373/assets/1556884770319.png -------------------------------------------------------------------------------- /assets/1556885297319.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/josonle/Coding-Now/32b963ff23af1e957099d03cb9f935a32cbc9373/assets/1556885297319.png -------------------------------------------------------------------------------- /assets/1556885669473.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/josonle/Coding-Now/32b963ff23af1e957099d03cb9f935a32cbc9373/assets/1556885669473.png -------------------------------------------------------------------------------- /assets/1556885795335.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/josonle/Coding-Now/32b963ff23af1e957099d03cb9f935a32cbc9373/assets/1556885795335.png -------------------------------------------------------------------------------- /assets/1556885939394.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/josonle/Coding-Now/32b963ff23af1e957099d03cb9f935a32cbc9373/assets/1556885939394.png -------------------------------------------------------------------------------- /assets/1556886206847.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/josonle/Coding-Now/32b963ff23af1e957099d03cb9f935a32cbc9373/assets/1556886206847.png -------------------------------------------------------------------------------- /assets/1556886589539.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/josonle/Coding-Now/32b963ff23af1e957099d03cb9f935a32cbc9373/assets/1556886589539.png -------------------------------------------------------------------------------- /assets/1556886824092.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/josonle/Coding-Now/32b963ff23af1e957099d03cb9f935a32cbc9373/assets/1556886824092.png -------------------------------------------------------------------------------- /assets/1556887053275.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/josonle/Coding-Now/32b963ff23af1e957099d03cb9f935a32cbc9373/assets/1556887053275.png -------------------------------------------------------------------------------- /assets/1556887129427.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/josonle/Coding-Now/32b963ff23af1e957099d03cb9f935a32cbc9373/assets/1556887129427.png -------------------------------------------------------------------------------- /assets/1556944982177.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/josonle/Coding-Now/32b963ff23af1e957099d03cb9f935a32cbc9373/assets/1556944982177.png -------------------------------------------------------------------------------- /assets/1556945256521.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/josonle/Coding-Now/32b963ff23af1e957099d03cb9f935a32cbc9373/assets/1556945256521.png -------------------------------------------------------------------------------- /assets/1556945314176.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/josonle/Coding-Now/32b963ff23af1e957099d03cb9f935a32cbc9373/assets/1556945314176.png -------------------------------------------------------------------------------- /assets/1556945414408.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/josonle/Coding-Now/32b963ff23af1e957099d03cb9f935a32cbc9373/assets/1556945414408.png -------------------------------------------------------------------------------- /assets/1556945533185.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/josonle/Coding-Now/32b963ff23af1e957099d03cb9f935a32cbc9373/assets/1556945533185.png -------------------------------------------------------------------------------- /assets/1556945641117.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/josonle/Coding-Now/32b963ff23af1e957099d03cb9f935a32cbc9373/assets/1556945641117.png -------------------------------------------------------------------------------- /assets/1556945756926.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/josonle/Coding-Now/32b963ff23af1e957099d03cb9f935a32cbc9373/assets/1556945756926.png -------------------------------------------------------------------------------- /assets/1556945820141.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/josonle/Coding-Now/32b963ff23af1e957099d03cb9f935a32cbc9373/assets/1556945820141.png -------------------------------------------------------------------------------- /assets/20190503174907.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/josonle/Coding-Now/32b963ff23af1e957099d03cb9f935a32cbc9373/assets/20190503174907.png -------------------------------------------------------------------------------- /assets/20190822110758971_764642917.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/josonle/Coding-Now/32b963ff23af1e957099d03cb9f935a32cbc9373/assets/20190822110758971_764642917.png -------------------------------------------------------------------------------- /assets/20190822110907672_847619643.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/josonle/Coding-Now/32b963ff23af1e957099d03cb9f935a32cbc9373/assets/20190822110907672_847619643.png -------------------------------------------------------------------------------- /assets/20190822110937662_1548052493.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/josonle/Coding-Now/32b963ff23af1e957099d03cb9f935a32cbc9373/assets/20190822110937662_1548052493.png -------------------------------------------------------------------------------- /assets/githubLicense.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/josonle/Coding-Now/32b963ff23af1e957099d03cb9f935a32cbc9373/assets/githubLicense.png -------------------------------------------------------------------------------- /eBook/HBase系列/HBase实战.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/josonle/Coding-Now/32b963ff23af1e957099d03cb9f935a32cbc9373/eBook/HBase系列/HBase实战.pdf -------------------------------------------------------------------------------- /eBook/JAVA核心知识点整理.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/josonle/Coding-Now/32b963ff23af1e957099d03cb9f935a32cbc9373/eBook/JAVA核心知识点整理.pdf -------------------------------------------------------------------------------- /eBook/Python/Python3数据分析与挖掘.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/josonle/Coding-Now/32b963ff23af1e957099d03cb9f935a32cbc9373/eBook/Python/Python3数据分析与挖掘.txt -------------------------------------------------------------------------------- /eBook/Python/Python升级3.6 强力Django+杀手级Xadmin打造在线教育平台.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/josonle/Coding-Now/32b963ff23af1e957099d03cb9f935a32cbc9373/eBook/Python/Python升级3.6 强力Django+杀手级Xadmin打造在线教育平台.txt -------------------------------------------------------------------------------- /eBook/Python/分布式爬虫打造搜索引擎.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/josonle/Coding-Now/32b963ff23af1e957099d03cb9f935a32cbc9373/eBook/Python/分布式爬虫打造搜索引擎.txt -------------------------------------------------------------------------------- /eBook/README.md: -------------------------------------------------------------------------------- 1 | - 面试技术岗,你真能讲明白技术吗?.md 2 | - JAVA核心知识点整理.pdf————来源网络,具体不知,侵权可删 -------------------------------------------------------------------------------- /eBook/Spark系列/01-基于Spark2.x新闻网大数据实时分析可视化系统项目.txt: -------------------------------------------------------------------------------- 1 | 链接: https://pan.baidu.com/s/100fffZlhYBtvVLU3NQTCew 提取码: qhm3 复制这段内容后打开百度网盘手机App,操作更方便哦 -------------------------------------------------------------------------------- /eBook/Spark系列/02-Spark离线和实时电影推荐系统直播回放(视频+文档+代码).txt: -------------------------------------------------------------------------------- 1 | 链接:https://pan.baidu.com/s/1VtrwmfIWk9KpCPPXPVErsw 2 | 提取码:w32c -------------------------------------------------------------------------------- /eBook/Spark系列/03-Spark项目实战:爱奇艺用户行为实时分析系统.txt: -------------------------------------------------------------------------------- 1 | 链接: https://pan.baidu.com/s/1BjPB-1bBYd05BixF_rnRcg 提取码: wykg 复制这段内容后打开百度网盘手机App,操作更方便哦 -------------------------------------------------------------------------------- /eBook/Spark系列/04-Spark企业级实战项目:道路交通实时流量监控预测系统.txt: -------------------------------------------------------------------------------- 1 | 链接:https://pan.baidu.com/s/19coozvA_tHEB8EawYhGA4Q 2 | 提取码:2p2d -------------------------------------------------------------------------------- /eBook/Spark系列/05-Spark企业级实战项目:知名手机厂商用户行为实时分析系统.txt: -------------------------------------------------------------------------------- 1 | 链接:https://pan.baidu.com/s/1jjiODt9A3NJ_lIyk_cUUYA 2 | 提取码:tior -------------------------------------------------------------------------------- /eBook/Spark系列/06-Spark大型项目实战:电商用户行为分析大数据平台.txt: -------------------------------------------------------------------------------- 1 | 链接:https://pan.baidu.com/s/1DHvdBv_5vImyDs5pIGuhfQ 2 | 提取码:sp13 -------------------------------------------------------------------------------- /eBook/Spark系列/07-Spark 2.0从入门到精通245讲.txt: -------------------------------------------------------------------------------- 1 | 链接:https://pan.baidu.com/s/13PZfRURGaJy53awtC3p6Pg 2 | 提取码:2my8 -------------------------------------------------------------------------------- /eBook/_vnote.json: -------------------------------------------------------------------------------- 1 | { 2 | "created_time": "2019-05-17T09:44:08Z", 3 | "files": [ 4 | { 5 | "attachment_folder": "", 6 | "attachments": [ 7 | ], 8 | "created_time": "2019-05-17T09:44:08Z", 9 | "modified_time": "2019-05-17T09:44:08Z", 10 | "name": "README.md", 11 | "tags": [ 12 | ] 13 | }, 14 | { 15 | "attachment_folder": "", 16 | "attachments": [ 17 | ], 18 | "created_time": "2019-05-17T09:44:08Z", 19 | "modified_time": "2019-05-17T09:44:08Z", 20 | "name": "面试技术岗,你真能讲明白技术吗?.md", 21 | "tags": [ 22 | ] 23 | }, 24 | { 25 | "attachment_folder": "", 26 | "attachments": [ 27 | ], 28 | "created_time": "2019-06-04T12:19:18Z", 29 | "modified_time": "2019-06-04T12:22:04Z", 30 | "name": "代码审核.md", 31 | "tags": [ 32 | ] 33 | } 34 | ], 35 | "sub_directories": [ 36 | ], 37 | "version": "1" 38 | } 39 | -------------------------------------------------------------------------------- /eBook/算法及其余基础书籍/数据库和分布式/20个数据库常见面试题讲解 - 搜云库技术团队.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/josonle/Coding-Now/32b963ff23af1e957099d03cb9f935a32cbc9373/eBook/算法及其余基础书籍/数据库和分布式/20个数据库常见面试题讲解 - 搜云库技术团队.pdf -------------------------------------------------------------------------------- /eBook/算法及其余基础书籍/数据库和分布式/『浅入深出』MySQL 中事务的实现.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/josonle/Coding-Now/32b963ff23af1e957099d03cb9f935a32cbc9373/eBook/算法及其余基础书籍/数据库和分布式/『浅入深出』MySQL 中事务的实现.pdf -------------------------------------------------------------------------------- /eBook/算法及其余基础书籍/数据库和分布式/分布式系统一致性(ACID、CAP、BASE、二段提交、三段提交、TCC、幂等性)原理详解.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/josonle/Coding-Now/32b963ff23af1e957099d03cb9f935a32cbc9373/eBook/算法及其余基础书籍/数据库和分布式/分布式系统一致性(ACID、CAP、BASE、二段提交、三段提交、TCC、幂等性)原理详解.pdf -------------------------------------------------------------------------------- /eBook/算法及其余基础书籍/数据库和分布式/分布式锁实现(基于redis-mysql).pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/josonle/Coding-Now/32b963ff23af1e957099d03cb9f935a32cbc9373/eBook/算法及其余基础书籍/数据库和分布式/分布式锁实现(基于redis-mysql).pdf -------------------------------------------------------------------------------- /eBook/算法及其余基础书籍/数据库和分布式/数据库两大神器【索引和锁】.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/josonle/Coding-Now/32b963ff23af1e957099d03cb9f935a32cbc9373/eBook/算法及其余基础书籍/数据库和分布式/数据库两大神器【索引和锁】.pdf -------------------------------------------------------------------------------- /eBook/算法及其余基础书籍/数据库和分布式/理解分布式事务 -贝聊科技.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/josonle/Coding-Now/32b963ff23af1e957099d03cb9f935a32cbc9373/eBook/算法及其余基础书籍/数据库和分布式/理解分布式事务 -贝聊科技.pdf -------------------------------------------------------------------------------- /eBook/算法及其余基础书籍/牛客网算法.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/josonle/Coding-Now/32b963ff23af1e957099d03cb9f935a32cbc9373/eBook/算法及其余基础书籍/牛客网算法.txt -------------------------------------------------------------------------------- /eBook/面试技术岗,你真能讲明白技术吗?.md: -------------------------------------------------------------------------------- 1 | > 原文地址 https://www.infoq.cn/article/FVEdSPKMZm00diYEj_iz?utm_source=rss&utm_medium=article 2 | 3 | > 给面试官讲明白技术,你不仅要懂技术,还要懂面试官。今天我们就从这两个方面出发,讲讲如何让面试官听到满意的答案,从而提高你的面试成功率。 4 | 5 | 对于程序员职位的面试,技术问题占的比重非常大。技术问题的回答质量,决定了面试成败。除了面试之外,讲技术的场景还有很多:你和同事讨论技术问题,选择技术方案,都是在讲技术。 6 | 7 | 你可能会说,把技术讲明白有什么难的,只要我懂就能讲明白。呵呵,你辅导过孩子作业么?有时候那种抓狂,是你对题目本身再明白也无法解决的。例子有点极端,我是在强调:**给面试官讲明白技术,你不仅要懂技术,还要懂面试官。**今天我们就从这两个方面出发,讲讲如何让面试官听到满意的答案,从而提高你的面试成功率。 8 | 9 | ## 技术的水有多深? 10 | 11 | 我们先说技术可以从哪些方面来讲,看看技术的水有多深。 12 | 13 | 技术是为了解决问题而生的。本质上,技术就是解决问题的方法。问题规模越大,难度越复杂,就要引入多种技术。这些技术组合搭配起来,构成该解决方案的一棵 “技术树”。其实,每一个分支和叶子都有多种可选的技术,随着更多的创新出现,这些分支和叶子也在演变,使得整体方案在空间和时间上,能更高效更节省地解决问题。我们对这些分支和叶子技术点的了解和运用,甚至对它们演变的推动,都体现了我们的经验和技能。 14 | 15 | 那么,一个技术领域,我们需要阐述哪些层面呢?我觉得可分两个维度,一个是技术的设计维度(从技术内部看),另一个是技术的应用维度(从技术外部看),如下图所示。 16 | 17 | ![](https://static001.infoq.cn/resource/image/4c/14/4c961cf56aeace604cfe830659a67314.jpeg) 18 | 19 | 我们以 Java 多线程为例,解释下这两个维度。 20 | 21 | ### 1\. 应用维度 22 | 23 | 应用维度主要从问题、技术规范、最佳实践、市场应用趋势这四个层面来解释。 24 | 25 | **问题**:从技术的应用维度看,首先考虑的是要解决什么问题,这是技术产生的原因。Java 多线程的产生,是因为要并发,并发使得程序的多种功能能响应更快,用户体验更好。**问题这层,用来回答 “干什么用”**。 26 | 27 | **技术规范**:接下来,技术被研发出来,人们怎么用它才能解决问题呢?这就要看技术规范,可以理解为技术使用说明书。在 Java 世界里,你可以实现 Runnable 接口、扩展 Thread 类来实现代码并发;同时,Java 提供 synchronized 关键字,以及各种锁,来帮你控制并发中的代码行为和衍生问题。这需要了解接口和关键字的使用规则和潜在影响,以及各功能的细微差别。比如, sleep() 和 wait() 的区别是什么, 为什么 wait() 需要在同步代码块内使用,而 sleep() 不需要。**技术规范,回答 “怎么用” 的问题,反映你对该技术使用方法的理解深度**。 28 | 29 | **最佳实践**:你把该技术运用到多种不同的场景时,会发现同样的使用方法,会有不同的效果,这是因为问题上下文不同了,该技术有不同的适应面。从而你可能踩了很多坑,知道了该技术的 “脾性”,从中总结出最佳实践。这缘于在不同应用场景中,对技术表现差异的比较和把握。**最佳实践回答 “怎么能用好” 的问题,反映你实践经验的丰富程度**。比如: 30 | 31 | > 在多线程场景下实现锁来确保线程的同步,但是加锁、释放锁是个非常消耗资源的操作,没有获得锁的线程还需要进入阻塞状态,等待被唤醒。 如果多个线程的竞争并不激烈,可以考虑使用 CAS 的方式实现无锁的线程同步,线程可以一直运行,不用阻塞。但是使用 CAS 还需要考虑使用时间戳等方式来解决 ABA 问题。 32 | 33 | **市场应用趋势**:随着技术生态的发展,和应用问题的变迁,技术的应用场景和流行趋势会受到影响。对于 Java,从低并发逐渐发展到高并发,如何充分利用系统的能力,减少响应时间变得非常重要。**这层回答 “谁用,用在哪” 的问题,反映你对技术应用领域的认识宽度**。 34 | 35 | ### 2\. 设计维度 36 | 37 | 应用维度是从外部看技术的应用。那么,从内部能看到技术的哪些层面呢? 38 | 39 | **目标**:为了解决用户的问题,技术本身要达成什么目标。比如,Java 多线程要在优先级调度、锁、信息同步等方面达成怎样的目标,才能更好地实现并发。**这层定义 “做到什么”**。 40 | 41 | **实现原理**:为了达到设计目标,该技术采用了什么原理和机制。Java 多线程的实现原理包括内核线程、使用用户态线程、使用用户态线程加轻量级进程混合等部分,还包括硬件指令集、Test and Set、各种锁等。**实现原理层回答 “怎么做到” 的问题**。把实现原理弄懂,并且讲清楚,是技术人员的基本功。 42 | 43 | **优劣局限**:每种技术实现,都有其局限性,在某些条件下能最大化的发挥效能,缺少了某些条件则暴露出其缺陷。比如在 Java 多线程编程中,采用共享内存的方式,锁的开销比较大,程序员编程难度较大,容易出错,难以调试。**优劣局限层回答 “做得怎么样” 的问题**。对技术优劣局限的把握,更有利于应用时总结最佳实践,是分析各种 “坑” 的基础。 44 | 45 | **演进趋势**:技术是在迭代改进和不断淘汰的。了解技术的前生后世,分清技术不变的本质,和变化的脉络,以及与其他技术的共生关系,能体现你对技术发展趋势的关注和思考。**这层体现 “未来如何”**。比如: 46 | 47 | > Java 5 提供 JUC 包,实现了多种锁结构,简化开发;Java 7 加入 Future 来获取线程返回值;Go 语言中 “协程” 的概念,也被第三方引入,扩展了 Java 的多线程功能,比线程切换更快,性能得到了很大的提升。 48 | 49 | 总地来说,从技术内部(也就是设计维度上)看,包括目标、实现原理、优劣局限、技术演进趋势。而从技术外部看,也就是市场应用维度上看,包括问题、技术规范、最佳实践、市场应用趋势。它们是逐层递进的关系,代表了你对技术把握的深度。 50 | 51 | 对于一项流行的技术,大部分人可以讲清实现原理和技术规范,也就是说能搞懂它的工作原理和使用方法,这是技术人员的基本功。再上面的技术局限性和最佳实践,只有经过深入的钻研,甚至读源码,以及多场景的实践之后,才能讲出深刻的认识。对于最上面的趋势层,需要具有相当程度的 “T” 型技术体系,对相关技术有横向和纵向的对比之后,才能总结得出来,考验应聘者的知识面和洞见。 52 | 53 | 但是,如果有人恰好读过几篇有深度的技术文章,上面的某些层他也可能照本宣科地讲出来。那么让你和他可以区分开的 “杀手锏” 就是技术实战:如果你在 “最佳实践” 部分中,能结合自己的项目经历,找到该技术的一个应用例子,特别是棘手的问题,讲清你是如何调优或者解决的,不仅会彰显你真实的技术水平,而且最有说服力,也是面试官最看重的。当你把问题的解决过程,跌宕起伏地讲出来,面试官也会跟你一样嗨起来。 54 | 55 | 讲到这,你可能要问,难道面试中的每个技术问题,都要按照上面两个维度八个方面去解释么?不是的,你还需要弄懂面试官想听什么,能听什么,然后再按需呈现。下面我们谈一下如何弄懂面试官的需求。 56 | 57 | ## 你有多懂面试官? 58 | 59 | 只听懂面试官说的字面意思,不一定能给面试官满意的答案。很多时候,应聘者并不能准确理解面试官想要听的点。下面列出了几种情况及其解决方法。 60 | 61 | 1. **问答双方角色不同(比如项目经理面试架构师的情况),思考角度不同,导致对同一个技术话题,展开的方向不同,自然理解上会发生分歧**。工程思维的人想的是如何得到结果,你可以着重讲技术内部维度的内容;而用户思维的人想的是那个结果可以用来干什么,你就要侧重到应用维度上了。(当然,项目经理不应该面试架构师人选,但是事实上这种安排还真有。) 62 | 63 | 2. **问答双方的知识结构和水平不一样,理解深度和宽度不同**。你觉得小儿科的知识,对方却可能完全听不懂。这需要你了解对方的技术水平,采用适当的技术语言或者业务语言来表达。不要满嘴都是你专用的术语或者缩写,谁知道你说的 “FID”“CPS” 代表什么呢。 64 | 65 | 3. **上下文理解不同,面试官的问题意图不能被应聘者理解**。面试官的问题之间或多或少是有联系的,你需要根据问题的上下文,结合前面问答中面试官的语言或者肢体反馈,分析他的意图,搞清他是在问 “为什么”,还是 “是什么”,或者 “怎么用”,从而调整要表达的内容。 66 | 67 | 4. **面试官没有问清楚**。比如,“请你解释一下 HTTPS”,这样的提问就不够具体,原因可能是面试官怕问到你能力临界点之外,但也可能是他本身就没把问题想清楚。 68 | 69 | 所以,遇到问题不清楚的时候,你需要从面试官的语言和关注点上,推测他的角色、知识结构、沟通风格,回忆最近几个问题的关系,来推测问题意图。如果推测不出来,就直接问他,比如,“我对该技术领域了解 ABCD,请问您对哪方面更感兴趣呢”,通过这样的问题,来确定要讲的内容。这里的要点是 “充分沟通”,否则你可能讲半天,对方还是不明白。自顾自地讲高深的内容,效果不一定好。 70 | 71 | ## **注意表达方法** 72 | 73 | 回答提问时还应注意选用适当的表达方法,展示你的表达能力。这里,我给你一些建议。 74 | 75 | 1. **结构化表达,帮助面试官梳理信息逻辑**。比如,使用列表,或者使用结构化的语言序号 “第一…… 第二……”。关于表达逻辑,芭芭拉 · 明托的《金字塔原理》可能会帮到你。 76 | 77 | 2. **可视化**。用画图或者演示的方法,直观形象地表达复杂的技术问题。 78 | 79 | 3. **举例子和做类比**。举常见的例子,类比成常见的事物,这样把高深的原理说简单,对方不仅能听懂,还会赞赏你的表达能力。比如: 80 | 81 | > 有人问 “Java 线程和进程有什么区别”,知乎上有人回答:“如果一个大火锅一个人吃,就是单进程单线程;一个大火锅多人吃,就是单进程多线程;如果他们分开吃小火锅,就是多进程多线程了。” 82 | 83 | 把内容说简短很不容易。马克 · 吐温曾给读者回信说:我没有时间给您写封短信,所以就写了封长信。把内容陈列出来容易,但是长话短说很难。需要你深刻理解本质,区分每块内容的重要等级,再梳理逻辑和分析取舍。 84 | 85 | 1. **对比**。电影《无双》中有一场面试,郭富城跟周润发在酒吧见面,郭富城讲作画的工艺:“…… 把纸放进碳酸钙和木质素就能泡出质感。行家用的油墨多数都是植物油,干得快,稳定。而我用核桃油、煤灰和松节油混合……” 这里他是在把两种技术进行对比,来突出自己采用的技术有多么专业和独特。 86 | 87 | 2. **讲故事**。如果你能找到一段相关经历,讲述该技术的应用或者学习细节,展示你学以致用的能力,效果会非常好。你可以说 “这个技术,我上个月正好在某某项目上用过,当时的情况是……” 88 | 89 | 灵活运用以上方法,能让你的表达效果事半功倍。以上这些表达方法,不仅适用于技术,在其他专业问题上,也同样见效。但是请注意,回答时一定注意详略。如果你在某一个问题上纠缠太久,会影响后面知识点的考查。你需要边讲边注意面试官的反应,如果他有看表、看简历等厌倦或者着急的情绪信号,就要赶紧调整到下一点了。 90 | 91 | * * * -------------------------------------------------------------------------------- /git团队协作项目操作说明.md: -------------------------------------------------------------------------------- 1 | [TOC] 2 | 3 | ### 一、如何参与该项目 4 | 5 | #### 项目要求 6 | 7 | - 文件(夹)命名格式 8 | - Leetcode题放在Leetcode_EveryDay目录下,后期可以考虑添加剑指offer、面经、每日分享等目录 9 | - 按题分成不同文件夹,文件夹命名格式为`Topic+题号-英文题名`,如`Topic1-two-sum` 10 | - 你刷的题请放在对应文件夹下,如果仓库中还没有的题,请新建对应文件夹,并在文件夹下添加`README.md`(最好是中英文题目内容+链接) 11 | - 刷的题请以`from--题名.java`格式命名,C++则以cpp结尾,github昵称用来区分不同提交 12 | - 加入项目的小伙伴只能操作自己的文件,不要删除其他人的文件(即**不要删除从原项目clone的内容**,不要删除从原项目clone的内容,不要删除从原项目clone的内容) 13 | - 14 | 15 | ### 二、clone项目到本地 16 | 17 | 如图,最好选择ssh 18 | ![深度截图_选择区域_20190503174907](assets/20190503174907.png) 19 | 20 | 21 | 22 | 然后选择一个文件夹,通过`git clone [复制的链接]`将项目下载到本地(前提是已经装了git,linux、mac直接终端,Windows用git shell或git Desktop) 23 | 24 | ![1556878717809](assets/1556878717809.png) 25 | 26 | ******* 27 | 28 | ### 三、设置fork的项目与原项目同步 29 | 30 | #### 命令行方式(推荐) 31 | 32 | 先看下仓库下有什么,然后开始配置 33 | 34 | ![1556884056058](assets/1556884056058.png) 35 | 36 | - 查看所有分支,`git branch -a` 37 | 38 | ![1556883688122](assets/1556883688122.png) 39 | 40 | - 查看所有远程仓库,`git remote -v` 41 | 42 | ![1556883671229](assets/1556883671229.png) 43 | 44 | - 添加一个上游分支,指向原项目,即`git@github.com:josonle/Leetcode-solution-for-us.git` 45 | 46 | > `git remote add upstream git@github.com:josonle/Leetcode-solution-for-us.git` 47 | > 48 | > 再次查看远程仓库,多了一个 49 | > 50 | > ![1556883986766](assets/1556883986766.png) 51 | 52 | - 先抓取上游分支的更新到本地,`git fetch upstream`,upstream是上面新建上游分支名 53 | 54 | >如下图,并且多了一个分支,本地分支master,两个远程分支其中一个是源项目的 55 | > 56 | >![1556884308437](assets/1556884308437.png) 57 | 58 | - 合并原项目的远程分支,然后push到自己fork的项目上去 59 | 60 | - `git merge upstream/master` 61 | 62 | ![1556884626871](assets/1556884626871.png) 63 | 64 | - `git push origin master` 65 | 66 | ![1556884677828](assets/1556884677828.png) 67 | 68 | 本地仓库里和网页上查看都更新了原项目的内容,如图 69 | 70 | ![1556884770319](assets/1556884770319.png) 71 | 72 | 73 | 74 | #### 直接在Web页面操作 75 | 76 | - 点击compare 77 | 78 | ![1556944982177](assets/1556944982177.png) 79 | 80 | - 选择从原项目的master分支同步到fork项目(这里是another-Lee/xxx)的master分支 81 | 82 | ![1556945256521](assets/1556945256521.png) 83 | 84 | 85 | 86 | ![1556945314176](assets/1556945314176.png) 87 | 88 | 89 | 90 | ![1556945414408](assets/1556945414408.png) 91 | 92 | - 其实上面的内容就是fetch原项目的更新内容,并对fork项目pull request,操作如下图 93 | 94 | ![1556945533185](assets/1556945533185.png) 95 | 96 | 97 | 98 | ![1556945641117](assets/1556945641117.png) 99 | 100 | 101 | 102 | ![1556945756926](assets/1556945756926.png) 103 | 104 | 105 | 106 | 然后再Confirm merge,即可。如图,更新已同步 107 | 108 | ![1556945820141](assets/1556945820141.png) 109 | 110 | 111 | 112 | ### 四、fork的项目如何pull request到原项目 113 | 114 | 这里我们在another-Lee的本地仓库新建一个文件夹`Topic2-add-two-numbers`,**强调必须以【`Topic+题号+英文题名`】命名**,里面随便放点啥,比如`from-anotherLee-add-two-numbers.java`。**再次强调,提交文件以【`from--题名.java`】命名,如果是C++就用cpp结尾** 115 | 116 | ![1556885297319](assets/1556885297319.png) 117 | 118 | 119 | 120 | 先提交并推送到自己仓库去 121 | 122 | ``` 123 | $ git add . 124 | $ git commit -m"from another-Lee:添加addTwoNumbers" 125 | $ git push origin master 126 | ``` 127 | 128 | > 强调,提交信息,必须是from :xxx格式 129 | > 130 | > 网页上打开查看,如图是我们刚刚推送的更新 131 | > 132 | > ![1556885669473](assets/1556885669473.png) 133 | 134 | 然后重点来了,向原项目pull request 135 | 136 | ![1556885795335](assets/1556885795335.png) 137 | 138 | 139 | 140 | 然后创建pr 141 | 142 | ![1556885939394](assets/1556885939394.png) 143 | 144 | 注意分支信息要设置的没问题,然后填写提交信息,标题最好不要修改(默认是commit信息) 145 | 146 | ![1556886206847](assets/1556886206847.png) 147 | 148 | 然后pull request就结束了,后续就是我负责审核代码,并merge到原项目中去,fork的项目也无法修改pr内容 149 | 150 | 151 | 152 | 到此就结束了,以下是介绍Master如何审核代码,处理pr 153 | 154 | *** 155 | 156 | 157 | 158 | ### 原项目审核并处理pull request 159 | 160 | 打开项目,可以发现pr有提示,然后我们可以查看更改的文件,给出审核结果 161 | 162 | ![1556886589539](assets/1556886589539.png) 163 | 164 | 如图审核结果有三种: 165 | 166 | - 评论,未经明确批准即提交一般反馈 167 | - 批准,提交反馈并批准合并这些更改 168 | - 请求更改,提交在合并之前必须解决的反馈 169 | 170 | 通过后,合并pr,如图点击Merge pull request,然后confirm merge 171 | 172 | ![1556886824092](assets/1556886824092.png) 173 | 174 | 175 | 176 | 最后,就这样了,项目中也多了another-Lee的pr过来的代码 177 | 178 | ![1556887053275](assets/1556887053275.png) 179 | 180 | 181 | 182 | ![1556887129427](assets/1556887129427.png) 183 | 184 | ## 附录 185 | 186 | - 显示git配置信息 187 | 188 | - `git config --global --list`显示全局配置信息,一般是提交用户的用户名和邮箱 189 | 190 | > ``` 191 | > # 可通过如下设置 192 | > git config --global user.name "username" 193 | > git config --global user.email "test@qq.com" 194 | > ``` 195 | 196 | - `git config --local --list`显示当前仓库配置信息 197 | 198 | - `git config --system --list`显示系统配置信息 199 | 200 | - 解决本地多个 ssh key问题 201 | 202 | - 在ssh-keygen生成公私钥时通过`-f`参数指定生成文件的名称 203 | 204 | - 多个git账号管理 205 | 206 | - 清除全局git配置信息,就是user.name和user.email哪些 207 | 208 | > 因为一个全局的配置只能为一个账号服务,两个账号验证时会冲突 209 | >``` 210 | > git config --global --unset user.name 211 | > git config --global --unset user.email 212 | > ``` 213 | 214 | - 在本地仓库里配置新的name和email,不同账号区别开 215 | 216 | ``` 217 | git config user.name "xxx" 218 | git config user.email "xxx@qq.com" 219 | ``` 220 | 221 | - 配置不同ssh-key(`-f`可以指定生成文件名),并在`/.ssh`下新建config文件,内容参考如下 222 | 223 | >``` 224 | >Host git@github.com #随便取和下面区别即可 225 | > HostName github.com 226 | > User josonlee 227 | > IdentityFile ~/.ssh/id_rsa_github #指定验证文件 228 | > 229 | >Host anothergithub.com 230 | > HostName github.com 231 | > User git 232 | > IdentityFile ~/.ssh/id_rsa_another 233 | >``` 234 | > 235 | >验证: 236 | > 237 | >![1556882392939](assets/1556882392939.png) 238 | 239 | - 配置项目新的remote作用域 240 | 241 | >``` 242 | >git remote rm origin #清空原有的 243 | >git remote add origin git@anothergithub.com:another-Lee/Leetcode-solution-for-us.git #举例第二个账号,网页上git clone处链接是`git@github.com:another-Lee/Leetcode-solution-for-us.git`,只是把git@github.com改成了git@anothergithub.com(config文件中指定的) 244 | >``` 245 | 246 | - 随便修改下啥然后提交`git push origin master` 247 | 248 | 249 | 250 | 251 | 252 | Topic2-add-two-numbers -------------------------------------------------------------------------------- /toc.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | # -*- coding:utf-8 -*- 3 | 4 | ##################################################### 5 | # ghtoc : a markdown toc generator 6 | # Author : Kai Yuan 7 | # Usage : toc.py 8 | # Date : 2014-12-02 9 | # License : 10 | #Copyright (C) 2014 Kai Yuan 11 | # 12 | #Permission is hereby granted, free of charge, to any person obtaining 13 | #a copy of this software and associated documentation files (the "Software"), 14 | #to deal in the Software without restriction, including without limitation 15 | #the rights to use, copy, modify, merge, publish, distribute, sublicense, 16 | #and/or sell copies of the Software, and to permit persons to whom the 17 | #Software is furnished to do so, subject to the following conditions: 18 | # 19 | #The above copyright notice and this permission notice shall be included 20 | #in all copies or substantial portions of the Software. 21 | # 22 | #THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 23 | #EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES 24 | #OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. 25 | #IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, 26 | #DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 27 | #TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE 28 | #OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 29 | ##################################################### 30 | 31 | import re 32 | import sys 33 | import shutil,datetime 34 | 35 | top_level=77 36 | lnk_temp='%s- [%s](#%s)' 37 | TOC='# 目录' 38 | REF='( 整理 by [Coding Now](https://github.com/josonle/coding-now))' 39 | 40 | def generate_toc(fname): 41 | global top_level 42 | lines = [] 43 | with open(fname, 'r') as file: 44 | lines = file.readlines() 45 | ts = datetime.datetime.now().strftime('%Y%m%d%H%M%S') 46 | destf= '.'.join((fname,ts,'bak')) 47 | shutil.copy(fname, destf) 48 | print "Backup was created: [%s]"%destf 49 | headers = [e.rstrip() for e in lines if re.match(r'#+', e)] 50 | #find top_level 51 | for i,h in enumerate(headers): 52 | ln = len(re.search(r'^#+',h).group(0)) 53 | top_level = ln if ln < top_level else top_level 54 | headers[i] = re.sub(r'^#+\s*', str(ln)+' ', h) 55 | headers = [tr_header(h) for h in headers] 56 | with open(fname,'w') as f: 57 | f.write(TOC+'\n') 58 | f.write(REF+'\n') 59 | f.write('\n'.join(headers) + '\n') 60 | f.write(''.join(lines) + '\n') 61 | f.write('\n\n') 62 | 63 | 64 | def tr_header(header): 65 | global lnk_temp 66 | lvl, txt = re.findall(r'^(\d+) (.*)', header)[0] 67 | # return lnk_temp%((int(lvl)-top_level)*' ', txt, re.sub(' ','-',re.sub('[^-a-z0-9 ]','',txt.lower()))) 68 | return lnk_temp%((int(lvl)-top_level)*' ', txt, re.sub(' ','-',txt)) 69 | 70 | if __name__ == '__main__': 71 | if len(sys.argv)<2: 72 | print """ 73 | Usage: 74 | toc.py 75 | """ 76 | else: 77 | infile = sys.argv[1] 78 | generate_toc(infile) -------------------------------------------------------------------------------- /大数据/DataFun技术年货大数据篇.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/josonle/Coding-Now/32b963ff23af1e957099d03cb9f935a32cbc9373/大数据/DataFun技术年货大数据篇.pdf -------------------------------------------------------------------------------- /大数据/DataFun技术年货搜索推荐篇.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/josonle/Coding-Now/32b963ff23af1e957099d03cb9f935a32cbc9373/大数据/DataFun技术年货搜索推荐篇.pdf -------------------------------------------------------------------------------- /大数据/DataFun技术年货风控反欺诈.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/josonle/Coding-Now/32b963ff23af1e957099d03cb9f935a32cbc9373/大数据/DataFun技术年货风控反欺诈.pdf -------------------------------------------------------------------------------- /大数据/_vnote.json: -------------------------------------------------------------------------------- 1 | { 2 | "created_time": "2019-05-17T09:44:08Z", 3 | "files": [ 4 | ], 5 | "sub_directories": [ 6 | { 7 | "name": "hadoop系列" 8 | }, 9 | { 10 | "name": "spark系列" 11 | } 12 | ], 13 | "version": "1" 14 | } 15 | -------------------------------------------------------------------------------- /大数据/hadoop系列/01MapReduce编程初步及源码分析.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: MapReduce编程初步及源码分析 3 | date: 2018-11-25 22:52:12 4 | tags: Hadoop、Spark 5 | categories: 大数据 6 | toc: true 7 | --- 8 | ## 初识MapReduce 9 | 先看一张图 10 | ![](大数据/mapreduce.jpg) 11 | 12 | ## MapReduce程序词频统计源码分析 13 | - 前言 14 | - hdfs中有自己的数据类型,java中的Int对应IntWritable,String对应Text 15 | - 为了实现文件序列化,编程中必须把Int、String转变为上面的两个 16 | 17 | ```java 18 | public class WordCount { 19 | 20 | public static class TokenizerMapper 21 | extends Mapper{//定义MAP的输入输出的Key-Value类型,第一对key-value的key不一定是字符串,所以申明为Object类型 22 | 23 | private final static IntWritable one = new IntWritable(1);//key-value中经常用到1,申明为常量 24 | private Text word = new Text();//相当于java中的String 25 | 26 | // map方法每次只处理一行【应该是的,我在另一个程序中打印输出是每次一行,还待深究】 27 | public void map(Object key, Text value, Context context 28 | ) throws IOException, InterruptedException {//这里三个变量,前两个对应上面的,context封装了输出的key-value 29 | StringTokenizer itr = new StringTokenizer(value.toString());//字符串分词器 30 | // String[] strs = value.toString().split(" "); //等于上面这行,就是分词 31 | while (itr.hasMoreTokens()) {// 取出子串,并赋1,写入context。不用管context存在什么地方 32 | word.set(itr.nextToken()); 33 | context.write(word, one); 34 | //有个概念要知道,这里他给每个词都赋值value=1,实际上value=2也是可以的( 35 | // 比如hello hello,可以一次计算value=2),看你怎么处理了(value=1省去了一步相同词再汇总过程) 36 | } 37 | } 38 | } 39 | 40 | public static class IntSumReducer 41 | extends Reducer {//如上,不过输入、出都是字符串-Int型 42 | private IntWritable result = new IntWritable();//对每个key,求value的和为result,比如 43 | 44 | public void reduce(Text key, Iterable values, 45 | Context context 46 | ) throws IOException, InterruptedException { 47 | int sum = 0; 48 | for (IntWritable val : values) { 49 | sum += val.get();// get是将IntWritable转为Int类型,set相反,见下面 50 | } 51 | result.set(sum);// sum是Int类型,hadoop无法将之序列化,所以转为IntWritable类型 52 | context.write(key, result); 53 | } 54 | } 55 | 56 | public static void main(String[] args) throws Exception { 57 | Configuration conf = new Configuration(); 58 | String[] otherArgs = new GenericOptionsParser(conf, args).getRemainingArgs(); 59 | if (otherArgs.length < 2) { 60 | System.err.println("Usage: wordcount [...] "); 61 | System.exit(2); 62 | } 63 | // 作业调度 64 | Job job = new Job(conf, "word count"); 65 | job.setJarByClass(WordCount.class);// 指定作业调度的类 66 | job.setMapperClass(TokenizerMapper.class);//指定Mapper类 67 | job.setCombinerClass(IntSumReducer.class);//指定Combiner类 68 | job.setReducerClass(IntSumReducer.class);//指定Reducer类 69 | job.setOutputKeyClass(Text.class); 70 | job.setOutputValueClass(IntWritable.class); 71 | for (int i = 0; i < otherArgs.length - 1; ++i) { //传入的文件参数可为多个【最后一个是输出文件】 72 | FileInputFormat.addInputPath(job, new Path(otherArgs[i])); 73 | } 74 | FileOutputFormat.setOutputPath(job, 75 | new Path(otherArgs[otherArgs.length - 1])); 76 | System.exit(job.waitForCompletion(true) ? 0 : 1);//等待执行,0是正常退出,1是错误退出 77 | } 78 | } 79 | 80 | ``` 81 | 82 | ## Windows下实现MapReduce编程初步 83 | ### 宿主机上开发环境配置 84 | 85 | ### 基于MapReduce统计学生平均成绩 86 | 如图,在hdfs的`/expr/studentgrades/grades/` 下创建,几个文件,随便写几行数据,类似如下(学号 成绩): 87 | ``` 88 | 1001 90 89 | 1002 100 90 | ... 91 | 92 | ``` 93 | 94 | 代码及注释如下: 95 | ```java 96 | package gradesAverage; 97 | 98 | import java.io.IOException; 99 | import java.util.StringTokenizer; 100 | 101 | 102 | import org.apache.hadoop.conf.Configuration; 103 | import org.apache.hadoop.fs.FileSystem; 104 | import org.apache.hadoop.fs.Path; 105 | import org.apache.hadoop.io.IntWritable; 106 | import org.apache.hadoop.io.Text; 107 | import org.apache.hadoop.mapreduce.Job; 108 | import org.apache.hadoop.mapreduce.Mapper; 109 | import org.apache.hadoop.mapreduce.Reducer; 110 | import org.apache.hadoop.mapreduce.lib.input.FileInputFormat; 111 | import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat; 112 | 113 | import mapReduceTest.wordCount.WordCount; 114 | import mapReduceTest.wordCount.WordCount.IntSumReducer; 115 | import mapReduceTest.wordCount.WordCount.TokenizerMapper; 116 | 117 | public class GradesAverage { 118 | 119 | public static class TokenizerMapper extends Mapper { 120 | private Text student = new Text(); 121 | private IntWritable grade = new IntWritable(); 122 | 123 | /* (non-Javadoc) 124 | * @see org.apache.hadoop.mapreduce.Mapper#map(KEYIN, VALUEIN, org.apache.hadoop.mapreduce.Mapper.Context) 125 | */ 126 | /* (non-Javadoc) 127 | * @see org.apache.hadoop.mapreduce.Mapper#map(KEYIN, VALUEIN, org.apache.hadoop.mapreduce.Mapper.Context) 128 | */ 129 | public void map(Object key, Text value, Context context) throws IOException, InterruptedException { 130 | // StringTokenizer iTokenizer = new StringTokenizer(value.toString(),"\n"); 131 | System.out.println("key is:"+key+"value is: "+value.toString()); 132 | // while (iTokenizer.hasMoreTokens()) { 133 | // 134 | // } 135 | String[] list_strs = value.toString().split(" "); 136 | // 因为每行只有一个学号和对应成绩,不需要考虑切分多个词 137 | student.set(list_strs[0]); 138 | grade.set(Integer.parseInt(list_strs[1])); 139 | context.write(student, grade); 140 | 141 | // String line = value.toString(); //将输入的纯文本文件的数据转化成String 142 | // System.out.println(line);//为了便于程序的调试,输出读入的内容 143 | // //将输入的数据先按行进行分割 144 | // StringTokenizer tokenizerArticle = new StringTokenizer(line,"\n"); 145 | // //分别对每一行进行处理 146 | // while(tokenizerArticle.hasMoreTokens()){ 147 | // //每行按空格划分 148 | // StringTokenizer tokenizerLine = new StringTokenizer(tokenizerArticle.nextToken()); 149 | // String strName = tokenizerLine.nextToken(); //学生姓名部分 150 | // String strScore = tokenizerLine.nextToken();//成绩部分 151 | // Text name = new Text(strName);//学生姓名 152 | // int scoreInt = Integer.parseInt(strScore);//学生成绩score of student 153 | // context.write(name, new IntWritable(scoreInt));//输出姓名和成绩 154 | // } 155 | } 156 | } 157 | 158 | public static class gradesAverageReducer extends Reducer { 159 | private IntWritable gradesSum = new IntWritable(); 160 | 161 | public void reduce(Text key, Iterable values, Context context) 162 | throws IOException, InterruptedException { 163 | int sum = 0; 164 | int grades = 0; 165 | for (IntWritable val : values) { 166 | sum += 1; 167 | grades += val.get(); 168 | } 169 | System.out.println("student is:"+key.toString()+",grades is:"+grades+",sum is:"+sum); 170 | gradesSum.set((int)grades/sum); 171 | context.write(key, gradesSum); 172 | } 173 | } 174 | 175 | public static void main(String[] args) throws IOException, ClassNotFoundException, InterruptedException { 176 | // 1.设置HDFS配置信息 177 | String namenode_ip = "192.168.17.10"; 178 | String hdfs = "hdfs://" + namenode_ip + ":9000"; 179 | Configuration conf = new Configuration(); // Hadoop配置类 180 | conf.set("fs.defaultFS", hdfs); 181 | conf.set("mapreduce.app-submission.cross-platform", "true"); // 集群交叉提交 182 | /* 183 | * conf.set("hadoop.job.user", "hadoop"); conf.set("mapreduce.framework.name", 184 | * "yarn"); conf.set("mapreduce.jobtracker.address", namenode_ip + ":9001"); 185 | * conf.set("yarn.resourcemanager.hostname", namenode_ip); 186 | * conf.set("yarn.resourcemanager.resource-tracker.address", namenode_ip + 187 | * ":8031"); conf.set("yarn.resourcemtanager.address", namenode_ip + ":8032"); 188 | * conf.set("yarn.resourcemanager.admin.address", namenode_ip + ":8033"); 189 | * conf.set("yarn.resourcemanager.scheduler.address", namenode_ip + ":8034"); 190 | * conf.set("mapreduce.jobhistory.address", namenode_ip + ":10020"); 191 | */ 192 | 193 | // 2.设置MapReduce作业配置信息 194 | String jobName = "GradesAverage"; // 定义作业名称 195 | Job job = Job.getInstance(conf, jobName); 196 | job.setJarByClass(GradesAverage.class); // 指定作业类 197 | job.setJar("export\\GradesAverage.jar"); // 指定本地jar包 198 | job.setMapperClass(TokenizerMapper.class); 199 | job.setCombinerClass(gradesAverageReducer.class); // 指定Combiner类 200 | job.setReducerClass(gradesAverageReducer.class); 201 | job.setOutputKeyClass(Text.class); 202 | job.setOutputValueClass(IntWritable.class); 203 | 204 | // 3.设置作业输入和输出路径 205 | String dataDir = "/expr/studentgrades/grades"; // 实验数据目录 206 | String outputDir = "/expr/studentgrades/output"; // 实验输出目录 207 | Path inPath = new Path(hdfs + dataDir); 208 | Path outPath = new Path(hdfs + outputDir); 209 | FileInputFormat.addInputPath(job, inPath); 210 | FileOutputFormat.setOutputPath(job, outPath); 211 | // 如果输出目录已存在则删除 212 | FileSystem fs = FileSystem.get(conf); 213 | if (fs.exists(outPath)) { 214 | fs.delete(outPath, true); 215 | } 216 | 217 | // 4.运行作业 218 | System.out.println("Job: " + jobName + " is running..."); 219 | if (job.waitForCompletion(true)) { 220 | System.out.println("统计 success!"); 221 | System.exit(0); 222 | } else { 223 | System.out.println("统计 failed!"); 224 | System.exit(1); 225 | } 226 | } 227 | } 228 | 229 | ``` 230 | 231 | 运行结果如下: 232 | ``` 233 | 234 | ``` 235 | 236 | 查看平均成绩结果文件,目录结构如图 237 | ![](大数据/MapReduce_coding.png) -------------------------------------------------------------------------------- /大数据/hadoop系列/02【MapReduce详解及源码解析(一)】——分片输入、Mapper及Map端Shuffle过程.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: 【MapReduce详解及源码解析(一)】——分片输入、Mapper及Map端Shuffle过程 3 | date: 2018-12-03 21:12:42 4 | tags: Hadoop 5 | categories: 大数据 6 | toc: true 7 | --- 8 | 9 | 10 | 见我的CSDN博文:https://blog.csdn.net/lzw2016/article/details/84779254 -------------------------------------------------------------------------------- /大数据/hadoop系列/_vnote.json: -------------------------------------------------------------------------------- 1 | { 2 | "created_time": "2019-05-17T09:44:08Z", 3 | "files": [ 4 | { 5 | "attachment_folder": "", 6 | "attachments": [ 7 | ], 8 | "created_time": "2019-05-17T09:44:08Z", 9 | "modified_time": "2019-05-17T09:44:08Z", 10 | "name": "01MapReduce编程初步及源码分析.md", 11 | "tags": [ 12 | ] 13 | }, 14 | { 15 | "attachment_folder": "", 16 | "attachments": [ 17 | ], 18 | "created_time": "2019-05-17T09:44:08Z", 19 | "modified_time": "2019-05-17T09:44:08Z", 20 | "name": "02【MapReduce详解及源码解析(一)】——分片输入、Mapper及Map端Shuffle过程.md", 21 | "tags": [ 22 | ] 23 | }, 24 | { 25 | "attachment_folder": "", 26 | "attachments": [ 27 | ], 28 | "created_time": "2019-05-17T09:44:08Z", 29 | "modified_time": "2019-05-17T09:44:08Z", 30 | "name": "使用Java API对HDFS进行系列操作.md", 31 | "tags": [ 32 | ] 33 | }, 34 | { 35 | "attachment_folder": "", 36 | "attachments": [ 37 | ], 38 | "created_time": "2019-05-17T09:44:08Z", 39 | "modified_time": "2019-05-17T09:44:08Z", 40 | "name": "数据倾斜解决(MR、Hive、Spark).md", 41 | "tags": [ 42 | ] 43 | }, 44 | { 45 | "attachment_folder": "", 46 | "attachments": [ 47 | ], 48 | "created_time": "2019-05-17T09:44:08Z", 49 | "modified_time": "2019-05-17T09:44:08Z", 50 | "name": "认识HDFS.md", 51 | "tags": [ 52 | ] 53 | } 54 | ], 55 | "sub_directories": [ 56 | ], 57 | "version": "1" 58 | } 59 | -------------------------------------------------------------------------------- /大数据/hadoop系列/assets/copycode.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/josonle/Coding-Now/32b963ff23af1e957099d03cb9f935a32cbc9373/大数据/hadoop系列/assets/copycode.gif -------------------------------------------------------------------------------- /大数据/hadoop系列/hadoop和hive的一些面试题.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/josonle/Coding-Now/32b963ff23af1e957099d03cb9f935a32cbc9373/大数据/hadoop系列/hadoop和hive的一些面试题.zip -------------------------------------------------------------------------------- /大数据/hadoop系列/大数据/HDFS名词.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/josonle/Coding-Now/32b963ff23af1e957099d03cb9f935a32cbc9373/大数据/hadoop系列/大数据/HDFS名词.jpg -------------------------------------------------------------------------------- /大数据/hadoop系列/大数据/MapReduce_coding.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/josonle/Coding-Now/32b963ff23af1e957099d03cb9f935a32cbc9373/大数据/hadoop系列/大数据/MapReduce_coding.png -------------------------------------------------------------------------------- /大数据/hadoop系列/大数据/SecNamenode.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/josonle/Coding-Now/32b963ff23af1e957099d03cb9f935a32cbc9373/大数据/hadoop系列/大数据/SecNamenode.jpg -------------------------------------------------------------------------------- /大数据/hadoop系列/大数据/mapreduce.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/josonle/Coding-Now/32b963ff23af1e957099d03cb9f935a32cbc9373/大数据/hadoop系列/大数据/mapreduce.jpg -------------------------------------------------------------------------------- /大数据/hadoop系列/大数据/metadata.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/josonle/Coding-Now/32b963ff23af1e957099d03cb9f935a32cbc9373/大数据/hadoop系列/大数据/metadata.jpg -------------------------------------------------------------------------------- /大数据/hadoop系列/数据倾斜解决(MR、Hive、Spark).md: -------------------------------------------------------------------------------- 1 | ### 数据倾斜是什么 2 | 3 | 总的来说,你集群运行时发现MR或者Hive卡在99%不动时,或者Spark运行时出现OOM异常(OutOfMemoryError),或者成功执行但就是耗时过久时,既要考虑是否出现了数据倾斜。数据倾斜就是某些key对应的数据分化不均,导致部分reduce处理数据量过大,以至于其他reduce都执行完了它还在运行。 4 | 5 | > 查看web UI、日志文件: 6 | > 7 | > 看是否出现map和reduce任务执行时间过久,需要缓存数据集的操作消耗过多的内存资源 8 | 9 | map端也是会出现数据倾斜的 10 | 11 | ### MapReduce 12 | 13 | #### 减少Reduce数据倾斜 14 | 15 | 1. 考虑map端使用Combine提前聚合部分数据 16 | 17 | 2. 自定义分区,避免将过大数据量分发到某些reduce 18 | 19 | > MR默认分区方式是通过map输出的key的hash值来分发到某些reduce上的,数据分布均匀的话结果还好,但出现数据倾斜就是个问题 20 | > 21 | > - 可以通过对原始数据进行抽样得到的结果集来预设分区边界值。TotalOrderPartitioner中的范围分区器可以通过预设的分区边界值进行分区。因此它也可以很好地用在矫正数据中的部分键的数据倾斜问题 22 | > - 像Hive那样,在出现数据倾斜的Key上加上随机前缀,先进行第一次局部聚合减少数据量。再去掉前缀进行第二次MapReduce全局聚合 23 | 24 | 3. 涉及数据连接时,可以预习考虑在map端连接 25 | 26 | > 4. 数据大小倾斜的自定义策略 27 | > 28 | > 在map端或reduce端的数据大小倾斜都会对缓存造成较大的影响,乃至导致OutOfMemoryError异常。处理这种情况并不容易。可以参考以下方法。 29 | > 30 | > - 设置`mapred.linerecordreader.maxlength`来限制RecordReader读取的最大长度。RecordReader在TextInputFormat和KeyValueTextInputFormat类中使用。默认长度没有上限。 31 | > - 通过`org.apache.hadoop.contrib.utils.join`设置缓存的数据集的记录数上限。在reduce中默认的缓存记录数上限是100条。 32 | > - 考虑使用有损数据结构压缩数据,如Bloom过滤器。 33 | > 34 | > > 这里我不太理解,没有实际应用过吧。参考: 35 | 36 | #### 预判MapReduce中哪些key会出现数据倾斜 37 | 38 | 在reduce方法中加入记录map输出键的详细情况的功能。 39 | 40 | 41 | 42 | 在发现了倾斜数据的存在之后,就很有必要诊断造成数据倾斜的那些键。有一个简便方法就是在代码里实现追踪每个键的最大值。为了减少追踪量,可以设置数据量阀值,只追踪那些数据量大于阀值的键,并输出到日志中。实现代码如下。 43 | 44 | ```java 45 | public static final String MAX_VALUES = "skew.maxvalues"; 46 | private int maxValueThreshold; 47 | 48 | @Override 49 | public void configure(JobConf job) { 50 | maxValueThreshold = job.getInt(MAX_VALUES, 100); 51 | } 52 | 53 | @Override 54 | public void reduce(Text key, Iterator values, 55 | OutputCollector output, 56 | Reporter reporter) throws IOException { 57 | 58 | int i = 0; 59 | 60 | while (values.hasNext()) { 61 | values.next(); 62 | i++; 63 | } 64 | 65 | if (++i > maxValueThreshold) { 66 | log.info("Received " + i + " values for key " + key); 67 | } 68 | } 69 | ``` 70 | 71 | 运行作业后就可以从日志中判断发生倾斜的键以及倾斜程度。 72 | 73 | 跟踪倾斜数据是了解数据的重要一步,也是设计MapReduce作业的重要基础。 74 | 75 | > 此处参考自: [MapReduce 性能调优:减小数据倾斜的性能损失](https://www.cnblogs.com/datacloud/p/3601624.html) 76 | 77 | ### Hive 78 | 79 | hive底层也是MapReduce,所以数据倾斜问题的解决也和上面差不多。但hive的数据倾斜多发生在group聚合、join连接上(这些会触发shuffle操作),可以通过配置几个参数来解决 80 | 81 | #### groupBy上数据倾斜解决 82 | 83 | ``` 84 | set hive.map.aggr=true;//开启map端聚合,默认true 85 | set hive.groupby.skewindata=true; //有数据倾斜时进行负载均衡,默认false 86 | set hive.groupby.mapaggr.checkinterval = 100000; //map端聚合操作条目数目 87 | ``` 88 | 89 | **注意下这几个万金油**: 90 | 91 | - map端聚合(mapjoin) 92 | - 负载均衡 93 | 94 | > 负载均衡: 95 | > 96 | > 生成的查询计划会有两个MRJob。第一个MRJob 中,Map的输出结果集合会随机分布到Reduce中,每个Reduce做部分聚合操作,并输出结果,这样处理的结果是相同的GroupBy Key有可能被分发到不同的Reduce中,从而达到负载均衡的目的;第二个MRJob再根据预处理的数据结果按照GroupBy Key分布到Reduce中(这个过程可以保证相同的GroupBy Key被分布到同一个Reduce中),最后完成最终的聚合操作 97 | > 98 | > 99 | > 100 | > 这个也是给Key加上标志,但好像不是上面说的key加上前缀 101 | 102 | 还有就是像Spark算子中,用reduceByKey取代groupByKey,这也是为了避免reduce中出现OOM问题。所以,作count、count distinct之前先对key进行一次group 103 | 104 | #### join上解决数据倾斜 105 | 106 | - 遵循小表join大表原则 107 | 108 | join中执行顺序从左往右,其次join的reduce阶段会把左表加载到内存中,小表可以降低内存溢出的可能 109 | 110 | - 先过滤再join,以便减少join的数据量 111 | - mapJoin:`hive.auto.convert.join = true`设置自动选择mapjoin,默认true;设置小表阈值`hive.mapjoin.smalltable.filesize=25000000`(默认25M以下是小表) 112 | 113 | mapJoin的好处是,不进行shuffle。hive会自动识别比较小的表,继而用mapJoin来实现两个表的联合 114 | 115 | 116 | 117 | > 不说数据倾斜,推荐一篇之前看过的Hive优化文章——[参考这篇文章](https://blog.csdn.net/MrLevo520/article/details/76339075) 118 | 119 | ### Spark 120 | 121 | 其实都差不多,mapJoin、repartition/coalesce调整reduce数量(也就是调整并行度)、自定义分区器、Key加上随机前缀等 122 | 123 | 124 | 125 | - 调整并行度 【第一步先尝试这个】 126 | 127 | - spark算子上加上partition分区数,因为一个分区对应一个reduce。而根据map的输出的hash值对reduce数取模分发到不同reduce上,所以改变reduce数目可以缓解倾斜问题 128 | 129 | - 也可在配置文件中通过`spark.default.parallelism`设置并行度 130 | 131 | - 通过coalesce、repartition算子重新调整分区数 132 | 133 | ```scala 134 | def coalesce(numPartitions: Int, shuffle: Boolean = false)(implicit ord: Ordering[T] = null): RDD[T] 135 | //numPartitions:重分区数,shuffle:是否进行shuffle,默认false 136 | //通过HashPartitioner对RDD进行重分区 137 | def repartition(numPartitions: Int)(implicit ord: Ordering[T] = null): RDD[T] 138 | //同上,不过默认是进行shuffle的 139 | //rdd.partitions.size可以查看分区数 140 | ``` 141 | 142 | 143 | 144 | - spark sql通过`spark.sql.shuffle.partitions`设置并行度 145 | 146 | **调整并行度并没有完全解决数据倾斜的问题,只是缓解了** 147 | 148 | - 自定义分区器Partitioner 149 | 150 | > **优势** 151 | > 不影响原有的并行度设计。如果改变并行度,后续Stage的并行度也会默认改变,可能会影响后续Stage。 152 | > 153 | > **劣势** 154 | > 适用场景有限,只能将不同Key分散开,对于同一Key对应数据集非常大的场景不适用。效果与调整并行度类似,只能缓解数据倾斜而不能完全消除数据倾斜。而且需要根据数据特点自定义专用的Partitioner,不够灵活。 155 | 156 | - mapJoin 157 | 158 | - 发生倾斜的key加上随机前缀 159 | 160 | - Spark Sql中的优化和Hive类似,可以参考Hive 161 | 162 | Spark调优我没怎么实操过,不太熟悉。放出参考的几篇文章吧 163 | 164 | - [Spark性能优化之道——解决Spark数据倾斜(Data Skew)的N种姿势]() 165 | - [Spark性能优化:数据倾斜调优]() 166 | - [Spark性能优化指南——基础篇](https://tech.meituan.com/2016/04/29/spark-tuning-basic.html) 167 | - [Spark性能优化指南——高级篇](https://tech.meituan.com/2016/05/12/spark-tuning-pro.html) 168 | 169 | *** 170 | 171 | 分割线 172 | 173 | *** 174 | 175 | ### 参考 176 | 177 | - [漫谈千亿级数据优化实践:数据倾斜(纯干货)](https://segmentfault.com/a/1190000009166436) 178 | - [MapReduce 性能调优:理解性能瓶颈,诊断map性能瓶颈](https://www.cnblogs.com/datacloud/p/3591981.html) 179 | - 其余参考列举在文中 180 | 181 | -------------------------------------------------------------------------------- /大数据/hadoop系列/认识HDFS.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: 大数据之Hadoop学习<一>————认识HDFS 3 | date: 2018-11-12 20:31:36 4 | tags: Hadoop 5 | categories: 大数据 6 | toc: true 7 | --- 8 | 9 | ## 分布式文件系统 HDFS 10 | 分布式文件系统(Distributed FileSystem)是指文件系统管理的物理存储资源不一定直接连接在本地节点上,而是通过计算机网络与节点相连。 11 | 12 | Hadoop有若干文件系统,HDFS只是其中一个,但HDFS是其重要组成部分。HDFS由java的`org.apache.hadoop.fs.FileSystem`定义,并实现了`java.io.Closeable`接口,继承了`org.apache.hadoop.conf` 13 | 14 | 我们可以通过命令行下 `hadoop dfs -ls hdfs:///` 访问HDFS文件系统 15 | 16 | ### HDFS特点 17 | - 存储超大文件 18 | - 流式文件访问 19 | - 高效访问模式:一次写入、多次访问 20 | - 只支持文件追加操作,不能修改 21 | - 追加操作要在hdfs-site.xml中的 dfs.support.append 设置为true才行 22 | - 普通商用硬件上即可运行(实际上普通PC还是不OK,那速度,这都是氪金玩家玩的,hh) 23 | - 低时间延迟的数据访问 24 | - 以高时延为代价,获取高数据吞吐量 25 | - 响应时间秒级、毫秒级的数据访问,应该采用HBase 26 | - 多用户在写入文件时有锁机制,只支持单个写入者 27 | - 不适合存大量小文件 28 | > 由于 Namenode 将文件系统的元数据存储在内存中,因此 29 | HDFS所能存储的文件总数受限于Namenode的内存容量 30 | 根据经验,每个文件、目录和数据块的存储信息大约占150 31 | 字节,存储100万个文件大约需要300M内存 32 | 33 | ### 名称解释 34 | 1. Cluster 集群 35 | 2. Rack 机架 36 | 3. Client 客户机 37 | 4. Namenode 名称节点 38 | 5. Datanode 数据节点 39 | 6. Secondary NameNode 辅助(第二)名称节点 40 | 7. Metadata 元数据 41 | 8. Block 块 42 | 43 | - 整体结构 44 | 45 | ![](大数据/HDFS名词.jpg) 46 | 47 | - Namenode和Secondary Namenode 48 | 49 | Namenode是HDFS的智脑,维护整个系统的目录树及目录树中的文件和目录 50 | 这些信息以镜像文件(FSImage)和编辑日志文件(edit log)的形式永久保存在本地磁盘上,在系统启动时被加载到内存 51 | 52 | > 镜像文件(文件系统镜像),HDFS元数据的完整快照,每次Namenode启动时会加载最新的镜像 53 | 54 | Secondary Namenode不能按照名字以为是Namenode的备份,他只是负责将镜像文件和编辑日志合并,以此来控制 edits 文件的大小在合理的范围,缩短集 55 | 群重启时Namenode重建fsimage的时间。一般每个集群都有单独运行在一台服务器上的一个Secondary Namenode。Secondary Namenode也有恢复部分数据的作用 56 | ![](大数据/SecNamenode.jpg) 57 | 58 | - Datanode 59 | 60 | 数据节点,HDFS是master/slave结构,Namenode是主,Datanode是从。它存放的是实际的数据块,块在文件系统中会产生两个文件(实际的数据文件和块的附加信息文件,包含数据的校验和、生成时间) 61 | 62 | Datanode通过心跳和namenode通信 63 | 64 | - block 65 | 66 | 块,文件系统进行数据读写的最小单位,hadoop 2.7之前的块(block)默认64M,之后是128M,可以在 `hdfs-site.xml` 文件中 `dfs.block.size` 项中配置块大小,`dfs.replication` 配置备份份数 67 | 68 | HDFS上文件会被分成若干块分开存储,使得文件可以比磁盘容量大,提供容错能力,也简化了存储子系统 69 | 70 | 不同于普通文件系统(即使文件大小小于块大小,仍占一个块的大小),HDFS小于一个块大小的文件不会占用整个块的空间 71 | 72 | - MetaData 73 | 74 | 元数据包括**文件系统目录树信息**和**文件和块对应关系的信息** 75 | - 文件系统目录树信息 76 | - 文件名,目录名 77 | - 文件和目录的从属关系 78 | - 文件和目录的大小,创建及最后访问时间 79 | - 权限 80 | - 文件和块的对应关系 81 | - 文件由哪些块组成、块ID 82 | - 每个块的存放位置 83 | 其存储是依赖本地文件:镜像文件和编辑日志文件,前者保存上面提到的两类,后者保存的是客户端请求新建、移动、写文件操作时的记录(先记录在编辑日志,成功后才更改内存中数据) 84 | ![](大数据/metadata.jpg) 85 | 86 | ### HDFS容错能力 87 | - 可靠性(不出错)、可用性(出错还能提供服务) 88 | - 文件系统的容错性 [引用:HDFS的容错能力](http://f.dataguru.cn/hadoop-25108-1-1.html) 89 | ``` 90 | 1)心跳机制,在Namenode和Datanode之间维持心跳检测,当由于网络故障之类的原因,导致Datanode发出的心跳包没有被Namenode正常收到的时候,Namenode就不会将任何新的IO操作派发给那个Datanode,该Datanode上的数据被认为是无效的,因此Namenode会检测是否有文件block的副本数目小于设置值,如果小于就自动开始复制新的副本并分发到其他Datanode节点。 91 | 92 | 2)检测文件block的完整性,HDFS会记录每个新创建的文件的所有block的校验和。当以后检索这些文件的时候,从某个节点获取block,会首先确认校验和是否一致,如果不一致,会从其他Datanode节点上获取该block的副本。 93 | 94 | 3)集群的负载均衡,由于节点的失效或者增加,可能导致数据分布的不均匀,当某个Datanode节点的空闲空间大于一个临界值的时候,HDFS会自动从其他Datanode迁移数据过来。 95 | 96 | 4)Namenode上的fsimage和edits日志文件是HDFS的核心数据结构,如果这些文件损坏了,HDFS将失效。因而,Namenode可以配置成支持维护多个FsImage和Editlog的拷贝。任何对FsImage或者Editlog的修改,都将同步到它们的副本上。它总是选取最近的一致的FsImage和Editlog使用。Namenode在HDFS是单点存在,如果Namenode所在的机器错误,手工的干预是必须的。 97 | 98 | 5)文件的删除,删除并不是马上从Namenode移出namespace,而是放在/trash目录随时可恢复,直到超过设置时间才被正式移除。 99 | ``` 100 | - hadoop本身的容错性 101 | - 支持升级、回滚,升级出现不兼容等可以回滚 102 | - 可参考:[Hadoop(七)HDFS容错机制详解](https://www.cnblogs.com/zhangyinhua/p/7681146.html) 103 | ### HDFS 副本存储机制 104 | hdfs提供的是**三副本放置策略**,每个块在HDFS集群中会存储多份,默认3份。其目的是平衡二者:提高数据存储的可靠性、可用性(多备份一些),减少数据写入的开销(少备份一些) 105 | 106 | 三副本放置策略: 107 | 108 | - 写请求方所在机器是其中一个Datanode(即客户端的节点),则第一份副本直接存放在本地,否则随机在集群中选择一个Datanode 109 | - 第二个副本存放于不同于第一个副本所在机架的机架上某一个节点 110 | - 第三个副本存放于第二个副本所在的机架,但是属于不同的节点 111 | 112 | 超过三份副本可随机放置,但满足:一个节点最多放一个副本,副本数少于机架数的两倍,则一个机架不能放超过两份副本 113 | 114 | ## HDFS读写文件流程 115 | 图片引自:[Hadoop--HDFS之读写流程](https://blog.xiaoxiaomo.com/2016/06/26/Hadoop-HDFS之读写流程/) 116 | ### 写入文件 117 | ![](https://img.xiaoxiaomo.com/blog%2Fimg%2F20160412195903.png) 118 | ![](https://img.xiaoxiaomo.com/blog%2Fimg%2F20160412195756.png) 119 | 120 | ### 读取文件 121 | ![](https://img.xiaoxiaomo.com/blog%2Fimg%2F20160412202260.png) 122 | 123 | ## 操作HDFS 124 | ### 命令行 [文档:命令手册](https://hadoop.apache.org/docs/r1.0.4/cn/commands_manual.html) 125 | HDFS的基本命令 126 | ``` 127 | -mkdir 在HDFS创建目录 hdfs dfs -mkdir /data 128 | -ls 查看根目录 hdfs dfs -ls / 129 | -ls -R 查看目录与子目录 130 | -put 上传一个文件 hdfs dfs -put data.txt /data/input 131 | -moveFromLocal 上传一个文件,会删除本地文件:ctrl + X 132 | -copyFromLocal 上传一个文件,与put一样 133 | -copyToLocal 下载文件 hdfs dfs -copyToLocal /data/input/data.txt 134 | -get 下载文件 hdfs dfs -get /data/input/data.txt 135 | -rm 删除文件 hdfs dfs -rm /data/input/data.txt 136 | -getmerge 将目录所有的文件先合并,再下载 137 | -cp 拷贝: hdfs dfs -cp /data/input/data.txt /data/input/data01.txt 138 | -mv 移动: hdfs dfs -mv /data/input/data.txt /data/input/data02.txt 139 | -count 统计目录下的文件个数 140 | -text、-cat 查看文件的内容 hdfs dfs -cat /data/input/data.txt 141 | -balancer 平衡操作 142 | ``` 143 | 144 | - 启动、关闭hdfs服务:start-dfs.sh/stop-dfs.sh 145 | - jps 查看服务进程 146 | 147 | HDFS的管理命令 148 | ``` 149 | hdfs version 查看版本 150 | hdfs namenode [ -format ] 格式化 151 | hdfs fsck [ -files [ -blocks [ -locations | -racks ] ] ] 查看HDFS文件对应的文件块信息(Block)和位置信息 152 | hdfs dfsadmin -report 文件系统使用报告 153 | hdfs dfsadmin -safemode [ get | enter | leave ] 进入、退出安全模式 154 | hdfs -help 帮助 155 | ``` 156 | ### java API 157 | - Configuration:HDFS环境配置类 158 | - FileSystem:分布式文件系统类 159 | - Path:HDFS文件路径类 160 | - FSDataInputStream / FSDataOutputStream:文件系统输入输出流类 161 | - URI:文件资源定位类 162 | 163 | > 顺便提一下HDFS的URI格式是:hdfs://namenode主机名[或namenode的IP]:端口/文件路径 164 | 165 | 参考资料: 166 | 167 | - [Hadoop(七)HDFS容错机制详解](https://www.cnblogs.com/zhangyinhua/p/7681146.html) 168 | - [Hadoop--HDFS之读写流程](https://blog.xiaoxiaomo.com/2016/06/26/Hadoop-HDFS之读写流程/) 169 | - [hadoop.apache.org 中文文档](https://hadoop.apache.org/docs/r1.0.4/cn/quickstart.html) -------------------------------------------------------------------------------- /大数据/hadoop系列/转载/HDFS 架构学习总结 _ Matt's Blog.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/josonle/Coding-Now/32b963ff23af1e957099d03cb9f935a32cbc9373/大数据/hadoop系列/转载/HDFS 架构学习总结 _ Matt's Blog.pdf -------------------------------------------------------------------------------- /大数据/hadoop系列/转载/YARN 架构学习总结 _ Matt's Blog.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/josonle/Coding-Now/32b963ff23af1e957099d03cb9f935a32cbc9373/大数据/hadoop系列/转载/YARN 架构学习总结 _ Matt's Blog.pdf -------------------------------------------------------------------------------- /大数据/hadoop系列/转载/唯品会HDFS性能挑战和优化实践.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/josonle/Coding-Now/32b963ff23af1e957099d03cb9f935a32cbc9373/大数据/hadoop系列/转载/唯品会HDFS性能挑战和优化实践.pdf -------------------------------------------------------------------------------- /大数据/spark系列/Intel-Spark SQL优化实践.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/josonle/Coding-Now/32b963ff23af1e957099d03cb9f935a32cbc9373/大数据/spark系列/Intel-Spark SQL优化实践.pdf -------------------------------------------------------------------------------- /大数据/spark系列/Koalas:让 pandas 轻松切换 Apache Spark,在大数据中规模应用.md: -------------------------------------------------------------------------------- 1 | > 今天订阅的RSS给我推送了一篇文章——在大数据中规模应用 pandas 切换Spark,感觉挺新鲜的,原文地址 https://www.infoq.cn/article/tvGrtwJxCR1kQDs_kqa4?utm_source=rss&utm_medium=article 2 | 3 | > 4 月 24 日,Databricks 在 Spark + AI 峰会上开源了一个新产品 Koalas,它增强了 PySpark 的 DataFrame API,使其与 pandas 兼容。 4 | 5 | Python 数据科学在过去几年中爆炸式增长, pandas 已成为生态系统的关键。当数据科学家得到一个数据集时,他们会使用 pandas 进行探索。它是数据处理和分析的终极工具。事实上,pandas 的 read_csv 通常是学生在学习数据科学过程中使用的第一个命令。 6 | 7 | 问题是什么呢?pandas 不能很好地在大数据中规模应用,因为它专为单个机器可以处理的小型数据集而设计。另一方面,Apache Spark 已成为处理大数据实际上的标准。今天,许多数据科学家将 pandas 用于职业培训、偏好性项目和小型数据任务,但是当他们使用非常大的数据集时,他们必须迁移到 PySpark 以利用 Spark,或对其数据进行下采样以使用 pandas。 8 | 9 | 现在有了 Koalas,数据科学家可以从单个机器迁移到分布式环境,而无需学习新的框架。正如你在下面所看到的,只需替换一个包,就可以使用 Koalas 在 Spark 上扩展你的 pandas 代码。 10 | 11 | pandas: 12 | 13 | ```python 14 | import pandas as pd 15 | df = pd.DataFrame({'x': [1, 2], 'y': [3, 4], 'z': [5, 6]}) 16 | # Rename columns 17 | df.columns = [‘x’, ‘y’, ‘z1’] 18 | # Do some operations in place 19 | df[‘x2’] = df.x * df.x 20 | 21 | ``` 22 | 23 | Koalas: 24 | 25 | ```python 26 | import databricks.koalas as ks 27 | df = ks.DataFrame({'x': [1, 2], 'y': [3, 4], 'z': [5, 6]}) 28 | # Rename columns 29 | df.columns = [‘x’, ‘y’, ‘z1’] 30 | # Do some operations in place 31 | df[‘x2’] = df.x * df.x 32 | 33 | ``` 34 | 35 | ## pandas 作为 Python 数据科学的标准词汇 36 | 37 | 随着 Python 成为数据科学的主要语言,社区已经开发了基于最重要的库的词汇表,包括 pandas、matplotlib 和 numpy。当数据科学家能够使用这些库时,他们可以充分表达他们的想法,并根据想法得出结论。他们可以将某些东西概念化并立即执行。 38 | 39 | 但是当他们不得不在词汇表之外使用库时,他们会遇到麻烦,每隔几分钟就需要检查一次 StackOverflow,还必须中断他们的工作流程才能使代码正常工作。虽然 PySpark 易于使用,并且在很多方面类似于 pandas,但它仍然是一个数据科学家必须学习的不同词汇。 40 | 41 | 在 Databricks,我们相信 Spark 上的 pandas 将大大提高数据科学家和数据驱动型组织的生产力,原因如下: 42 | 43 | * Koalas 无需决定是否为给定的数据集使用 pandas 或 PySpark 44 | * 对于最初用 pandas 为单个机器编写的工作,Koalas 允许数据科学家通过 pandas 和 Koalas 的轻松切换来扩展在 Spark 上的代码 45 | * Koalas 为组织中的更多数据科学家解锁大数据,因为他们不再需要学习 PySpark 以使用 Spark 46 | 47 | 下面,我们展示了两个简单而强大的 pandas 方法示例,这些方法可以直接在 Spark 上运行 Koalas。 48 | 49 | ## 具有分类变量的特征工程 50 | 51 | 数据科学家在构建 ML 模型时经常会遇到分类变量。一种流行的技术是将分类变量编码为虚拟变量。在下面的示例中,有几个分类变量,包括调用类型、邻域和单元类型。pandas 的 get_dummies 是一种简便的方法。下面我们将展示如何使 52 | 53 | pandas: 54 | 55 | ```python 56 | import pandas as pd 57 | data = pd.read_csv("fire_department_calls_sf_clean.csv", header=0) 58 | display(pd.get_dummies(data)) 59 | 60 | ``` 61 | 62 | ![](https://static.geekbang.org/infoq/5cc121148d2bf.png) 63 | ![](https://static.geekbang.org/infoq/5cc12115447e7.png) 64 | 有了 Koalas,我们可以通过一些调整在 Spark 上做到这一点: 65 | 66 | ```python 67 | import databricks.koalas as ks 68 | data = ks.read_csv("fire_department_calls_sf_clean.csv", header=0) 69 | display(ks.get_dummies(data)) 70 | 71 | ``` 72 | 73 | 就是这样! 74 | 75 | ## 带时间戳的算术 76 | 77 | 数据科学家一直使用时间戳,但正确处理这些时间戳非常麻烦。pandas 提供了一个优雅的解决方案。假设你有一个日期的 DataFrame : 78 | 79 | ```python 80 | import pandas as pd 81 | import numpy as np 82 | date1 = pd.Series(pd.date_range('2012-1-1 12:00:00', periods=7, freq='M')) 83 | date2 = pd.Series(pd.date_range('2013-3-11 21:45:00', periods=7, freq='W')) 84 | df = pd.DataFrame(dict(Start_date = date1, End_date = date2)) 85 | print(df) 86 | 87 | End_date            Start_date 88 | 0 2013-03-17 21:45:00 2012-01-31 12:00:00 89 | 1 2013-03-24 21:45:00 2012-02-29 12:00:00 90 | 2 2013-03-31 21:45:00 2012-03-31 12:00:00 91 | 3 2013-04-07 21:45:00 2012-04-30 12:00:00 92 | 4 2013-04-14 21:45:00 2012-05-31 12:00:00 93 | 5 2013-04-21 21:45:00 2012-06-30 12:00:00 94 | 6 2013-04-28 21:45:00 2012-07-31 12:00:00 95 | 96 | ``` 97 | 98 | 要使用 pandas 从结束日期中减去开始日期,只需运行: 99 | 100 | ```python 101 | df['diff_seconds'] = df['End_date'] - df['Start_date'] 102 | df['diff_seconds'] = df['diff_seconds']/np.timedelta64(1,'s') 103 | print(df) 104 | End_date Start_date diff_seconds 105 | 0 2013-03-17 21:45:00 2012-01-31 12:00:00 35545500.0 106 | 1 2013-03-24 21:45:00 2012-02-29 12:00:00 33644700.0 107 | 2 2013-03-31 21:45:00 2012-03-31 12:00:00 31571100.0 108 | 3 2013-04-07 21:45:00 2012-04-30 12:00:00 29583900.0 109 | 4 2013-04-14 21:45:00 2012-05-31 12:00:00 27510300.0 110 | 5 2013-04-21 21:45:00 2012-06-30 12:00:00 25523100.0 111 | 6 2013-04-28 21:45:00 2012-07-31 12:00:00 23449500.0 112 | 113 | ``` 114 | 115 | 现在要在 Spark 上做同样的事情,你需要做的就是用 Koalas 替换 pandas: 116 | 117 | 复制代码 118 | 119 | ```python 120 | import databricks.koalas as ks 121 | df = ks.from_pandas(pandas_df) 122 | df['diff_seconds'] = df['End_date'] - df['Start_date'] 123 | df['diff_seconds'] = df['diff_seconds'] / np.timedelta64(1,'s') 124 | print(df) 125 | 126 | ``` 127 | 128 | 再做一次,就这么简单。 129 | 130 | ## 接下来的计划和 Koalas 入门 131 | 132 | 我们之所以创建 Koalas,是因为我们遇到了许多不愿意处理大数据的数据科学家。我们相信 Koalas 会让数据科学家将工作轻松拓展到 Spark 上,从而让他们获得更多能力。 133 | 134 | 目前为止,我们已经实现了常见的 DataFrame 操作方法,以及 pandas 中强大的索引技术。以下是我们路线图中的一些即将推出的项目,主要侧重于扩大覆盖范围: 135 | 136 | * 用于处理文本数据的字符串操作 137 | * 时间序列数据的日期 / 时间操作 138 | 139 | 该计划尚处于初期阶段,但正在迅速发展。如果你有兴趣了解更多有关 Koalas 或入门的信息,请查看该项目的 **GitHub:**[https://github.com/databricks/koalas](https://github.com/databricks/koalas) 140 | 141 | 142 | 143 | > 原文链接: 144 | > [https://databricks.com/blog/2019/04/24/koalas-easy-transition-from-pandas-to-apache-spark.html](https://databricks.com/blog/2019/04/24/koalas-easy-transition-from-pandas-to-apache-spark.html) -------------------------------------------------------------------------------- /大数据/spark系列/RDD完整.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/josonle/Coding-Now/32b963ff23af1e957099d03cb9f935a32cbc9373/大数据/spark系列/RDD完整.pdf -------------------------------------------------------------------------------- /大数据/spark系列/Spark SQL最佳实践.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/josonle/Coding-Now/32b963ff23af1e957099d03cb9f935a32cbc9373/大数据/spark系列/Spark SQL最佳实践.pdf -------------------------------------------------------------------------------- /大数据/spark系列/SparkSQL子查询源码阅读.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/josonle/Coding-Now/32b963ff23af1e957099d03cb9f935a32cbc9373/大数据/spark系列/SparkSQL子查询源码阅读.pdf -------------------------------------------------------------------------------- /大数据/spark系列/Spark大数据相关面试.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/josonle/Coding-Now/32b963ff23af1e957099d03cb9f935a32cbc9373/大数据/spark系列/Spark大数据相关面试.pdf -------------------------------------------------------------------------------- /大数据/spark系列/_vnote.json: -------------------------------------------------------------------------------- 1 | { 2 | "created_time": "2019-05-17T09:44:08Z", 3 | "files": [ 4 | { 5 | "attachment_folder": "", 6 | "attachments": [ 7 | ], 8 | "created_time": "2019-05-17T09:44:08Z", 9 | "modified_time": "2019-05-17T09:44:08Z", 10 | "name": "Koalas:让 pandas 轻松切换 Apache Spark,在大数据中规模应用.md", 11 | "tags": [ 12 | ] 13 | } 14 | ], 15 | "sub_directories": [ 16 | ], 17 | "version": "1" 18 | } 19 | -------------------------------------------------------------------------------- /大数据/京东大数据技术白皮书-2018.12-120页.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/josonle/Coding-Now/32b963ff23af1e957099d03cb9f935a32cbc9373/大数据/京东大数据技术白皮书-2018.12-120页.pdf -------------------------------------------------------------------------------- /大数据/今日头条推荐系统+架构设计实践.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/josonle/Coding-Now/32b963ff23af1e957099d03cb9f935a32cbc9373/大数据/今日头条推荐系统+架构设计实践.pdf -------------------------------------------------------------------------------- /大数据/快看漫画大数据平台的模型思维与用户增长实践.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/josonle/Coding-Now/32b963ff23af1e957099d03cb9f935a32cbc9373/大数据/快看漫画大数据平台的模型思维与用户增长实践.pdf -------------------------------------------------------------------------------- /大数据/有赞百亿级日志系统架构设计.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/josonle/Coding-Now/32b963ff23af1e957099d03cb9f935a32cbc9373/大数据/有赞百亿级日志系统架构设计.pdf -------------------------------------------------------------------------------- /大数据/流式数据处理在百度数据工厂应用与实践.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/josonle/Coding-Now/32b963ff23af1e957099d03cb9f935a32cbc9373/大数据/流式数据处理在百度数据工厂应用与实践.pdf -------------------------------------------------------------------------------- /大数据/用户画像相关资料/《奔跑吧兄弟2》电视直播观看人群用户画像报告.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/josonle/Coding-Now/32b963ff23af1e957099d03cb9f935a32cbc9373/大数据/用户画像相关资料/《奔跑吧兄弟2》电视直播观看人群用户画像报告.pdf -------------------------------------------------------------------------------- /大数据/用户画像相关资料/《用户画像分析》专题分享.pptx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/josonle/Coding-Now/32b963ff23af1e957099d03cb9f935a32cbc9373/大数据/用户画像相关资料/《用户画像分析》专题分享.pptx -------------------------------------------------------------------------------- /大数据/用户画像相关资料/基于用户画像的大数据挖掘实践 .pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/josonle/Coding-Now/32b963ff23af1e957099d03cb9f935a32cbc9373/大数据/用户画像相关资料/基于用户画像的大数据挖掘实践 .pdf -------------------------------------------------------------------------------- /大数据/用户画像相关资料/用户画像举例.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/josonle/Coding-Now/32b963ff23af1e957099d03cb9f935a32cbc9373/大数据/用户画像相关资料/用户画像举例.pdf -------------------------------------------------------------------------------- /大数据/用户画像相关资料/用户画像和精准化平台系统实践案例.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/josonle/Coding-Now/32b963ff23af1e957099d03cb9f935a32cbc9373/大数据/用户画像相关资料/用户画像和精准化平台系统实践案例.pdf -------------------------------------------------------------------------------- /大数据/用户画像相关资料/用户画像实战应用.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/josonle/Coding-Now/32b963ff23af1e957099d03cb9f935a32cbc9373/大数据/用户画像相关资料/用户画像实战应用.pdf -------------------------------------------------------------------------------- /大数据/用户画像相关资料/用户画像很重要-那你知道是怎么画出来的吗?.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/josonle/Coding-Now/32b963ff23af1e957099d03cb9f935a32cbc9373/大数据/用户画像相关资料/用户画像很重要-那你知道是怎么画出来的吗?.pdf -------------------------------------------------------------------------------- /大数据/用户画像相关资料/用户画像数据建模方法.docx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/josonle/Coding-Now/32b963ff23af1e957099d03cb9f935a32cbc9373/大数据/用户画像相关资料/用户画像数据建模方法.docx -------------------------------------------------------------------------------- /大数据/用户画像相关资料/用户画像数据建模方法.pdfx.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/josonle/Coding-Now/32b963ff23af1e957099d03cb9f935a32cbc9373/大数据/用户画像相关资料/用户画像数据建模方法.pdfx.pdf -------------------------------------------------------------------------------- /大数据/用户画像相关资料/用户画像构建.docx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/josonle/Coding-Now/32b963ff23af1e957099d03cb9f935a32cbc9373/大数据/用户画像相关资料/用户画像构建.docx -------------------------------------------------------------------------------- /大数据/用户画像相关资料/用户画像的方法、实践与行业应用.docx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/josonle/Coding-Now/32b963ff23af1e957099d03cb9f935a32cbc9373/大数据/用户画像相关资料/用户画像的方法、实践与行业应用.docx -------------------------------------------------------------------------------- /大数据/用户画像相关资料/用户画像的构建及应用.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/josonle/Coding-Now/32b963ff23af1e957099d03cb9f935a32cbc9373/大数据/用户画像相关资料/用户画像的构建及应用.pdf -------------------------------------------------------------------------------- /算法和数据结构/LeetCode刷题心得/LeetCode刷题心得.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: LeetCode刷题心得 3 | date: 2018-12-12 12:34:35 4 | tags: 数据机构 5 | categories: 数据结构与算法 6 | toc: true 7 | --- 8 | 9 | # LeetCode刷题心得 10 | 11 | - 181212 链表刷题 12 | 13 | ## 数组 14 | 15 | 16 | 17 | ## 链表 18 | 19 | ### 链表设计 20 | 21 | - 单链表,双链表,循环链表 22 | - 合理增加哨兵节点(head、tail节点) 23 | - head节点是不是要放在第一个节点位置,还是在第一个节点前;tail指向最后一个节点 24 | - 删除节点p怎么方便? 25 | 26 | > 通常遇到都会考虑,找到p前面一个节点q,然后q->next = q->next->next 27 | > 28 | > / 29 | > 30 | > 还有一种是找到节点p,然后替换p的值为后一个节点的值(`p.val = p.next.val`),然后`p->next = p->next-next` 31 | 32 | ### 双指针应用 33 | 34 | #### 判断链表有无环(环的入口处节点位置,环的长度) 35 | 36 | > 我们遍历所有结点并在哈希表中存储每个结点的引用(或内存地址)。如果当前结点为空结点 `null`(即已检测到链表尾部的下一个结点),那么我们已经遍历完整个链表,并且该链表不是环形链表。如果当前结点的引用已经存在于哈希表中,那么返回 `true`(即该链表为环形链表)。 37 | > 38 | > 时间空间复杂度都为O(n) 39 | 40 | 第二种方法 41 | 42 | > 两个指针,一个步长为一,一个为二。只要二者遍历时重合,必定存在环 43 | > 44 | > 时间复杂度O(n),空间复杂度O(1) 45 | > 46 | > **求环的入口点**:p1和p2重合时,把p1拉回head处,p1、p2同步长,再次相交处就是入口点q 47 | > 48 | > **求环的长度**:由上,再次相交后,p2再次走一圈,回到q处所走的距离就是环的长度 49 | > 50 | > **关键在于以上步长能够保证p1,p2相遇时,p1不可能走完一圈** 51 | 52 | 53 | 54 | ```java 55 | public boolean hasCycle(ListNode head) {// 判断有环 56 | ListNode p1 = head; 57 | ListNode p2 = head; 58 | 59 | while(p2 != null && p2.next != null){ 60 | p1 = p1.next; 61 | p2 = p2.next.next; 62 | 63 | if(p1==p2) 64 | return true; 65 | } 66 | return false; 67 | } 68 | 69 | public ListNode detectCycle(ListNode head) {// 有环的话,求解环入口节点 70 | ListNode p1 = head; 71 | ListNode p2 = head; 72 | while(p2 != null && p2.next != null){ 73 | p1 = p1.next; 74 | p2 = p2.next.next; 75 | 76 | if(p1 == p2){ 77 | p1 = head; 78 | int index = 0; 79 | while(p1!=p2){ 80 | p1 = p1.next; 81 | p2 = p2.next; 82 | index++; 83 | } 84 | return p1; 85 | } 86 | } 87 | return null; 88 | } 89 | ``` 90 | 91 | 92 | 93 | #### 判断两个单链表是否相交及找到第一个交点 [160. Intersection of Two Linked Lists](https://leetcode-cn.com/problems/intersection-of-two-linked-lists/) 94 | 95 | 【这道题默认单链表无环,下面链接给出了有环的解法】 96 | 97 | 最简单解法:两个链表相交的话,链表长度和一定相等,每次遍历到尾部时,再次从另一链表头部出发,一定会相交。 98 | 99 | 如果不相交,如果链表长度相等,第一次遍历就会结束;不相等,第二次遍历会结束 100 | 101 | ```java 102 | public ListNode getIntersectionNode(ListNode headA, ListNode headB) { 103 | if (headA == null || headB == null) 104 | return null; 105 | ListNode node1 = headA; 106 | ListNode node2 = headB; 107 | while (node1 != node2) { 108 | node1 = (node1 == null ? headB : node1.next); 109 | node2 = (node2 == null ? headA : node2.next); 110 | } 111 | return node1; 112 | } 113 | ``` 114 | 115 | 116 | 117 | 这道题解法也是妙,把相交转化为求解有无环 118 | 119 | > 先遍历第一个链表到它的尾部,然后将尾部的next指针指向第二个链表(尾部指针的next本来指向的是null)。这样两个链表就合成了一个链表。若该链表有环,则原两个链表一定相交。否则,不相交。 120 | > 121 | > 这样进行转换后就可以从链表头部进行判断了,其实并不用。通过简单的了解我们就很容易知道,如果新链表是有环的,那么原来第二个链表的头部一定在环上。因此我们就可以从第二个链表的头部进行遍历的,从而减少了时间复杂度(减少的时间复杂度是第一个链表的长度) 122 | > 123 | > 124 | > 参考:https://blog.csdn.net/fengxinlinux/article/details/78885764 125 | 126 | 127 | 128 | ```java 129 | public ListNode getIntersectionNode(ListNode headA, ListNode headB) { 130 | if(headA==null||headB==null) 131 | return null; 132 | 133 | ListNode h1 = headA; 134 | // ListNode h2 = headB; 135 | while(h1.next!=null){ 136 | h1 = h1.next; 137 | } 138 | h1.next = headB; 139 | return findCyclw(headA); 140 | } 141 | public ListNode findCycle(ListNode head){ 142 | ListNode p1 = head; 143 | ListNode p2 = head; 144 | while(p2 != null && p2.next != null){ 145 | p1 = p1.next; 146 | p2 = p2.next.next; 147 | 148 | if(p1 == p2){ 149 | p1 = head; 150 | int index = 0; 151 | while(p1!=p2){ 152 | p1 = p1.next; 153 | p2 = p2.next; 154 | index++; 155 | } 156 | return p1; 157 | } 158 | } 159 | return null; 160 | } 161 | ``` 162 | 163 | #### 不知道单链表有无环如何判断是否相交? 164 | 165 | https://blog.csdn.net/liuxialong/article/details/6556096 166 | 167 | > ```markdown 168 | > 先判断是否有环,判断是否有环可以使用追逐办法,设置两个指针,一个走一步,一个走两步,如果能相遇则说明存在环 169 | > (1)两个都没环,就是上面解题思路 170 | > (2)**一个有环,一个没环,肯定两链表不相交**。如果相交,相交节点处next就有两个指针了 171 | > (3)两个都有环:判断链表A的碰撞点是否出现在链表B的环中,如果在,则相交。(相交时,环必定是两链表共有的) 172 | > 173 | > ``` 174 | 175 | ![](assets/Cycle.png) 176 | 177 | 178 | 179 | #### 删除链表倒数第N个节点 180 | 181 | 让一个指针先走N步,然后两个指针一起走即可 182 | 183 | 注意边界点:最后一个节点和**第一个节点**删除问题 184 | 185 | > public ListNode removeNthFromEnd(ListNode head, int n) {// 返回头结点 186 | > ​ ListNode p1 = head; 187 | > ​ ListNode p2 = head; 188 | > ​ while(n>0){ 189 | > ​ n--; 190 | > ​ p2 = p2.next; 191 | > ​ } 192 | > ​ if(p2==null){// 删除第一个节点的情况 193 | > ​ head = head.next; 194 | > ​ return head; 195 | > ​ } 196 | > ​ while(p2.next!=null){ 197 | > ​ p1 = p1.next; 198 | > ​ p2 = p2.next; 199 | > ​ } 200 | > ​ p1.next = p1.next.next; 201 | > ​ return head; 202 | > ​ } 203 | 204 | #### 判断链表中点位置 205 | 206 | > 同样是两个指针,一个步长为一,一个为二。步长为二的指针走到终点时,另一个指针走到中点。 207 | > 208 | > **注意奇偶个数节点所得中点不同** 209 | 210 | ### 链表简单题 211 | 212 | 213 | 214 | #### 反转链表 215 | 216 | ![](assets/reverseList.png) 217 | 218 | 思路就是每次把节点1后面的节点移到head处(作为head节点),时间复杂度O(n),空间复杂度O(1) 219 | 220 | ```java 221 | // LeetCode提交100%,0ms 222 | class Solution { 223 | public ListNode reverseList(ListNode head) { 224 | if(head==null||head.next==null) 225 | return head; 226 | ListNode q = head; 227 | ListNode p = head.next; 228 | while(p!=null){ 229 | ListNode flag = p.next; 230 | q.next = flag; 231 | p.next = head; 232 | head = p; 233 | p = flag; 234 | } 235 | return head; 236 | } 237 | } 238 | ``` 239 | 240 | #### 删除链表中所有等于val的节点 241 | 242 | ```java 243 | public ListNode removeElements(ListNode head, int val) { 244 | if(head==null){ 245 | return null; 246 | } 247 | // 要么创建一个哨兵节点置于最前面 248 | // ListNode p = new ListNode(0); 249 | // p.next = head; 250 | // head = p; 251 | // while(p.next != null){ 252 | // if(p.next.val==val){ 253 | // p.next = p.next.next; 254 | // }else{ 255 | // p = p.next; 256 | // } 257 | // } 258 | // return head.next; 259 | // 要么最后来处理head.val==val的情况 260 | ListNode p = head; 261 | while(p.next!=null){ 262 | if(p.next.val==val) 263 | p.next = p.next.next; 264 | else 265 | p = p.next; 266 | } 267 | if(head.val==val) 268 | head = head.next; 269 | return head; 270 | } 271 | ``` 272 | 273 | 看到有一种递归的提交解法 274 | 275 | ```java 276 | public ListNode removeElements(ListNode head, int val) { 277 | if (head == null) 278 | return null 279 | head.next = removeElements(head.next, val); 280 | return head.val == val ? head.next : head; 281 | } 282 | ``` 283 | 284 | #### 奇偶链表 285 | 286 | 给定一个单链表,把所有的奇数节点和偶数节点分别排在一起。请注意,这里的**奇数节点和偶数节点指的是节点编号的奇偶性**,而不是节点的值的奇偶性。 287 | 288 | 请尝试使用原地算法完成。你的算法的空间复杂度应为 O(1),时间复杂度应为 O(nodes),nodes 为节点总数 289 | 290 | - 要求 291 | - 应当保持奇数节点和偶数节点的相对顺序。 292 | - 链表的第一个节点视为奇数节点,第二个节点视为偶数节点,以此类推。 293 | 294 | ![](assets/奇偶链表.png) 295 | 296 | ```java 297 | public ListNode oddEvenList(ListNode head) { 298 | if(head==null) 299 | return null; 300 | ListNode p = head; 301 | ListNode q = head.next,tmp = head.next; 302 | //tmp指针使得每次调整位置时,无需将如图所示节点3的next指向节点2,而是最后将奇链表最后一个节点的next指向节点2 303 | 304 | while(p.next!=null&&q.next!=null){ 305 | p.next = p.next.next; 306 | q.next = q.next.next; 307 | p = p.next; 308 | q = q.next; 309 | } 310 | p.next = tmp; 311 | return head; 312 | } 313 | ``` 314 | 315 | 如下是二次改进版,提交耗时3ms,上面的7ms 316 | 317 | ```java 318 | while(p.next!=null&&q.next!=null){ 319 | // 注意,以下不会出现指针指向空指针的next节点,这种情况根本进不了循环 320 | p.next = q.next; 321 | p = p.next; 322 | q.next = p.next; 323 | q = q.next; 324 | } 325 | ``` 326 | 327 | 如上写法时间开销更少,好处在于链表遍历次数减少,如果是`p.next = p.next.next`,指针需跳两次循环一次就是四次,所以n个节点时间复杂度O(2n),而直接`q.next`是O(n) 328 | 329 | #### 回文链表判断 [234. Palindrome Linked List](https://leetcode-cn.com/problems/palindrome-linked-list/) 330 | 331 | 要求Could you do it in O(n) time and O(1) space 332 | 333 | 334 | 335 | 想法一:自己上手思路是翻转链表,再逐个遍历比较。翻转O(n),遍历O(n),时间复杂度O(n);另外还需O(n)的空间复杂度(比较的话,需复制一个链表) 336 | 337 | 想法二:其次是用栈stack保存前半段数据,通过快慢指针,先走到中点处(此时stack中已存下前半段数据),继续从中点处开始遍历,出栈逐个比较。时间复杂度O(n),空间复杂度O(n/2),更好点 338 | 339 | 看了下别人的题解,我去,也是翻转链表,不过是翻转半段链表 340 | 341 | 这题确实不错,既有快慢指针用法,有又翻转链表 342 | 343 | ```java 344 | public boolean isPalindrome(ListNode head) { 345 | if(head==null||head.next==null) 346 | return true; 347 | 348 | ListNode fast = head,slow = head; 349 | while(fast!=null&&fast.next!=null){// 找到中点slow 350 | slow = slow.next; 351 | fast = fast.next.next; 352 | } 353 | if(fast==null){// 偶 354 | slow = reverseList(slow); 355 | }else{// 奇 356 | slow = reverseList(slow.next); 357 | } 358 | while(slow!=null){ 359 | if(head.val!=slow.val) 360 | return false; 361 | head = head.next; 362 | slow = slow.next; 363 | } 364 | return true; 365 | } 366 | public ListNode reverseList(ListNode head){ 367 | if(head==null||head.next==null) 368 | return head; 369 | ListNode p = head.next,q = head; 370 | while(p!=null){ 371 | ListNode flag = p.next; 372 | q.next = flag; 373 | p.next = head; 374 | head = p; 375 | p = flag; 376 | } 377 | return head; 378 | } 379 | ``` 380 | 381 | 382 | 383 | ### 个人感触:遍历next节点时,务必判断当前节点是否为空; 384 | 385 | 链表中双指针多是一个步长一,一个步长二 386 | 387 | **复杂度分析** 388 | 389 | ``` 390 | 空间复杂度分析容易。如果只使用指针,而不使用任何其他额外的空间,那么空间复杂度将是 O(1)。但是,时间复杂度的分析比较困难。为了得到答案,我们需要分析运行循环的次数。 391 | 392 | 在前面的查找循环示例中,假设我们每次移动较快的指针 2 步,每次移动较慢的指针 1 步。 393 | 394 | 1. 如果没有循环,快指针需要 N/2 次才能到达链表的末尾,其中 N 是链表的长度。 395 | 2. 如果存在循环,则快指针需要 M 次才能赶上慢指针,其中 M 是列表中循环的长度。 396 | 397 | 显然,M <= N 。所以我们将循环运行 N 次。对于每次循环,我们只需要常量级的时间。因此,该算法的时间复杂度总共为 O(N)。 398 | 399 | ``` -------------------------------------------------------------------------------- /算法和数据结构/LeetCode刷题心得/_vnote.json: -------------------------------------------------------------------------------- 1 | { 2 | "created_time": "2019-05-17T09:44:08Z", 3 | "files": [ 4 | { 5 | "attachment_folder": "", 6 | "attachments": [ 7 | ], 8 | "created_time": "2019-05-17T09:44:08Z", 9 | "modified_time": "2019-05-17T09:44:08Z", 10 | "name": "LeetCode刷题心得.md", 11 | "tags": [ 12 | ] 13 | } 14 | ], 15 | "sub_directories": [ 16 | ], 17 | "version": "1" 18 | } 19 | -------------------------------------------------------------------------------- /算法和数据结构/LeetCode刷题心得/assets/Cycle.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/josonle/Coding-Now/32b963ff23af1e957099d03cb9f935a32cbc9373/算法和数据结构/LeetCode刷题心得/assets/Cycle.png -------------------------------------------------------------------------------- /算法和数据结构/LeetCode刷题心得/assets/reverseList.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/josonle/Coding-Now/32b963ff23af1e957099d03cb9f935a32cbc9373/算法和数据结构/LeetCode刷题心得/assets/reverseList.png -------------------------------------------------------------------------------- /算法和数据结构/LeetCode刷题心得/assets/奇偶链表.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/josonle/Coding-Now/32b963ff23af1e957099d03cb9f935a32cbc9373/算法和数据结构/LeetCode刷题心得/assets/奇偶链表.png -------------------------------------------------------------------------------- /算法和数据结构/_vnote.json: -------------------------------------------------------------------------------- 1 | { 2 | "created_time": "2019-05-17T09:44:08Z", 3 | "files": [ 4 | ], 5 | "sub_directories": [ 6 | { 7 | "name": "LeetCode刷题心得" 8 | }, 9 | { 10 | "name": "剑指Offer" 11 | } 12 | ], 13 | "version": "1" 14 | } 15 | -------------------------------------------------------------------------------- /算法和数据结构/剑指Offer/_vnote.json: -------------------------------------------------------------------------------- 1 | { 2 | "created_time": "2019-05-17T09:44:08Z", 3 | "files": [ 4 | { 5 | "attachment_folder": "", 6 | "attachments": [ 7 | ], 8 | "created_time": "2019-05-17T09:44:08Z", 9 | "modified_time": "2019-05-17T09:44:08Z", 10 | "name": "字符串.md", 11 | "tags": [ 12 | ] 13 | }, 14 | { 15 | "attachment_folder": "", 16 | "attachments": [ 17 | ], 18 | "created_time": "2019-05-17T09:44:08Z", 19 | "modified_time": "2019-05-17T09:44:08Z", 20 | "name": "链表.md", 21 | "tags": [ 22 | ] 23 | } 24 | ], 25 | "sub_directories": [ 26 | ], 27 | "version": "1" 28 | } 29 | -------------------------------------------------------------------------------- /算法和数据结构/剑指Offer/字符串.md: -------------------------------------------------------------------------------- 1 | ## 题目:字符串正则匹配 2 | 3 | 请实现一个函数用来匹配包括`.`和`*`的正则表达式。模式中的字符'`.`表示任意一个字符,而`*`示它前面的字符可以出现任意次(包含0次)。在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字符串"aaa"与模式"a.a"和"ab*ac*a"匹配,但是与"aa.a"和"ab*a"均不匹配 4 | 5 | ## 题解 6 | 7 | 其实很好想 8 | 9 | - `.` 匹配任意一个字符不用管。 10 | 11 | - `*`匹配前一个字符0~N次,`*`**前一个字符有和Str当前字符不匹配和匹配(或`.`)两种情况** 12 | - 不匹配--->看作`*`匹配0次,Pstr跳过两个字符继续和Str匹配 13 | - 匹配 14 | - `.*`是有可能的,可能情况包含在匹配和不匹配内 15 | - `*`匹配0次,Pstr跳过两个字符继续和Str匹配 16 | - `*`匹配N次,Str跳过一个字符继续和当前Pstr匹配 17 | 18 | 终止条件这里我反而想了好久,Pstr和Str都走到了尾部就可以成立了(虽然Pstr可能比Str长,也可能短,但其中存在或判断,所以只要可以匹配就一定能都走到尾部) -------------------------------------------------------------------------------- /算法和数据结构/剑指Offer/链表.md: -------------------------------------------------------------------------------- 1 | ## 题目:链表删除节点 2 | 3 | 用O(1)的时间复杂度删除单链表中的某个节点 4 | 5 | 这道题我想了挺久,一致认为怎么做都需要O(n),其实我搞混了一个问题,它并非是先找到该节点(通过值找到啥的),题目是该节点已经给出了。所以只可能有两种情况,该节点(不是)是最后一个节点。前者直接用下一个节点值覆盖当前,并指向下下个节点`cur.val=cur.next.var;cur.next=cur.next.next;` n-1个O(1),后者要先遍历找到倒数第二个节点,再指向null,1个O(n)。所以平均时间复杂度`((n-1)O(1)+O(n))/n`还是O(1) --------------------------------------------------------------------------------