Seven's blog

你不会找到路,除非你敢于迷路

IT 编程

语言篇

Java

核心
  • JavaGuide 24190

    [Java学习+面试指南] 一份涵盖大部分Java程序员所需要掌握的核心知识.

框架
Spring Boot
  • Spring Boot Reference Guide | Spring Boot 参考指南

    Spring Boot 官方文档和中文翻译.

  • SpringBoot 非官方教程 | 886

    springboot非官方教程,可能最接近于官方的一个教程,大多数案例都来自于官方文档,为了更好的理解,加入了个人的改造。

工具
  • Arthas

    Arthas 是Alibaba开源的Java诊断工具,深受开发者喜爱。

JavaScript

  • 33-js-concepts | 中文版 | 19961

    每个 JavaScript 工程师都应懂的 33 个概念.

  • JavaScript 教程 - 网道

    本教程全面介绍 JavaScript 核心语法,从最简单的讲起,循序渐进、由浅入深,力求清晰易懂。所有章节都带有大量的代码实例,便于理解和模仿,可以用到实际项目中,即学即用。

    适合初学者当作 JavaScript 语言入门教程,也适合当作日常使用的参考手册。

算法

示例

  • TheAlgorithms/Python | 18945

    All Algorithms implemented in Python

    用 Python 实现所有算法.

  • [trekhleb/javascript-algorithms]( Algorithms and data structures implemented in JavaScript with explanations and links to further readings) | 中文文档 | 41081

    本仓库包含了多种基于 JavaScript 的算法与数据结构。

    每种算法和数据结构都有自己的 README,包含相关说明和链接,以便进一步阅读 (还有 YouTube 视频) 。

算法可视化工具

  • Algorithm Visualizer | Github | 11564

    可视化演示算法执行过程, 也汇总了很多算法, 很不错的项目.

  • Data Structure Visualizations | Source Code

    旧金山大学数据结构和算法的可视化学习工具.

  • VisuAlgo

    可视化学习算法和数据结构的工具.

  • SORTING

    可视化展示排序算法原理的工具.

  • Algomation | Github | 48

    查看、创建和分享算法的学习平台.

深度学习

  • DeepLearning-500-questions | 14202

    深度学习500问,以问答形式对常用的概率知识、线性代数、机器学习、深度学习、计算机视觉等热点问题进行阐述.

  • 网易云课堂 - 吴恩达深度学习课程

    由 deeplearning.ai 出品,网易引进的正版授权中文版深度学习工程师微专业课程,让你在了解丰富的人工智能应用案例的同时,学会在实践中搭建出最先进的神经网络模型,训练出属于你自己的 AI。

工具篇

MacOS

  • Mac OS X 配置指南

    本指南包含了大部分的通用软件的配置,也有部分针对特定的编程语言的配置。这里面配置适用于大部分的科研工作者/程序员/码农,也适用于有志于从事类似工作的学生。

Git

  • Learning Git Branching | Github | 8838

    git 可视化教程, 动态描述了 git 操作的一些流程, 适合新手参考理解.
    对于大部分人来说 git 教程还是看文字比较好, 列举这个项目只是觉得作者的想法不错, 支持一下.

Nginx

  • nginxconfig.io | Github | 5345

    Nginx 配置生成工具.

fatedier/frp

frp 是一个可用于内网穿透的高性能的反向代理应用,支持 tcp, udp, http, https 协议。

README | 中文文档

运维篇

Linux 系统

  • Linux 命令搜索引擎 | Github | 2667

    540多个 Linux 命令,内容包含 Linux 命令手册、详解、学习,值得收藏的 Linux 命令速查手册。

  • letsencrypt

    给网站自动签发和管理 SSL 证书.

  • iptables

    简单易懂的 iptables 教程。

综合篇

电子刊物

  • 阮一峰的网络日志 | 3182

    技术分享周刊,每周五发布.

  • HelloGitHub | 8435

    一个分享 GitHub 上有趣、入门级、好用的开源项目。每个月 28 号,发布最新一期。

电子书

  • free-programming-books | 114342

    作者整合了网上优质的电子书资源, 涵盖了几乎所有编程语言.

  • 程序人生 阅读快乐

    编程方面的电子书资源.

  • 提问的智慧

    当你拋出一个技术问题时,最终是否能得到有用的回答,往往取决于你所提问和追问的方式。本指南将教你如何正确的提问以获得你满意的答案。

