Writing
I tend to write in series, sometimes ten or twenty posts about one thing while I learn it, and the odd standalone rant in between. 262 posts since 2009, some of them still useful, some of them about technology nobody has touched in a decade. They stay up either way.
The series · Everything, by year · RSS
Series
Blogging the mundane: NVIDIA
Writing an NVENC/NVDEC driver for our own media stack, with only moderate frustration.
Purescript on the BEAM
id3as starts writing Purescript instead of Erlang, and I write down what happens.
Pinto and Stetson
Opinionated Purescript bindings to OTP and Cowboy, and an end-to-end project built on them.
- Introducing Pinto and Stetson - Opinionated Purescript bindings to OTP and Cowboy
- The structure of an end-to-end Purescript OTP project
- Building on top of OTP with Purescript with Pinto
- Building a Purescript web server with Stetson and Pinto
- Shared code twixt Purescript server and client
- Purescript interop with native Erlang - Interacting with Redis
- Codemesh 2019 - Purerl and OTP talk
- Purerl - Some questions from #CodeMeshLdn
Purerl updates
Two rounds of changes to Pinto and Stetson, in 2020 and 2021.
- Updates to Pinto+Stetson - Purerl In Progress
- Purerl updates - Typed routes in Stetson
- Purerl Updates - Arbitrary messages and handle_info in gen servers
- Purerl Updates - Arbitrary messages and Stetson handlers
- Purerl Updates - Monitors in Stetson and Pinto
- Purerl Updates - Message Routing From Legacy Code
- Purerl Updates - Processes and Self
- Purerl Updates - Subscriptions
- Purerl Updates - Untagged Unions
- Purerl Updates - maxing out Pinto OTP
- Purerl Updates - GenStatem
- Purerl Updates - A heap of ported modules
A few notes on Elm 0.17
EventStore
- Playing with the event store
- Basic projections
- Re-partitioning streams
- Creating a projection per stream
- Pumping data from Github into the EventStore
- Emitting commits as their own events
- Backing up your database
- Who writes the sweariest commits?
- Temporal queries - who doesn't trust their hardware?
- Crossing the streams to gain real insights
- Temporal averages
- Sentiment analysis of Github commits
Javascript
- Look Ma - No Framworks
- Grunt+Browserify+NPM = Application Success
- jQuery isn't a framework, but I don't really use it anyway
- Frameworkless JS - an example
- Starting the frameworkless project
- Rendering templates in a frameworkless project
- Using Knockout in a frameworkless project
- Why I stopped using Asynchronous Module Definitions
- Stop using relative paths in our JS
- Anti templating languages
Investigating Kotlin
Writing space invaders in Clojure
- Mission statement
- Drawing a square
- Moving the square
- Attributes and Vectors
- Improving my workflow
- Adding more state
- Mutating lots of state
- Adding maps
- Keyboard input
- Adding items to a sequence
- Refactoring state transition
- More idiomatic clojure
- Adding collision detection
- Functional difficulty levels
- This is where I realised how bad it was
My relationship with SOLID
Cascalog and the OHD Platform
Being agile, and having a work life balance
A week or so at Hibernating Rhinos
- Working at Hibernating Rhinos
- Adding idle indexes
- Auto idling indexes
- Removing temporary indexes
- Autocompaction of indexes
- Running indexes in memory
- Re-thinking result transformers
- The problem with result transformers
- A new way to look at transformers
- Using transformers outside of querying
- Avoiding ambiguity in transformers
- Custom query inputs in RavenDB
- Investigating RavenDB on Mono again
- Basic operations with LevelDB
- Transactional Guaranteers in LevelDB
- Writing a transaction manager on top of LevelDB
- Streaming large values from LevelDB
- Secondary indexes in LevelDB
- The price of abstraction, LevelDB in RavenDB
Opinions
Project write-ups
Miscellaneous
Learning OMeta with OData in Greece
- Learning OMeta
- Building a JSON Parser
- Building an OData Parser
- Starting with OData
- Nested resource paths
- Service operations
- Applying modifiers
- Paging support for OData
- Looking at FilterBy
- Recursive expression parsing
- Not the results you are looking for
- Arithmetic operators
- Precedence grouping
- Filtering functions
- The final query bits
- The end product
Everything, by year
2023
2021
2020
- Encoding h264 with Nvidia
- CUDA Context Management with NvEnc
- Decoding h264 with Nvidia
- Exploring the NVIDIA code samples and docs
- Getting started with NVEnc
- Blogging the mundane
- Purerl Updates - Message Routing From Legacy Code
- Purerl Updates - Monitors in Stetson and Pinto
- Purerl Updates - Arbitrary messages and Stetson handlers
- Purerl Updates - Arbitrary messages and handle_info in gen servers
- Purerl updates - Typed routes in Stetson
- Updates to Pinto+Stetson - Purerl In Progress
2019
- Purerl - Some questions from #CodeMeshLdn
- Codemesh 2019 - Purerl and OTP talk
- Purescript interop with native Erlang - Interacting with Redis
- Shared code twixt Purescript server and client
- Building a Purescript web server with Stetson and Pinto
- Building on top of OTP with Purescript with Pinto
- The structure of an end-to-end Purescript OTP project
- Introducing Pinto and Stetson - Opinionated Purescript bindings to OTP and Cowboy
2018
2016
2015
2014
- The Ashton Disinterest Curve - Clojure
- The Ashton Disinterest Curve - Javascript and Node
- The Ashton Disinterest Curve - C#
- The Exponential Ashton Disinterest Curve
- I done a keynote on learning dev etc
- The joy of make at jsconfeu
- Indexing support for my clojure document database
- Document storage in my clojure document database
- The InMemory storage for my clojure document database
- The LevelDB storage for my clojure document database
- The core storage protocols for my clojure document database
- The http API for my clojure document database
- The client API for my clojure document database
- Professionalism and TDD in the future
- I wrote a document database in Clojure
- you have ruined javascript
2013
- Clojure dojo-ing at NDC London
- Frameworkless JS - A module per widget
- Frameworkless JS - What jQuery did right
- Frameworkless JS - encapsulation of views
- Frameworkless JS - but we *really* want to use Knockout for that bit
- Frameworkless JS - rendering templates
- Starting the frameworkless JS project
- Frameworkless JS - an example
- Primary-Secondary and when it isn't
- This consultant shows you one weird trick to take down a managed database
- Refactoring the Clojure method I am least proud of in CravenDB
- On Testing and the REPL in Clojure
- Perception is fleeting, OSS in .NET
- I worry too
- An introduction to the OHD platform via REPL driven development
- A Rob Update - A busy few months
- Impatiently learning Cascalog - Part 4
- Impatiently learning Cascalog - Part 3
- Impatiently learning Cascalog - Part 2
- The use of Clojure in the CDEC Open Health Data Platform
- Impatiently learning Cascalog - Part 1
- An ode to Sebastien Lambla
- Don't be a super hero
- I am free again
- jQuery is not a framework but I avoid using it too
- Grunt+browserify+npm+application=success
- Look ma, no frameworks
- Learn functional programming with me - but rob, it needs to be more composable
- Learn functional programming with me - functional difficulty levels
- Working for free and what it taught me
- Learn functional programming with me - adding collision detection to the game
- Change it Up - A Tekpub thing
- Learn functional programming with me - more idiomatic Clojure
- Ruby on Rails and the Phantom Menace
- Company spotlight - Featurist
- Learn functional programming with me - refactoring my state transitions
- Learn functional programming with me - Adding items to a sequence
- Learn functional programming with me - keyboard input for our red square
- Stand-ups are a crutch
- Learn functional programming with me - Improving our data structure with maps
- Learn functional programming with me - Mutating lots of state
- Learn functional programming with me - Adding lots more state
- Learn functional programming with me - improving my workflow
- A comparison of various JS frameworks using cold hard data
- I'm leaving .NET
- Looking at Kotlin - The rest of it
- Looking at Kotlin - Fun with functions
- Looking at Kotlin - Kicking the Java Inheritance Addiction
- Looking at Kotlin - Classes and Functions
- Looking at Kotlin - a few notes made
- Evented Github Adventure - Sentiment Analysis of Github Commits
- Evented Github Adventure - Temporal averages
- Evented Github Adventure - Crossing the streams to gain real insights
- Evented Github Adventure - Temporal queries, who doesn't trust their hardware
- Evented Github Adventure - Who writes the sweariest commit messages
- Evented github adventure - database storage and backing up
- Evented Github Adventure - Emitting Commits as their own events
- Less abstract, pumping data from Github into the EventStore
- Creating a projection per stream in the EventStore
- Re-partitioning streams in the Event Store for better projections
- Basic projections in the EventStore
- Pushing data into streams in the EventStore
- Playing with the EventStore
- OMeta OData ODear - polishing it off
- The final OData query bits, yes we're nearly there
- Parsing those pesky filtering functions in OData
- Precedence grouping, you first.. no you (Odata parser)
- Adding arithmetic operators to our OData parser
- These are NOT the results you are looking for - OData parser
- Recursive expression parsing in our OData filter parser
- Our OData parser - looking at filterby
- Paging support in our OData parser
- The OData parser - applying modifiers to our query
- Parsing OData - service operations
- Parsing OData - nested resource paths
- Writing an OData parser - starting at the beginning
- Building an OData parser in OMeta
- Building a basic JSON parser in OMeta
- Learning OMeta in Greece
- I am interested in talking about work
- My relationship with SOLID - The overloaded D
- My relationship with SOLID - Seeing I to I
- My relationship with SOLID - The misunderstood L
- My relationship with SOLID - The big O
- My relationship with SOLID - Starting with S
- A note on working hours and working at home
- Why I stopped using AMD
- Stop using relative paths in your JavaScripts
- This week, let's create a start-up - Day 5
- This week, let's create a start-up - Day 4
- This week, let's create a start-up - Day 3
- This week, let's create a start-up - Day 2
- This week, let's create a start-up - Day 1
- This week, let's create a start-up
- The fallacy of the Dreyfus model in software development
- The price of abstraction - using LevelDB in RavenDB
- Secondary indexes on top of LevelDB
- Streaming large values from LevelDB
- Uncle Bob's viewpoint considered harmful
- Writing a transaction manager on top of LevelDB
- Transactional guarantees on top of LevelDB
- Basic operations with LevelDB
- Investigating RavenDB on Mono for reals
- Custom query inputs in RavenDB
- Talking at DevSum 2013
- RavenDB - Avoiding ambiguity in result transformers
- Result transformers - not just for querying
- RavenDB ResultTransformers - a new way of looking at things
- The problem with result transformations in RavenDB
- Re-thinking result transformations in RavenDB
- Next, we run new RavenDB indexes in memory
- Automatically merging indexes in RavenDB for optimal performance
- Getting rid of temporary indexes in RavenDB
- Auto idling auto indexes in RavenDB
- Adding idle indexes to RavenDB
- Working at Hibernating Rhinos
- Lots of small things
- Never write code again
2012
- Why work for free
- I am not looking for a job
- Learn Functional Programming With Me - Attributes And Vectors
- Learn Functional Programming With Me - Moving The Square
- Learn Functional Programming With Me - Drawing A Square
- Learn Functional Programming With Me - A Mission Statement
- Github Live
- Anatomy of a 48 hour HTML5-JS Game
- Asset packaging in browser based games
- Anti-templating languages
- Lessons learned building a multiplayer game in NodeJS and WebGL
- Your container is not wanted here
2011
- What does it look like when I code
- Hoverbattles Released (and more)
- A relaxed attitude towards the pragmatic delivery of 'okay' software
- CQRS is too complicated
- RavenDB Consultancy
- SLJS.org - a Silverlight - Html/JS converter
- 5 reasons to give node.js some love
- Static analysis of Simple.Data code to generate databases
- Cloud9 on Cygwin with Node and Npm
- WebGl Pong is alive
- A Javascript game loop for multiplayer WebGL
- Speaking at NDC2011
- Why WebGL and node.js (and websockets) are important
- Service location is (not) always evil
- My DDD9 Experience (and slides from my talks)
- CUDA - A basic parallelised task
- CUDA - A brief looksee into the world of generalised GPU computing
- A word of advice for recruiters
2010
- RavenDB - Document design with collections
- RavenDB - StackOverflow style voting with Live Projections
- RavenDB on Mono
- Adventures in Mono
- I have handed in my notice and am looking for a job
- RavenDB - The Image Gallery Project (XVI) - Adding Edit Functionality (I)
- Oredev - Post conference review
- RavenDB-The Image Gallery Project (XV) - Improving Tag Search with AutoComplete
- RavenDB - The Image Gallery Project (XIV) - Implementing a real-time tag search
- RavenDB-Image Gallery Project (XIII)- Understanding Indexes
- RavenDB - The Image Gallery Project (XII) - Integrating our view with ASP.NET MVC
- RavenDB - The Image Gallery Project (XI) - Our First View
- RavenDB - Photo Gallery Project (X)-File Storage
- RavenDB - Image Gallery Project (IX)-The Basic Image Model
- #NhDay - A post-mortem debugging session
- Upcoming talks (mostly on RavenDB)
- RavenDB - Image Gallery Project (VIII) - Signing In + RavenDB Testing
- RavenDB - Image Gallery Project (VII) - User Registration
- Working with RavenDB Documents + Entities - The Debate
- RavenDB - Image Gallery Application (VI) - Entities, Repositories and Commands
- RavenDB - Image Gallery Project (V) - The Structure
- RavenDB - Image Gallery Project (IV) -Tracking Documents
- RavenDB - Image Gallery Project (III) - The Application Lifecycle
- RavenDB-Image Gallery Project (II) - Setting Up
- RavenDB - Image Gallery Project (I)
- DDD9 Announced
- TwitterFS - A HackCamp 2010 Production
- Sqlite-Csharp and NHibernate
- RavenDB & CouchDB - Map and Reduce
- RavenDB & CouchDB - Basic Queries
- RavenDB - What's the difference
- RavenDB - How stale do you want it
- RavenDB - The HiLo what how and why
- RavenDB - Basic usage considerations
- RavenDB - An Introduction
- Playing with RavenDB - A Precursor
- A gotcha for those Fluent interfaces
- AutoPoco 0.4 released - features features features
- Why diversity and choice are good things
- AutoPoco v0.2 Released
- AutoPoco v0.1 Released
- Multi-tenancy in ASP.NET MVC - Controller Actions (Part II)
- Multi-tenancy in ASP.NET MVC - Controller Actions (Part I)
- DDD8 Feedback... feedback
- Multi-tenancy in ASP.NET MVC - Views
- Multi-tenancy in ASP.NET MVC - DDD8 Video
- Multi-tenancy in ASP.NET MVC - Breaking it down
- Multi-tenancy in ASP.NET MVC - Why do we want it
- Multi-tenancy and ASP.NET MVC
- DDD8 - Post Event