Clojure 实战(3):使用 Noir 框架开发博客(下)

Session和Cookie

做网络编程的人肯定对这两个概念不陌生,因此这里就不介绍它们的定义和作用了。我们要实现的需求也很简单:用户通过一个表单登录,在当前窗口中保持登录状态,并可以选择“记住我”来免去关闭并新开窗口之后的重登录。显然,前者使用Session,后者使用Cookie。下面我们就来看Noir对这两者的支持。

Session

1
2
3
4
(require 'noir.session)
(noir.session/put! :username "john")
(noir.session/get :username "nobody")
(noir.session/clear!)

很简单的API。注意put!函数中的!,和之前遇到的?一样,这种特殊字符是合法的函数名,但!习惯用来表示该方法会改变某个对象的状态,这里put!就表示会改变Session的状态。

Noir还提供了一种“闪信(Flash)”机制,主要用于在页面跳转之间暂存消息。如用户登录后会跳转到首页,如果想在首页显示“登录成功”的信息,就需要用到闪信了。闪信的API也放置在noir.session命名空间下:

1
2
(noir.session/flash-put! "登录成功")
(noir.session/flash-get)

闪信的生命周期是一次请求,即在设置了闪信后的下一个请求中,可以多次flash-get,但再下一次请求就获取不到值了。

阅读全文

Clojure 实战(2):使用 Noir 框架开发博客(中)

在Eclipse中编写Clojure代码

从这章起我们就要开始真正的编码了。Vim可能是很多程序员的选择,但如果你像我一样更喜欢GUI界面,那就来看看如何在Eclipse中编写Clojure代码吧。

安装Eclipse插件

Eclipse提供了一个Clojure插件:CounterClockwise,可以用来编写Clojure代码,进行语法高亮、调试等操作。打开Eclipse的Market Place,搜索counterclockwise关键字,点击Install即可。

将Leiningen项目导入Eclipse

由于CounterClockwise插件并没有默认使用Leiningen来管理项目,因此需要做一些额外的工作。

在使用lein new命令创建项目后,在project.clj文件中增加如下一行:

1
2
3
(defproject ...
:dev-dependencies [[lein-eclipse "1.0.0"]]
...)

然后依次执行lein depslein eclipse,会看到项目根目录下生成了.project和.classpath文件。然后就可以进入Eclipse导入这个项目了。如果使用Git进行版本控制,lein已经为你生成好了.gitignore文件。执行了git init后,就能在Eclilpse中选择Share Project菜单项,进行可视化的版本控制。

使用表单

我们现在需要编写一个新建文章的功能,它是一个简单的页面,页面上有“标题”和“内容”两个文本框,并有一个“提交”按钮。

在src/blog/views目录下新建一个文件article.clj,输入以下内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
(ns blog.views.article
(:require [blog.views.common :as common])
(:use [noir.core]
[hiccup.form-helpers]))
(defpage "/blog/add" []
(common/layout
[:h1 "新建文章"]
(form-to [:post "/blog/add"]
(label "title" "标题:")
(text-field {:size 50} "title") [:br]
(label "content" "内容:")
(text-area {:rows 20 :cols 50} "content") [:br]
(submit-button "提交"))))

defpagecommon/layout我们之前已经见到过,前者定义了URL/blog/add指向的页面,后者则是套用了一个模板。[:h1 ...][:br]也应该熟悉,它们是Hiccup的语法,分别生成<h1>...</h1><br>标签。

阅读全文

Clojure 实战(1):使用 Noir 框架开发博客(上)

前言

为什么要学习一门新的语言?我的想法很简单,平时OO、PO代码写多了,却从未接触过函数式编程,不免有些遗憾。考察下来,Clojure可以用来尝尝鲜,所以就决定学一学。为了给自己的学习留下些记录,就有了这样一份教程。

Clojure已经有一些不错的教程,如Mark VolkmannClojure - Functional Programming for the JVM,Storm的主要贡献者徐明明也对这个教程做了全文翻译。还有一些不错的书籍,像O’ReillyClojure Programming,都值得一读。我是从Mark的教程开始学起的,对其中没有提到的部分则是参考了Clojure Programming这本书。Clojure的官方网站上有详尽的API参考,可以作为工具书查阅。

但是,上面提到的教程都是针对Clojure语言本身的,从 Hello, world! 开始,讲解Clojure的各种语法,关键字,结构等等。虽然Clojure的语法已经足够吸引你的眼球,在REPL中敲击Clojure代码已经是一种莫大的乐趣了,但似乎还有些不够,我们想看到一个用Clojure编写的应用程序!

因为平时都是做Web开发,所以先从一个Web框架入手会是不错的选择,因此这份教程会从使用Noir框架搭建一个博客开始,带你领略Clojure的魅力。

阅读全文

开源软件架构 - 卷1:第14章 Python 打包工具

作者:Tarek Ziadé,翻译:张吉

原文:http://www.aosabook.org/en/packaging.html

14.1 简介

对于如何安装软件,目前有两种思想流派。第一种是说软件应该自给自足,不依赖于其它任何部件,这点在Windows和Mac OS X系统中很流行。这种方式简化了软件的管理:每个软件都有自己独立的“领域”,安装和卸载它们不会对操作系统产生影响。如果软件依赖一项不常见的类库,那么这个类库一定是包含在软件安装包之中的。

第二种流派,主要在类Linux的操作系统中盛行,即软件应该是由一个个独立的、小型的软件包组成的。类库被包含在软件包中,包与包之间可以有依赖关系。安装软件时需要查找和安装它所依赖的其他特定版本的软件包。这些依赖包通常是从一个包含所有软件包的中央仓库中获取的。这种理念也催生了Linux发行版中那些复杂的依赖管理工具,如dpkgRPM。它们会跟踪软件包的依赖关系,并防止两个软件使用了版本相冲突的第三方包。

以上两种流派各有优劣。高度模块化的系统可以使得更新和替换某个软件包变的非常方便,因为每个类库都只有一份,所有依赖于它的应用程序都能因此受益。比如,修复某个类库的安全漏洞可以立刻应用到所有程序中,而如果应用程序使用了自带的类库,那安全更新就很难应用进去了,特别是在类库版本不一致的情况下更难处理。

不过这种“模块化”也被一些开发者视为缺点,因为他们无法控制应用程序的依赖关系。他们希望提供一个独立和稳定的软件运行环境,这样就不会在系统升级后遭遇各种依赖方面的问题。

阅读全文

开源软件架构 - 卷2:第6章 Git

作者:Susan Potter,翻译:张吉

原文:http://www.aosabook.org/en/git.html

6.1 Git概述

Git能够让不同的协作者通过一个点对点的仓库网络对数据内容(通常是代码,当然不仅限于代码)进行维护。它支持分布式的工作流程,能够让数据内容临时分离,并最终合并到一起。

本章将阐述Git的内部实现是如何提供以上功能的,以及它和其他版本控制系统(VCS)的区别。

6.2 Git起源

为了更好地理解Git的设计思想,我们有必要先了解一下Git项目的发源地——Linux内核开发社区——所面临的问题。

Linux内核开发与其他商业软件项目有很大不同,因为它的开发者众多,且每个开发者的参与程度和对Linux内核代码的理解有很大差异。多年以来,内核代码一直都是以Tar压缩文件以及补丁的形式维护的,而当时的核心开发团队一直在寻找一个能够满足他们各方面需求的版本控制系统。

Git就是在这样的背景下于2005年作为一款开源软件诞生的。当时,Linux内核代码通过两种版本控制系统进行维护,BitKeeper和CVS,分别由两组核心开发团队使用。BitKeeper相较于当时颇为流行的CVS,提供了一种不同的历史展示方式。

阅读全文