<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[蜗牛的专栏]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/Linux2_SCDN</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; Linux2_SCDN]]></copyright><item><title><![CDATA[clojure实战——何时使用宏]]></title><link>https://blog.youkuaiyun.com/Linux2_SCDN/article/details/78619544</link><guid>https://blog.youkuaiyun.com/Linux2_SCDN/article/details/78619544</guid><author>Linux2_SCDN</author><pubDate>Thu, 23 Nov 2017 22:18:55 +0800</pubDate><description><![CDATA[clojure实战——何时使用宏一、记住几点
在C语言中，宏在编译的时候会被文本替代，纯粹的文本替换。而在clojure中，宏在编译的时候会先被求值，然后求值后得到的数据结构代替宏原来的位置。而正是这个求值功能，使clojure的宏比C语言那种纯代码替代的宏具备更强大的功能。
不管是C语言的宏还是clojure的宏，它们的起作用的时期都是“编译期”。
如果可以最好不要用使用宏，优先使用函数。
二、为]]></description><category></category></item><item><title><![CDATA[链表（linked list）]]></title><link>https://blog.youkuaiyun.com/Linux2_SCDN/article/details/78011490</link><guid>https://blog.youkuaiyun.com/Linux2_SCDN/article/details/78011490</guid><author>Linux2_SCDN</author><pubDate>Sun, 17 Sep 2017 16:52:44 +0800</pubDate><description><![CDATA[链表的特点
根据线性表元素多少，长度可变化。
动态申请内存空间：元素删除或插入时，对应申请新的存储空间或释放原来占有的存储空间。
使用指针来链接各个结点，按照线性表的前驱关系将结点连接起来，结点之间内存地址不必相邻。
链表的访问：不能像数组那样根据下标直接访问某一个结点i，而需要从头结点开始，沿着link指针一个一个地计数（遍历），才能找到。
通常有一个first指针变量和一个last指针遍历，用来]]></description><category></category></item><item><title><![CDATA[clojure实战——binding vs let]]></title><link>https://blog.youkuaiyun.com/Linux2_SCDN/article/details/78010665</link><guid>https://blog.youkuaiyun.com/Linux2_SCDN/article/details/78010665</guid><author>Linux2_SCDN</author><pubDate>Sun, 17 Sep 2017 15:47:27 +0800</pubDate><description><![CDATA[clojure实战——binding vs letbinding vs let（1）
binding 创建了一个动态的域绑定；用于动态绑定动态的Var，即必须先创建一个动态绑定的Var，然后才可以进行动态绑定。
binding 用于线程内绑定。使用binding创建的绑定不能被其他线程可见。clojure中每个Var都可以有一个”根值”（也可以不设置），它是对所有线程可见的。而一个可动态绑定的Var]]></description><category></category></item><item><title><![CDATA[clojure实战——宏]]></title><link>https://blog.youkuaiyun.com/Linux2_SCDN/article/details/77801156</link><guid>https://blog.youkuaiyun.com/Linux2_SCDN/article/details/77801156</guid><author>Linux2_SCDN</author><pubDate>Sat, 02 Sep 2017 14:43:53 +0800</pubDate><description><![CDATA[clojure实战——宏本博客主要介绍clojure中宏相关的基础知识，因为自己没能很深入研究clojure的宏，所以做不到深入的讲解。但根据自己及什么clojure用的比较好的人的经验，能不用宏就不用宏，用宏、特别是逻辑复杂的宏机会真的很少，因此我个人觉得本博客所涉及的东西已经足够应付一般的场景了。clojure宏概述clojure宏在编译期间被求值，而不是文本替换（和C语言的预编译不同），宏的求]]></description><category></category></item><item><title><![CDATA[clojure实战——符号&@#'+-*/]]></title><link>https://blog.youkuaiyun.com/Linux2_SCDN/article/details/77799713</link><guid>https://blog.youkuaiyun.com/Linux2_SCDN/article/details/77799713</guid><author>Linux2_SCDN</author><pubDate>Sat, 02 Sep 2017 11:33:01 +0800</pubDate><description><![CDATA[clojure实战——符号&amp;amp;@#’+-*/

本博客继续对clojure语言中一些符号进行讲解：&amp;amp;，@，-‘，#’。



保持“剩下的元素”——&amp;amp;、%&amp;amp;


  &amp;amp;：保持”剩下的元素”
  
  在解构中，可以用&amp;amp;符号保持解构剩下来的元素，有点像java中的可变参数


