ESPIER 一只JAVA程序猿的日常

少侠与剑

十年磨一剑,霜刃未曾试

           ——贾岛

亮剑

  少侠们刚从师门中出来,准备闯荡江湖时,难免被前辈指导:”少侠,亮剑吧!“

  此时,少侠们之间的差别就显现出来了。有的在师门勤奋磨剑,精于技艺。有的就是做做样子,整日浑浑噩噩,过着自以为快乐的生活,好吧,其实快乐也挺重要的。

  我们回到前面亮剑的问题,作为一名剑客,在被挑战的时候,拿不出手就很羞耻了,当然,大部分初出茅庐的少侠都是拿不出手或者剑磨得并不怎么样的吧。

  当然,对于大多数人来说,闯江湖的路,一开始都是这个样子。

Js整型的坑

JS整型的坑

昨天同事跟我说js在整型长度支持上有坑,我去查了一下确实是有些坑的。js对于数值的保存遵循IEEE 754 双精度浮点格式规范,采用了双精度存储,占用64bit。如图所示:

存储格式示意图,取自wiki

使用gradle打可执行jar包

前言

最近的一个项目里面需要使用gradle打一个可执行的jar包,在网上看了一堆帖子照着做最后都不是很成功,最后终于参考StackOverflow上的帖子搞定了可执行jar包的打包脚本,因此做一个笔记对这个进行一下记录。

记一次登录假死的异常排查

前言

事件的起因源自一次客户现场的调试,调试到一半,客户说办公系统突然登录不进去了Σ(っ °Д °;)っ,当时因为手头上的事还没有搞定,就顺手把客户的tomcat重启了,然后似乎就一切正常,我也没有太放在心上。然鹅,事情并没有这么简单。

Nginx+keepalived配置热备(互为主从)

从开发到实施XD

因为公司一个小项目要求有负载和热备,于是翻了很多网上的教程,于是找到了这一篇blog,很感谢博客的作者MassiveStars,这篇博客也使我学到了不少关于nginx配置的知识,毕竟以前连nginx都没有碰过XD。本博客大部分内容可能和作者的博客内容雷同,毕竟只是作为笔记存在的东西,侵删。

配置虚拟IP

互为主从模式

互为主从模式需要配置两个vip(虚拟ip)进行负载,因此是需要负载均衡支持的哟~

image

数据结构与算法学习系列(二)

线性表

线性表是一个存储相同类型数据元素的有限序列。
这里面需要关注的两个点就是,相同类型的数据、有限序列。

线性表包含两种类型:

  • 顺序表。使用一段地址连续的存储单元依次存储线性表的数据元素。
  • 链表。使用一组任意的存储单元存放线性表的元素。

顺序表

顺序表的特性

  1. 顺序表使用的一段连续的存储空间,因此只要知道存储顺序表的起始地址,就可以计算表中任意位置元素的地址。所以,计算任意一个元素的存储地址的时间是相等的
  2. 由于上述特性,顺序表具有随机存取的特性。
  3. 顺序表存取操作的时间复杂度为O(1)。

顺序表的实现

下面就是一个简单的顺序表的实现:

clojure读书笔记其四

这个系列还会继续的

忽然发现我之前已经建立了这篇博客,心想姑且把这篇完成吧,后续更高级的内容等我琢磨明白了再放出来。这个系列并不是一个单纯学习教程,更是我对Clojure认知的一种体现吧,说实话从java这种语言跳到clojure上还是有挺多问题的,至少思维方式可能就需要进行蛮大的转变,后续估计还会在读一些SICP之类的内容去逐渐加深自己对于LISP这个深坑的理解。

说一说常用的东西

这一节就来说一说常用的一些函数,在实际的应用中不论是刷题还是实际的开发应用,都会经常的用到,比如递归 map reduce apply 等等,这些都是接触clojure之后都会经常看到,用到的方法。那么,今天就来说说这些吧。

递归

递归的话在一般的语言中(没错,我说的就是Java),一般都会采用这种方式:

  public int doMethod(int param){
    // do something
    doMethod(param);
  }

在方法内部调用方法本身实现递归,完成方法的递归调用。
然而,在clojure中这种方式虽然可以,但却会造成堆栈的溢出(因为Clojure的尾递归优化不是用的原函数名,而是使用的recur,使用原函数名会不断产生新的实例从而造成堆栈溢出)。

数据结构与算法学习系列(一)

关于新坑和旧坑的说明

我又开了一个新的坑,迫于近期一些方面的压力,我又把数据结构和算法这个东西捡起来了,至于之前Clojure学习笔记系列的坑,咳咳,虽然还会更新下去,但是估计会延后很多了,因为学了Clojure蛮久的时间了,没有太多的实践机会,也没有对Clojure理解的足够深,因此这个系列估计会稍微放一放,等我理解足够深刻了在继续下去(对不起,还是因为懒XD)。

什么是算法

算法,这个东西其实是思路的体现,也可以说是问题的解决方案。相信大家也都看到过这句话:

程序=算法+数据结构

虽然这么说或许不够准确,但是算法对于程序本身而言意义是十分重大的。也是影响程序性能的一个关键因素。大多时候算法都是一个由实际问题转化而成的数学模型,因此,像写出一个好的算法的话首先要能充分理解问题,然后就是将问题转化成一个高效的数学模型。所以说啊,学好数学还是很关键滴~

配置lein的私有依赖仓库

lein与私有仓库

lein在new一个新的项目的时候都会从maven或者clojars上下载对应的依赖,但是一旦你离开了互联网环境只有一个maven私服的时候,这一切就变得不是那么美好了。因此,我们需要配置一下lein,让它能够从我们指定的位置下载依赖。

创建profiles.clj

在$HOME/.lein/下创建profiles.clj文件,在其中添加如下内容:

clojure学习笔记其三

Namespace

名称空间对于Clojure来说是一个逻辑上对于代码进行分组的概念,类似于Java的package,通过使用名称空间能够规避方法名冲突,有效的对代码进行管理。主要应用的话,其实就是方便代码的引入和使用了,毕竟你不可能将所有代码放到一个clj文件中。

create-ns

user> (create-ns 'clojure.by.example)
nil

这样一个名称空间就建立好了,是不是so easy!

in-ns

;; create the namespace and switch to it
(in-ns 'first-namespace)

in-ns的主要作用是切换到指定的namespace中,如果这个namespace不存在,则会创建他。