网站导航

  • Best-websites-a-programmer-should-visit | 程序员应该访问的最佳网站中文版 | 23377

    一些对程序员有用的网站

    在学习CS的时候有一些你必须知道的有用的站点来获取通知为了你的技术储备和学习新知识。这里是一个你应该访问的不是非常全面的一些站点的列表,这个列表会不断更新,只要我能得到链接,你也可以通过添加你知道的来为此做出贡献

设计

图片网站

  • StockSnap.io

    免费高清可商用, 每周更新数百张, 拥有 CC0 授权.

  • Unsplash

    免费高清可商用, 分类浏览, 信息详细.

    这个网站提供了 API 接口供开发者使用, 本站的背景图片就使用了这个网站的 API.

  • Streetwill

    免费高清可商用, 风景人像小清新, CC0 授权.

  • Pixabay

    免费的高清照片, 插画, 矢量文件, 视频资源库.

  • Textures

    材质贴图图片库, 每天下载 15 张.

  • manypixels

    一个收集无版权插图的网站,提供 SVG / PNG 格式下载,并且允许更改颜色.

  • CC0.CN

    服务器在国内, 打开速度较快, 遵循 CC0 协议.

  • visualhunt

    一个CC0图片网站搜索引擎, 搜索后直接显示不同CC0图片网站的结果.

  • 创客贴

    极简的图片设计工具.

  • remove bg

    在线移除图片背景.

视频素材

  • pexels

    免费下载, 但是要注意视频下方的版权声明.

  • Mixkit

    所有内容免费可商用.

  • vidsplay

    使用时须注明视频来源及链接.

表情包

  • b7 表情网

    海量表情包大全.

科普

视频

CrashCourse 中文字幕组

Crash Course 是一个由 Hank Green 和 John Green 成立的 YouTube 教育频道。

由于其频道在中国大陆天然的不可访问性, 很多译者将视频翻译并上传至国内网站。
但这些视频系列由不同的译者进行翻译,上传至不同的网站。
为方便观众查找,故建此索引。

这里的视频涵盖了各个学科的科普知识, 视频内容小而精, 强烈推荐!!!

3Blue1Brown

深入浅出、直观明了地分享数学之美.

李永乐老师

紧跟时政热门, 简洁明了地讲授数学知识.

译学馆

学习英语的好去处.

其它

小工具

格式转换

  • cloudconvert

    支持 218 种文件的格式转换.

  • LightPDF

    在线PDF编辑器及转换器.

  • Firefox Send

    一款端对端的加密文件分享工具, 由火狐团队开发.

视频下载

  • 微信视频下载

  • 抖音无水印视频下载

音乐下载

  • 疯狂音乐搜索

  • VIP付费音乐解析下载

  • 爱券音乐

    可以搜索下载全网音乐.

微信艺术字

  • 得到倾斜加黑的字母
  • Instagram Fonts Generator (𝓬𝓸𝓹𝔂 𝕒𝕟𝕕 𝓅𝒶𝓈𝓉𝑒) ― IGFonts.io

综合

  • MikuTools - 工具集合

    集成了很多有用的功能, 这里不一一列举.

微信公众平台

  • MarkdownNice | github

    支持自定义样式的在线微信Markdown排版工具.

娱乐

在线小游戏

  • ZTYPE
  • yumy.io
  • coderacer.me
  • js13kGames
  • 在线 DOS 游戏
  • 中文家用游戏博物馆

图例

  • — 表示 Github 资源

  • — 表示 Github star 数目

  • — 表示改资源为英文

致谢