示例：

(comment
  (defn &amp;amp;test
    [a ...]]></description><category></category></item><item><title><![CDATA[clojure实战——引述相关'`~~@]]></title><link>https://blog.youkuaiyun.com/Linux2_SCDN/article/details/77799148</link><guid>https://blog.youkuaiyun.com/Linux2_SCDN/article/details/77799148</guid><author>Linux2_SCDN</author><pubDate>Sat, 02 Sep 2017 10:31:26 +0800</pubDate><description><![CDATA[clojure实战——引述相关’`~~@clojure中，经常看到一些诸如’ ` ~ ~@ #’ 之类的符号，本博客专门针对其中与引述相关的三个符号（其实就是函数）进行详细说明。这三个符号（函数）在clojure.core中定义，因此可直接在repl中使用。普通引述——’
  ‘：普通引述。
  
  ’ 等同于 quote，是它的简写版；返回参数的不求值的形式。 
  普通引述不允许反引述
示例：]]></description><category></category></item><item><title><![CDATA[clojure实战——IO（1）]]></title><link>https://blog.youkuaiyun.com/Linux2_SCDN/article/details/52575659</link><guid>https://blog.youkuaiyun.com/Linux2_SCDN/article/details/52575659</guid><author>Linux2_SCDN</author><pubDate>Sat, 02 Sep 2017 10:09:42 +0800</pubDate><description><![CDATA[# clojure实战——IO（1）
本博客主要介绍clojure基本文件处理。除了clojure.core单元，还主要用到clojure.java.io单元。在实践本博客中的示例时，可以在repl中require相应命名空间：

(require '[clojure.java.io :as cio])
(require '[clojure.edn :as edn])]]></description><category></category></item><item><title><![CDATA[设计模式——模板方法模式（ Template Method Pattern）]]></title><link>https://blog.youkuaiyun.com/Linux2_SCDN/article/details/75949400</link><guid>https://blog.youkuaiyun.com/Linux2_SCDN/article/details/75949400</guid><author>Linux2_SCDN</author><pubDate>Mon, 24 Jul 2017 00:21:22 +0800</pubDate><description><![CDATA[一、模板方法模式的定义
  在一个方法中定义一个算法的骨架，而将一些步骤延迟到子类中。模板方法使得子类可以在不改变算法结构的情况下，重新定义算法中的某些步骤。
从定义可以看出，模板方法的本质是：封装算法。类图结构： 
其中，templateMethod会调用抽象类中定义的一些抽象方法，或者已经实现（默认的具体实现）的方法（称之为“钩子”），子类（实现类）需要实现父类中的抽象方法，或者覆盖父类中已实现]]></description><category></category></item><item><title><![CDATA[设计模式——外观模式（Facade Pattern）]]></title><link>https://blog.youkuaiyun.com/Linux2_SCDN/article/details/75040970</link><guid>https://blog.youkuaiyun.com/Linux2_SCDN/article/details/75040970</guid><author>Linux2_SCDN</author><pubDate>Thu, 13 Jul 2017 00:58:47 +0800</pubDate><description><![CDATA[一、外观模式的定义


  外观模式提供了一个统一的接口，用来访问子系统中的一群接口。外观定义了一个高层接口，让子系统更容易使用。


注意：外观模式的意图是提供一个简单的接口，好让一个复杂的子系统更易于使用，但是如果你需要使用子系统中的复杂功能，也是可以调用原来复杂接口的。]]></description><category></category></item><item><title><![CDATA[docker——发布一个应用程序]]></title><link>https://blog.youkuaiyun.com/Linux2_SCDN/article/details/74999352</link><guid>https://blog.youkuaiyun.com/Linux2_SCDN/article/details/74999352</guid><author>Linux2_SCDN</author><pubDate>Tue, 11 Jul 2017 23:06:33 +0800</pubDate><description><![CDATA[docker——发布一个java应用程序



一、安装docker

使用docker之前，需要在物理机上安装docker。安装过程可参考docker官网，安装完成之后，运行docker。不同的操作系统，docker的安装和启动不同。



二、待发布的java程序说明

需要发布的java服务目录结构如下：



