├── .gitignore ├── C++ ├── README.md ├── Xcode.md ├── acess.png ├── c++.md ├── template.png └── uml1.png ├── Composer └── Composer.md ├── Git ├── GitHub Desktop 登陆时出现key chain 问题解决.md ├── git.md └── status.png ├── MongoDB ├── MongDB.md └── image │ ├── 2019-08-01-Redis-datastruct.png │ ├── 2019-08-01-hset.png │ ├── 2019-09-06-JumpTable1.png │ └── 2019-09-06-JumpTable2.png ├── NoteTree.png ├── PHP ├── PHP基础 │ ├── WeiPHP(PHP)学习笔记.md │ └── php-basic.md ├── README.md └── php-laravel │ ├── img │ ├── N1-without-rel.png │ ├── car_driver.png │ ├── error1.png │ ├── error2.png │ ├── facade.png │ ├── n1-sql-use-with.png │ ├── n1-with-rel.png │ ├── pages.png │ └── sql-debugger-bar.png │ ├── laravel-basic-features.md │ ├── laravel-comprehensive-topic.md │ ├── laravel-env.md │ ├── laravel-front.md │ ├── laravel-kernel.md │ ├── laravel-plugin.md │ ├── laravel-sys-function.md │ └── laravel.md ├── README.md ├── RPC ├── RESTful-In-spring.md └── rpc-In-spring.md ├── Redis ├── Redis.md └── image │ ├── 2019-08-01-Redis-datastruct.png │ ├── 2019-08-01-hset.png │ ├── 2019-09-06-JumpTable1.png │ └── 2019-09-06-JumpTable2.png ├── Springcloud ├── Eureka.md ├── Gateway.md ├── Hystrix.md ├── Maven.md ├── OpenFeign.md ├── RestTemplate.md ├── Ribbon.md ├── Springcloud Config.md ├── Springcloud.md ├── image │ ├── Cloud 升级.xmind │ ├── eureka-client-registery.png │ ├── eureka-cluster01.png │ ├── eureka-cluster02.png │ ├── eureka-cs-framework.png │ ├── eureka-selfprotect.png │ ├── load-balance01.png │ ├── load-balance02.png │ ├── micoservice-component.png │ └── tranditional-ms.png └── zk │ ├── Zookeeper.md │ └── image │ ├── 2019-09-03-zpnode.svg │ ├── 2019-09-20-Redis_Cluster_lock.svg │ └── zk-springcloud.png ├── Untitled.md ├── Vim └── Vim.md ├── WebAPP └── 网页环境相关配置.md ├── algorithm ├── README.md ├── bintree.md ├── dp.md ├── image │ ├── LevelTravel_judge_level.png │ └── robot_maze.png └── 我爱算法.md ├── datastructure ├── 1-4-queu.png ├── 2-4-queue.png ├── 2-4-queue2.png ├── 2-4-tree-hard.png ├── 2-4tree.png ├── 8-quee.png ├── 8-queue-code.png ├── PracticeProblems4FinalExam.pdf ├── b-tree-visit.png ├── bi-search.png ├── ds.md ├── insert-sort.gif ├── merge.gif ├── process.png ├── quick_sort.gif ├── shortpath1.png ├── shortpath2.png ├── sort.png └── sum-sort.png ├── docker ├── Docker.md └── image │ └── php-nginx-ok.png ├── gRpc ├── grpc笔记.md ├── grpc通信模式.xmind └── images │ └── protobuf-message-encoding.svg ├── images └── mysql-replication.png ├── java ├── JDBC │ └── JDBC.md ├── JVM │ ├── Java内存区域.md │ ├── Java类加载.md │ └── 垃圾回收机制.md ├── JavaIO │ ├── IO模型.md │ └── JavaIO操作.md ├── JavaSE │ ├── .idea │ │ ├── JavaSE.iml │ │ ├── misc.xml │ │ ├── modules.xml │ │ ├── vcs.xml │ │ └── workspace.xml │ ├── JAVA基本数据对象.md │ ├── JAVA按值传递与按引用传递.md │ ├── JAVA访问控制.md │ ├── java异常.md │ ├── 一切皆对象.md │ ├── 关于java运行.md │ ├── 内部类.md │ ├── 反射.md │ ├── 多态.md │ ├── 抽象类和接口.md │ ├── 泛型.md │ ├── 类再生.md │ └── 类初始化和重载.md ├── Lombok │ └── Lombok.md ├── MyBatis │ └── MyBatis.md ├── README.md ├── Spring │ ├── AOP.md │ ├── IoCI.md │ └── IoCII.md ├── SpringMVC │ ├── SpringMVC.md │ └── SpringMVC启动.md ├── Springboot │ └── springboot.md ├── image │ ├── 20109-09-12-1.svg │ ├── 2018-08-06-GC.png │ ├── 2019-07-19-java-exception.png │ ├── 2019-07-20-thread-insecure.svg │ ├── 2019-07-20-thread-status.png │ ├── 2019-07-30-StackOrConstant.jpg │ ├── 2019-07-31-constant_pool.png │ ├── 2019-08-.png │ ├── 2019-08-03-Classload.svg │ ├── 2019-08-03-classmem.png │ ├── 2019-08-07-JDBC.png │ ├── 2019-08-07-java-reflect.png │ ├── 2019-08-07-reflect-struct.png │ ├── 2019-08-08-HasIOC.png │ ├── 2019-08-08-NoIOC.png │ ├── 2019-08-08-NormAccountSaving.png │ ├── 2019-08-08-NormDependancy.png │ ├── 2019-08-14-SpringMVCFiltter.png │ ├── 2019-08-14-SpringRequest.svg │ ├── 2019-08-23-BIO.png │ ├── 2019-08-23-NIO.png │ ├── 2019-09-06-basicNIO.svg │ ├── 2019-09-06-select.svg │ ├── ThreadPoolExecutor-2019-08-31.svg │ ├── class_loading.jpg │ └── types_of_inheritance.png ├── spring-plugins │ ├── Spring-plugins.md │ └── image │ │ ├── devtools1.png │ │ └── devtools2.png ├── 其他类 │ ├── Math.md │ ├── Runtime.md │ └── String.md ├── 容器 │ ├── Java工具类-Map.md │ ├── Java工具类-集合.md │ └── 容器高阶.md ├── 并发 │ ├── 多线程.md │ ├── 多线程面试易问.md │ ├── 线程池.md │ └── 高并发包JUC.md └── 琐碎问题集合.md ├── linux ├── Linux概述.md ├── README.md ├── Shell.md ├── 文件管理.md ├── 用户管理.md ├── 网络.md ├── 软件包管理.md ├── 进程管理.md └── 骚操作.md ├── mysql ├── MySQL基本操作.md ├── MySQL服务器性能优化.md ├── Mysql高级.md ├── README.md ├── image │ ├── 2019-07-18-left-outer-join-1.png │ ├── 2019-07-18-left-outer-join-2.png │ ├── 2019-07-18-right-outer-join-1.png │ ├── 2019-07-18-right-outer-join-2.png │ ├── 2019-07-18-set-operation.png │ ├── 2019-7-19-transaction.png │ ├── 2019-7-31-Distrbuted-MySQL.png │ ├── DirtyRead.png │ ├── Non-repeatable.png │ └── Phantom_read.png ├── 关系数据库设计理论.md ├── 更改数据库密码.md └── 查询.md ├── ngxin-conf ├── Nginx配置.md ├── conf │ └── nginx.conf ├── data │ ├── h1.html │ └── img1.png ├── logs │ ├── access.log │ └── error.log └── start.sh ├── npm ├── jquery.png ├── logo.png ├── npm.md └── project │ ├── node_modules │ └── jquery │ │ ├── AUTHORS.txt │ │ ├── LICENSE.txt │ │ ├── README.md │ │ ├── bower.json │ │ ├── dist │ │ ├── core.js │ │ ├── jquery.js │ │ ├── jquery.min.js │ │ ├── jquery.min.map │ │ ├── jquery.slim.js │ │ ├── jquery.slim.min.js │ │ └── jquery.slim.min.map │ │ ├── external │ │ └── sizzle │ │ │ ├── LICENSE.txt │ │ │ └── dist │ │ │ ├── sizzle.js │ │ │ ├── sizzle.min.js │ │ │ └── sizzle.min.map │ │ ├── package.json │ │ └── src │ │ ├── .eslintrc.json │ │ ├── ajax.js │ │ ├── ajax │ │ ├── jsonp.js │ │ ├── load.js │ │ ├── parseXML.js │ │ ├── script.js │ │ ├── var │ │ │ ├── location.js │ │ │ ├── nonce.js │ │ │ └── rquery.js │ │ └── xhr.js │ │ ├── attributes.js │ │ ├── attributes │ │ ├── attr.js │ │ ├── classes.js │ │ ├── prop.js │ │ ├── support.js │ │ └── val.js │ │ ├── callbacks.js │ │ ├── core.js │ │ ├── core │ │ ├── DOMEval.js │ │ ├── access.js │ │ ├── camelCase.js │ │ ├── init.js │ │ ├── isAttached.js │ │ ├── nodeName.js │ │ ├── parseHTML.js │ │ ├── ready-no-deferred.js │ │ ├── ready.js │ │ ├── readyException.js │ │ ├── stripAndCollapse.js │ │ ├── support.js │ │ ├── toType.js │ │ └── var │ │ │ └── rsingleTag.js │ │ ├── css.js │ │ ├── css │ │ ├── addGetHookIf.js │ │ ├── adjustCSS.js │ │ ├── curCSS.js │ │ ├── finalPropName.js │ │ ├── hiddenVisibleSelectors.js │ │ ├── showHide.js │ │ ├── support.js │ │ └── var │ │ │ ├── cssExpand.js │ │ │ ├── getStyles.js │ │ │ ├── isHiddenWithinTree.js │ │ │ ├── rboxStyle.js │ │ │ ├── rnumnonpx.js │ │ │ └── swap.js │ │ ├── data.js │ │ ├── data │ │ ├── Data.js │ │ └── var │ │ │ ├── acceptData.js │ │ │ ├── dataPriv.js │ │ │ └── dataUser.js │ │ ├── deferred.js │ │ ├── deferred │ │ └── exceptionHook.js │ │ ├── deprecated.js │ │ ├── dimensions.js │ │ ├── effects.js │ │ ├── effects │ │ ├── Tween.js │ │ └── animatedSelector.js │ │ ├── event.js │ │ ├── event │ │ ├── ajax.js │ │ ├── alias.js │ │ ├── focusin.js │ │ ├── support.js │ │ └── trigger.js │ │ ├── exports │ │ ├── amd.js │ │ └── global.js │ │ ├── jquery.js │ │ ├── manipulation.js │ │ ├── manipulation │ │ ├── _evalUrl.js │ │ ├── buildFragment.js │ │ ├── getAll.js │ │ ├── setGlobalEval.js │ │ ├── support.js │ │ ├── var │ │ │ ├── rscriptType.js │ │ │ └── rtagName.js │ │ └── wrapMap.js │ │ ├── offset.js │ │ ├── queue.js │ │ ├── queue │ │ └── delay.js │ │ ├── selector-native.js │ │ ├── selector-sizzle.js │ │ ├── selector.js │ │ ├── serialize.js │ │ ├── traversing.js │ │ ├── traversing │ │ ├── findFilter.js │ │ └── var │ │ │ ├── dir.js │ │ │ ├── rneedsContext.js │ │ │ └── siblings.js │ │ ├── var │ │ ├── ObjectFunctionString.js │ │ ├── arr.js │ │ ├── class2type.js │ │ ├── concat.js │ │ ├── document.js │ │ ├── documentElement.js │ │ ├── fnToString.js │ │ ├── getProto.js │ │ ├── hasOwn.js │ │ ├── indexOf.js │ │ ├── isFunction.js │ │ ├── isWindow.js │ │ ├── pnum.js │ │ ├── push.js │ │ ├── rcheckableType.js │ │ ├── rcssNum.js │ │ ├── rnothtmlwhite.js │ │ ├── slice.js │ │ ├── support.js │ │ └── toString.js │ │ └── wrap.js │ ├── package-lock.json │ └── package.json ├── package.json ├── react-ecology ├── Antd.md ├── JavaScript.md ├── React.md ├── Redux.md └── image │ ├── dom-diff.png │ ├── life-cycle.jpg │ ├── redux-diff.png │ ├── redux-flow.png │ ├── redux-logo.png │ └── redux-middleware.png ├── 中间件 ├── image │ ├── 2019-08-02-MQ1.svg │ ├── 2019-08-02-MQ3.svg │ ├── 2019-08-02-mq2.svg │ ├── 2019-09-01-SimpleQueue.svg │ ├── 2019-09-01-subscribe_model.svg │ ├── 2019-09-01-workers.svg │ └── work-queue.png └── 消息队列 │ ├── RabbitMQ.md │ └── 消息队列概述.md ├── 分布式系统设计 ├── Nginx 负载均衡.md ├── distributed-lock.md ├── image │ ├── 2019-08-22-ConHash.jpg │ └── 2019-08-22-conHash2.jpg ├── 分布式事务.md ├── 分布式系统设计.md └── 数据密集系统设计.md ├── 大数据 ├── HDFS 设计原理.md └── Hadoop.md ├── 机器学习 ├── README.md ├── ann.md ├── basic.md ├── classification.md ├── image │ ├── ann │ │ ├── Muti-linear-still-linear.png │ │ ├── ann-back-1.png │ │ ├── back-phase.png │ │ ├── backward-eq.png │ │ ├── forward-eq.png │ │ ├── linear-ann-addb.png │ │ ├── linear-ann.png │ │ ├── lms-algo.png │ │ ├── sigmoid.png │ │ ├── softmax.png │ │ ├── tanh.png │ │ ├── training-error.png │ │ └── xor.png │ ├── basic-bias-and-variance.png │ ├── basic-overfitting.png │ ├── basic-tradeoff.png │ ├── classification-M-D-classifier.png │ ├── classification-Piece-wise.png │ ├── regression-L1-L2.png │ ├── regression-lasso-eq.png │ ├── regression-ridge-eq.png │ ├── semi-1.png │ ├── semi-10.png │ ├── semi-11.png │ ├── semi-12.png │ ├── semi-13.png │ ├── semi-14.png │ ├── semi-15.png │ ├── semi-16.png │ ├── semi-2.png │ ├── semi-3.png │ ├── semi-4.png │ ├── semi-5.png │ ├── semi-6.png │ ├── semi-7.png │ ├── semi-8.png │ ├── semi-9.png │ ├── svm │ │ ├── hinge-loss.png │ │ ├── kernel-trick.png │ │ ├── soft-margin.png │ │ ├── svm-intro.png │ │ └── svm.png │ └── unsuper-ann │ │ ├── som-struct.png │ │ └── struct.png ├── regression.md ├── semi-supvised-learning.md ├── svm.md ├── unsupervised-ann.md ├── 常用库 │ ├── Pandas & Numpy.md │ └── TensorFlow.md └── 数据预处理 │ └── 数据预处理的基本思路.md ├── 笔记树.xmind └── 设计模式 ├── image └── 2019-07-21-Singleton-uml.jpg └── 设计模式.md /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | -------------------------------------------------------------------------------- /C++/README.md: -------------------------------------------------------------------------------- 1 | # C++ 语言基础 2 | 3 | * [C++ 基础](c++.md) 4 | 5 | * [Xcode 编译的时候遇到的问题](Xcode.md) 6 | 7 | -------------------------------------------------------------------------------- /C++/Xcode.md: -------------------------------------------------------------------------------- 1 | ## Xcode 写 c++ 时候遇到的一些问题 2 | 3 | ### 1. 读取文件(txt)的路径问题 4 | 5 | 一直显示读取文件失败 (**file not found**) , 文件和代码都放在一个文件夹下面, 这时需要改工作目录的默认文件读取路径 : 6 | 7 | ~~~ 8 | Put your .txt files in the same directory where your main.cpp file is (or anywhere you like). 9 | 10 | In Xcode go to Product > Scheme > Edit Scheme > Run test (on the right) > Options (middle top) 11 | 12 | Down under Options check “Use custom working directory” and set it to the directory where you .txt files are located. 13 | 14 | To work with the files, you will have to specify just file names, e.g. 15 | in_file.open("inputFile.txt"); no path is necessary. 16 | ~~~ 17 | 18 | -------------------------------------------------------------------------------- /C++/acess.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/arkssss/StudyNotes/d6d95640bc5a7c566a2372bb951e687ca5802845/C++/acess.png -------------------------------------------------------------------------------- /C++/template.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/arkssss/StudyNotes/d6d95640bc5a7c566a2372bb951e687ca5802845/C++/template.png -------------------------------------------------------------------------------- /C++/uml1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/arkssss/StudyNotes/d6d95640bc5a7c566a2372bb951e687ca5802845/C++/uml1.png -------------------------------------------------------------------------------- /Composer/Composer.md: -------------------------------------------------------------------------------- 1 | [TOC] 2 | 3 | # Composer 4 | 5 | **Composer是 PHP 世界里用于管理项目依赖的工具** 6 | 7 | 8 | 9 | # 相关命令 10 | 11 | ## 创建一个项目 - create-project 12 | 13 | ~~~shell 14 | # 创建一个 laravel 项目, 本地写入文件夹 larabbs 中. 15 | >$composer create-project laravel/laravel larabbs --prefer-dist "6.*" 16 | ~~~ 17 | 18 | 19 | 20 | ## 设置国内淘宝镜像 21 | 22 | ~~~shell 23 | $ composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/ 24 | ~~~ 25 | 26 | -------------------------------------------------------------------------------- /Git/GitHub Desktop 登陆时出现key chain 问题解决.md: -------------------------------------------------------------------------------- 1 | # GitHub Desktop 登陆时出现key chain 问题解决 2 | 3 | 打开 dasborad 里面的钥匙串 4 | 5 | 点击第一栏的登陆 6 | 7 | 点击上锁 再 解锁 -------------------------------------------------------------------------------- /Git/status.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/arkssss/StudyNotes/d6d95640bc5a7c566a2372bb951e687ca5802845/Git/status.png -------------------------------------------------------------------------------- /MongoDB/image/2019-08-01-Redis-datastruct.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/arkssss/StudyNotes/d6d95640bc5a7c566a2372bb951e687ca5802845/MongoDB/image/2019-08-01-Redis-datastruct.png -------------------------------------------------------------------------------- /MongoDB/image/2019-08-01-hset.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/arkssss/StudyNotes/d6d95640bc5a7c566a2372bb951e687ca5802845/MongoDB/image/2019-08-01-hset.png -------------------------------------------------------------------------------- /MongoDB/image/2019-09-06-JumpTable1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/arkssss/StudyNotes/d6d95640bc5a7c566a2372bb951e687ca5802845/MongoDB/image/2019-09-06-JumpTable1.png -------------------------------------------------------------------------------- /MongoDB/image/2019-09-06-JumpTable2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/arkssss/StudyNotes/d6d95640bc5a7c566a2372bb951e687ca5802845/MongoDB/image/2019-09-06-JumpTable2.png -------------------------------------------------------------------------------- /NoteTree.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/arkssss/StudyNotes/d6d95640bc5a7c566a2372bb951e687ca5802845/NoteTree.png -------------------------------------------------------------------------------- /PHP/PHP基础/php-basic.md: -------------------------------------------------------------------------------- 1 | # PHP语言基础 2 | 3 | ## 数组 4 | 5 | ### 遍历 6 | 7 | ~~~php 8 | /* foreach 遍历 php 数组 */ 9 | $arr = []; 10 | 11 | /* key + value 形式 */ 12 | foreach($arr as $key => $value){ 13 | // code ... 14 | } 15 | 16 | /* value 形式 */ 17 | foreach($arr as $value){ 18 | // code ... 19 | } 20 | ~~~ 21 | 22 | 23 | 24 | ### `in_array` 判断数组有无某元素 25 | 26 | > [in_array]() 27 | 28 | ~~~php 29 | 38 | ~~~ 39 | 40 | 41 | 42 | ### `unset` 销毁数组中元素 43 | 44 | > [unset]() 45 | 46 | ~~~php 47 | /* 可以使用 unset 销毁某数组元素 */ 48 | $arr = ['title' => 'hello', 'age' : '18', ...]; 49 | 50 | /* 销毁,同时销毁 title 及其对应的 value 值 */ 51 | unset($arr['title']); 52 | ~~~ 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | ## 其他 65 | 66 | ### 如何子类函数调用基类方法, 在这个方法中显示子类的类名 ? 67 | 68 | 69 | 70 | * 1. 首先想到的是PHP的魔术常量 \__CLASS__ 71 | 72 | 但是, 如果在基类中使用\__CLASS__ 代表的是这个基类的类名, 而非调用它的子类的类名 73 | 74 | ~~~php 75 | test(); // 此时输出的为 Base 而非 myTest 84 | } 85 | } 86 | ~~~ 87 | 88 | * 2. 利用PHP 自带的函数 **get_called_class()** 后者 **get_class()** 既可以解决 89 | 90 | ~~~php 91 | 'Asia/Shanghai', 89 | 90 | /* 默认语言设置为中文 */ 91 | 'locale' => 'zh-CN', 92 | ~~~ 93 | 94 | 当然也可以自定义配置文件如 `constant.php` 95 | 96 | ~~~php 97 | /* 如: config/constant.php */ 98 | return [ 99 | 'pi' => 3.14 100 | ] 101 | ~~~ 102 | 103 | 获取的方式和之前相同 104 | 105 | ~~~php 106 | Config::get('constant.pi'); 107 | ~~~ 108 | 109 | 110 | 111 | 112 | 113 | 114 | 115 | 116 | 117 | 118 | 119 | 120 | 121 | 122 | 123 | 124 | 125 | 126 | 127 | 128 | 129 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # 学习笔记 2 | 3 | 这个 Repo 用于记录大致从2019年准备秋招开始, 断断续续整理的一些笔记, 最后成功上岸鹅厂. 4 | 5 | 不断学习加深印象的同时也方便日后查阅. Coder本身就是一个需要不断积累的职业, 记录学习点滴也可以勉励自己不断向前. 6 | 7 | 8 | 9 | **生命不停, 学习不止** 🔥 10 | 11 | 🏃🏃‍♀️ 12 | 13 | 14 | 15 | ## 语言 16 | 17 | * [Java](java/README.md) ☕️ 18 | 19 | * [PHP](PHP/README.md) 🐘 20 | 21 | * [C++](C++/README.md) 22 | 23 | 24 | 25 | ## Web 前端 26 | 27 | * [JavaScript基础] 28 | 29 | * [React](react-ecology/React.md) 30 | 31 | * [Redux](react-ecology/Redux.md) 32 | 33 | 34 | 35 | ## 分布式系统设计 36 | 37 | * [Springcloud生态](Springcloud/Springcloud.md) 38 | 39 | * [RESTful-spring](RPC/RESTful-In-spring.md) 40 | * [rpc-spring](RPC/rpc-In-spring.md) 41 | * [分布式锁](分布式系统设计/distributed-lock.md) 42 | 43 | 44 | 45 | ## 机器学习 46 | 47 | * [机器学习](机器学习/README.md) 48 | 49 | 50 | 51 | ## 系统基础 52 | 53 | - [数据结构与算法](datastructure/ds.md) 54 | - [常见算法](algorithm/README.md) 55 | - [Linux基础](linux/README.md) 56 | - [常见设计模式] 57 | 58 | 59 | 60 | ## 数据库 61 | 62 | * [MySQL](MySQL/README.md) 63 | 64 | * [Redis](Redis/Redis.md) 65 | 66 | * [MongoDB](MongoDB/MongDB.md) 67 | 68 | 69 | 70 | ## 中间件 71 | 72 | * [消息队列概述](中间件/消息队列/消息队列概述.md) 73 | 74 | * [RabbitMQ](中间件/消息队列/RabbitMQ.md) 75 | 76 | 77 | 78 | ## 常用工具 79 | 80 | * [git](Git/git.md) 81 | * [vim](Vim/Vim.md) 82 | * [npm](npm/npm.md) 83 | * [docker](docker/Docker.md) 84 | 85 | -------------------------------------------------------------------------------- /Redis/image/2019-08-01-Redis-datastruct.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/arkssss/StudyNotes/d6d95640bc5a7c566a2372bb951e687ca5802845/Redis/image/2019-08-01-Redis-datastruct.png -------------------------------------------------------------------------------- /Redis/image/2019-08-01-hset.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/arkssss/StudyNotes/d6d95640bc5a7c566a2372bb951e687ca5802845/Redis/image/2019-08-01-hset.png -------------------------------------------------------------------------------- /Redis/image/2019-09-06-JumpTable1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/arkssss/StudyNotes/d6d95640bc5a7c566a2372bb951e687ca5802845/Redis/image/2019-09-06-JumpTable1.png -------------------------------------------------------------------------------- /Redis/image/2019-09-06-JumpTable2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/arkssss/StudyNotes/d6d95640bc5a7c566a2372bb951e687ca5802845/Redis/image/2019-09-06-JumpTable2.png -------------------------------------------------------------------------------- /Springcloud/Gateway.md: -------------------------------------------------------------------------------- 1 | # Gateway 2 | 3 | > [Spring Cloud Gateway]() 4 | > 5 | > API 网关自身也是一个服务,且是是后端微服务的唯一入口,它封装了内部的架构,为客户端提供一个定制的API接口。同时还可以负责 验证,监控,负载均衡,限流等功能。 6 | 7 | Gateway 是 SpringCloud 官方推出的 **服务网关层** , 用于取代 网飞公司的Zuul2.x。 8 | 9 | Gateway 是一个 非阻塞异步IO,底层基于 Netty。 10 | 11 | -------------------------------------------------------------------------------- /Springcloud/Maven.md: -------------------------------------------------------------------------------- 1 | # Maven 2 | 3 | > [Maven]() 4 | > 5 | > [Maven repository]() 6 | > 7 | > Apache Maven is a software project management and comprehension tool. Based on the concept of a project object model (POM), Maven can manage a project's build, reporting and documentation from a central piece of information. 8 | 9 | Java 的依赖包下载管理工具 10 | 11 | 12 | 13 | # 标签概念 14 | 15 | ## Dependency 和 DependencyManagement 16 | 17 | DependencyManagement 一般用在父类 pom 文件中如: 18 | 19 | ~~~xml 20 | 21 | 22 | 23 | 24 | mysql 25 | mysql-connector-java 26 | 5.1.47 27 | 28 | 29 | 30 | ~~~ 31 | 32 | 此时子项目在依赖 mysql 的时候,可以不指定版本,默认从父类的中读取对应的版本号。 33 | 34 | ~~~xml 35 | 36 | 37 | mysql 38 | mysql-connector-java 39 | 40 | ~~~ 41 | 42 | * DependencyManagement 只是声明依赖,并不真正引入jar, 类似于 接口。 43 | * 子类的 pom 文件中必须要指定依赖,才会真正的引入 jar 包。 44 | * 如果子类自己规定了版本号,那么子类自定义版本号会覆盖父类 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | -------------------------------------------------------------------------------- /Springcloud/OpenFeign.md: -------------------------------------------------------------------------------- 1 | # OpenFeign 2 | 3 | # 一. 概念 4 | 5 | > OpenFeign 实现了客户端 Rest 接口的更简易调用,且其聚合了 RestTemplate + Ribbon 的功能,可以在客户端上封装负载均衡的方式调用微服务提供者的 REST 接口。 6 | 7 | 8 | 9 | # 二. 安装 10 | 11 | ## Maven Jar 包引入 12 | 13 | ~~~xml 14 | 15 | org.springframework.cloud 16 | spring-cloud-starter-openfeign 17 | 18 | ~~~ 19 | 20 | 注意引入 openfeign 便可以不再引入 ribbon 因为其已经自身整合。 21 | 22 | 23 | 24 | # 三. 基本使用 25 | 26 | ## Quick Start 27 | 28 | ### `@EnableFeignClients` 注解 29 | 30 | 首先需要在主程序添加 `@EnableFeignClients` 注解 31 | 32 | ~~~java 33 | package com.ark.springcloud; 34 | import org.springframework.boot.SpringApplication; 35 | import org.springframework.boot.autoconfigure.SpringBootApplication; 36 | import org.springframework.cloud.openfeign.EnableFeignClients; 37 | 38 | @SpringBootApplication 39 | @EnableFeignClients 40 | public class FeignMain80 { 41 | public static void main(String[] args) { 42 | SpringApplication.run(FeignMain80.class, args); 43 | } 44 | } 45 | ~~~ 46 | 47 | 48 | 49 | ### `@FeignClient` 注解面向微服务接口 50 | 51 | openfeign 最大的特点是自身封装 ribbon 和 Rest 接口调用, 可以讲原本在 contoller 层进行的 rest 调用抽离到单独的service层进行。 52 | 53 | ~~~java 54 | package com.ark.springcloud.service; 55 | 56 | /* @FeignClient 定义了请求的微服务名 */ 57 | @Component 58 | @FeignClient(value = "CLOUD-PAYMENT-SERVICE") 59 | public interface PaymentFeignService { 60 | 61 | /* 62 | 这些定义的方法和微服务提供者保持一致即可 63 | 注解的地址即为微服务提供者暴露的 REST 风格地址 64 | */ 65 | 66 | @PostMapping(value = "/payment/create") 67 | CommonResult create(@RequestBody Payment payment); 68 | 69 | @GetMapping(value = "/payment/get/{id}") 70 | CommonResult getPaymentById(@PathVariable("id") Long id); 71 | 72 | @GetMapping(value = "/payment/timeout") 73 | public String timeOutUnit(); 74 | } 75 | 76 | ~~~ 77 | 78 | 79 | 80 | ## 服务响应时间 81 | 82 | OpenFeign中 ribbon 默认服务响应时间为 1s, 如果超过会自动跳转到超时页面 83 | 84 | 也是更改如下设置 85 | 86 | ~~~yaml 87 | ribbon: 88 | #指的是建立连接所用的时间,适用于网络状况正常的情况下,两端连接所用的时间 89 | ReadTimeout: 5000 90 | #指的是建立连接后从服务器读取到可用资源所用的时间 91 | ConnectTimeout: 5000 92 | ~~~ 93 | 94 | 95 | 96 | ## 日志增强 97 | 98 | OpenFeign 可以设置日志的等级,详细的日志等级可以记录每一次 HTTP 请求的详细信息, 可以如下设置 99 | 100 | 首先在 `@Configuration` 类中进行 IoC注入 101 | 102 | ~~~java 103 | package com.ark.springcloud.config; 104 | 105 | import feign.Logger; 106 | import org.springframework.context.annotation.Bean; 107 | import org.springframework.context.annotation.Configuration; 108 | 109 | @Configuration 110 | public class ApplicationContext { 111 | @Bean 112 | Logger.Level getFeignLoggerLevel(){ 113 | /* 配置openfeign日志增强 */ 114 | return Logger.Level.FULL; 115 | } 116 | } 117 | ~~~ 118 | 119 | **然后在配置文件中设置 openfeign 的日志输出在slf4j的输出等级** 120 | 121 | ~~~yaml 122 | logging: 123 | level: 124 | # feign日志以什么级别监控哪个接口 125 | com.ark.springcloud.service.PaymentFeignService: debug 126 | ~~~ 127 | 128 | 129 | 130 | 131 | 132 | 133 | 134 | 135 | 136 | 137 | 138 | 139 | 140 | 141 | 142 | 143 | 144 | 145 | 146 | 147 | 148 | 149 | 150 | 151 | 152 | 153 | 154 | 155 | 156 | -------------------------------------------------------------------------------- /Springcloud/RestTemplate.md: -------------------------------------------------------------------------------- 1 | # RestTemplate 2 | 3 | > 提供多种便捷访问远程 Http 服务的方法 4 | > 5 | > Spring 提供的访问 Rest 服务的 客户端模版工具集 6 | 7 | 8 | 9 | # 一. 依赖注入 10 | 11 | 由于 RestTemplate 是Spring框架自带功能,因此无需 maven 引入, 在使用的时候,只需要 DI 即可, 具体步骤如下: 12 | 13 | 新建 com\ark\springcloud\config\ApplicationContextConfig 类, 然后注入 RestTemplate。 14 | 15 | ~~~java 16 | package com.ark.springcloud.config; 17 | 18 | import org.springframework.context.annotation.Bean; 19 | import org.springframework.context.annotation.Configuration; 20 | import org.springframework.web.client.RestTemplate; 21 | 22 | /** 23 | * IoC 容器初始化注入类 24 | */ 25 | @Configuration 26 | public class ApplicationContextConfig { 27 | 28 | /* RestTemplate 注入到容器中 */ 29 | @Bean 30 | public RestTemplate getRestTemplate(){ 31 | return new RestTemplate(); 32 | } 33 | 34 | } 35 | ~~~ 36 | 37 | 38 | 39 | # 二. 基本用法 40 | 41 | ## 常用函数 ---ForObject 42 | 43 | ---ForObject 函数返回对象为响应体中数据转化的对象,**基本上可以理解为 Json** 44 | 45 | 推荐使用 **---ForObject 方法** 46 | 47 | ### `postForObject` 48 | 49 | ~~~java 50 | /* 51 | 发送一个 post 请求 52 | 分别传入 53 | 1. 请求url 54 | 2. post 数据 55 | 3. response 类型 56 | */ 57 | restTemplate.postForObject(PAYMENT_URL + "/payment/create", payment, CommonResult.class); 58 | ~~~ 59 | 60 | ### `getForObject` 61 | 62 | ~~~java 63 | /* 64 | 发送一个 get 请求 65 | 1. 请求 url 66 | 2. response 类型 67 | */ 68 | restTemplate.getForObject(PAYMENT_URL + "/payment/get/" + id, CommonResult.class); 69 | ~~~ 70 | 71 | 72 | 73 | ## 常用函数 ---ForEntity 74 | 75 | ---ForEntity函数返回的是 ResponseEntity<> 对象。 76 | 77 | 78 | 79 | ### `getForEntity` 80 | 81 | ~~~java 82 | ResponseEntity entity = 83 | restTemplate.getForEntity(PAYMENT_URL + "/payment/get/" + id, CommonResult.class); 84 | 85 | /* 86 | 获取请求状态码 87 | entity.getStatusCode().is2xxSuccessful() 88 | 89 | 获取内容, 可直接返回 90 | entity.getBody(); 91 | */ 92 | ~~~ 93 | 94 | 95 | 96 | 97 | 98 | ## 相关注解 99 | 100 | ### `@LoadBalanced` 101 | 102 | 要成功实现负载均衡调用,需要在 `RestTemplate` 注入的时候加入该注解 103 | 104 | ```java 105 | /** 106 | * IoC 容器初始化注入类 107 | */ 108 | @Configuration 109 | public class ApplicationContextConfig { 110 | 111 | /* RestTemplate 注入到容器中 */ 112 | @Bean 113 | @LoadBalanced // enable 负载均衡调用 114 | public RestTemplate getRestTemplate(){ 115 | return new RestTemplate(); 116 | } 117 | 118 | } 119 | ``` 120 | 121 | 122 | 123 | 124 | 125 | 126 | 127 | 128 | 129 | 130 | 131 | 132 | 133 | -------------------------------------------------------------------------------- /Springcloud/Ribbon.md: -------------------------------------------------------------------------------- 1 | # Ribbon 2 | 3 | > Spring cloud Ribbon 是 Netflix 实现的一个 **负载均衡工具**, 通过Spring Cloud的封装,可以让我们轻松地将面向服务的REST模版请求自动转换成客户端负载均衡的服务调用 4 | 5 | 6 | 7 | # 一. 安装 8 | 9 | ## 通过 Eureka 整合安装 Ribbon 10 | 11 | 引入了 **eureka-client** 变可以不用再引入 **ribbon** 12 | 13 | ~~~xml 14 | 15 | 16 | org.springframework.cloud 17 | spring-cloud-starter-netflix-eureka-client 18 | 19 | ~~~ 20 | 21 | 22 | 23 | ## 独立安装 Ribbon 24 | 25 | ~~~xml 26 | 27 | org.springframework.cloud 28 | spring-cloud-starter-netflix-ribbon 29 | 30 | ~~~ 31 | 32 | 33 | 34 | 35 | 36 | # 二. 基本概念 37 | 38 | ## Ribbon vs Nginx 39 | 40 | Ribbon 和 Nginx 均为常见的负载均衡工具,但是两者也有所不同。 41 | 42 | * Nginx 是服务端负载均衡: 43 | 44 | 用于拦截所有的 浏览器 请求, 是整合微服务端架构的大门, 负责将请求转发为所有的 **接入层**。 45 | 46 | * Ribbon 即为本地负载均衡: 47 | 48 | 即为 **微服务接入层** 和 **微服务持久层** 的负载均衡,属于微服务内部服务之间的负载均衡。 49 | 50 | 51 | 52 | ## 负载均衡策略 53 | 54 | Ribbin 负载均衡策略可以分为如下几种 : 55 | 56 | * 轮询(默认): `RoundRobinRule` 57 | 58 | ~~~java 59 | /* 60 | 实现: 61 | 请求服务为 当前请求次数的 % 总机器数量 62 | */ 63 | ~~~ 64 | 65 | * 随机 : `RandomRule` 66 | 67 | 68 | 69 | ## 切换策略 70 | 71 | Ribben 额负载均衡策略由 **IRule** 类型的 bean 定义,一般而言在容器中注入实例, 需要在 `ApplicationContext` 配置文件中配置即可。 72 | 73 | 但是 Ribben 的注入略有不同,Ribben 不能在 `@ComponentScan` 注解下的那个包中放入容器。 74 | 75 | 因此需要另起一个 包 `com.ark.myrule` 76 | 77 | ~~~java 78 | package com.ark.myrule; 79 | 80 | import com.netflix.loadbalancer.IRule; 81 | import com.netflix.loadbalancer.RandomRule; 82 | import org.springframework.context.annotation.Bean; 83 | import org.springframework.context.annotation.Configuration; 84 | 85 | @Configuration 86 | public class MyselfRule { 87 | @Bean 88 | public IRule myRule(){ 89 | 90 | /* 使用随机的负载均衡规则 */ 91 | return new RandomRule(); 92 | } 93 | } 94 | ~~~ 95 | 96 | 在主程中添加 `@RibbonClient` 注解 97 | 98 | ~~~java 99 | package com.ark.springcloud; 100 | 101 | import com.ark.myrule.MyselfRule; 102 | import org.springframework.boot.SpringApplication; 103 | import org.springframework.boot.autoconfigure.SpringBootApplication; 104 | import org.springframework.cloud.netflix.eureka.EnableEurekaClient; 105 | import org.springframework.cloud.netflix.ribbon.RibbonClient; 106 | 107 | @SpringBootApplication 108 | @EnableEurekaClient 109 | @RibbonClient(name = "CLOUD-PAYMENT-SERVICE", configuration = MyselfRule.class) 110 | public class OrderMain80 { 111 | public static void main(String[] args) { 112 | SpringApplication.run(OrderMain80.class, args); 113 | } 114 | } 115 | ~~~ 116 | 117 | 118 | 119 | 120 | 121 | 122 | 123 | 124 | 125 | 126 | 127 | 128 | 129 | 130 | 131 | 132 | 133 | 134 | 135 | 136 | 137 | 138 | 139 | 140 | 141 | 142 | 143 | 144 | 145 | 146 | 147 | 148 | 149 | -------------------------------------------------------------------------------- /Springcloud/Springcloud Config.md: -------------------------------------------------------------------------------- 1 | # SpringCloud Config 2 | 3 | 随着工程的增多,配置文件变得膨胀,公共配置变得难以维护。 4 | 5 | 使用 SpringCloud Config 抽离所有微服务的配置服务。 6 | 7 | Spring Cloud Config 分为 8 | 9 | * server 端 : 即为config server 10 | * client 端 : 即为各个微服务 11 | 12 | -------------------------------------------------------------------------------- /Springcloud/image/Cloud 升级.xmind: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/arkssss/StudyNotes/d6d95640bc5a7c566a2372bb951e687ca5802845/Springcloud/image/Cloud 升级.xmind -------------------------------------------------------------------------------- /Springcloud/image/eureka-client-registery.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/arkssss/StudyNotes/d6d95640bc5a7c566a2372bb951e687ca5802845/Springcloud/image/eureka-client-registery.png -------------------------------------------------------------------------------- /Springcloud/image/eureka-cluster01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/arkssss/StudyNotes/d6d95640bc5a7c566a2372bb951e687ca5802845/Springcloud/image/eureka-cluster01.png -------------------------------------------------------------------------------- /Springcloud/image/eureka-cluster02.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/arkssss/StudyNotes/d6d95640bc5a7c566a2372bb951e687ca5802845/Springcloud/image/eureka-cluster02.png -------------------------------------------------------------------------------- /Springcloud/image/eureka-cs-framework.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/arkssss/StudyNotes/d6d95640bc5a7c566a2372bb951e687ca5802845/Springcloud/image/eureka-cs-framework.png -------------------------------------------------------------------------------- /Springcloud/image/eureka-selfprotect.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/arkssss/StudyNotes/d6d95640bc5a7c566a2372bb951e687ca5802845/Springcloud/image/eureka-selfprotect.png -------------------------------------------------------------------------------- /Springcloud/image/load-balance01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/arkssss/StudyNotes/d6d95640bc5a7c566a2372bb951e687ca5802845/Springcloud/image/load-balance01.png -------------------------------------------------------------------------------- /Springcloud/image/load-balance02.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/arkssss/StudyNotes/d6d95640bc5a7c566a2372bb951e687ca5802845/Springcloud/image/load-balance02.png -------------------------------------------------------------------------------- /Springcloud/image/micoservice-component.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/arkssss/StudyNotes/d6d95640bc5a7c566a2372bb951e687ca5802845/Springcloud/image/micoservice-component.png -------------------------------------------------------------------------------- /Springcloud/image/tranditional-ms.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/arkssss/StudyNotes/d6d95640bc5a7c566a2372bb951e687ca5802845/Springcloud/image/tranditional-ms.png -------------------------------------------------------------------------------- /Springcloud/zk/image/zk-springcloud.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/arkssss/StudyNotes/d6d95640bc5a7c566a2372bb951e687ca5802845/Springcloud/zk/image/zk-springcloud.png -------------------------------------------------------------------------------- /Untitled.md: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/arkssss/StudyNotes/d6d95640bc5a7c566a2372bb951e687ca5802845/Untitled.md -------------------------------------------------------------------------------- /WebAPP/网页环境相关配置.md: -------------------------------------------------------------------------------- 1 | # MAC网页环境相关配置路径 2 | 3 | ## 1.apache 4 | 5 | **Mac系统有自带的apache服务器,无需另外下载** 6 | 7 | #### 1.1相关访问路径 8 | 9 | * 系统自带的apache的路径位于/private/etc/apache2 10 | 11 | * 系统apache服务器默认的访问路径为/Library/WebServer/Documents 12 | 13 | 14 | #### 1.2修改apache服务器的默认访问路径 15 | 16 | 在apache所在路径中,找到位于/private/etc/apache2下的配置文件httpd.conf,修改配置文件中的documentroot后的路径为自己想要的路径即可,本mac上的修改为/Users/ark/code_file/php 17 | 18 | 19 | 20 | ## 2.mysql 21 | 22 | mysql为自己下载,安装路径为/usr/local/mysql 23 | 24 | * 命令行启动mysql:sudo apachectl start 25 | * 命令行重置mysql:sudo apachectl restart 26 | * 本地的 username = 'root' pwd = '19951103' 27 | 28 | 29 | 30 | ## 3.PHP 31 | 32 | MAC系统同样有已经配置好的PHP环境,版本为7.1.16 33 | 34 | 启用只需要将apache的配置文件中的关于modulePHP那一行注释即可 35 | 36 | 37 | 38 | 39 | 40 | -------------------------------------------------------------------------------- /algorithm/README.md: -------------------------------------------------------------------------------- 1 | * [动态规划经典题型](dp.md) 2 | 3 | * [二叉树经典题型](bintree.md) 4 | 5 | 6 | -------------------------------------------------------------------------------- /algorithm/image/LevelTravel_judge_level.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/arkssss/StudyNotes/d6d95640bc5a7c566a2372bb951e687ca5802845/algorithm/image/LevelTravel_judge_level.png -------------------------------------------------------------------------------- /algorithm/image/robot_maze.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/arkssss/StudyNotes/d6d95640bc5a7c566a2372bb951e687ca5802845/algorithm/image/robot_maze.png -------------------------------------------------------------------------------- /datastructure/1-4-queu.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/arkssss/StudyNotes/d6d95640bc5a7c566a2372bb951e687ca5802845/datastructure/1-4-queu.png -------------------------------------------------------------------------------- /datastructure/2-4-queue.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/arkssss/StudyNotes/d6d95640bc5a7c566a2372bb951e687ca5802845/datastructure/2-4-queue.png -------------------------------------------------------------------------------- /datastructure/2-4-queue2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/arkssss/StudyNotes/d6d95640bc5a7c566a2372bb951e687ca5802845/datastructure/2-4-queue2.png -------------------------------------------------------------------------------- /datastructure/2-4-tree-hard.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/arkssss/StudyNotes/d6d95640bc5a7c566a2372bb951e687ca5802845/datastructure/2-4-tree-hard.png -------------------------------------------------------------------------------- /datastructure/2-4tree.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/arkssss/StudyNotes/d6d95640bc5a7c566a2372bb951e687ca5802845/datastructure/2-4tree.png -------------------------------------------------------------------------------- /datastructure/8-quee.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/arkssss/StudyNotes/d6d95640bc5a7c566a2372bb951e687ca5802845/datastructure/8-quee.png -------------------------------------------------------------------------------- /datastructure/8-queue-code.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/arkssss/StudyNotes/d6d95640bc5a7c566a2372bb951e687ca5802845/datastructure/8-queue-code.png -------------------------------------------------------------------------------- /datastructure/PracticeProblems4FinalExam.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/arkssss/StudyNotes/d6d95640bc5a7c566a2372bb951e687ca5802845/datastructure/PracticeProblems4FinalExam.pdf -------------------------------------------------------------------------------- /datastructure/b-tree-visit.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/arkssss/StudyNotes/d6d95640bc5a7c566a2372bb951e687ca5802845/datastructure/b-tree-visit.png -------------------------------------------------------------------------------- /datastructure/bi-search.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/arkssss/StudyNotes/d6d95640bc5a7c566a2372bb951e687ca5802845/datastructure/bi-search.png -------------------------------------------------------------------------------- /datastructure/insert-sort.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/arkssss/StudyNotes/d6d95640bc5a7c566a2372bb951e687ca5802845/datastructure/insert-sort.gif -------------------------------------------------------------------------------- /datastructure/merge.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/arkssss/StudyNotes/d6d95640bc5a7c566a2372bb951e687ca5802845/datastructure/merge.gif -------------------------------------------------------------------------------- /datastructure/process.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/arkssss/StudyNotes/d6d95640bc5a7c566a2372bb951e687ca5802845/datastructure/process.png -------------------------------------------------------------------------------- /datastructure/quick_sort.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/arkssss/StudyNotes/d6d95640bc5a7c566a2372bb951e687ca5802845/datastructure/quick_sort.gif -------------------------------------------------------------------------------- /datastructure/shortpath1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/arkssss/StudyNotes/d6d95640bc5a7c566a2372bb951e687ca5802845/datastructure/shortpath1.png -------------------------------------------------------------------------------- /datastructure/shortpath2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/arkssss/StudyNotes/d6d95640bc5a7c566a2372bb951e687ca5802845/datastructure/shortpath2.png -------------------------------------------------------------------------------- /datastructure/sort.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/arkssss/StudyNotes/d6d95640bc5a7c566a2372bb951e687ca5802845/datastructure/sort.png -------------------------------------------------------------------------------- /datastructure/sum-sort.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/arkssss/StudyNotes/d6d95640bc5a7c566a2372bb951e687ca5802845/datastructure/sum-sort.png -------------------------------------------------------------------------------- /docker/image/php-nginx-ok.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/arkssss/StudyNotes/d6d95640bc5a7c566a2372bb951e687ca5802845/docker/image/php-nginx-ok.png -------------------------------------------------------------------------------- /gRpc/grpc通信模式.xmind: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/arkssss/StudyNotes/d6d95640bc5a7c566a2372bb951e687ca5802845/gRpc/grpc通信模式.xmind -------------------------------------------------------------------------------- /images/mysql-replication.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/arkssss/StudyNotes/d6d95640bc5a7c566a2372bb951e687ca5802845/images/mysql-replication.png -------------------------------------------------------------------------------- /java/JavaSE/.idea/JavaSE.iml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /java/JavaSE/.idea/misc.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 6 | -------------------------------------------------------------------------------- /java/JavaSE/.idea/modules.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /java/JavaSE/.idea/vcs.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /java/JavaSE/.idea/workspace.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 14 | 15 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 1588765579099 43 | 48 | 49 | 50 | 51 | 53 | 54 | 63 | 64 | -------------------------------------------------------------------------------- /java/JavaSE/JAVA按值传递与按引用传递.md: -------------------------------------------------------------------------------- 1 | [TOC] 2 | 3 | # JAVA 按值传递 与 按引用传递 4 | 5 | ## 基本数据类型 6 | 7 | 8 | 9 | 10 | 11 | ## 数组 12 | 13 | ```java 14 | /* 15 | String[] myString 可以直接在函数修改值 16 | */ 17 | 18 | ``` 19 | 20 | 21 | 22 | ## ArrayList 容器 23 | 24 | java 允许通过函数 来改变 ArrayList容器的值 25 | 26 | 说明 此时 `Title` 为 `ArrayList` 的一个引用 27 | 28 | 函数虽然是 **按值传递** 29 | 30 | 但是传递过去的为 `ArrayList` 引用的 Copy 31 | 32 | 所以在函数中仍然可以直接操作 `ArrayList` 对象 33 | 34 | ~~~java 35 | public static void main(String[] args){ 36 | 37 | ArrayList Title = new ArrayList<>(); 38 | Read(Title); 39 | 40 | // 打印 [Movie_id] 41 | // 说明更改成功 42 | System.out.println(Title); 43 | } 44 | 45 | public static void Read(ArrayList Title){ 46 | 47 | String S = "Movie_id"; 48 | Title.add(S); 49 | } 50 | ~~~ 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | -------------------------------------------------------------------------------- /java/JavaSE/JAVA访问控制.md: -------------------------------------------------------------------------------- 1 | ## JAVA访问控制 2 | 3 | ### 1. java 数据成员访问指示符 4 | 5 | 分为 **public, protected, private, 友好的** 四大类, 与c++不同, java类的**每一个数据成员都必须有指示一个标识符.** 6 | 7 | 8 | 9 | #### 1. 1 友好的 10 | 11 | 如果一个类的某个成员 **没有给定指示符, 那么这个成员就是友好的** 12 | 13 | 友好的说明 : 在**同一个包(package)下**, 所有其他的文件可以任意访问这个类的友好方法, 但是一旦位于外部(不再同一个包下)的时候, 其他文件变不可以再访问. 14 | 15 | **友好的具有包访问权限** 16 | 17 | 18 | 19 | #### 1.2 公共的(public) 20 | 21 | 所有的人都具有访问权限 22 | 23 | 24 | 25 | ####1.3 私有的(private) 26 | 27 | 只有这个类的其他成员才具有访问权限, 否则即使在同一个包下都不能访问. 28 | 29 | **如果将一个类的构造器设置为私有的, 那么便不能声明一个类**. 30 | 31 | 32 | 33 | #### 1.4 保护的(protected) 34 | 35 | 在访问上和友好的类似 : 36 | 37 | * **一个包下, 可以访问保护的成员** 38 | * **不在一个包下, 不能访问保护的成员** 39 | 40 | 在继承的属性上, 和友好的不同 : 41 | 42 | * ~~友好的成员被继承后, 类似于私有的成员, 扩展类不能再访问~~, 其实是可以被访问的 43 | * 保护的成员被继承后, 扩展类可以访问 44 | 45 | **所有保护的和友好的成员之间的有什么区别?** 46 | 47 | 48 | 49 | ### 2. java 类访问指示符 50 | 51 | java的类有且仅有两种访问指示符 **public, 友好** 52 | 53 | 和友好的类成员类似**友好类在同一个包下可以任意访问, 但是在外部便无法访问** 54 | 55 | 对于public 类中, 该文件的文件名必须和该文件中public的类名一致 : 56 | 57 | ~~~java 58 | // file_name : demo1.java 59 | public class demo1{ 60 | code ... 61 | } 62 | ~~~ 63 | 64 | 65 | 66 | 但是一个文件中, 除了public类, 还可以存在其他任意多个友好类 : 67 | 68 | * **一个文件有且仅有一个public类, 也可以没有public类** 69 | 70 | * **一个文件可以有任意多个友好类** 71 | 72 | 73 | 74 | ~~~java 75 | public class demo1{ 76 | 77 | } 78 | 79 | class demo2{} 80 | class demo3{} 81 | ~~~ 82 | 83 | 84 | 85 | 如果希望一个类为私有类, 那么可以将类的构造函数指定为私有的 86 | 87 | ~~~java 88 | class demo1{ 89 | private demo1{} 90 | 91 | // 以静态方法的形式来声明一个类, 从而实现对类实例化数量的控制 92 | public static demo1 AcessDemo1(){ 93 | return new demo1(); 94 | } 95 | } 96 | ~~~ 97 | 98 | 99 | 100 | * 如果一个类的构造函数为私有的, 那么我们不能在类的外部去实例化这个类 101 | 102 | 103 | 104 | -------------------------------------------------------------------------------- /java/JavaSE/关于java运行.md: -------------------------------------------------------------------------------- 1 | ## 关于java 运行 2 | 3 | ###1. .java 和 .class 文件 4 | 5 | * .java 是自己(开发者)编写的源文件 6 | * .class 是通过编译 .java 文件之后生成的文件 7 | 8 | 9 | 10 | Tips : 11 | 12 | **java 程序的运行依赖于虚拟机(JVM),这也是java可以做到跨平台的一个保证 ** 13 | 14 | **任何一个java程序的运行都需要先 将 .java文件 编译成为 .class 文件, 然后在JVM上运行 .class 文件 , JVM 只认识.class 文件** 15 | 16 | 17 | 18 | ### 2. 如何在 MAC 终端 (command line) 运行 java 程序 19 | 20 | 假设有一个.java 文件 test.java 21 | 22 | 要在shell 上编译且执行它 : 23 | 24 | ~~~shell 25 | # 先用javac 命令 编译 .java 文件 26 | javac test.java 27 | 28 | # 编译了之后可以发现目录下多了一个 .class 文件 29 | 30 | # 再用 java 命令直接运行test文件即可 31 | # 注意 java 后面不要加 .class 32 | java test 33 | ~~~ 34 | 35 | 36 | 37 | tips : 38 | 39 | **安装java配置的环境变量 $PATH 添加 \$JAVA_HOME 就是可以让我们在任何的路径下都能直接使用 java javac 命令进行编译和执行java文件 ** 40 | 41 | 42 | 43 | **另一个环境变量 $CLASS_PATH 的作用 就是可在任何路径下都可以去执行 java class_file 这个可执行程序, 当然这个类文件必须在\$CLASS_PATH 的路径下** 44 | 45 | 46 | 47 | 48 | 49 | ### 3. JVM 50 | 51 | * JVM作为.class文件和操作系统的中间层 ,因此一个java程序才可以实现跨平台运行, 因为一个java程序不直接又操作系统去解释, 而是又虚拟机去解释, 在虚拟机的层面上去做到操作系统兼容即可 52 | * JVM 也是使得java不同于其他的编译型语言(c++)的一个重要原因, 其他的编译型语言, 可执行程序的下一层便直接是操作系统 53 | 54 | 55 | 56 | 57 | -------------------------------------------------------------------------------- /java/JavaSE/内部类.md: -------------------------------------------------------------------------------- 1 | [TOC] 2 | 3 | ## 内部类 4 | 5 | ### 什么是内部类? 6 | 7 | **将一个类定义在另一个类里面**, 则对里面的类就称为内部类. 8 | 9 | **在访问特点上** 10 | 11 | * 内部类可以**直接去访问外部类的成员, 即使是私有成员** 12 | * 外部类要访问内部类, 则需要先实例化这个内部类对象 13 | 14 | ~~~java 15 | class outer{ 16 | // 私有成员 17 | private int num = 10; 18 | class inner { 19 | void show(){ 20 | // 内部类直接访问外部类的所有成员 21 | System.out.println("Show outer num" + num); 22 | } 23 | } 24 | public void methid(){ 25 | 26 | // 外部类要访问需要先去实例化 27 | inner in = new inner(); 28 | in.show() 29 | } 30 | } 31 | ~~~ 32 | 33 | 34 | 35 | ### 内部类的访问控制 36 | 37 | 一旦一个类声明为一个内部类, 那么这个类可以当为外部类的一个成员. 38 | 39 | **所以这个内部类可以使用作为一个类成员的所有访问修饰符号** 40 | 41 | 从而, 我们可以引入**内部静态类的概念** 42 | 43 | **注意在java中, 只存在于一种静态类, 就是内部静态类, 外部的类不可以用static关键字修饰 !!!** 44 | 45 | * 内部普通类的声明 46 | 47 | ~~~java 48 | class outer{ 49 | public class inner{ 50 | 51 | } 52 | } 53 | 54 | class main{ 55 | public static void main(String args[]){ 56 | // 此时我们要在外部直接声明inner类 57 | // 相当于我们需要先去实例化外部类, 再去实例化内部类 58 | outer.inner in = new outer().new inner() 59 | } 60 | } 61 | ~~~ 62 | 63 | * 内部静态类的声明 64 | 65 | 对于内部静态类, 我们一旦加载了外部类, 这个静态类就可以被读入内存. 66 | 67 | ~~~java 68 | class outer{ 69 | public static class inner{ 70 | 71 | } 72 | } 73 | 74 | class main{ 75 | public static void main(String args[]){ 76 | // 此时我们可以不去实例化外部类而直接声明我们的内部类 77 | outer.inner in = new outer.inner(); 78 | } 79 | } 80 | ~~~ 81 | 82 | 83 | ### 内部类的成员数据访问 84 | 85 | 一个内部类方法可以去访问外部类的成员, 也可以访问外部类的成员, 那么如何去做成员访问的限制呢? 86 | 87 | ~~~java 88 | class outer{ 89 | int i = 10; 90 | public class inner{ 91 | int i = 11; 92 | void show(){ 93 | int i = 12; 94 | 95 | // 直接调用i输出的是12 96 | // 调用this.i 输出的是11 97 | // 调用outer.this.i 输出的是10 98 | } 99 | } 100 | } 101 | ~~~ 102 | 103 | **可以看出, 内部类其实含有外部类的引用的 即为outer.this** 104 | 105 | 106 | 107 | 108 | 109 | ### 匿名内部类 110 | 111 | 匿名内部类只是, 内部类的一种简写格式, 其实也可以理解成一个特殊的匿名子类. 112 | 113 | 实现的前提 : 114 | 115 | * 这个匿名的类demo, 必须是一个基类的子类, 或者是一个接口的实现 116 | 117 | ~~~java 118 | new demo(){ 119 | public void show(){ 120 | System.out.println("hello unnamed class" + x); 121 | } 122 | }.show(); 123 | ~~~ 124 | 125 | 126 | 127 | 128 | 129 | 130 | 131 | 132 | 133 | 134 | 135 | 136 | 137 | 138 | 139 | 140 | 141 | 142 | 143 | 144 | 145 | 146 | 147 | 148 | 149 | 150 | 151 | 152 | 153 | 154 | 155 | 156 | 157 | 158 | 159 | 160 | 161 | 162 | 163 | 164 | 165 | 166 | 167 | 168 | 169 | 170 | 171 | 172 | 173 | 174 | 175 | 176 | 177 | 178 | 179 | 180 | 181 | 182 | 183 | 184 | 185 | 186 | 187 | 188 | 189 | 190 | 191 | -------------------------------------------------------------------------------- /java/JavaSE/抽象类和接口.md: -------------------------------------------------------------------------------- 1 | [TOC] 2 | 3 | ## 抽象类 和 接口 4 | 5 | ### 抽象类 6 | 7 | #### 为什么要衍生出抽象类? 8 | 9 | 联系到上一节的类多态, **基类被子类重写(override)的方法其实只是起一个规范的作用**, 我们并不会去直接调用基类的相应方法, 而是调用子类的重写方法去实现类多态, 且大多数情况下, 基类的相应方法, 并没有意义 10 | 11 | **所以, 我们应该提供一种机制, 去防止子类去调用这样的基类方法** 12 | 13 | 从而我们设计出关键字 : **abstract** , 用这个关键字声明的方法为 : 14 | 15 | ~~~java 16 | abstract void x(); 17 | ~~~ 18 | 19 | 20 | 21 | #### 什么是抽象类 22 | 23 | 当我们用abstract 关键字去定义一个基类的方法时, 我们便不需要去具体是实现这个抽象方法的实现, **它出现的作用只是为了告诉子类, 要继承我, 就必须由你实现这个抽象方法(子类不实现就会报错)** 24 | 25 | **当一个类有一个或者多个抽象方法的时候, 这个类就必须被声明为抽象的** 26 | 27 | ~~~java 28 | abstract class TestA{ 29 | abstract void x(); 30 | } 31 | ~~~ 32 | 33 | * 一个抽象类不可以被实例化 34 | * 子类必须自己实现基类的抽象方法, 否则该子类也是抽象的 35 | * 即使一个类没有抽象方法, 亦可以通过利用抽象的声明去禁止这个类被实例 36 | 37 | 38 | 39 | ### 接口 40 | 41 | #### 什么是接口 ? 42 | 43 | **一个接口是一个更为纯净的抽象类**, 接口的所有方法都必须不能拥有主体. 即接口的所有方法都是抽象的方法(注意接口的方法并不使用abstract关键字). 44 | 45 | * 接口(interface)的所有方法都是抽象的 46 | * 接口的所有方法都是公共(public)的 47 | * 接口可以有成员变量, 但是它们默认都是**静态和final**的 48 | * 接口不可以被实例化 49 | 50 | 接口的声明 51 | 52 | ~~~java 53 | interface C{} 54 | ~~~ 55 | 56 | 57 | 58 | #### 如何使用接口 59 | 60 | 接口的继承和类有所不同 61 | 62 | * 接口的子类继承**关键字变为 implements, 注意不能写 extends** 63 | * 子类的方法**必须声明为public** 64 | 65 | ~~~java 66 | interface C{} 67 | // 接口C的基类 68 | class C_Son implements C{} 69 | ~~~ 70 | 71 | 72 | 73 | #### 接口实现了java的多继承 74 | 75 | 在常规继承操作中, java并不允许多继承. 但是引入了**接口这一概念, 我们便可以实现java多继承**. 但是java能且仅能继承一个**抽象或者实体类**, 可以继承多个借口 76 | 77 | ~~~java 78 | class A extends B 79 | implements C,D,E{} 80 | ~~~ 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | -------------------------------------------------------------------------------- /java/JavaSE/泛型.md: -------------------------------------------------------------------------------- 1 | # 泛型 2 | 3 | 4 | 5 | ## OverView 6 | 7 | `JDK 1.5 (5.0)` 以后开始引入 泛型, 是一种 **安全性机制** 8 | 9 | 早期容器没有泛型机制, 所以统一接受的 `Object` 类型, 很容易造成 `ClassCastException` 异常 10 | 11 | ```java 12 | /* 13 | 使得 ArrayList 只能存储特定类型的元素 (String) 14 | 增加程序的安全性 15 | */ 16 | ArrayList al = new ArrayList(); 17 | 18 | 19 | /* 20 | 在迭代器的时候, 也需要声明 特定的类型 21 | */ 22 | Iterator it = al.ListIterator(); 23 | ``` 24 | 25 | 26 | 27 | **泛型原理** 28 | 29 | 泛型为编译器行为, 运行时是不带有泛型的, 会被擦除, 即为 **泛型擦除** 30 | 31 | 32 | 33 | **泛型擦除是为了 :** 34 | 35 | 为了兼容运行的类加载器 36 | 37 | 38 | 39 | **泛型的补偿** 40 | 41 | 在运行时, 通过获取元素的类型进行转化动作, 不用在强制转化了 42 | 43 | 44 | 45 | 46 | 47 | ## 带来的好处 48 | 49 | 1. 将运行事情的异常 `ClassCastException` 转到了编译时期, **也就是说, 泛型是编译期行为.** 50 | 51 | ~~~java 52 | /* 53 | 泛型 为编译器技术 54 | */ 55 | ArrayList al = new ArrayList(); 56 | 57 | // 编译不通过 58 | al.add(1); 59 | ~~~ 60 | 61 | 2. 避免强制转换的麻烦 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | -------------------------------------------------------------------------------- /java/JavaSE/类初始化和重载.md: -------------------------------------------------------------------------------- 1 | ## 类初始化和重载 2 | 3 | 4 | 5 | ### 1. 类的初始化构造函数 6 | 7 | * 和c++一样, java中类的构造函数名就是**类名** 8 | * 构造函数**没有返回值**, 且与void返回值有明显的区别 9 | * 当对象没有定义构造方法的时候, 编译器自动的调用默认构造方法, **但是一但定义了, 便只能按定义的构造方法的参数列表传递** 10 | 11 | ~~~java 12 | 13 | class demo1{ 14 | // contructor 15 | public demo1(int i){} 16 | // overload 17 | public demo1(string s){} 18 | } 19 | 20 | 21 | ~~~ 22 | 23 | ### 2. finalize函数 24 | 25 | Java的finalize函数可以对应与c++的析构函数, 但是也有本质的区别 26 | 27 | ~~~java 28 | @Override 29 | protected void finalize() throws Throwable { 30 | 31 | // super函数可以调用基类的finalize方法 32 | super.finalize(); 33 | } 34 | ~~~ 35 | 36 | 37 | 38 | * finalize() 函数 : 是自动到java启动垃圾回收的时候调用, 但是垃圾回收的启动是在系统可用内存快溢出, java程序自动进行的, 就是说在**内存充足的情况下, 系统不会启动垃圾回收机制** 也就不会掉用finalize函数, 但是c++的析构函数是在一个对象的生存时间就必须掉用的. 39 | 40 | 41 | 42 | ### 3. 重载(overload)和重写(override) 43 | 44 | #### 3.1 重载 45 | 46 | > 重载(overloading) 是在一个类里面,方法名字相同,而参数不同。返回类型可以相同也可以不同。 47 | > 48 | > 每个重载的方法(或者构造函数)都必须有一个独一无二的参数类型列表。 49 | > 50 | > 最常用的地方就是构造器的重载。 51 | 52 | **java中舍弃了c++中的操作符重载的规则** 53 | 54 | 55 | 56 | 57 | 58 | #### 3.2 重写 59 | 60 | **在子类中对于父类的相同的方法重新定义** 61 | 62 | ~~~java 63 | class father{ 64 | public void fa(){ 65 | 66 | } 67 | } 68 | 69 | class son extends father{ 70 | // 重写 71 | public void fa(){ 72 | 73 | 74 | // 可以调用父类的相应函数 75 | super.fa(); 76 | } 77 | 78 | // 子类的特有方法 79 | public void son(){ 80 | 81 | } 82 | } 83 | 84 | ~~~ 85 | 86 | 87 | 88 | * 在子类重写的方法中, **必须参数列表和返回值和父类完全一致** 89 | * 可以重写的前提是**可以继承该方法** 90 | * 父类中声明为final的方法不可以被重写 91 | * 父类中声明为static的方法不可以被重写但是可以被重写声明 92 | 93 | 94 | 95 | 关于声明 96 | 97 | ~~~java 98 | public static void main(String args[]){ 99 | 100 | // 利用父类名实例化子类 101 | father son1 = new son(); 102 | // 可以调用子类的重写fa方法 103 | son1.fa(); 104 | // 但是不可以调用子类的特有方法 105 | // ❌ 106 | son1.son(); 107 | 108 | // 以子类的类明声明 109 | son son2 = new son(); 110 | 111 | // 可以调用子类特有的方法 112 | // right 113 | son2.son() 114 | } 115 | ~~~ 116 | 117 | 118 | 119 | ####3.3 两者区别 120 | 121 | | 区别点 | 重载方法 | 重写方法 | 122 | | -------- | -------- | ---------------------------------------------- | 123 | | 参数列表 | 必须修改 | 一定不能修改 | 124 | | 返回类型 | 可以修改 | 一定不能修改 | 125 | | 异常 | 可以修改 | 可以减少或删除,一定不能抛出新的或者更广的异常 | 126 | | 访问 | 可以修改 | 一定不能做更严格的限制(可以降低限制) | 127 | 128 | 129 | 130 | 131 | 132 | 133 | 134 | 135 | 136 | 137 | 138 | 139 | 140 | 141 | 142 | 143 | 144 | 145 | 146 | 147 | 148 | 149 | 150 | 151 | 152 | 153 | 154 | 155 | 156 | 157 | 158 | 159 | 160 | 161 | 162 | 163 | 164 | 165 | 166 | 167 | 168 | 169 | 170 | 171 | 172 | -------------------------------------------------------------------------------- /java/Lombok/Lombok.md: -------------------------------------------------------------------------------- 1 | >[Lombok的基本使用]() 2 | > 3 | >以前的Java项目中,充斥着太多不友好的代码:POJO的getter/setter/toString;异常处理;I/O流的关闭操作等等,这些样板代码既没有技术含量,又影响着代码的美观,Lombok应运而生。 4 | 5 | # 一. 安装 6 | 7 | 1. 从 `pom.xml` 文件中引入即可 8 | ~~~xml 9 | 10 | 11 | org.projectlombok 12 | lombok 13 | 1.16.18 14 | 15 | ~~~ 16 | 17 | 2. 增加 `idea` 的 `Lombok` 插件 18 | 19 | 即在 `idea` 的插件栏中安装 `lombok` 插件 20 | 21 | 22 | 23 | # 二. 基本使用 24 | 25 | 我们以自定的 pojo 类 person 为例: 26 | 27 | ~~~java 28 | package com.ark.springcloud.entities; 29 | 30 | public class Person { 31 | private String name; 32 | private long id; 33 | 34 | } 35 | ~~~ 36 | 37 | ## `Data` 注解 38 | 39 | `@Data` 注解添加在类上便可以使得一个 pojo 类拥有一下功能 40 | 41 | 1. `getter, setter` 方法 42 | 2. `toString` 方法 43 | 3. `hashCode` 方法 44 | 4. `equals` 方法 45 | 46 | ~~~java 47 | @Data 48 | public class Person { 49 | private String name; 50 | private Long id; 51 | } 52 | ~~~ 53 | 54 | 55 | 56 | ## `@AllArgsConstructor` 注解 57 | 58 | 使用后添加一个构造函数,该构造函数含有所有已声明字段属性参数 59 | 60 | ~~~java 61 | @AllArgsConstructor 62 | public class Person { 63 | private String name; 64 | private Long id; 65 | } 66 | 67 | /* 则相当于 */ 68 | 69 | public class Person { 70 | private String name; 71 | private Long id; 72 | 73 | /* @AllArgsConstructor 注解默认生成如下构造函数 */ 74 | public Person(String name, Long id){ 75 | this.name = name; 76 | this.id = id; 77 | } 78 | } 79 | ~~~ 80 | 81 | 82 | 83 | ## `@NoArgsConstructor` 注解 84 | 85 | 使用后创建一个无参构造函数,即所有的成员变量保持默认值 86 | 87 | ~~~java 88 | @NoArgsConstructor 89 | public class Person { 90 | private String name; 91 | private Long id; 92 | } 93 | 94 | /* 则相当于 */ 95 | 96 | public class Person { 97 | private String name; 98 | private Long id; 99 | 100 | /* @NoArgsConstructor 注解默认生成如下构造函数 */ 101 | public Person(){} 102 | } 103 | ~~~ 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | 112 | 113 | 114 | 115 | 116 | 117 | 118 | 119 | 120 | 121 | 122 | 123 | 124 | 125 | 126 | 127 | 128 | 129 | -------------------------------------------------------------------------------- /java/README.md: -------------------------------------------------------------------------------- 1 | # Java 基础部分 2 | 3 | ## 一. Java SE 4 | 5 | * [Java 运行](JavaSE/关于java运行.md) 6 | * [Java 异常](JavaSE/Java异常.md) 7 | * [反射](JavaSE/反射.md) 8 | * [多态](JavaSE/多态.md) 9 | * [泛型](JavaSE/泛型.md) 10 | * [一切皆对象](JavaSE/Java异常.md) 11 | * [八大基本数据对象](JavaSE/JAVA基本数据对象.md) 12 | * 面向对象 13 | * [类初始化和方法重载](JavaSE/类初始化和重载.md) 14 | * [内部类](JavaSE/内部类.md) 15 | * [类再生](JavaSE/类再生.md) 16 | * [类访问控制](JavaSE/JAVA访问控制.md) 17 | * [抽象类和接口](JavaSE/抽象类和接口.md) 18 | * 其他 19 | * [JAVA 按值传递 与 按引用传递](JavaSE/JAVA按值传递与按引用传递.md) 20 | * [String类](其他类/String.md) 21 | * [Runtime类](其他类/Runtime.md) 22 | * [Math类](其他类/Math.md) 23 | 24 | ## 二. 并发 25 | 26 | * [多线程overview](并发/多线程.md) 27 | * [线程池](并发/线程池.md) 28 | * [面试题](并发/多线程面试易问.md) 29 | * [高并发包JUC](并发/高并发包JUC.md) 30 | 31 | 32 | 33 | ## 三. Java IO 34 | 35 | * [IO模型](JavaIO/IO模型.md) 36 | * [JavaIO操作](JavaIO/JavaIO操作.md) 37 | 38 | 39 | 40 | ## 四. JVM 41 | 42 | * [内存区域](JVM/Java内存区域.md) 43 | * [垃圾回收机制](JVM/垃圾回收机制.md) 44 | * [类加载](JVM/Java类加载.md) 45 | 46 | 47 | 48 | ## 五. 容器 49 | 50 | * [Collection](容器/Java工具类-集合.md) 51 | * [Map](容器/Java工具类-Map.md) 52 | * [高阶细节](容器/容器高阶.md) 53 | 54 | 55 | 56 | ## 六. JDBC 57 | 58 | * [JDBC概述](JDBC/JDBC.md) 59 | 60 | 61 | 62 | # 框架及工具 63 | 64 | ## Spring 🍃 65 | 66 | * [IoCI](Spring/IoCI.md) 67 | * [IoCII](Spring/IoCII.md) 68 | * [AOP](Spring/AOP.md) 69 | * [SpringMVC](SpringMVC/SpringMVC.md) 70 | * [SpringMVC 项目启动注意点](SpringMVC/SpringMVC启动.md) 71 | 72 | 73 | 74 | ## Springboot 🍃 75 | 76 | * [Springboot 入门](Springboot/springboot.md) 77 | 78 | 79 | 80 | ## 持久层框架及工具 81 | 82 | - [MyBatis](MyBatis/MyBatis.md) 83 | 84 | - [Lombok](Lombok/Lombok.md) 85 | 86 | 87 | 88 | 89 | -------------------------------------------------------------------------------- /java/Spring/AOP.md: -------------------------------------------------------------------------------- 1 | # AOP 面向切面编程 2 | 3 | [TOC] 4 | 5 | 6 | 7 | # 一 概述 8 | 9 | `面向切面编程` 只是一种编程范式 10 | 11 | 它是 `oop` 的补充, 可是实现 `关注点` 分离 , 一般有如下的用途 : 12 | 13 | * 权限控制 14 | * 缓存控制 15 | * 事务控制 16 | * 日志 17 | * 性能监控 18 | 19 | 20 | 21 | ## AOP 解决的问题 22 | 23 | 考虑如下的权限控制问题, 对于某一方法中要去进行一个权限验证 24 | 25 | ~~~java 26 | public void deleteItem(Item i){ 27 | // auth access check 28 | // 可以看到, 我们如果要在一个这个函数进行权限验证, 那么需要调用这个 checkAccess方法 29 | // 有很严重的代码入侵. 且后期不好维护 30 | Auth.checkAccess(); 31 | 32 | // delete process 33 | } 34 | ~~~ 35 | 36 | `AOP` 的编程风格可以实现, 将 ` Auth.checkAccess(); ` 这一行代码从 `deleteItem` 里面分离出来. 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | ## AOP 的实现原理 45 | 46 | **动态代理 :** 47 | 48 | * 基于接口的代理 : `JDK` 49 | * 基于继承的代理 : `Cglib` 50 | 51 | 52 | 53 |
54 | 55 | **基于 JDK** 的代理 **只能基于接口** 56 | 57 | 需要调用 : `java.lang.reflect.Proxy` 包 58 | 59 | 然后 代理类需要继承 `InvocationHandle` 接口并且实现 `invoke` 方法 60 | 61 | ~~~java 62 | package Proxy; 63 | 64 | import Subject.ISubject; 65 | import Subject.Impl.ISubjectImpl; 66 | 67 | import java.lang.reflect.InvocationHandler; 68 | import java.lang.reflect.Method; 69 | 70 | // Subject 动态代理 71 | public class SubjectProxy implements InvocationHandler { 72 | 73 | private ISubject is; 74 | 75 | public SubjectProxy(ISubjectImpl is){ 76 | this.is = is; 77 | } 78 | 79 | // jdk动态代理 实现 invoke 接口 80 | // 从而成为 ISubject 对象的代理 81 | public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { 82 | System.out.println("before ======= "); 83 | 84 | method.invoke(is, args); 85 | 86 | System.out.println("after ======= "); 87 | 88 | return null; 89 | } 90 | } 91 | 92 | ~~~ 93 | 94 | 然后在调用的地方通过 `Proxy.newProxyInstance() `调用即可 95 | 96 | ~~~java 97 | package domain; 98 | import Subject.ISubject; 99 | import Subject.Impl.ISubjectImpl; 100 | import Proxy.SubjectProxy; 101 | 102 | import java.lang.reflect.Proxy; 103 | 104 | public class Client { 105 | 106 | public static void main(String[] args) { 107 | 108 | // 完成 subject 的动态代理 109 | ISubject subject = (ISubject) Proxy.newProxyInstance(Client.class.getClassLoader(), 110 | new Class[]{ISubject.class}, 111 | new SubjectProxy(new ISubjectImpl()) 112 | ); 113 | 114 | subject.request(); 115 | } 116 | 117 | } 118 | 119 | ~~~ 120 | 121 | 122 | 123 | 124 | 125 | # 二 Spring AOP 使用 126 | 127 | 在 Spring 中, `AOP` 主要有两种使用方式 128 | 129 | * `XML` 配置的方式 130 | * 🌟 `注解` 方式 131 | 132 | 133 | 134 | ## 2.1 Pointcut Expression 135 | 136 | 137 | 138 | 139 | 140 | 141 | 142 | 143 | 144 | 145 | 146 | 147 | 148 | 149 | 150 | 151 | 152 | 153 | 154 | 155 | 156 | 157 | 158 | 159 | 160 | 161 | 162 | 163 | 164 | 165 | 166 | 167 | -------------------------------------------------------------------------------- /java/image/2018-08-06-GC.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/arkssss/StudyNotes/d6d95640bc5a7c566a2372bb951e687ca5802845/java/image/2018-08-06-GC.png -------------------------------------------------------------------------------- /java/image/2019-07-19-java-exception.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/arkssss/StudyNotes/d6d95640bc5a7c566a2372bb951e687ca5802845/java/image/2019-07-19-java-exception.png -------------------------------------------------------------------------------- /java/image/2019-07-20-thread-status.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/arkssss/StudyNotes/d6d95640bc5a7c566a2372bb951e687ca5802845/java/image/2019-07-20-thread-status.png -------------------------------------------------------------------------------- /java/image/2019-07-30-StackOrConstant.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/arkssss/StudyNotes/d6d95640bc5a7c566a2372bb951e687ca5802845/java/image/2019-07-30-StackOrConstant.jpg -------------------------------------------------------------------------------- /java/image/2019-07-31-constant_pool.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/arkssss/StudyNotes/d6d95640bc5a7c566a2372bb951e687ca5802845/java/image/2019-07-31-constant_pool.png -------------------------------------------------------------------------------- /java/image/2019-08-.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/arkssss/StudyNotes/d6d95640bc5a7c566a2372bb951e687ca5802845/java/image/2019-08-.png -------------------------------------------------------------------------------- /java/image/2019-08-03-classmem.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/arkssss/StudyNotes/d6d95640bc5a7c566a2372bb951e687ca5802845/java/image/2019-08-03-classmem.png -------------------------------------------------------------------------------- /java/image/2019-08-07-JDBC.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/arkssss/StudyNotes/d6d95640bc5a7c566a2372bb951e687ca5802845/java/image/2019-08-07-JDBC.png -------------------------------------------------------------------------------- /java/image/2019-08-07-java-reflect.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/arkssss/StudyNotes/d6d95640bc5a7c566a2372bb951e687ca5802845/java/image/2019-08-07-java-reflect.png -------------------------------------------------------------------------------- /java/image/2019-08-07-reflect-struct.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/arkssss/StudyNotes/d6d95640bc5a7c566a2372bb951e687ca5802845/java/image/2019-08-07-reflect-struct.png -------------------------------------------------------------------------------- /java/image/2019-08-08-HasIOC.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/arkssss/StudyNotes/d6d95640bc5a7c566a2372bb951e687ca5802845/java/image/2019-08-08-HasIOC.png -------------------------------------------------------------------------------- /java/image/2019-08-08-NoIOC.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/arkssss/StudyNotes/d6d95640bc5a7c566a2372bb951e687ca5802845/java/image/2019-08-08-NoIOC.png -------------------------------------------------------------------------------- /java/image/2019-08-08-NormAccountSaving.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/arkssss/StudyNotes/d6d95640bc5a7c566a2372bb951e687ca5802845/java/image/2019-08-08-NormAccountSaving.png -------------------------------------------------------------------------------- /java/image/2019-08-08-NormDependancy.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/arkssss/StudyNotes/d6d95640bc5a7c566a2372bb951e687ca5802845/java/image/2019-08-08-NormDependancy.png -------------------------------------------------------------------------------- /java/image/2019-08-14-SpringMVCFiltter.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/arkssss/StudyNotes/d6d95640bc5a7c566a2372bb951e687ca5802845/java/image/2019-08-14-SpringMVCFiltter.png -------------------------------------------------------------------------------- /java/image/2019-08-23-BIO.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/arkssss/StudyNotes/d6d95640bc5a7c566a2372bb951e687ca5802845/java/image/2019-08-23-BIO.png -------------------------------------------------------------------------------- /java/image/2019-08-23-NIO.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/arkssss/StudyNotes/d6d95640bc5a7c566a2372bb951e687ca5802845/java/image/2019-08-23-NIO.png -------------------------------------------------------------------------------- /java/image/class_loading.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/arkssss/StudyNotes/d6d95640bc5a7c566a2372bb951e687ca5802845/java/image/class_loading.jpg -------------------------------------------------------------------------------- /java/image/types_of_inheritance.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/arkssss/StudyNotes/d6d95640bc5a7c566a2372bb951e687ca5802845/java/image/types_of_inheritance.png -------------------------------------------------------------------------------- /java/spring-plugins/Spring-plugins.md: -------------------------------------------------------------------------------- 1 | # Spring-plugins 2 | 3 | 介绍 Spring 技术群中好用的一些插件 4 | 5 | 6 | 7 | # 一. Devtools 热部署 8 | 9 | ## 安装 10 | 11 | ~~~xml 12 | 13 | org.springframework.boot 14 | spring-boot-devtools 15 | runtime 16 | 17 | ~~~ 18 | 19 | 20 | 21 | ## 使用步骤 22 | 23 | 1. `idea` 中需要开启自动编译的选项 24 | 25 | `preferences -> Build, Execution, Deployment -> Compiler` 将右边的选项打勾 26 | 27 | 2. `idea` 中输出 `command + shift + A` 搜索 Registry 28 | 29 | 30 | 31 | 3. 然后选中允许热部署 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | -------------------------------------------------------------------------------- /java/spring-plugins/image/devtools1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/arkssss/StudyNotes/d6d95640bc5a7c566a2372bb951e687ca5802845/java/spring-plugins/image/devtools1.png -------------------------------------------------------------------------------- /java/spring-plugins/image/devtools2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/arkssss/StudyNotes/d6d95640bc5a7c566a2372bb951e687ca5802845/java/spring-plugins/image/devtools2.png -------------------------------------------------------------------------------- /java/其他类/Math.md: -------------------------------------------------------------------------------- 1 | # Java Math 数学类 2 | 3 | 一: 取根号: `Math.sqrt()` 4 | 5 | -------------------------------------------------------------------------------- /java/其他类/Runtime.md: -------------------------------------------------------------------------------- 1 | # Java Runtime 类 2 | 3 | 这个类 可以直接在 java 程序里面进行 系统命令调用 e.g. 4 | 5 | ~~~java 6 | try { 7 | 8 | /* 9 | Java 调用 py 文件 10 | */ 11 | InputStream ip = Runtime.getRuntime().exec ("python3test.py").getInputStream(); 12 | 13 | byte[] buffer = new byte[1024]; 14 | int len = 0; 15 | 16 | 17 | while ( (len = ip.read(buffer)) != -1) { 18 | 19 | System.out.println(new String(buffer, 0, len)); 20 | 21 | } 22 | 23 | 24 | 25 | }catch (IOException e){ 26 | 27 | } 28 | 29 | ~~~ 30 | 31 | -------------------------------------------------------------------------------- /java/容器/Java工具类-Map.md: -------------------------------------------------------------------------------- 1 | [TOC] 2 | 3 | # Java 工具类-Map 4 | 5 | 6 | 7 | ## 一. 概述 8 | 9 | * Key => Value的存储结构 : 给定一个键和一个值,你可以将该值存储在一个Map对象. 之后,你可以通过键来访问对应的值。 10 | 11 | * **键值对可以是 任意的 Object** 12 | 13 | * 初始化方式 : 14 | 15 | ~~~java 16 | /* 17 | e.g. 初始化HashMap 18 | 注意存放的 ArrayList 只是各个 String 里的引用 19 | 也就是说, 取出ArrayList, 赋给变量, 此时修改变量会导致Map里面的值发生变化 20 | */ 21 | HashMap > myMap = new HashMap<>(); 22 | 23 | 24 | 25 | 26 | ~~~ 27 | 28 | 29 | 30 | 31 | 32 | 33 | ## 二. Map相应子类 34 | 35 | 36 | 37 | ![img](https://github.com/CyC2018/CS-Notes/raw/master/notes/pics/774d756b-902a-41a3-a3fd-81ca3ef688dc.png) 38 | 39 | Map父亲类方法, 依然从 增, 删, 该, 查入手 40 | 41 | 42 | 43 | 44 | 45 | **查看 : ** 46 | 47 | ~~~java 48 | /* 49 | 查看Map中是否包含 Key 值的映射 50 | boolean containsKey(Object key) 51 | 52 | Exception: 53 | NullPointerException : 如果传递的Key为Null, 则抛出. 54 | ClassCastException : 如果传递的Key值不是该 Map 规定的类型, 则抛出 55 | */ 56 | 57 | // 如果 myMap 存在 "hello" 为 key 的键值对, 返回 True, 否则返回false 58 | myMap.containsKey("hello"); 59 | 60 | ~~~ 61 | 62 | 63 | 64 |
65 | 66 | ### HashMap 67 | 68 | HashMap 基于哈希表实现 69 | 70 | 71 | 72 | #### HashMap 的几种遍历方式 73 | 74 | ~~~java 75 | /* 76 | 1. 利用迭代器 77 | */ 78 | Map map = new HashMap(); 79 | Iterator iter = map.entrySet().iterator(); 80 | while (iter.hasNext()) { 81 | Map.Entry entry = (Map.Entry) iter.next(); 82 | Object key = entry.getKey(); 83 | Object val = entry.getValue(); 84 | } 85 | ~~~ 86 | 87 | 88 | 89 | 90 | 91 | ~~~java 92 | /* 93 | 2. 先获得 keySet 94 | 再通过 get 获得 95 | */ 96 | Map map = new HashMap(); 97 | for(E key : map.keySet()){ 98 | value = map.get(key); 99 | } 100 | ~~~ 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | 112 | 113 | 114 | 115 | 116 | 117 | 118 | 119 | 120 | 121 | 122 | 123 | 124 | 125 | 126 | 127 | 128 | 129 | 130 | -------------------------------------------------------------------------------- /java/琐碎问题集合.md: -------------------------------------------------------------------------------- 1 | # 琐碎问题集合 2 | 3 | [TOC] 4 | 5 | # ==, hashCode, equals 6 | 7 | * 对于所有的对象来说, == 都是直接比较的两个对象的地址 8 | 9 | ~~~java 10 | /* 11 | == 12 | */ 13 | string a = "123"; 14 | string b = "123"; 15 | string c = new string(a); 16 | 17 | // true; 18 | sout(a == b); 19 | // false 20 | sout(a == c); 21 | ~~~ 22 | 23 | 24 | * equals, 对于一般对象来说 `equals` 内部是直接调用的 `==` , 也就是比较的两个对象的地址. 对于八种基本数据类型, ➕ string 都对 `equals` 进行了重写, 比较的为两个对象的值 25 | 26 | * hashCode : 对于一般的对象, `hashCode` 就是对象的地址的十进制形式, 对于 八种基本类型和 string, hashCode 返回的为相应的值 27 | 28 | # 为什么重写了 equals 必须重写 hashCode 29 | 30 | 31 | 32 | # 容器 value 值为 copy 还是 引用 33 | 34 | * 对于 **八种基本类型** ➕ **String** 类型作为容器的 value 值. 那么容器里存储的就是 这些常量的 **Value** 35 | * 对于一般的对象, 容器里面存储的变为 对象的引用了 36 | 37 | ~~~java 38 | // test1 39 | Map mySet = new HashMap(); 40 | Student fz = new Student("fz", 18); 41 | mySet.put("std1", fz); 42 | fz.name = "zz"; 43 | Student s1 = mySet.get("std1"); 44 | // 此时 s1 的 name 被改为 zz 45 | System.out.println(s1); 46 | 47 | // test2 48 | Map myMap = new HashMap(); 49 | String key = "name"; 50 | String value = new String("fz"); 51 | myMap.put(key, value); 52 | value = "zz"; 53 | // 此时的 value 还是相当于 指向了另外一个 对象, 容器里面的对象没有被改变 54 | System.out.println(myMap.get(key)); 55 | ~~~ 56 | 57 | 58 | 59 | # Static 关键字 60 | 61 | - 自我性 : 可以使得 static 声明的 **方法** 或者 **成员** 可以**不于任何实例化对象绑定在一起**, 从而可以在不实例化这个对象的情况下去访问这个 **方法** 或者 **成员**. !!! 62 | - 唯一性 : 这个static 声明的 **方法** 或者 **成员** , 在**内存里面是唯一的**, 不管声明了几个对象, 都只有这一份, 且访问的也是只有这一份. 63 | - 调用模式 : 既可以用实例化的类去调用, 也可以用类名去调用, 但是我们推荐用类名去调用, 不要和实例化的对象扯上关系 64 | - 入内存时间 : 只有在必要的时候, 我们才会去装载 static 修饰的成员 65 | - 当带有static成员的对像被实例化的时候 66 | - 当第一次引用一个未实例化的对象的静态成员的时候 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | 112 | 113 | 114 | -------------------------------------------------------------------------------- /linux/Linux概述.md: -------------------------------------------------------------------------------- 1 | [TOC] 2 | 3 | # 概述 4 | 5 | # 一. Linux指令 6 | 7 | ## 1.Linux文件命名规则 8 | 9 | * 除了 / 之外 , 所有的字符都可以用为文件的命名 , 因为/在Linxu中用为文件目录的分割 ; / 还表示根目录 10 | * 但是应该尽量避免以下字符的使用作为命名 : 空格 , 制表 , @ ... 11 | * 避免使用 .作为普通文件名的第一个字符 (.最为开头意味着隐藏该文件) 12 | * Linux对大小写敏感(**区分大小写**)(window不区分) 13 | * Linux中文件可以没有后缀名 14 | 15 | 16 | 17 | ## 2.命令格式 18 | 19 | * 格式 : 命令 -选项 参数 20 | 21 | ~~~shell 22 | ls -la /etc 23 | # ls 为命令 24 | # -la 为选项 (可以为一个或者多个) -l -a 也是可以的 , 此时的l a 为两个选项 25 | # /etc 为参数, 即为这个命令操作的对象,(一个命令可以对文件操作,对进程操作,对目录操作...)/etc即为一个目录 26 | ~~~ 27 | 28 | * linux 目录结构中, .表示当前目录, ..为当前目录的父目录 29 | 30 | 31 | 32 | ## 3. 指令分类 33 | 34 | Linux下的指令大致分为两类 35 | 36 | * 直接输出结果的指令 e.g. date , cal 37 | * 输入之后进入该软件环境的指令 e.g bc (在结束之后需要输入quit 退出) 38 | 39 | 40 | 41 | ## 4.命令权限 42 | 43 | Linux中的命令权限的限制 44 | 45 | * root (管理员权限执行的命令) : 所在的目录为 /sbin OR /usr/sbin 46 | * all users (所有用户) : 所在的目录为 /bin OR /usr/bin 47 | 48 | (bin == binary) (usr == user)(sbin == super binary) 49 | 50 | 在安装的软件中也服从该规则 , e.g 安装的软件中 在/bin下面的命令为所有用户都可以执行的 51 | 52 | 53 | 54 | ## 5.Linux中用户类型 55 | 56 | * 文件所有者u (user)(一般为文件的创始者) 57 | * 文件所属组g (group)(将文件对于所属组授权即为对组中的所有用户授权) 58 | * 其他人o (others)(既不是u又不是g即为o) 59 | 60 | 61 | 62 | ## 6.Linux中快捷键 63 | 64 | Command + c 终止该命令 65 | 66 | 67 | 68 | 69 | 70 | # 二. 系统引导流程 71 | 72 | Linux 系统上的机器, 从打开电源到进入桌面的步骤 73 | 74 | - Step1 : 固件(CMOS/BIOS) -- > POST加电自检 75 | 76 | 固件是介于硬件和软件中间的状态 , 为固化在主板上的一段程序, 用户检查机器上的一些硬件的存在与否(e.g. 键盘, 硬盘...), 即为加电自检 77 | 78 | - Step2 : 启动BootLoader自举程序, 位于读取的硬盘中的第一段数据 , 即固件检测没有问题之后,载入BootLoader程序(Linux 下叫 GRUB) , 方能控制进行后续的一些比如**内核的载入**... 79 | 80 | - Step3: 载入内核 Kernel , (一:驱动硬件(从操作系统软件的层次上进行驱动) 二:启动init进程) 81 | 82 | - Step4: 启动进程 init, PID为进程的唯一标示符, 在进程启动的时候为随机分配, 但是init进程的pid恒为1(PPID 即为父进程) init的父进程的pid = 0, 称为内核调度器(Kernel scheduler), 用于分配CPU的时间 83 | 84 | - 父进程终止, 子进程必然终止 (如果父进程终止, 子进程没终止, 则系统默认将该孤儿进程的父进程指向init) 85 | - 如果子进程终止, 父进程不知道而没有切断和子进程的联系, 则称此时的子进程为僵尸进程(Z) 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | -------------------------------------------------------------------------------- /linux/README.md: -------------------------------------------------------------------------------- 1 | # Linux 2 | 3 | 记录 Linux 平台下常用的一些命令 4 | 5 | * [概述](Linux概述.md) 6 | * [文件管理](文件管理.md) 7 | * [用户管理](用户管理.md) 8 | * [进程管理](进程管理.md) 9 | * [网络](网络.md) 10 | * [软件包管理](软件包管理.md) 11 | * [shell](Shell.md) 12 | * [骚操作](骚操作.md) 13 | 14 | -------------------------------------------------------------------------------- /linux/用户管理.md: -------------------------------------------------------------------------------- 1 | [TOC] 2 | 3 | 4 | 5 | # 用户管理 6 | 7 | ## 用户重要文件 8 | 9 | 10 | ### 配置文件 11 | 12 | * 用户的信息文件 : /etc/passwd 13 | * 用户密码文件 : /etc/shadow 14 | 15 | 16 | 17 | ### 用户信息文件相关列说明 18 | 19 | 在/etc/passwd文件里面对于用户的描述信息为 用户名 : 密码 : UID : GID : 注释性描述 : 宿主目录 : 命令解释器 20 | 21 | 22 | 23 | #### 用户类型 (UID栏) 24 | 25 | * 超级用户 (Root, UID=0) 注意只要用户的uid=0,则此时用户的权限和root一样, 所以Linux里区分超级用户靠的不为名称, 而为uid 26 | 27 | * 普通用户(UID 500-60000)() 28 | 29 | * 伪用户 (UID 1-499) 30 | 31 | * 系统或者服务在安装的时候, 自动安装的用户, 只是在系统或者服务在运行的时候调用的一个用户身份 32 | * 不能正常的登陆系统 33 | 34 | 35 | #### 用户缺省的所属组(GID栏) 36 | 37 | 38 | 39 | #### 注释性描述 40 | 存放的用户全名等一些备注的信息, 可以不填但是最好对这个用户给出描述 41 | 42 | #### 宿主目录 43 | 用户登陆系统之后的缺省的目录(每个用户都有, 用于存放用户的基本信息(自动会在/home/username的目录进行存放)) 44 | 45 | #### 命令解释器 46 | 用户使用的Shell, 默认为bash 47 | 48 | 49 | 50 | 51 | 52 | ### 用户密码文件相关列说明 53 | 54 | 55 | 56 | 文件内容的格式为 **用户名 : 加密密码 :最后一次修改密码时间 : 两次修改密码之间的最小时间间隔 : 最大时间间隔 : 警号时间 : 账号的闲置时间: 密码已经失效时间: 标志(一般为空)** 57 | 58 | **密码位为经过加密之后的用户密码, 当时用root用户将某个用户的密码删除之后, 该用户即可以不需要密码直接登陆服务器** 59 | 60 | 最后一次修改的时间为以Unix系统的诞生时间(1970.1.1)到距离上次修改的时间 61 | 62 | 最大时间间隔 : 30天之后必须修改密码, 否则让用户不登陆 63 | 64 | 警号时间: 在最大时间间隔结束的前几天开始警告用户 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | ### 两个文件的一些TIPS 75 | 76 | * 既然密码保存在文件 /etc/shadow中 , 那么为什么 /etc/passwd中还有密码位呢 ? 77 | 78 | ans : 因为在系统中, 默认情况下,**密码是先保存在/etc/passwd中**, 然后用 #pwconv 命令转化到passwd文件中 79 | 80 | 当然也可以利用命令 #pwunconv 将 shadow中保存的密码 , 重新转到 passwd中 81 | 82 | * !!!!可以在/etc/passwd/文件中直接添加一个用户 83 | 84 | ~~~shell 85 | # 可以直接编辑该文件在最后一行进行添加用户 86 | $ vi /etc/passwd 87 | # 然后帮该用户在/home/username创建宿主目录 88 | 89 | ~~~ 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | -------------------------------------------------------------------------------- /linux/软件包管理.md: -------------------------------------------------------------------------------- 1 | ### Linux 软件包管理 2 | 3 | * 二进制包, RPM包的管理 4 | 5 | RPM软件包的格式 6 | 7 | sudo(软件名) - 1.7.2pl (版本号) - el5.i386(硬件平台).rmp 8 | 9 | 10 | 11 | 12 | 13 | #### rpm 命令 14 | 15 | * 卸载命令 16 | 17 | ~~~shell 18 | #sudo为软件的名称 19 | $rpm -e sudo 20 | #如果有其他软件包和sudo有依赖关系, --nodeps表示有依赖关系也强行卸载 21 | $rpm -e --nodeps sudo 22 | ~~~ 23 | 24 | * 安装命令 25 | 26 | ~~~shell 27 | 28 | ~~~ 29 | 30 | -------------------------------------------------------------------------------- /linux/骚操作.md: -------------------------------------------------------------------------------- 1 | # 常用操作 2 | 3 | [TOC] 4 | 5 | # 1. 使用scp命令实现上传下载 6 | 7 | 8 | 9 | - 从服务器上下载文件 scp username@servername:/path/filename /Users/mac/Desktop(本地目录) 10 | 11 | 例如:`scp root@123.207.170.40:/root/test.txt /Users/mac/Desktop`就是将服务器上的/root/test.txt下载到本地的/Users/mac/Desktop目录下。注意两个地址之间有空格! 12 | 13 | 14 | 15 | 16 | 17 | - **上传本地文件到服务器 scp /path/filename username@servername:/path ;** 18 | 19 | 例如`scp /Users/mac/Desktop/test.txt root@123.207.170.40:/root/` 20 | 21 | **注意不要少了服务器IP 和目标文件夹中间的冒号 :** 22 | 23 | 24 | 25 | - 从服务器下载整个目录 scp -r username@servername:/root/(远程目录) /Users/mac/Desktop(本地目录) 26 | 27 | 例如:`scp -r root@192.168.0.101:/root/ /Users/mac/Desktop/` 28 | 29 | 30 | 31 | 32 | 33 | - 上传目录到服务器 scp -r local_dir username@servername:remote_dir 34 | 35 | 例如:`scp -r test root@192.168.0.101:/root/` 把当前目录下的test目录上传到服务器的/root/ 目录 36 | 37 | 注:目标服务器要开启写入权限。 38 | 39 | 40 | 41 | 42 | 43 | # 2. nmap 端口扫描 44 | 45 | 可以用来扫描某一个主机开了哪些端口 : 46 | 47 | 用法 : 48 | 49 | ~~~shell 50 | e.g. 51 | 52 | # 扫描一个网址 53 | nmap -v -A www.baidu.com 54 | 55 | # 扫描一个IP 56 | nmap -v -sn 12.3.2.1 57 | ~~~ 58 | 59 | 60 | 61 | 62 | 63 | # 3. 查看某个端口的打开情况 64 | 65 | `lsof` 66 | 67 | ~~~shell 68 | # 查看某个端口是否被占用如 3306 69 | > lsof -i:3306 70 | 71 | ~~~ 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | -------------------------------------------------------------------------------- /mysql/MySQL服务器性能优化.md: -------------------------------------------------------------------------------- 1 | # 服务器性能剖析 2 | 3 | ## 性能优化简介 4 | 5 | **性能度量指标:** 查询的响应时间 6 | 7 | **优化目标:**一定的工作负载下尽可能减少响应时间 8 | 9 | 10 | 11 | # Schema 与数据类型优化 12 | 13 | ## 正确选择数据类型 14 | 15 | ### #1. 数字类型 16 | 17 | 数据库分为两种类型的数字 18 | 19 | * 整数 20 | 21 | **整数 :指整型变量** 22 | 23 | **整型**其可以分为如下几种类型 24 | 25 | | 类型 | 存储空间(bit) | 26 | | --------- | ------------- | 27 | | TINYINT | 8 | 28 | | SMALLINT | 16 | 29 | | MEDIUMINT | 24 | 30 | | INT | 32 | 31 | | BIGINT | 64 | 32 | 33 | 其中整型可以选择带符号与否,如果为UNSIGNED则其正数大小为SIGNED的一倍。 34 | 35 | MySQL可以为整数类型指定宽度,例如INT(11),对于大多数应用是没有意义的,**它仅规定了MySQL客户端的显示字符的个数,而对于存储与计算 INT(11) 和 INT(1) 则是完全相同** 36 | 37 | * 实数 38 | 39 | **实数 : 指带小数部分的变量** 40 | 41 | | 类型 | 说明 | 42 | | ------- | ------------------------------------------------------------ | 43 | | decimal | 用于存储精确的小数,其底层并不是基于浮点实现,而是字符串,所以不存在浮点误差的问题,但是面对大规模的计算,可能销量较低,此时可以用 BIGINT 乘相应倍数代替。 | 44 | | float | 4字节,浮点计算可能存在误差 | 45 | | double | 8字节,浮点计算可能存在误差 | 46 | 47 | ### #2. 字符串类型 48 | 49 | varchar 和 char 是两种最主要的字符串类型,但是两者的区别和具体的存储引擎有关,假设在 InnoDB / MyISAM 中 50 | 51 | * **VARCHAR 一般用于存储可变的长字符串** 52 | 53 | VARCHAR 会根据字符串的长度,可变的选择存储空间的长度,一般而言,VARCHAR需要额外的1~2个字节来标示字符串的长度 54 | 55 | 也就是说,加入定义 **VARCHAR**(10) 但是实际的存储空间会根据真实的存入字符串分配,如果只存入一个字符,那么占用的字符串仅为2~3个。 56 | 57 | 一般可以在如下两种情况下使用 VARCHAR 58 | 59 | 1. 字符串的最大长度较平均长度大的多 60 | 2. 使用了 UTF-8 这样的复杂数据集 61 | 62 | * **CHAR 是定长存储的** 63 | 64 | 在设定好CHAR大小的时候,存储空间变为确定的 65 | 66 | 即使用 **CHAR**(10) 存储时,不管存入的字符串大小,存储空间均为10个字节 67 | 68 | 同时,CHAR类型还会将存入字符串末尾的空格默认去除,即存入为 `"abc "` 取出则为 `"abc"` 69 | 70 | 一般而言,CHAR 可以用于以下情况的存储 71 | 72 | 1. 定长的字符串,例如 MD_5 后的密码 73 | 2. 状态位如 CHAR(1) 表示 是,否。因为CHAR不用浪费空间记录存入字符串的长度 74 | 75 | 76 | 77 | ### #3. 日期和时间类型 78 | 79 | timestamp 和 datetime 可以存储相同的数据:时间和日期,精确到秒,但是 **timesape 只使用 datetime 一半** 80 | 81 | **的存储空间,并且其可以根据时区的变化自动更新** 82 | 83 | * datetime 能保存大范围的值,从 1001年~9999年 84 | 85 | 可将日期封装到 YYYYMMDDHHMMSS 的整数中如 86 | 87 | `"2018-01-16 22:37:08"` 88 | 89 | * timestamp 保存了从 1970年1月1日午夜以来的秒数,和UNIX时间戳相同,且只能从 1970年保存到 2038 年 90 | 91 | `FROM_UNIXTOME()` 函数可以将 UNIX 时间戳转化为日期 92 | 93 | `UNIX_TIMESTAMP()`函数则可以将日期转化为时间戳 94 | 95 | 96 | 97 | ### #4. 设计tips 98 | 99 | 1. **尽量避免使用NULL,因此NULL值会使得索引,值比较更加复杂** 100 | 101 | 通常情况下需要指定NOT NULL, 102 | 103 | 2. 应该使用内建的类型如 date 而不是字符串来存储日期和时间 104 | 105 | 3. 应该使用整型而不是字符串来存储 IP 地址 106 | 107 | 108 | 109 | ## 特殊表 110 | 111 | ### #1. 计数器表 112 | 113 | 114 | 115 | # 创建高性能索引 116 | 117 | 118 | 119 | 120 | 121 | 122 | 123 | 124 | 125 | 126 | 127 | 128 | 129 | 130 | 131 | 132 | 133 | 134 | 135 | 136 | 137 | 138 | 139 | 140 | 141 | 142 | 143 | 144 | 145 | -------------------------------------------------------------------------------- /mysql/README.md: -------------------------------------------------------------------------------- 1 | # MySQL 基础 2 | 3 | ## 概念 4 | 5 | * [关系数据库设计理论](关系数据库设计理论.md) 6 | 7 | 8 | 9 | ## SQL 10 | 11 | * [基本语法](MySQL基本操作.md) 12 | * [查询](查询.md) 13 | 14 | 15 | 16 | ## 高阶 17 | 18 | * [索引](查询优化及索引和约束.md) 19 | * [分布式设计](MySQL分布式设计.md) 20 | * [锁与事物](MySQL锁与事务与隔离级别.md) 21 | 22 | 23 | 24 | # 其他 25 | 26 | * [改数据库密码](更改数据库密码.md) 27 | 28 | -------------------------------------------------------------------------------- /mysql/image/2019-07-18-left-outer-join-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/arkssss/StudyNotes/d6d95640bc5a7c566a2372bb951e687ca5802845/mysql/image/2019-07-18-left-outer-join-1.png -------------------------------------------------------------------------------- /mysql/image/2019-07-18-left-outer-join-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/arkssss/StudyNotes/d6d95640bc5a7c566a2372bb951e687ca5802845/mysql/image/2019-07-18-left-outer-join-2.png -------------------------------------------------------------------------------- /mysql/image/2019-07-18-right-outer-join-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/arkssss/StudyNotes/d6d95640bc5a7c566a2372bb951e687ca5802845/mysql/image/2019-07-18-right-outer-join-1.png -------------------------------------------------------------------------------- /mysql/image/2019-07-18-right-outer-join-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/arkssss/StudyNotes/d6d95640bc5a7c566a2372bb951e687ca5802845/mysql/image/2019-07-18-right-outer-join-2.png -------------------------------------------------------------------------------- /mysql/image/2019-07-18-set-operation.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/arkssss/StudyNotes/d6d95640bc5a7c566a2372bb951e687ca5802845/mysql/image/2019-07-18-set-operation.png -------------------------------------------------------------------------------- /mysql/image/2019-7-19-transaction.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/arkssss/StudyNotes/d6d95640bc5a7c566a2372bb951e687ca5802845/mysql/image/2019-7-19-transaction.png -------------------------------------------------------------------------------- /mysql/image/2019-7-31-Distrbuted-MySQL.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/arkssss/StudyNotes/d6d95640bc5a7c566a2372bb951e687ca5802845/mysql/image/2019-7-31-Distrbuted-MySQL.png -------------------------------------------------------------------------------- /mysql/image/DirtyRead.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/arkssss/StudyNotes/d6d95640bc5a7c566a2372bb951e687ca5802845/mysql/image/DirtyRead.png -------------------------------------------------------------------------------- /mysql/image/Non-repeatable.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/arkssss/StudyNotes/d6d95640bc5a7c566a2372bb951e687ca5802845/mysql/image/Non-repeatable.png -------------------------------------------------------------------------------- /mysql/image/Phantom_read.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/arkssss/StudyNotes/d6d95640bc5a7c566a2372bb951e687ca5802845/mysql/image/Phantom_read.png -------------------------------------------------------------------------------- /mysql/关系数据库设计理论.md: -------------------------------------------------------------------------------- 1 | [TOC] 2 | 3 | # 一. 关系数据库设计理论 4 | 5 | 6 | 7 | 8 | ## 函数依赖 9 | 10 | 记 A->B 表示 A 函数决定 B,也可以说 B 函数依赖于 A。 11 | 12 | functional dependency A → B is valid in a relational table R or that A functionally determines B 13 | 14 |
15 | 16 | 假设 X, Y, Z be the nonempty subsets of {A1, ..., An} 17 | 18 | 我们有如下的结论 : 19 | 20 | * If Y ⊆ X then X → Y (reflexivity axiom) 如果 Y 属于 X 那么 21 | 22 | * If X → Y then X, Z → Y, Z (augmentation axiom), 如果 X 确定 Y, 那么 X, Z 确定 Y. Z 23 | * If X → Y and Y → Z then X → Z (transitivity axiom 传递函数依赖) 24 | 25 | 26 | 27 |
28 | 29 | 完全函数依赖 ( fully functionally dependent) 和 部分函数依赖 : 30 | 31 | 对于 A->B,如果能找到 A 的真子集 A',使得 A'-> B,那么 A->B 就是 **部分函数依赖**,否则就是 **完全函数依赖** 32 | 33 | 简单来说 A -> B 中 A是一个最小的集合, 那么 A对B就是完全函数依赖 34 | 35 | 36 | 37 |
38 | 39 | **如何确定 键码 :** 40 | 41 | 如果 {A1,A2,... ,An} 是关系的一个或多个属性的 **集合** ,该集合函数 **决定了关系的其它所有属性** 并且是**最小的**,那么该集合就称为 **键码** 42 | 43 | 即 如果 X 为 R 的一个子集, 且如果 X 可以决定 R的其他所有的属性, 且 X 为最小的子集, 我们有, X 为 R的一个键码 44 | 45 | 46 | 47 | ## 异常 48 | 49 | 以下展现一个 **不符合范式** 设计的数据表可能出现的问题 50 | 51 | 以下的学生课程关系的函数依赖为 {Sno, Cname} -> {Sname, Sdept, Mname, Grade} 即 52 | 53 | **键码为 {Sno, Cname}**。也就是说,确定学生和课程之后,就能确定其它信息。 54 | 55 | | Sno | Sname | Sdept | Mname | Cname | Grade | 56 | | ---- | ------ | ------ | ------ | ------ | ----- | 57 | | 1 | 学生-1 | 学院-1 | 院长-1 | 课程-1 | 90 | 58 | | 2 | 学生-2 | 学院-2 | 院长-2 | 课程-2 | 80 | 59 | | 2 | 学生-2 | 学院-2 | 院长-2 | 课程-1 | 100 | 60 | | 3 | 学生-3 | 学院-2 | 院长-2 | 课程-2 | 95 | 61 | 62 | - 冗余数据:例如 `学生-2` 出现了两次。 63 | - 修改异常:修改了一个记录中的信息,但是另一个记录中相同的信息却没有被修改。 64 | - 删除异常:删除一个信息,那么也会丢失其它信息。例如删除了 `课程-1` 需要删除第一行和第三行,那么 `学生-1` 的信息就会丢失。 65 | - 插入异常:例如想要插入一个学生的信息,如果这个学生还没选课,那么就无法插入。 66 | 67 | 68 | 69 | 70 | 71 | ## 范式 (Normal Form) 72 | 73 | 范式的提出是为了解决以上的四种异常. 74 | 75 | 高级别范式的依赖于低级别的范式,1NF 是最低级别的范式。 76 | 77 | 78 | 79 | ### INF (第一范式) 80 | 81 | 第一范式要求, 我们设计的表的字段都是具有 **原子性**, 即表字段不可再分 82 | 83 | 例如 : 84 | 85 | | name | address | 86 | | ---- | ---------------------------------------- | 87 | | fz | \| Country\| Province \|City\|Stresst \| | 88 | 89 | 字段 address 又可以被分为 下面的四个字段 | Country| Province | City | Stresst | 90 | 91 | 所以此时这个 字段不符合 **原子性** 92 | 93 | 这个表不符合 1NF (不符合 1NF 的表通常被称为 0NF) 94 | 95 | **注意, 符合1NF 仅仅是数据表设计的最基本的要求, 满足 1NF 仍然会有很多问题出现, 比如上面的例子表就符合1NF的要求** 96 | 97 | 98 | 99 | 100 | 101 | ### 2NF (第二范式) 102 | 103 | 第二范式要求 : 我们的设计的表的 **非主属性** 完全依赖函数于 **主属性 (主键)** 104 | 105 | 完全函数依赖的概念再复习一遍 : 106 | 107 | ~~~ 108 | 已知 A , B 且 A -> B. 109 | 110 | 如果存在 A' 为 A 的一个真子集, 且 A' -> B, 那么我们说, A, B为部分函数依赖 111 | 112 | 否则为完全函数依赖 113 | ~~~ 114 | 115 | 以上的 表设计举例, 我们有如下的 依赖关系 : 116 | 117 | {Sno, Cname} -> {Sname, Sdept, Mname, Grade} 118 | 119 | 且 观察表我们可以发现, 还有如下的依赖关系 : 120 | 121 | Sno -> Sname, Sdept 122 | 123 | 124 | 125 | 126 | 127 | 128 | 129 | ### 3NF (第三范式) 130 | 131 | 没有传递依赖 132 | 133 | 134 | 135 | 136 | 137 | 138 | 139 | ### BCNF 140 | 141 | 142 | 143 | 144 | 145 | 146 | 147 | 148 | 149 | 150 | 151 | 152 | 153 | 154 | 155 | 156 | 157 | 158 | 159 | 160 | 161 | 162 | 163 | 164 | 165 | 166 | 167 | 168 | 169 | 170 | 171 | 172 | 173 | 174 | 175 | 176 | 177 | 178 | 179 | -------------------------------------------------------------------------------- /mysql/更改数据库密码.md: -------------------------------------------------------------------------------- 1 | ## 更改数据库密码 2 | 3 | ~~~shell 4 | mysql -u root -p 5 | # 输入旧密码 6 | ****** 7 | 8 | # 进去mysql 后 9 | # 使用mysql数据库 10 | mysql > use mysql; 11 | 12 | # 如果此时mysql 开启了安全模式, 则需要先关闭它的安全模式 13 | mysql > SET SQL_SAFE_UPDATES = 0; 14 | 15 | # 跟新usr 表中的password 字段 16 | mysql > update user set password=password('123') where user='root'; 17 | # 若此时的数据库的版本较高, 则原来的password 字段被替换成了 authentication_string字段 , 更变即可 18 | #mysql > update user set authentication_string=password('root') where user='root' ; 19 | 20 | # 利用该命令来刷新mysql 的系统权限相关表 , 从而可以不需要重启mysql 服务器 21 | mysql > flush privileges; 22 | 23 | # 更改完成之后需要重新开启安全模式 24 | mysql > SET SQL_SAFE_UPDATES = 1; 25 | 26 | # 退出 27 | mysql > exit; 28 | ~~~ 29 | 30 | -------------------------------------------------------------------------------- /ngxin-conf/Nginx配置.md: -------------------------------------------------------------------------------- 1 | # 反向代理 2 | 3 | ## [proxy_pass] 4 | 5 | Nginx可以代理转发Http请求, 使用默认自带的模块 `proxy_pass` 即可 6 | 7 | 分别使用 http://{nginx_host:80}/api/hello 访问以下配置 8 | 9 | * ~~~ 10 | server { 11 | listen: 80 12 | 13 | location /api/ { 14 | // 后面没有 '/' 15 | proxy_pass http://127.0.0.1:8899; 16 | } 17 | } 18 | ~~~ 19 | 20 | 会被代理到 `http://127.0.0.1:8899/api/hello` 下 21 | 22 | * ~~~ 23 | server { 24 | listen: 80 25 | 26 | location /api/ { 27 | // 后面带有 '/' 28 | proxy_pass http://127.0.0.1:8899/; 29 | } 30 | } 31 | ~~~ 32 | 33 | 会被代理到 `http://127.0.0.1:8899/hello` 下 34 | 35 | ## [upstream] 36 | 37 | `upstream` 模块可以给一个对外暴露的 host 配置多个内部转发的 sever, 并且可以 **按照自定义的策略** 进行转发 38 | 39 | ~~~ 40 | // 定一个名为 backend-gin 的server 41 | // 如果不指定转发策略, 则公平分配到所有server上去 42 | upstream backend-gin { 43 | server host.docker.internal:8899; 44 | server host.docker.internal:8898; 45 | } 46 | 47 | 48 | server { 49 | location /api/ { 50 | // 将请求打到 backend-gin server 上去 51 | proxy_pass http://backend-gin; 52 | } 53 | } 54 | ~~~ 55 | 56 | 常用的配置参数如下 57 | 58 | * `backup` 可以标记 svr 为备用服务器, 当主服务器不可用时, 才会切换为备用服务器 59 | 60 | ~~~ 61 | upstream backend-gin { 62 | server host.docker.internal:8899; 63 | server host.docker.internal:8898; 64 | 65 | // 备用服务器 66 | server xxx backup; 67 | } 68 | ~~~ 69 | 70 | * `down` 可以标记某个 svr 不可用 71 | 72 | ~~~ 73 | upstream backend-gin { 74 | server host.docker.internal:8899; 75 | server host.docker.internal:8898; 76 | 77 | // 停用服务器 78 | server xxx down; 79 | } 80 | ~~~ 81 | 82 | * `keepalive` 规定了 nginx 进程和 upstream 进程中保持长连接的数量, 相当于连接池的最大数量. 83 | 84 | ~~~ 85 | upstream backend-gin { 86 | server host.docker.internal:8899; 87 | server host.docker.internal:8898; 88 | 89 | keepalive: 32; 90 | } 91 | ~~~ 92 | 93 | 94 | 95 | ### 加权轮训 - 默认 96 | 97 | 默认情况下, nginx的负载策略就是加权轮训, 如果不指定权, 则权都为 1. 已上配置为例, 流量分发到 `host.docker.internal:8899`, `host.docker.internal:8898` 的比例为 1:1 且为轮训分配。同时可以给各个server分配不同的权值: 98 | 99 | ~~~ 100 | // 此时则为比例为 2:1 的轮询转发 101 | upstream backend-gin { 102 | server host.docker.internal:8899 weight=2; 103 | server host.docker.internal:8898; 104 | } 105 | ~~~ 106 | 107 | 如果其中有 svr 通信时发生错误, 则 nginx 会自动转发给下一个 svr 保证可用性, 当所有的 srv 都尝试失败时, 才会返回给客户端失败 108 | 109 | 110 | 111 | ### ip_hash 112 | 113 | 根据客户端请求的ip做hash后固定分配到某个svr中, 对于同一个客户端请求, 转发到后端的服务器是一致的 114 | 115 | ~~~ 116 | upstream backend-gin { 117 | ip_hash; 118 | 119 | server host.docker.internal:8899; 120 | server host.docker.internal:8898; 121 | } 122 | ~~~ 123 | 124 | 125 | 126 | ## root / alias 127 | 128 | 当将 `nginx` 作为文件服务器使用时, `root / alias` 可以指定对应请求所在服务器中的路径然后返回 129 | 130 | * `root ` 会将路径做为根地址, 再匹配 location 131 | 132 | ~~~ 133 | # 将 domain/data/xxxx 请求的文件转发到 134 | # domain/home/data/xxxx 下 135 | location /data/ { 136 | root /home/; 137 | } 138 | ~~~ 139 | 140 | * `alias` 会将路径作为 location中的替换 141 | 142 | ~~~ 143 | # 将 domain/data/xxxx 请求的文件转发到 144 | # domain/home/xxxx 下 145 | location /data/ { 146 | alias /home/; 147 | } 148 | ~~~ 149 | 150 | -------------------------------------------------------------------------------- /ngxin-conf/conf/nginx.conf: -------------------------------------------------------------------------------- 1 | upstream backend-gin { 2 | ip_hash; 3 | 4 | server host.docker.internal:8899; 5 | server host.docker.internal:8898; 6 | } 7 | 8 | 9 | server { 10 | 11 | listen 80; 12 | 13 | location /api/ { 14 | proxy_pass http://backend-gin; 15 | } 16 | 17 | location /data/ { 18 | root /home/; 19 | } 20 | 21 | } 22 | -------------------------------------------------------------------------------- /ngxin-conf/data/h1.html: -------------------------------------------------------------------------------- 1 | hello world 2 | -------------------------------------------------------------------------------- /ngxin-conf/data/img1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/arkssss/StudyNotes/d6d95640bc5a7c566a2372bb951e687ca5802845/ngxin-conf/data/img1.png -------------------------------------------------------------------------------- /ngxin-conf/logs/access.log: -------------------------------------------------------------------------------- 1 | 172.17.0.1 - - [29/Apr/2021:16:29:39 +0000] "GET /public/h1.html HTTP/1.1" 404 556 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.128 Safari/537.36" "-" 2 | 172.17.0.1 - - [29/Apr/2021:16:29:39 +0000] "GET /favicon.ico HTTP/1.1" 404 556 "http://127.0.0.1:8080/public/h1.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.128 Safari/537.36" "-" 3 | 172.17.0.1 - - [29/Apr/2021:16:30:57 +0000] "GET / HTTP/1.1" 404 556 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.128 Safari/537.36" "-" 4 | 172.17.0.1 - - [29/Apr/2021:16:31:04 +0000] "GET /data/h1.html HTTP/1.1" 200 13 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.128 Safari/537.36" "-" 5 | 172.17.0.1 - - [29/Apr/2021:16:31:11 +0000] "GET /data/img1.png HTTP/1.1" 200 208211 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.128 Safari/537.36" "-" 6 | 172.17.0.1 - - [05/Jun/2021:16:20:11 +0000] "GET / HTTP/1.1" 404 556 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.212 Safari/537.36" "-" 7 | 172.17.0.1 - - [05/Jun/2021:16:20:11 +0000] "GET /favicon.ico HTTP/1.1" 404 556 "http://127.0.0.1:8080/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.212 Safari/537.36" "-" 8 | 172.17.0.1 - - [05/Jun/2021:16:20:26 +0000] "GET / HTTP/1.1" 404 556 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.212 Safari/537.36" "-" 9 | -------------------------------------------------------------------------------- /ngxin-conf/logs/error.log: -------------------------------------------------------------------------------- 1 | 2021/04/29 16:29:39 [error] 21#21: *1 open() "/etc/nginx/html/public/h1.html" failed (2: No such file or directory), client: 172.17.0.1, server: , request: "GET /public/h1.html HTTP/1.1", host: "127.0.0.1:8080" 2 | 2021/04/29 16:29:39 [error] 21#21: *1 open() "/etc/nginx/html/favicon.ico" failed (2: No such file or directory), client: 172.17.0.1, server: , request: "GET /favicon.ico HTTP/1.1", host: "127.0.0.1:8080", referrer: "http://127.0.0.1:8080/public/h1.html" 3 | 2021/04/29 16:30:57 [error] 21#21: *4 "/etc/nginx/html/index.html" is not found (2: No such file or directory), client: 172.17.0.1, server: , request: "GET / HTTP/1.1", host: "127.0.0.1:8080" 4 | 2021/06/05 16:20:11 [error] 21#21: *2 "/etc/nginx/html/index.html" is not found (2: No such file or directory), client: 172.17.0.1, server: , request: "GET / HTTP/1.1", host: "127.0.0.1:8080" 5 | 2021/06/05 16:20:11 [error] 21#21: *2 open() "/etc/nginx/html/favicon.ico" failed (2: No such file or directory), client: 172.17.0.1, server: , request: "GET /favicon.ico HTTP/1.1", host: "127.0.0.1:8080", referrer: "http://127.0.0.1:8080/" 6 | 2021/06/05 16:20:26 [error] 21#21: *2 "/etc/nginx/html/index.html" is not found (2: No such file or directory), client: 172.17.0.1, server: , request: "GET / HTTP/1.1", host: "127.0.0.1:8080" 7 | -------------------------------------------------------------------------------- /ngxin-conf/start.sh: -------------------------------------------------------------------------------- 1 | # !bin/bash 2 | docker run --name nginx-test -p 8080:80 -v ~/Desktop/ngxin-conf/conf:/etc/nginx/conf.d -v ~/Desktop/ngxin-conf/logs:/var/log/nginx -v ~/Desktop/ngxin-conf/data:/home/data -d nginx 3 | 4 | 5 | -------------------------------------------------------------------------------- /npm/jquery.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/arkssss/StudyNotes/d6d95640bc5a7c566a2372bb951e687ca5802845/npm/jquery.png -------------------------------------------------------------------------------- /npm/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/arkssss/StudyNotes/d6d95640bc5a7c566a2372bb951e687ca5802845/npm/logo.png -------------------------------------------------------------------------------- /npm/npm.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | [TOC] 4 | 5 | # I. 概述 6 | 7 | **Node Package Manager** 8 | 9 | 一个 **包管理工具**, 可以看作为 **前端** 开发的 **Maven** 10 | 11 | 12 | 13 | # II. npm 常用操作 14 | 15 | ## 1. 安装依赖 16 | 17 | **`以前`** 18 | 19 | **以前引入一个依赖如 `Jquery`我们通常的做法是** 20 | 21 | ~~~html 22 | 23 | <- 在线引用 jquery !-> 24 | 25 | 26 | ... 27 | 28 | ~~~ 29 | 30 | **`现在`** 31 | 32 | **引入 npm 后, 我们再安装一个项目的依赖入 `Jquery` 可以** 33 | 34 | ~~~shell 35 | # 先进入我们的项目的目录 36 | cd ~/home/webproject 37 | 38 | # 初始化 npm 39 | npm init -y 40 | 41 | # 下载 jquery 42 | npm i jquery 43 | 44 | # 此时 jquery 相应的代码便被下载到了本地项目的 node_modules 中 45 | ~~~ 46 | 47 | 48 | 49 | ~~~html 50 | 51 | <- 本地引用 jquery !-> 52 | 53 | 54 | ... 55 | 56 | ~~~ 57 | 58 | 59 | 60 | ## 2. `package.json` 文件 61 | 62 | ~~~json 63 | { 64 | "name": "project", 65 | "version": "1.0.0", 66 | "description": "", 67 | "main": "index.js", 68 | "scripts": { 69 | "test": "echo \"Error: no test specified\" && exit 1" 70 | }, 71 | "keywords": [], 72 | "author": "", 73 | "license": "ISC", 74 | "dependencies": { 75 | "jquery": "^3.4.1" 76 | } 77 | } 78 | ~~~ 79 | 80 | 可以看到此时项目的依赖项加入了 jquery, 以及相应的版本 81 | 82 | 如果 node_module 中没有对应的依赖, 那么我们可以直接用执行下载 83 | 84 | ~~~shell 85 | $ npm i 86 | ~~~ 87 | 88 | 也就是说, 我们可以直接改变 **package.json** 文件, 然后执行该命令一次性下载所有所需文件 89 | 90 | 91 | 92 | ## 3. 卸载依赖 93 | 94 | ~~~shell 95 | > npm uninstall jquery 96 | ~~~ 97 | 98 | 99 | 100 | ## 4. 更新版本 101 | 102 | ~~~shell 103 | # 会下载更新最新的版本 104 | > npm update jquery 105 | ~~~ 106 | 107 | 108 | 109 | ## 5. 指定版本安装 110 | 111 | ~~~shell 112 | > npm i jquery@2.0.0 113 | ~~~ 114 | 115 | 116 | 117 | ## 6. 设置国内镜像 118 | 119 | ~~~shell 120 | > npm config set registry=https://registry.npm.taobao.org 121 | ~~~ 122 | 123 | 124 | 125 | 126 | 127 | 128 | 129 | 130 | 131 | -------------------------------------------------------------------------------- /npm/project/node_modules/jquery/LICENSE.txt: -------------------------------------------------------------------------------- 1 | Copyright JS Foundation and other contributors, https://js.foundation/ 2 | 3 | Permission is hereby granted, free of charge, to any person obtaining 4 | a copy of this software and associated documentation files (the 5 | "Software"), to deal in the Software without restriction, including 6 | without limitation the rights to use, copy, modify, merge, publish, 7 | distribute, sublicense, and/or sell copies of the Software, and to 8 | permit persons to whom the Software is furnished to do so, subject to 9 | the following conditions: 10 | 11 | The above copyright notice and this permission notice shall be 12 | included in all copies or substantial portions of the Software. 13 | 14 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 15 | EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 16 | MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 17 | NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 18 | LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 19 | OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 20 | WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 21 | -------------------------------------------------------------------------------- /npm/project/node_modules/jquery/README.md: -------------------------------------------------------------------------------- 1 | # jQuery 2 | 3 | > jQuery is a fast, small, and feature-rich JavaScript library. 4 | 5 | For information on how to get started and how to use jQuery, please see [jQuery's documentation](http://api.jquery.com/). 6 | For source files and issues, please visit the [jQuery repo](https://github.com/jquery/jquery). 7 | 8 | If upgrading, please see the [blog post for 3.4.1](https://blog.jquery.com/2019/05/01/jquery-3-4-1-triggering-focus-events-in-ie-and-finding-root-elements-in-ios-10/). This includes notable differences from the previous version and a more readable changelog. 9 | 10 | ## Including jQuery 11 | 12 | Below are some of the most common ways to include jQuery. 13 | 14 | ### Browser 15 | 16 | #### Script tag 17 | 18 | ```html 19 | 20 | ``` 21 | 22 | #### Babel 23 | 24 | [Babel](http://babeljs.io/) is a next generation JavaScript compiler. One of the features is the ability to use ES6/ES2015 modules now, even though browsers do not yet support this feature natively. 25 | 26 | ```js 27 | import $ from "jquery"; 28 | ``` 29 | 30 | #### Browserify/Webpack 31 | 32 | There are several ways to use [Browserify](http://browserify.org/) and [Webpack](https://webpack.github.io/). For more information on using these tools, please refer to the corresponding project's documention. In the script, including jQuery will usually look like this... 33 | 34 | ```js 35 | var $ = require("jquery"); 36 | ``` 37 | 38 | #### AMD (Asynchronous Module Definition) 39 | 40 | AMD is a module format built for the browser. For more information, we recommend [require.js' documentation](http://requirejs.org/docs/whyamd.html). 41 | 42 | ```js 43 | define(["jquery"], function($) { 44 | 45 | }); 46 | ``` 47 | 48 | ### Node 49 | 50 | To include jQuery in [Node](nodejs.org), first install with npm. 51 | 52 | ```sh 53 | npm install jquery 54 | ``` 55 | 56 | For jQuery to work in Node, a window with a document is required. Since no such window exists natively in Node, one can be mocked by tools such as [jsdom](https://github.com/tmpvar/jsdom). This can be useful for testing purposes. 57 | 58 | ```js 59 | require("jsdom").env("", function(err, window) { 60 | if (err) { 61 | console.error(err); 62 | return; 63 | } 64 | 65 | var $ = require("jquery")(window); 66 | }); 67 | ``` 68 | -------------------------------------------------------------------------------- /npm/project/node_modules/jquery/bower.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "jquery", 3 | "main": "dist/jquery.js", 4 | "license": "MIT", 5 | "ignore": [ 6 | "package.json" 7 | ], 8 | "keywords": [ 9 | "jquery", 10 | "javascript", 11 | "browser", 12 | "library" 13 | ] 14 | } -------------------------------------------------------------------------------- /npm/project/node_modules/jquery/external/sizzle/LICENSE.txt: -------------------------------------------------------------------------------- 1 | Copyright JS Foundation and other contributors, https://js.foundation/ 2 | 3 | This software consists of voluntary contributions made by many 4 | individuals. For exact contribution history, see the revision history 5 | available at https://github.com/jquery/sizzle 6 | 7 | The following license applies to all parts of this software except as 8 | documented below: 9 | 10 | ==== 11 | 12 | Permission is hereby granted, free of charge, to any person obtaining 13 | a copy of this software and associated documentation files (the 14 | "Software"), to deal in the Software without restriction, including 15 | without limitation the rights to use, copy, modify, merge, publish, 16 | distribute, sublicense, and/or sell copies of the Software, and to 17 | permit persons to whom the Software is furnished to do so, subject to 18 | the following conditions: 19 | 20 | The above copyright notice and this permission notice shall be 21 | included in all copies or substantial portions of the Software. 22 | 23 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 24 | EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 25 | MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 26 | NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 27 | LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 28 | OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 29 | WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 30 | 31 | ==== 32 | 33 | All files located in the node_modules and external directories are 34 | externally maintained libraries used by this software which have their 35 | own licenses; we recommend you read them, as their terms may differ from 36 | the terms above. 37 | -------------------------------------------------------------------------------- /npm/project/node_modules/jquery/src/.eslintrc.json: -------------------------------------------------------------------------------- 1 | { 2 | "root": true, 3 | 4 | "extends": "../.eslintrc-browser.json", 5 | 6 | "overrides": [ 7 | { 8 | "files": "wrapper.js", 9 | "globals": { 10 | "jQuery": false 11 | } 12 | } 13 | ] 14 | } 15 | -------------------------------------------------------------------------------- /npm/project/node_modules/jquery/src/ajax/jsonp.js: -------------------------------------------------------------------------------- 1 | define( [ 2 | "../core", 3 | "../var/isFunction", 4 | "./var/nonce", 5 | "./var/rquery", 6 | "../ajax" 7 | ], function( jQuery, isFunction, nonce, rquery ) { 8 | 9 | "use strict"; 10 | 11 | var oldCallbacks = [], 12 | rjsonp = /(=)\?(?=&|$)|\?\?/; 13 | 14 | // Default jsonp settings 15 | jQuery.ajaxSetup( { 16 | jsonp: "callback", 17 | jsonpCallback: function() { 18 | var callback = oldCallbacks.pop() || ( jQuery.expando + "_" + ( nonce++ ) ); 19 | this[ callback ] = true; 20 | return callback; 21 | } 22 | } ); 23 | 24 | // Detect, normalize options and install callbacks for jsonp requests 25 | jQuery.ajaxPrefilter( "json jsonp", function( s, originalSettings, jqXHR ) { 26 | 27 | var callbackName, overwritten, responseContainer, 28 | jsonProp = s.jsonp !== false && ( rjsonp.test( s.url ) ? 29 | "url" : 30 | typeof s.data === "string" && 31 | ( s.contentType || "" ) 32 | .indexOf( "application/x-www-form-urlencoded" ) === 0 && 33 | rjsonp.test( s.data ) && "data" 34 | ); 35 | 36 | // Handle iff the expected data type is "jsonp" or we have a parameter to set 37 | if ( jsonProp || s.dataTypes[ 0 ] === "jsonp" ) { 38 | 39 | // Get callback name, remembering preexisting value associated with it 40 | callbackName = s.jsonpCallback = isFunction( s.jsonpCallback ) ? 41 | s.jsonpCallback() : 42 | s.jsonpCallback; 43 | 44 | // Insert callback into url or form data 45 | if ( jsonProp ) { 46 | s[ jsonProp ] = s[ jsonProp ].replace( rjsonp, "$1" + callbackName ); 47 | } else if ( s.jsonp !== false ) { 48 | s.url += ( rquery.test( s.url ) ? "&" : "?" ) + s.jsonp + "=" + callbackName; 49 | } 50 | 51 | // Use data converter to retrieve json after script execution 52 | s.converters[ "script json" ] = function() { 53 | if ( !responseContainer ) { 54 | jQuery.error( callbackName + " was not called" ); 55 | } 56 | return responseContainer[ 0 ]; 57 | }; 58 | 59 | // Force json dataType 60 | s.dataTypes[ 0 ] = "json"; 61 | 62 | // Install callback 63 | overwritten = window[ callbackName ]; 64 | window[ callbackName ] = function() { 65 | responseContainer = arguments; 66 | }; 67 | 68 | // Clean-up function (fires after converters) 69 | jqXHR.always( function() { 70 | 71 | // If previous value didn't exist - remove it 72 | if ( overwritten === undefined ) { 73 | jQuery( window ).removeProp( callbackName ); 74 | 75 | // Otherwise restore preexisting value 76 | } else { 77 | window[ callbackName ] = overwritten; 78 | } 79 | 80 | // Save back as free 81 | if ( s[ callbackName ] ) { 82 | 83 | // Make sure that re-using the options doesn't screw things around 84 | s.jsonpCallback = originalSettings.jsonpCallback; 85 | 86 | // Save the callback name for future use 87 | oldCallbacks.push( callbackName ); 88 | } 89 | 90 | // Call if it was a function and we have a response 91 | if ( responseContainer && isFunction( overwritten ) ) { 92 | overwritten( responseContainer[ 0 ] ); 93 | } 94 | 95 | responseContainer = overwritten = undefined; 96 | } ); 97 | 98 | // Delegate to script 99 | return "script"; 100 | } 101 | } ); 102 | 103 | } ); 104 | -------------------------------------------------------------------------------- /npm/project/node_modules/jquery/src/ajax/load.js: -------------------------------------------------------------------------------- 1 | define( [ 2 | "../core", 3 | "../core/stripAndCollapse", 4 | "../var/isFunction", 5 | "../core/parseHTML", 6 | "../ajax", 7 | "../traversing", 8 | "../manipulation", 9 | "../selector" 10 | ], function( jQuery, stripAndCollapse, isFunction ) { 11 | 12 | "use strict"; 13 | 14 | /** 15 | * Load a url into a page 16 | */ 17 | jQuery.fn.load = function( url, params, callback ) { 18 | var selector, type, response, 19 | self = this, 20 | off = url.indexOf( " " ); 21 | 22 | if ( off > -1 ) { 23 | selector = stripAndCollapse( url.slice( off ) ); 24 | url = url.slice( 0, off ); 25 | } 26 | 27 | // If it's a function 28 | if ( isFunction( params ) ) { 29 | 30 | // We assume that it's the callback 31 | callback = params; 32 | params = undefined; 33 | 34 | // Otherwise, build a param string 35 | } else if ( params && typeof params === "object" ) { 36 | type = "POST"; 37 | } 38 | 39 | // If we have elements to modify, make the request 40 | if ( self.length > 0 ) { 41 | jQuery.ajax( { 42 | url: url, 43 | 44 | // If "type" variable is undefined, then "GET" method will be used. 45 | // Make value of this field explicit since 46 | // user can override it through ajaxSetup method 47 | type: type || "GET", 48 | dataType: "html", 49 | data: params 50 | } ).done( function( responseText ) { 51 | 52 | // Save response for use in complete callback 53 | response = arguments; 54 | 55 | self.html( selector ? 56 | 57 | // If a selector was specified, locate the right elements in a dummy div 58 | // Exclude scripts to avoid IE 'Permission Denied' errors 59 | jQuery( "
" ).append( jQuery.parseHTML( responseText ) ).find( selector ) : 60 | 61 | // Otherwise use the full result 62 | responseText ); 63 | 64 | // If the request succeeds, this function gets "data", "status", "jqXHR" 65 | // but they are ignored because response was set above. 66 | // If it fails, this function gets "jqXHR", "status", "error" 67 | } ).always( callback && function( jqXHR, status ) { 68 | self.each( function() { 69 | callback.apply( this, response || [ jqXHR.responseText, status, jqXHR ] ); 70 | } ); 71 | } ); 72 | } 73 | 74 | return this; 75 | }; 76 | 77 | } ); 78 | -------------------------------------------------------------------------------- /npm/project/node_modules/jquery/src/ajax/parseXML.js: -------------------------------------------------------------------------------- 1 | define( [ 2 | "../core" 3 | ], function( jQuery ) { 4 | 5 | "use strict"; 6 | 7 | // Cross-browser xml parsing 8 | jQuery.parseXML = function( data ) { 9 | var xml; 10 | if ( !data || typeof data !== "string" ) { 11 | return null; 12 | } 13 | 14 | // Support: IE 9 - 11 only 15 | // IE throws on parseFromString with invalid input. 16 | try { 17 | xml = ( new window.DOMParser() ).parseFromString( data, "text/xml" ); 18 | } catch ( e ) { 19 | xml = undefined; 20 | } 21 | 22 | if ( !xml || xml.getElementsByTagName( "parsererror" ).length ) { 23 | jQuery.error( "Invalid XML: " + data ); 24 | } 25 | return xml; 26 | }; 27 | 28 | return jQuery.parseXML; 29 | 30 | } ); 31 | -------------------------------------------------------------------------------- /npm/project/node_modules/jquery/src/ajax/script.js: -------------------------------------------------------------------------------- 1 | define( [ 2 | "../core", 3 | "../var/document", 4 | "../ajax" 5 | ], function( jQuery, document ) { 6 | 7 | "use strict"; 8 | 9 | // Prevent auto-execution of scripts when no explicit dataType was provided (See gh-2432) 10 | jQuery.ajaxPrefilter( function( s ) { 11 | if ( s.crossDomain ) { 12 | s.contents.script = false; 13 | } 14 | } ); 15 | 16 | // Install script dataType 17 | jQuery.ajaxSetup( { 18 | accepts: { 19 | script: "text/javascript, application/javascript, " + 20 | "application/ecmascript, application/x-ecmascript" 21 | }, 22 | contents: { 23 | script: /\b(?:java|ecma)script\b/ 24 | }, 25 | converters: { 26 | "text script": function( text ) { 27 | jQuery.globalEval( text ); 28 | return text; 29 | } 30 | } 31 | } ); 32 | 33 | // Handle cache's special case and crossDomain 34 | jQuery.ajaxPrefilter( "script", function( s ) { 35 | if ( s.cache === undefined ) { 36 | s.cache = false; 37 | } 38 | if ( s.crossDomain ) { 39 | s.type = "GET"; 40 | } 41 | } ); 42 | 43 | // Bind script tag hack transport 44 | jQuery.ajaxTransport( "script", function( s ) { 45 | 46 | // This transport only deals with cross domain or forced-by-attrs requests 47 | if ( s.crossDomain || s.scriptAttrs ) { 48 | var script, callback; 49 | return { 50 | send: function( _, complete ) { 51 | script = jQuery( "