自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(64)
  • 问答 (3)
  • 收藏
  • 关注

原创 clojure实战——何时使用宏

clojure实战——何时使用宏一、记住几点在C语言中,宏在编译的时候会被文本替代,纯粹的文本替换。而在clojure中,宏在编译的时候会先被求值,然后求值后得到的数据结构代替宏原来的位置。而正是这个求值功能,使clojure的宏比C语言那种纯代码替代的宏具备更强大的功能。不管是C语言的宏还是clojure的宏,它们的起作用的时期都是“编译期”。如果可以最好不要用使用宏,优先使用函数。二、为

2017-11-23 22:18:55 846

原创 链表(linked list)

链表的特点根据线性表元素多少,长度可变化。动态申请内存空间:元素删除或插入时,对应申请新的存储空间或释放原来占有的存储空间。使用指针来链接各个结点,按照线性表的前驱关系将结点连接起来,结点之间内存地址不必相邻。链表的访问:不能像数组那样根据下标直接访问某一个结点i,而需要从头结点开始,沿着link指针一个一个地计数(遍历),才能找到。通常有一个first指针变量和一个last指针遍历,用来

2017-09-17 16:52:44 530

原创 clojure实战——binding vs let

clojure实战——binding vs letbinding vs let(1)binding 创建了一个动态的域绑定;用于动态绑定动态的Var,即必须先创建一个动态绑定的Var,然后才可以进行动态绑定。binding 用于线程内绑定。使用binding创建的绑定不能被其他线程可见。clojure中每个Var都可以有一个”根值”(也可以不设置),它是对所有线程可见的。而一个可动态绑定的Var

2017-09-17 15:47:27 1050

原创 clojure实战——宏

clojure实战——宏本博客主要介绍clojure中宏相关的基础知识,因为自己没能很深入研究clojure的宏,所以做不到深入的讲解。但根据自己及什么clojure用的比较好的人的经验,能不用宏就不用宏,用宏、特别是逻辑复杂的宏机会真的很少,因此我个人觉得本博客所涉及的东西已经足够应付一般的场景了。clojure宏概述clojure宏在编译期间被求值,而不是文本替换(和C语言的预编译不同),宏的求

2017-09-02 14:43:53 822

原创 clojure实战——符号&@#'+-*/

clojure实战——符号&@#’+-*/本博客继续对clojure语言中一些符号进行讲解:&,@,-‘,#’。保持“剩下的元素”——&、%& &:保持”剩下的元素” 在解构中,可以用&符号保持解构剩下来的元素,有点像java中的可变参数示例:(comment (defn &test [a ...

2017-09-02 11:33:01 2059

原创 clojure实战——引述相关'`~~@

clojure实战——引述相关’`~~@clojure中,经常看到一些诸如’ ` ~ ~@ #’ 之类的符号,本博客专门针对其中与引述相关的三个符号(其实就是函数)进行详细说明。这三个符号(函数)在clojure.core中定义,因此可直接在repl中使用。普通引述——’ ‘:普通引述。 ’ 等同于 quote,是它的简写版;返回参数的不求值的形式。 普通引述不允许反引述示例:

2017-09-02 10:31:26 629

原创 clojure实战——IO(1)

# clojure实战——IO(1)本博客主要介绍clojure基本文件处理。除了clojure.core单元,还主要用到clojure.java.io单元。在实践本博客中的示例时,可以在repl中require相应命名空间:(require '[clojure.java.io :as cio])(require '[clojure.edn :as edn])

2017-09-02 10:09:42 1081

原创 设计模式——模板方法模式( Template Method Pattern)

一、模板方法模式的定义 在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤。从定义可以看出,模板方法的本质是:封装算法。类图结构: 其中,templateMethod会调用抽象类中定义的一些抽象方法,或者已经实现(默认的具体实现)的方法(称之为“钩子”),子类(实现类)需要实现父类中的抽象方法,或者覆盖父类中已实现

2017-07-24 00:21:22 549

原创 设计模式——外观模式(Facade Pattern)