docker-test/
    |-bin/
    |  |-server.]]></description><category></category></item><item><title><![CDATA[设计模式——适配器模式（Adapter Pattern）]]></title><link>https://blog.youkuaiyun.com/Linux2_SCDN/article/details/74091717</link><guid>https://blog.youkuaiyun.com/Linux2_SCDN/article/details/74091717</guid><author>Linux2_SCDN</author><pubDate>Sun, 02 Jul 2017 12:01:45 +0800</pubDate><description><![CDATA[一、适配器模式的定义
  将一个类的接口，转换成客户期望的另一个接口。适配器让原本接口不兼容的类可以合作无间。
对象适配器的类图：Targetpublic interface ITarget {
    public void request();
}目标接口，与客户对接。Adapterpublic class Adapter implements ITarget {
    // 持有一个Adap]]></description><category></category></item><item><title><![CDATA[设计模式——命令模式（Command Pattern）]]></title><link>https://blog.youkuaiyun.com/Linux2_SCDN/article/details/74066393</link><guid>https://blog.youkuaiyun.com/Linux2_SCDN/article/details/74066393</guid><author>Linux2_SCDN</author><pubDate>Sun, 02 Jul 2017 09:34:25 +0800</pubDate><description><![CDATA[一、命令模式的定义
  将“请求”封装成对象，以便使用不同的请求，队列或者日志来参数化其他对象。命令模式也支持可撤销。
命令接口–ICommandpublic interface ICommand {
    public void execute();
    public void undo();
}定义统一的接口，所有的命令类都需要实现该接口。命令类–ConcreteCommandpublic]]></description><category></category></item><item><title><![CDATA[设计模式——单件模式（Singleton Pattern）]]></title><link>https://blog.youkuaiyun.com/Linux2_SCDN/article/details/73929179</link><guid>https://blog.youkuaiyun.com/Linux2_SCDN/article/details/73929179</guid><author>Linux2_SCDN</author><pubDate>Fri, 30 Jun 2017 00:19:37 +0800</pubDate><description><![CDATA[一、单件模式定义及经典实现
  确保一个类只有一个实例，并提供一个全局访问点。