本资源合集搜集自互联网, 感谢前人贡献, 以下排名不分先后:
ruanyf/weekly | 扩展迷EXTFANS | 算法爱好者 | 开源最前线 | 一周进步 |

  1. static 关键字的用法

    • 声明 静态属性 和 静态方法;

    • 定义 静态内部类;

    • 导入某个类中的静态方法或属性:

      1
      2
      3
      4
      5
      // 导入 java.lang.System 下的 out 方法
      import static java.lang.System.out;
      // codes
      // 直接调用 out 方法
      out.println("balabala");
  2. instance of 关键字

    用于判断一个对象是不是一个类的实例, 语法: 对象 instance of 类.

    如果实例 a 是类 A 的一个实例, 那么它也是类 A 的父类的一个实例.

  3. 抽象类和接口

    • 抽象类不一定有抽象方法, 但有抽象方法的类一定是抽象类;
    • 接口没有构造器 (因为接口不是类), 抽象类有构造器;
    • 接口可以继承接口, 类可以实现接口;
    • 接口可以多继承;
  4. 多态

    • Parent parent = new Son(), 子类对象虽然可以赋给父类实例, 但是这时候编译器是按照 = 左边的类型来加载的, 所以通过实例 parent 不能调用类 Parent 中不存在的方法/属性;
  5. 字符串

    关于字符串的比较:

    1
    2
    3
    String s1 = "AA", s2 = "AA", s3 = new String("AA");
    System.out.println(s1 == s2); // true
    System.out.println(s1 == s3); // false

    在 java 中, 对于引用类型变量, == 比较的是变量指向的内存地址.

    s1 == s2 为 true 是因为它们指向了同一个内存地址, s1 != s3 是因为它们指向的不是同一个内存地址. 这里牵涉到 java 内存结构和字符串常量池.

  6. try - catch -finally 语句块

    在 try - catch -finally 语句块中, finally 语句块中的 return 语句会覆盖掉 try - catch 语句块中的 return 语句.

Java 集合框架简析

  • {Collection}

    • {Set} — 无序, 不可重复的集合

      • [HashSet] — 先跟据对象的 hashcode() 方法判断元素是否重复, 如果 hashcode() 相同, 再根据 equals() 方法判断;

      • [LinkedSet] — 内部使用链表实现, 方便添加和删除, 但是维护链表需要消耗一部分开支;

      • [TreeSet]

        1. TreeSet 强制集合元素必须属于同一类型

        2. TreeSet 集合元素所属的类必须实现 Comparable 接口, TreeSet 判断集合元素是否相同的依据是元素对象的 compareTo() 方法

        3. TreeSet 是有序的, 默认自然排序, 通过自然排序的元素必须实现 Comparable 接口的 compareTo() 方法; 也可以传入一个实现 Comparator 接口的对象来实现定制排序

    • {List} — 有序, 可重复的集合

      • [ArrayList] — ArrayList 底层是通过数组来实现的
      • [LinkedList] — LinkedList 底层是通过链表来实现的, 方便频繁增删元素
      • [Vector] — Vector 线程安全, 但是执行效率慢
  • {Map} — “键 - 值” 对

    • [HashMap] —- key 的本质是 Set, value 的本质是 Collection, “key - value” 整体也可以当做是 Set
      • [LinkedHashMap] — 同上, 内部使用 LinkedSet 实现
    • [TreeMap] — 内部使用 TreeSet 实现
    • [Hashtable] — 线程安全, 键和值都不允许为 “null”
      • [Properties] — 键值对都为 String 类型, 常用于处理属性文件
  • [Collections] — 工具类, 用来对 Collection 进行操作

  • — 用于遍历 Collection 集合元素

泛型

核心思想

泛型的核心思想是把一个集合中的数据内容限制为一种特定的数据类型

作用

  1. 解决元素存储的安全性问题
  2. 解决获取数据元素时需要强制类型转换的问题

举一个例子: 引入泛型之前, List 中可以添加任意 object 类型的对象, 类型不安全; 取出 List 中的元素时也需要做强制类型转换, 有可能报 类型转换异常, 程序不够健壮. 泛型的出现, 限制了集合元素的数据类型, 解决了上述问题.

泛型类与泛型方法

格式:

1
2
3
4
5
6
7
8
9
10
11
public class Exaple<T> {
public T method1(T t) {
return t;
}
public void method2(T t) {
// TODO
}
public <E> E method3(E e) {
return e;
}
}

泛型与继承的关系

尽管 Son 是 Parent 的子类, List 也不是 List 的子接口, 他们是并列关系.

通配符 “ ? “

  • List<?> 是所有 List 共同的父接口.

  • ? extends E 代表类型 E 及其所有子类

  • ? super E 代表类型 E 及其所有父类

