0%

很久没有用现在的笔记本连过RabbitMQ,今天在Windows上装了一下RabbitMQ,然后启用管理界面,发现怎么都启用不了,一直提示:Plugin configuration unchanged.,查看服务发现MQ的服务都关闭了,为什么会自动关闭服务呢?我们来查看下MQ的日志,路径是:C:\Users\明山\AppData\Roaming\RabbitMQ\log\rabbit@DESKTOP-Q1D3TT5.log,在文件末尾,发现有下面的错误:

Read more »

序幕

旁白:纵观天下大势,分久必合,合久必分,风云变幻,成王败寇。汉室衰微,天下英雄逐鹿中原。曹操为除董卓散家财起兵,天意相助,然刘备先投后反曹操,引出事端,后刘备奔逃,曹操计围关羽,遣张文远劝关降曹,这才引出曹公信义放关羽的故事。

Read more »

图(Graph)这个数据结构在平时开发中遇到的比较少,但我认为它是十分重要的,因为从真实的世界中来看,很多东西都可以抽象为图的表示,比如人际关系,地理位置,天马行空的东西都可以抽象为图,所以它比链表等基础数据结构高级一点点,也比较复杂,属于非线性结构。数学中有一个图论的分支也是与其有关。了解图在程序世界的存储方式,我们可以更加细致地刻画图的结构,让其为我所用,岂不妙哉?

Read more »

平时我们用MySQL,字符编码方式一般是 utf8 或者 utf8mb4,至于MySQL内部是如何处理编码问题的在日常开发中并没有十分关注,遇到最多的问题也无非是表中中文乱码和表情无法存储。对于编码不一致的问题,出问题是在所难免的,我们需要系统地了解下在MySQL内部字符集是如何配置和转化的。

Read more »

咳咳,趁着2019年的小尾巴,总结下这一年我都干了些什么吧。最近几年每年年初几乎都要立flag,其实flag不是说我今年一定要搞成什么样子,而是让自己能够坚持做一件事情,至少正儿八经地定一个目标。

Read more »

在维基百科中,关于分治算法(divide-and-conquer)的介绍如下:在计算机科学中,分治法是建基于多项分支递归的一种很重要的算法范式。字面上的解释是“分而治之”,就是把一个复杂的问题分成两个或更多的相同或相似的子问题,直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合并。这个概念非常好理解,一个操作的计算规模很大,直接计算比较困难,如果可以将该问题分解为多个子问题进行计算,并且合并这些计算结果与原计算结果期望一致,那么这样就再好不过了。

单从上述概念来理解,我们不难发现,利用分治算法有一个分解与合并的过程,至于分解后的小规模问题如果解决,可以继续利用分治思想继续进行分解,直至可以直接计算。这就形成了递归。所以利用分治算法求解问题一般有三个步骤:

  1. 分解:将原问题分解为若干个规模较小,相对独立,与原问题形式相同的子问题。
  2. 解决:若子问题规模较小且易于解决时,则直接解。否则,递归地解决各子问题。
  3. 合并:将各子问题的解合并为原问题的解。
Read more »

最近在看邓俊辉邓公的《数据结构和算法》课程,其中在讲Vector时提到了唯一化算法,也就是我们熟悉的去重算法,该算法实现相当简单,但却很高效。如果我们不借助Java任何已有的数据结构和方法,想对一个集合去重,最低效的算法是遍历其集合,找出每个重复元素存在的区间,每个区间只保留一个元素即可,这就涉及到remove 操作,最坏的情况下,每次都要调用remove方法,时间复杂度累计到$O(2^n)$,显然十分低效。

Read more »

第一个看到树状数组(Binary Indexed Tree)这个数据结构时,真的被吸引了,设计真是简洁,属于理论很复杂,但实现不复杂的那种算法。该算法多用于高效计算数列的前缀和, 区间和动态单点值的修改。要理解树状数组的工作原理,必须要知道二进制的运算法则,比如 &-、补码和反码等。下面先介绍下二进制的一些简单运算。

Read more »

近日发现项目日志中有关于MQ的异常日志,Rabbit在进行自我检查时,发现没有Channel可用了,报出org.springframework.amqp.AmqpTimeoutException: No available channels异常,这个异常具体是由什么引起的呢?

Read more »

了解到CompletableFuture的基础用法之后,我们不禁好奇,以前的Future模式不支持如此好用的异步编程,CompletableFuture是如何做到的呢?这就需要我们去阅读源码了,通过源码我们才能了解到其设计思想和实现方式,我们分析下supplyAsync 和 thenApplyAsync 这两个,并且是提供线程池的接口,因为如果不提供自定义线程池,就会用默认的,如下:

1
2
3
4
5
6
7
8
9
private static final boolean USE_COMMON_POOL =
(ForkJoinPool.getCommonPoolParallelism() > 1);

private static final Executor ASYNC_POOL = USE_COMMON_POOL ?
ForkJoinPool.commonPool() : new ThreadPerTaskExecutor();

static final class ThreadPerTaskExecutor implements Executor {
public void execute(Runnable r) { new Thread(r).start(); }
}
Read more »