单例的经典（简单）实现如下：public class Singleton{
    // 利用静态变量记录Singleton类的唯一实例
    private static Singleton uniqueInstance;
    // ... 类的其他成员和方法    // 声明构造器为私有，即只有本类内才可以调用]]></description><category></category></item><item><title><![CDATA[web服务程序设计探索（4）——数据总线-分层模型]]></title><link>https://blog.youkuaiyun.com/Linux2_SCDN/article/details/73396928</link><guid>https://blog.youkuaiyun.com/Linux2_SCDN/article/details/73396928</guid><author>Linux2_SCDN</author><pubDate>Sun, 25 Jun 2017 23:53:07 +0800</pubDate><description><![CDATA[一、数据总线-分层模型
整个流程像是“污水处理”过程：服务层（service层）接到最初的污水之后，将里面的一些物质初步整理出来（提取出参数，转化格式等），然后放入一个包（event-package)中，标注好这个包的ID以及它在service层的处理结果，然后扔回到水管中；包沿水管流到下一层（core业务逻辑层）进行处理，core业务逻辑层拿到service层处理后的数据，根据ID对应的业务规则进行处理，将处理结果]]></description><category></category></item><item><title><![CDATA[进程间通信——管道]]></title><link>https://blog.youkuaiyun.com/Linux2_SCDN/article/details/73477481</link><guid>https://blog.youkuaiyun.com/Linux2_SCDN/article/details/73477481</guid><author>Linux2_SCDN</author><pubDate>Mon, 19 Jun 2017 21:50:01 +0800</pubDate><description><![CDATA[管道管道的本质其实就是一个文件，进程可以对其进行读或写，从而实现进程间的通信。无名管道和有名管道无名管道创建单向数据流无名管道代码为：int pipe(int fd[2]);该函数返回两个文件描述符：fd[0]用于读，fd[1]用于写。管道被创建与内核态。 
管道一个典型而常见的例子：ls | sort | grep xxx其中，shell将执行上述步骤，创建三个进程和两个管道，并且将每个管道的读出]]></description><category></category></item><item><title><![CDATA[web服务程序设计探索（3）——中间件模型]]></title><link>https://blog.youkuaiyun.com/Linux2_SCDN/article/details/73381454</link><guid>https://blog.youkuaiyun.com/Linux2_SCDN/article/details/73381454</guid><author>Linux2_SCDN</author><pubDate>Sun, 18 Jun 2017 00:04:01 +0800</pubDate><description><![CDATA[一、中间件模型中间建模型是插件模型的一种改进版。上次提高插件模型中，核心业务逻辑处理模块并不是一个真正的“纯函数”，因为它里面存在写操作。中间件模型正是将这些写操作剥离出来，放在一个中间件中。中间件只负责执行事务（包括数据库操作，rmi/rpc/http远程调用，内存数据操作等），不理解业务，比如它只负责SQL语句的执行，而不知道SQL是如何组织的，也不知道SQL的内容。二、模块说明因为大多数模块和]]></description><category></category></item><item><title><![CDATA[web服务程序设计探索（2）——插件模型]]></title><link>https://blog.youkuaiyun.com/Linux2_SCDN/article/details/73377734</link><guid>https://blog.youkuaiyun.com/Linux2_SCDN/article/details/73377734</guid><author>Linux2_SCDN</author><pubDate>Sat, 17 Jun 2017 14:08:22 +0800</pubDate><description><![CDATA[一、模型图该模型是自己摸索出来的一种web服务设计模型，整个围绕核心业务逻辑处理模块进行。在这个模型中，core业务逻辑处理中心处理负责执行所有逻辑处理流程，该模块所需要的所有副作用操作都以“插件”的形式从参数中传入。而所谓的“插件”，其实就是一些处理副作用读写的函数。二、模块说明service模块提供网络服务，根据具体使用的技术，对客户端来的请求进行路由分发，提取出请求参数，对参数进行解密、格式转]]></description><category></category></item><item><title><![CDATA[web服务程序设计探索（1）——俄罗斯套娃模型]]></title><link>https://blog.youkuaiyun.com/Linux2_SCDN/article/details/73368855</link><guid>https://blog.youkuaiyun.com/Linux2_SCDN/article/details/73368855</guid><author>Linux2_SCDN</author><pubDate>Sat, 17 Jun 2017 12:11:11 +0800</pubDate><description><![CDATA[一、模型图“service/logic/dao/db”是一种非常常见的分层架构，从代码层次上看，同一层次代码可以放在同一个package，或以…Logic, …Dao等类名来区分；在程序实现处理过程中，都严格遵循上层调用下层函数的方式进行，不会出现跨层、反向调用，一直调用到最底层。二、优点在使用过程中，感觉到这种模型的好处就是比较简单，对于每一个请求，都是一层一层代码往下写，如果下层代码可复用，就直]]></description><category></category></item><item><title><![CDATA[浅谈“数据>函数>宏”]]></title><link>https://blog.youkuaiyun.com/Linux2_SCDN/article/details/72513007</link><guid>https://blog.youkuaiyun.com/Linux2_SCDN/article/details/72513007</guid><author>Linux2_SCDN</author><pubDate>Tue, 06 Jun 2017 00:04:54 +0800</pubDate><description><![CDATA[现在的程序设计哲学中，“数据>函数>宏”是一种流行趋势，即数据优于函数，函数优于宏。宏排在末位，不足为奇。对于宏的使用，有一种指导方法是：不到不得已的时候，不要使用宏。因此，我们在此只讨论“数据>函数”。



一、“数据>函数”的几个例子



1. REST风格服务架构

近两年，REST流行，人们纷纷抛弃RPC，转向REST。众所周知，REST风格服务的抽象工具是资源，即数据；而RPC服务的]]></description><category></category></item><item><title><![CDATA[clojure实战——快速搭建web前端开发框架]]></title><link>https://blog.youkuaiyun.com/Linux2_SCDN/article/details/70667085</link><guid>https://blog.youkuaiyun.com/Linux2_SCDN/article/details/70667085</guid><author>Linux2_SCDN</author><pubDate>Mon, 24 Apr 2017 23:50:40 +0800</pubDate><description><![CDATA[clojure实战——快速搭建web前端开发框架之前写过一篇类似的文章，搭建web前端开发框架(模拟web服务器、推送js修改)，感觉讲的还是有点复杂，因为将模拟后台的开发也放进去了，但在使用clojurescript+reagent的实际生产过程中，发现后台模拟其实是没有多大用处的。很多时候为了模拟后台程序而花时间写一些代码，而且一旦有所变动，又得修改代码，重启figwheel，花费不少时间。反倒]]></description><category></category></item></channel></rss>