注意事项

  • 继承泛型类 / 接口的时候可以指明泛型类型, 也可以不指明
  • 静态方法中不能使用类的泛型. 因为泛型类型的确定是在创建实例的时候, 而静态方法随类的加载而加载, 静态方法的加载时间早于实例的创建, 静态方法加载时泛型类型尚不确定, 所以在静态方法中不能使用泛型
  • 不能在 catch 语句中捕获泛型

枚举类

枚举类是单例模式的延伸, 把单例模式中的 “一个实例” 扩展为 “多个实例” 即为枚举类.

  • 枚举类需要私有化构造器
  • 枚举类属性需要限制为 private final 类型, 可以在构造器中初始化
  • 枚举类的对象需要声明为 public static final 类型

也可以使用 enum 关键字声明枚举类, 语法层面相对于自定义实现枚举类更加简洁.

枚举类实现接口时, 可以针对每个枚举类对象分别实现接口的抽象方法, 这样一来每个对象的方法实现可以不同.

注解

JDK 内置的基本注解类型

  1. @Override: 限定 (显示表明) 重写父类方法, 该注解只能用于方法;
  2. @Deprecated: 用于表示某个程序元素 (类 / 方法等) 已过时;
  3. @SuppressWarnings: 抑制编译器警告;

自定义注解

使用 @interface 关键字自定义注解

元注解

用于对注解进行注解的注解叫元注解.

  1. @Retention: 用于指定一个注解的生命周期, 包括 source, class, runtime 等;
  2. @Target: 用于指定某个注解可以用于注解哪些结构;
  3. @Documented: 被 @Documented 注解的注解将被 javadoc 工具写入文档 (被 @Documented 注解的注解的生命周期必须为 RUNTIME);
  4. @Inherited: 被 @Inherited 注解的注解具有继承性, 如果一个类使用了被 @Inherited 注解的注解, 那么这个类的子类自动拥有该注解.

多线程

多线程的实现方法

  1. 继承 Thread 类并实现其 run() 方法, 通过 Thread 类的 start() 方法启动多线程;

  2. 实现 Runnable 接口并完善 run() 方法, 通过 Thread 类的 start() 方法启动多线程;

    Runnable 类型实例可作为参数传递给 Thread 类的构造方法.

线程不安全

线程不安全可通过 同步代码块 和 同步方法 两种方式解决. 其中: 同步代码块需要传入一个对象实例作为锁.

线程通信

  • wait()
  • notify()
  • notifyAll()

Java 常用类

字符串

  • String 字符串常亮, 不可变; StringBuffer, StringBuilder 字符串变量;
  • StringBuffer 线程安全; StringBuilder 线程不安全;
  • 速度: StringBuilder > StringBuffer > String;

日期 / 时间

  • System.surrentTimeMillis() - 获取当前时间戳
  • java.util.Date - 日期类
  • DateFormate类 - 日期格式化
  • Calender类 - 日历

数学

Math - 常用数学函数

BigInteger - 任意精度整数

BigDecimal - 任意精度定点数

反射

获取 Class 类实例的四种方式

  1. 通过调用类本身的 .class 属性获取:

    1
    Class cl = Object.class;
  2. 通过运行时类对象的 getClass() 方法获取:

    1
    2
    Object o = new Object();
    Class cl = o.getClass();
  3. 通过 Class 类的静态方法 forName(String className) 获取:

    1
    2
    String className = "java.lang.String";
    Class cl = Class.forName(className);
  4. 通过类加载器获取:

    1
    2
    3
    String className = "java.lang.String";
    ClassLoader classLoader = this.getClass().getClassLoader();
    Class cl = classLoader.loadClass(className);

    注: 引导类加载器是不可获取的.