一、外观模式的定义 外观模式提供了一个统一的接口,用来访问子系统中的一群接口。外观定义了一个高层接口,让子系统更容易使用。注意:外观模式的意图是提供一个简单的接口,好让一个复杂的子系统更易于使用,但是如果你需要使用子系统中的复杂功能,也是可以调用原来复杂接口的。

2017-07-13 00:58:47 476

原创 docker——发布一个应用程序

docker——发布一个java应用程序一、安装docker使用docker之前,需要在物理机上安装docker。安装过程可参考docker官网,安装完成之后,运行docker。不同的操作系统,docker的安装和启动不同。二、待发布的java程序说明需要发布的java服务目录结构如下:docker-test/ |-bin/ | |-server.

2017-07-11 23:06:33 9014

原创 设计模式——适配器模式(Adapter Pattern)

一、适配器模式的定义 将一个类的接口,转换成客户期望的另一个接口。适配器让原本接口不兼容的类可以合作无间。对象适配器的类图:Targetpublic interface ITarget { public void request();}目标接口,与客户对接。Adapterpublic class Adapter implements ITarget { // 持有一个Adap

2017-07-02 12:01:45 525

原创 设计模式——命令模式(Command Pattern)

一、命令模式的定义 将“请求”封装成对象,以便使用不同的请求,队列或者日志来参数化其他对象。命令模式也支持可撤销。命令接口–ICommandpublic interface ICommand { public void execute(); public void undo();}定义统一的接口,所有的命令类都需要实现该接口。命令类–ConcreteCommandpublic

2017-07-02 09:34:25 439

原创 设计模式——单件模式(Singleton Pattern)

一、单件模式定义及经典实现 确保一个类只有一个实例,并提供一个全局访问点。单例的经典(简单)实现如下:public class Singleton{ // 利用静态变量记录Singleton类的唯一实例 private static Singleton uniqueInstance; // ... 类的其他成员和方法 // 声明构造器为私有,即只有本类内才可以调用

2017-06-30 00:19:37 628

原创 web服务程序设计探索(4)——数据总线-分层模型

一、数据总线-分层模型整个流程像是“污水处理”过程:服务层(service层)接到最初的污水之后,将里面的一些物质初步整理出来(提取出参数,转化格式等),然后放入一个包(event-package)中,标注好这个包的ID以及它在service层的处理结果,然后扔回到水管中;包沿水管流到下一层(core业务逻辑层)进行处理,core业务逻辑层拿到service层处理后的数据,根据ID对应的业务规则进行处理,将处理结果

2017-06-25 23:53:07 1463

原创 进程间通信——管道

管道管道的本质其实就是一个文件,进程可以对其进行读或写,从而实现进程间的通信。无名管道和有名管道无名管道创建单向数据流无名管道代码为:int pipe(int fd[2]);该函数返回两个文件描述符:fd[0]用于读,fd[1]用于写。管道被创建与内核态。 管道一个典型而常见的例子:ls | sort | grep xxx其中,shell将执行上述步骤,创建三个进程和两个管道,并且将每个管道的读出

2017-06-19 21:50:01 408

原创 web服务程序设计探索(3)——中间件模型

一、中间件模型中间建模型是插件模型的一种改进版。上次提高插件模型中,核心业务逻辑处理模块并不是一个真正的“纯函数”,因为它里面存在写操作。中间件模型正是将这些写操作剥离出来,放在一个中间件中。中间件只负责执行事务(包括数据库操作,rmi/rpc/http远程调用,内存数据操作等),不理解业务,比如它只负责SQL语句的执行,而不知道SQL是如何组织的,也不知道SQL的内容。二、模块说明因为大多数模块和

2017-06-18 00:04:01 908

原创 web服务程序设计探索(2)——插件模型

一、模型图该模型是自己摸索出来的一种web服务设计模型,整个围绕核心业务逻辑处理模块进行。在这个模型中,core业务逻辑处理中心处理负责执行所有逻辑处理流程,该模块所需要的所有副作用操作都以“插件”的形式从参数中传入。而所谓的“插件”,其实就是一些处理副作用读写的函数。二、模块说明service模块提供网络服务,根据具体使用的技术,对客户端来的请求进行路由分发,提取出请求参数,对参数进行解密、格式转

2017-06-17 14:08:22 747

原创 web服务程序设计探索(1)——俄罗斯套娃模型

一、模型图“service/logic/dao/db”是一种非常常见的分层架构,从代码层次上看,同一层次代码可以放在同一个package,或以…Logic, …Dao等类名来区分;在程序实现处理过程中,都严格遵循上层调用下层函数的方式进行,不会出现跨层、反向调用,一直调用到最底层。二、优点在使用过程中,感觉到这种模型的好处就是比较简单,对于每一个请求,都是一层一层代码往下写,如果下层代码可复用,就直

2017-06-17 12:11:11 1108

原创 浅谈“数据>函数>宏”

现在的程序设计哲学中,“数据>函数>宏”是一种流行趋势,即数据优于函数,函数优于宏。宏排在末位,不足为奇。对于宏的使用,有一种指导方法是:不到不得已的时候,不要使用宏。因此,我们在此只讨论“数据>函数”。一、“数据>函数”的几个例子1. REST风格服务架构近两年,REST流行,人们纷纷抛弃RPC,转向REST。众所周知,REST风格服务的抽象工具是资源,即数据;而RPC服务的

2017-06-06 00:04:54 352

原创 clojure实战——快速搭建web前端开发框架

clojure实战——快速搭建web前端开发框架之前写过一篇类似的文章,搭建web前端开发框架(模拟web服务器、推送js修改),感觉讲的还是有点复杂,因为将模拟后台的开发也放进去了,但在使用clojurescript+reagent的实际生产过程中,发现后台模拟其实是没有多大用处的。很多时候为了模拟后台程序而花时间写一些代码,而且一旦有所变动,又得修改代码,重启figwheel,花费不少时间。反倒

2017-04-24 23:50:40 2300

原创 RESTful API 设计最佳实践(8)

前面几篇文章介绍了一些RESTful API设计方面的参考规范,这篇文章我们来看几个“不良”的例子,并以个人的实践总结为这一系列做个结尾。欢迎大家评论交流。一、几个“不良”示例 1. 查询当前活动状态** 请求:**GET /activity/query?method=status&game=PDK&type=aAccept:json ** 应答:**{:status-code 200

2017-02-28 00:40:29 622

原创 RESTful API 设计最佳实践(7)

RESTful API 设计最佳实践(7)本篇博客将侧重介绍在RESTful API设计中,消息头HEADER和消息体body相关的东西。URL只是RESTful API设计的主要一部分,要实现REST的统一接口,HTTP协议中的其他部分也不可或缺。关于统一接口,可查看我之前的博客。一、返回新建资源的URL使用POST新建的资源时,如果创建成功,则返回201状态码,,应该在返回的消息头HEADER的

2017-02-28 00:06:00 1977

原创 RESTful API 设计最佳实践(6)

RESTful API 设计最佳实践(6)在本文中,将重点介绍一些实际设计RESTful API的建议,这些API是基于HTTP协议设计的。这些建议是参考网上一些好的资料并结合自己实际经验做了更加细致的分析,个人觉得有不错的参考价值。一、两个简单的例子1. 简单资源的CRUD GET /users - 获取用户列表 GET /users/:id - 获取用户ID号为:

2016-09-22 10:03:12 2693

原创 RESTful API 设计最佳实践(3)

RESTful API 设计最佳实践(3)一、无状态和有状态无状态服务,是REST风格服务的核心约束。无状态指的是:处理请求所需要的状态信息都放在请求里面(如,放在URI路径、查询参数、body以及Header中等),而不是存放在服务器端。服务器端从请求中获取到相关状态信息,对请求进行处理之后,将需要返回的状态信息放在诸如body、header中,返回给客户端。无状态服务,是不要求请求有先后次序的。

2016-09-21 16:55:28 711

原创 RESTful API 设计最佳实践(2)

RESTful API 设计最佳实践(2)常见的分布式应用架构风格有三种: (1)分布式对象(Distributed Objects) 架构实例:CORBA/RMI/EJB/DCOM/.NET Remoting等。 (2)远程过程调用(RPC) 架构实例:SOAP/XML-RPC/Hessian/Flash AMF/DWR等。 (3)表述性状态转移(REST) 架构实例:HT

2016-09-20 17:03:15 853 2

原创 RESTful API 设计最佳实践(5)

RESTful API 设计最佳实践(5)在上篇文章中,主要介绍了Roy Fielding论文中,关于统一接口的四个约束,并对其中资源定义相关部分阐述了自己的一些观点。本章节主要介绍一下我们现实中最为常见的,也是REST统一接口的最佳实践者——HTTP规范,着重介绍设计RESTful API时,对于HTTP方法选择,以及REST服务实现过程中需要注意的点。

2016-09-20 16:45:08 1305

原创 RESTful API 设计最佳实践(4)

RESTful API 设计最佳实践(4)目前,对于RESTful API设计并没有非常严格的标准,但一定要尽量满足以下需求:(1)使用WEB标准,如满足HTTP协议规范(2)对开发者友好,并且可以通过浏览器、curl等简单工具进行调用。(3)简单、易用、一致。(4)高效。这一章节,我想先介绍一下REST中统一接口相关理论知识。

2016-09-20 10:57:32 1135

原创 RESTful API 设计最佳实践(1)

RESTful API 设计最佳实践(1)——在Roy Thomas Fielding看来,这可能(kending)不是真正的REST,但也将是一个因REST所带来的好的实践。一、Representational State Transfer (REST)概述1. 相关概念(1)资源: rest对于资源的定义基于一个简单的前提:标识符的改变应该尽可能少的发生,将一个资源定义为创作者想要标识的语义,而

2016-09-18 22:09:26 1221

原创 java服务器编程——log4j日志

一、引入log4j包对于mvn构建的java工程,在pom.xml文件中引入如下配置:<dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.16</version></dependency>二、配置log4j.xml文件log4j.xml文件放在工程的资源目录下,配

2016-08-27 13:31:11 3089

原创 clojure实战——schema for clojure

一、何为schemaschema是描述数据形式的一种clojure数据结构,可用于文件、校验函数和数据。 下面举个例子让大家对schema有个总体认识,例:(ns schema-examples (:require [schema.core :as s]))(def s-type s/Str)(s/validate s-type "123") ;; Success!(s/val

2016-08-27 09:09:40 1128

原创 clojure实战——如何在java中调用clojure函数

clojure作为一门函数式编程语言,有其自身的优势,比如可以用极为精简的代码写一些逻辑运算,灵活的edn文件配置,编程效率特别高。因此,在需要编写一些较为复杂的逻辑模块或者是要和第三方clojure库/服务进行无缝交互时,可以使用该方法。

2016-08-27 08:21:49 3198

原创 系统服务监控命令

1.查看某个进程中运行的线程数量所有进程的运行状态都可以用文件来获取。系统根目录/proc中,每一个数字子目录的名字都是运行中的进程的PID,进入任一个进程目录,可通过其中文件或目录来观察进程的各项运行指标,例如task目录就是用来描述进程中线程的,因此也可以通过下面的方法获取某进程中运行中的线程数量(PID指的是进程ID):ls /proc/进程号/task | wc -l 2.监控java线程数

2016-03-10 13:52:04 588 1

原创 系统服务监控--CPU利用率

unix系统中,CPU消耗主要在以下几个方面:用户进程、内核进行、中断处理、I/O等待,Nice时间、丢失时间、空闲等。CPU的利用率则为这些时间所占总时间的百分比。在unix系统中,可以通过top命令来查看CPU的消耗情况: top | grep Cpu依次按列说明: us: 用户时间(User Time), 表示CPU执行用户进程所占用的时间,通常希望us占比越高越好。 sy: 系统时间(

2016-03-10 13:28:42 742

原创 系统服务监控指标--load

load 系统的load被定义为特定时间间隔内运行队列的平均线程数,如果一个线程满足以下条件,该线程就会处于运行队列中: 没有处于I/O等待状态。没有主动进入等待状态,也就是没有调用wait操作;没有被终止。每个CPU的核都维护了一个运行队列,系统的load主要由运行队列来决定。load的值越大,也就意味着系统的CPU越繁忙,这样线程运行完以后等待操作系统分配下一个时间片段的时间也就越长。

2016-03-10 11:27:57 2563 1

原创 datomic数据库——ACID(1)

ACIDdatomic数据库的事务是ACID的:Atomic(原子性),Consistent(一致性),Isolated(隔离性),Durable(持久性)。原子性原子性要求每一个事务要么就全部执行,要么就全不执行。如果事务中某部分操作失败,那么整个事务也就失败,数据库应该没有任何变化。datomic的事务(transaction)在被写入到持久储存的数据库的过程,是一个原子性写操作,所以能够保证其

2015-12-17 21:25:11 1793

原创 clojure实战——函数内存化

纯函数就从纯函数开始讲起吧。 对于纯函数,它具以下几个特征:没有副作用:不会读写数据库、文件、socket、以及全局变量等。具有一致性:正是因为没有副作用,纯函数才能表现出一致性:即对于参数a, b它始终会返回结果c,不管在什么环境中。易于测试:纯函数的返回值完全由它的参数决定,因此编写测试用例时,不需要mock,你可以轻松地对一个纯函数进行全面测试。结果可缓存:任何使用到纯函数表达式的地

2015-12-08 19:38:21 1317

原创 clojure实战——基于logstash搭建日志数据获取与整理平台(2)

clojure实战——基于logstash搭建日志数据获取与整理平台(2)1. logstash简介logstash是金牌搭档ELK中的“L”,它主要负责数据的收集、解析整理、传输。这对应体现在它的配置文件中的input、filter、output这三段配置。下面仅针对本次项目中需要使用到的地方做一个讲解,其他方面读者可自行到其官网查阅。2. logstash使用(1)运行一个logstash使用l

2015-11-03 15:11:46 779

原创 clojure实战——基于logstash搭建日志数据获取与整理平台(1)

clojure实战——基于logstash搭建日志数据获取与整理平台(1)1. 需求背景介绍比如: 在一个游戏平台中,所有的游戏都将结果直接写入到一个数据库,但现在我们想根据游戏结果来搞一些活动(活动可能只依赖某一个游戏结果数据,或多个游戏数据结果),此时我们可能想到以下几个方案:在所有游戏和数据库中间建立一个“游戏结果消息中心”,修改各个游戏代码,将游戏结果通知到“中心”,“中心”可将结果写入

2015-11-03 12:40:47 658

原创 clojure实战——搭建web前端开发框架(模拟web服务器、推送js修改)

直接动手搭建框架吧,闲话留着后面碎碎念~~1. 框架概述使用figwheel库,通过websocket将js推送给浏览器。修改ClojureScript之后,不用重新编译打包,就可立即推送到浏览器进行显示。使用ClojureScript REPL模拟web服务器,不需将网页部署到ngnix等容器中,浏览器即可访问本地web服务。使用environ库进行环境变量设置,可轻松切换开发/发布环境。

2015-10-30 00:53:41 2315

原创 clojure实战——日志处理

clojure实战——日志处理1. 关于日志的一些想法日志对于开发人员来说,是定位、分析软件故障时的重要依据;对于运维人员来说,是了解软件运行状态、系统状态的重要途径;对于业务需求方来说,是获取统计业务相关数据的重要来源。由此观之,开发人员在记录日志时,不仅需要考虑开发时定位软件异常、方便调试等需要,还要考虑来自运维、需求方这三方面的需求。另外,为了方便日后进行日志分析、统计,需要好好设计日志的记

2015-10-29 23:30:25 1792

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除