0%

2018年3月26日 下午11:35














滑动窗口可以更容易的看出整体的变化趋势,如果是单日的话容易起伏比较大
滑动窗口有点理解成是卷积核


RNN实在CNN的基础上增加了本层神经元之间的联系

站在A的角度,他有两个输入,一个输出









2018年3月25日 下午4:15

怎样刷这些题?

  1. 分多轮,第一轮按时间卡,每道题15分钟,如果不能解决就暂时留下,放到第二轮,这样能提高做题的效率
  2. 每一个算法都要写一个简略的总结,说出唯一的那一个关键点!!

2018年3月20日 下午4:22

最关键:

自己提出问题,并且提出问题的质量。

前序

做算法题的思路和做项目的思路是不同的,首先要找两个题热身,将思维转过去

正文:

  1. 算法其实并不是啥高端的东西,就像我们生活中各种各样小的技巧一样,对待这些小的技巧的态度应该是好玩。
  2. 难是因为你要从0开始想问题,所以,我们一定不要从0开始思考算法,而是借助所有的知识、方法作为工具
  3. 并且,设计算法我们不要从创建数据开始思考,我们完成的就是一个已经给定参数,然后给出特定的返回就行。
  4. 其实算法的这些题,知道方法之后也就不难了。关键是你要积累这些方法

【思考】,其实就是问自己问题。但是问题的好坏就决定了你的思路,最关键
【分析】,先从简单的一个两个开始具体的思考,发现规律,人的脑子大家都一样,直接来个复杂的谁都受不了。分析出唯一的一个核心规律/总结
【算法思路】,要画出具体的程序运行一连窜步骤图,在每一步的图中都标明变量的值

前两节重点是连接链表和堆栈的属性,他们的属性是帮助我们解决特定问题的工具

递归是一种函数代码格式,回溯是一种算法/思维。但是,他们都可以看成我们解决问题的tool之一,和链表栈等都是工具而已,我们做的事情就是在分析清楚问题之后,拿上合适的工具,然后干活

2018年3月11日 上午11:18

  1. 注意这时要用debug模式运行,而不是run,因为我们要打断点进行联调
    1. 在debug模式,我们的断点在更改之后,立即在下一次访问生效,不用重新启动tomcat
    2. 在debug模式,即使断点已经到来,我们依然可以在当前断点的后面增加断点,同样也是立即生效
    3. debug 放慢程序执行速度,观察瞬间的操作
    4. Debug 临时设置变量的值,而不是修改之后重启动tomcat
    5. Debug 在tomcat集群中,我们可以只留一个tomcat执行,其他的全部打断点停止,观察单个tomcat的执行情况

2018年3月10日 下午12:10

这个代码对应于tack/CloseOrderTask.java类,我这里就先不分析代码了!

  1. 我的通俗理解:小明和小王逛街累了抢一个椅子,当然是谁先抢上谁坐,说明椅子有主了。但是如果一个人坐在那里好多个小时,他始终不离开椅子,自己玩手机,另一个人就得一直等着他。等上一个小时,站着的哪个就火了,直接踹开那家伙,自己就坐了上去。
    1. 离开椅子的标志是:在redis中删除了CLOSE_ORDER_TASK_LOCK这个变量。
    2. 抢上椅子的标志为:在redis中设置了CLOSE_ORDER_TASK_LOCK这个变量
  2. 其实expire就可以起到防止死锁的作用,让50秒以后redis就会自动删除这个键。我理解这是一个双重保险。

版本一:

  1. 第一个版本:不使用redis,只是使用Spring Schedule使关单程序周期执行。但是由于我们是tomcat集群,这个关单程序会在两个tomcat同时执行,并且同时操作数据库。
  2. 一定会带来的问题:定时任务同时执行,对数据库的访问造成数据混乱

版本二:

  1. 第二个版本:使用redis做为分布式的锁,即使这个关单程序会在两个tomcat同时执行,但是会由于有这个锁的存在,使他们走不同的分支,只有其中一个分支可以执行关单程序业务流程,去操作数据库。如下图,这样就不会造成数据库的访问造成数据混乱。
  2. 极端条件下可能出现的问题:当我们setnx将“锁”放入redis之后,此时停止tomcat,那么原先放入的“锁”就会一直存在reids中,不会删除,以后由于这个“锁”的存在,永远不会执行真正的业务。最终造成死锁
  3. 关键:
    1. 使用了setnx这个原子性的操作,这就保证了即使同时执行,也会有一个先来后到,一个走左分支,一个走右分支

版本三:

  1. 第三个版本:假设,当我们setnx将“锁”放入redis之后,此时停止tomcat。那么此时两个tomcat中的同时执行的程序,永远都会走到“获取锁失败”的分支。那么我们就需要在执行了“获取锁失败”的分支中解决这个问题,在redis中这个“死锁”条件存在的情况下,也可以执行相关业务
  2. 关键:
    1. 在setnx时,我们的的“锁”key-value值要设置这个锁的超时时间,当然这个只是一个字符串的类型,是看的,而不是他自动会起作用的。
    2. 第一种情况:
      1. 还没有超过了这个“死锁”的超时时间
      2. 我们规定此时已然不能执行业务,必须等待这个“死锁”的时间到了
    3. 第二种情况:
      1. 已经超过了这个“死锁”的超时时间,我们此时就可以进行业务操作了,但是此时同样还是两个tomcat都要请求执行,那给谁呢?这不是回到了一开始的情况了吗
      2. 关键:
        1. 在第二个版本中我们使用原子操作setnx,来确定到底是哪个tomcat执行业务,在这里我们使用另一原子操作getset来区分。
      3. 总结:
        1. 对于判断一来说,两个tomcat要true都true,要false都false
        2. 对于判断二来说,一个tomcat是true一个tomcat是false

总结:

  1. redis 两个原子性操作是实现的关键
  2. Redis的中setnx的值,就是”锁”
  3. 一个锁,有两个时间
    1. 一个是setnx时的字符串value
    2. 一个是redis本身可以对单个数据设置的超时时间

2018年3月10日 下午12:04






利用拦截器去消除代码重复(下图是没有使用拦截器原始的controller中的验证)

开始写拦截器:在spring-mvc的DispatcherServlet.xml中








上面这图中配置的application/json:charset=UTF-8与下面的我们在dispetchar-servlet.xml中的配置是等价的


现在拦截器主干已经写完了,但是还有两个特殊情况需要处理

  1. login登录循环的问题(两种方法)

  2. 富文本上传的特殊处理:

    我们进入到上传方法中,看到这里的返回值是map,而我们的拦截器中的返回都是reponse!

最后:简化controller方法


2018年3月10日 上午11:58


全局异常的优点


类似与上图的这种报错方式会泄露我们的代码信息不安全。

包扫描隔离的意思是

spring扫描除了controller以外的文件,而springMVC只扫描controller就够用了

@component

@componen @service @repository 共都是声明spring的bean,注入到spring中,本质来说功能一样,只不过是一种约定俗称。

将异常封装成modelandview