Class 对象的应用

  1. 通过 Class 对象创建对象

    • newInstance() —- 创建运行时类的对象 (运行时类必须有可见的无参构造器);
  2. 获取运行时类的属性

    • getField(String s) —- 获取运行时类及其父类的 public 属性;
    • getFields() —- 获取运行时类及其父类的 public 属性列表;
    • getDeclaredFields() —- 方法获取运行时类本身声明的所有属性列表;
    • 获取 Field 类型的属性信息:
      • getmodifiers() —- 获取属性的权限(int 型)
      • Modify.toString(int i) —- 获取属性的权限修饰符
      • getType() —- 获取属性的类型
  3. 获取运行时类的方法

    • getMethods() —- 获取运行时类及其父类中所有的 public 方法;
    • getDeclaredMethods() —- 获取运行时类自身声明的所有方法;
      • 通过 Method 类获取方法的信息
        • getAnnotations() —- 获取方法的注解列表
        • getModifiers() —- 获取方法的权限修饰符
        • getReturnType() —- 获取方法的返回值类型
        • getParameterTypes() —- 获取方法的形参类型列表
        • getExceptionTypes() —- 获取方法的异常类型列表
  4. 获取运行时类的构造器

    • getConstructors() — 获取运行时类及其父类 public 的构造器列表;

    • getDeclaredConstructors() —- 获取运行时类自身声明的所有构造器列表;

  5. 获取运行时类的父类

    • getSuperClass() —- 获取运行时类的父类
    • getGenericSuperClass() —- 获取带泛型的父类
    • ParameterizedType.getActualTypeArguments() —- 获取父类的泛型列表
  6. 获取运行时类实现的接口

    • getInterfaces() —- 获取运行时类实现的接口列表;
  7. 获取运行时类所在的包

    • getPackage() —- 获取运行时类所在的包
  8. 获取运行时类的注解信息

    • getAnnotations() —- 获取运行时类生命周期为 RUNTIME 的注解列表

前言

当初倒腾 Ubuntu 18.04 的时候积攒了一些美化经验, 但是一直没有将其系统整理归纳. 暂借这次升级系统的机会, 重新记录一下 Ubuntu 的美化流程.

工具

gnome-tweak-tool 是 Gnome 官方发布的一款 Gnome 调节软件, 借助这款软件, 我们可以更好地管理主题, 扩展, 字体 以及系统行为等设置项.

输入以下命令安装:

1
sudo apt install gnome-tweak-tool
阅读全文 »

前言

Jenkins 简介

Jenkins is a self-contained, open source automation server which can be used to automate all sorts of tasks related to building, testing, and delivering or deploying software.

Jenkins can be installed through native system packages, Docker, or even run standalone by any machine with a Java Runtime Environment (JRE) installed.

                                                                   ------ [jenkins.io](https://jenkins.io/doc/)

Jenkins 是一个独立开源的自动化服务, 可以用来对软件进行自动化构建, 测试, 发布, 部署等操作. Jenkins 可以通过软件包管理器, Docker 安装, 或者在任意一台安装了 JRE 的机器上独立运行.

按照我的理解, jenkins 其实就是一个线性的指令集, 它所做的事情就是按照我们设置的流水线完成一些重复性的工作. jenkins 只是负责管理流水线的运行与否以及状态监控 , 在流水线各个节点上的任务依然需要由专业的 “工人” 去完成, 扮演 “工人” 角色的就是 jenkins 插件以及我们日常使用的诸如 Git, maven 等第三方工具. jenkins 根据预先设计好的指令调用第三方工具完成该部分的功能并监控其执行状态, 一个节点执行成功, 便跳转到下一个节点继续执行, 直到运行完流水线上的所有节点. 如果不巧有任意一个节点执行失败, jenkins 便会捕获异常状态并终止流水线的执行.

本文主要介绍如何使用 Jenkins 对 maven 项目进行自动化构建, 部署, 备份以及回滚操作.

阅读全文 »

前言

依然是博客的问题, 因为我的主域名设置了一条 MX 记录, 导致主域名不能设置 CNAME 或者 url 转发 等解析记录, dnspod 提示建议使用 A 记录解析主域名, 遗憾的是我的博客搭建在 Github Pages 和 Coding Pages 上面, 他们只提供 CNAME 解析. 虽然可以通过 ping 命令得到 Github Pages 和 Coding Pages 的 ip, 但毕竟他们的 ip 相当多, 而且可能会有变动, 可能会导致解析不稳定.

而且我的需求只是暂时将主域名指向博客所在的子域名, 所以最后选择了将主域名指向自己的一台服务器, 在服务器上利用 nginx 做 301 跳转, 算是退而求其次, 不太完美地解决了这个问题吧.

阅读全文 »
0%