we've written some books you might like

we've some videos

spec: Leverage

The new Clojure spec library provides support for data and function specification. In this first in a series of screencasts, Stuart Halloway discusses how spec provides leverage to achieve many returns for a small investment in describing your functions with spec.

spec: testing

Clojure spec defines specifications for both data and functions. In addition to validity checking, specs can generate random samples of the data they specify. This capability enables an alternative to unit testing known as generative, or property-based, testing.

spec: customizing generators

One benefit of Clojure specs is that they automatically provide data generators that produce values conforming to the spec which can be used for testing. In addition, you can compose your own generator to more precisely match your data model.

In this screencast, Stuart Halloway demonstrates techniques for creating and combining models of your input using the `bind` and `fmap` functions to produce custom generators.

introduction to datomic

Rich Hickey gives an introduction to Datomic, including the basics of the architecture and data model.

core.async Part 1

The first of 2 videos of the core.async training, recorded at Clojure/West in Portland Oregon in April of 2015.

The course will cover core.async, a library for doing concurrent programming with immutable values available in both Clojure and ClojureScript.

In this first video, Luke VanderHart will introduce core.async and cover the basics of channels and go blocks.

CORE.ASYNC PART 2

In this video, Luke VanderHart moves beyond the basics of channels and go blocks, demonstrating some of the advantages of using these constructs in realistic examples.

Luke additionally discusses higher level features of core.async including alternates and transducers, followed by a discussion of helpful patterns and practices for building systems with core async, including exception handling and a discussion of use cases.

Simulation Testing with Simulant

Simulation Testing predicts how your system will behave under varying degrees of load and realistic use patterns, without risking revenue or sacrificing customer trust. In this webinar recording, Michael Nygard will introduce the structure of simulation testing using the open-source framework Simulant. We will walk through a complete simulation lifecycle with source code.

Bridging Language Barriers with Transit

If you need to move data between applications, JSON is your friend.

No matter where your program is running, no matter which programming language you are using, chances are there is a high quality — and high performance — JSON implementation available. But JSON has some shortcomings: It only supports a very limited set of types. It’s not extensible. And it is verbose.

In this webinar, Russ Olsen introduces Transit, a format that is built atop JSON, and the closely related MessagePack. Transit takes up where JSON leaves off: Transit comes with a much richer set of types including full 64 bit integers, UUIDs, and timestamps. Transit also includes a straight forward mechanism for defining new types as well as a simple but effective caching mechanism. Cross language as well as cross platform — Transit implementations are available for JavaScript, Java, Clojure, ClojureScript Ruby and Python.

Designing Front End Applications with core.async

Arguably the two largest sources of complexity in front end client applications are application state and application events. Programming with immutable values gives us better tools for managing application state, but what about events?Callbacks are a weak abstraction for complex event flows. Promises eliminate some incidental complexity but are ill-suited for representing streams or queues. Can we do better?

As usual, everything old is new again. In this webinar, we'll explore how Clojure's core.async brings the power of Tony Hoare's Communicating Sequential Processes to client browsers. We'll start with the basic building blocks and work our way up to a simple but complete interactive application.