Posts

  1. Impressions of React and TypeScript from an Elixir/Elm developer

    Shares first impressions of React and TypeScript from the perspective of an experienced Elixir and Elm developer, comparing mainstream and niche development approaches.

  2. Blameless culture and individual responsibility

    Explores the balance between blameless culture and individual responsibility in software development.

  3. Brief thought

    My practical experience with microservices bears out what I always thought about them: 99% of the time, they’re introducing more complexity and cost than can be justified, Conway’s law notwithstanding.

  4. Test code smells catalogue

    Presents a comprehensive catalogue of test code smells, addressing gaps in existing resources and covering important aspects of good test suite design.

  5. Trojan horses of software architecture: message passing

    Examines how message passing can create more problems than it solves in software architecture, drawing from experience with large embedded C++ codebases.

  6. A few notes on a positive engineering experience

    Documents engineering practices that contributed to a successful software team experience, highlighting autonomy, collaboration, and effective development processes.

  7. Brief thought

    Still feeling disappointed that Elm didn’t take over the world while poor abstractions like React are extremely popular.

  8. Brief thought

    If null is a billion dollar mistake, then OOP is a trillion dollar mistake.

  9. Experience with using Tailwind in Phoenix LiveView

    Shares practical experience with Tailwind CSS in Phoenix LiveView projects, addressing initial scepticism and exploring the value proposition of utility-first CSS.

  10. Thoughts on Elixir, Phoenix and LiveView after 18 months of commercial use

    Reflects on 18 months of commercial Elixir, Phoenix, and LiveView development, covering how the stack exceeded expectations and comparing it to previous experience with Elm.

  11. An elm-review rule to generate JSON decoders and encoders from a JSON sample

    Presents an elm-review rule that generates JSON decoders and encoders from sample JSON, leveraging Jeroen Engels' static code analysis tool.

  12. Parse URLs with elm/url

    Demonstrates URL parsing with elm/url, building on previous Browser.application and routing concepts to handle URL patterns in Elm applications.

  13. Generating pipeline and applicative decoders with json2elm

    Announces new features in json2elm for generating pipeline and applicative decoder patterns, expanding the tool's capabilities.

  14. Generating elm/json decoders with elm/json decoders

    Introduces json2elm, a tool for generating elm/json JSON decoders, encoders, and type definitions from sample JSON strings.

  15. Elm Catalog update: 1000+ packages and search

    Celebrates the Elm Catalog reaching over 1000 packages and introduces search functionality, making package discovery even more accessible.

  16. elm-ui: The CSS Escape Plan is in early access

    Announces early access to 'elm-ui: The CSS Escape Plan', an extended guide/manual for elm-ui.

  17. More examples added to elm-ui patterns

    Announces the addition of several new examples to the elm-ui patterns collection, expanding the available resources for elm-ui developers.

  18. Syntax highlighting for code snippets in Keynote with Pygments

    Creates an Automator workflow for applying syntax highlighting to code snippets in Keynote presentations using Pygments, with clipboard-based text processing.

  19. Compile-time checks on values in a list with phantom types

    Explores using phantom types in Elm to implement compile-time constraints on list values, building on Jeroen Engels' work on type-level validation.

  20. Announcing elm-ui Patterns: a collection of elm-ui examples

    Introduces elm-ui Patterns, a collection of practical examples for elm-ui, inspired by Ricardo García Vega's elm-css patterns project.

  21. Elmstatic 0.7.0: improved performance

    Announces Elmstatic version 0.7.0 with substantially improved performance through parallel HTML page generation.

  22. An introduction to elm-animator, and using it with elm-ui

    Introduces Matthew Griffith's elm-animator package for animations in Elm and demonstrates how to integrate it with elm-ui for enhanced user interfaces.

  23. Simple performant CSS animations in Elm with Animate.css

    Shows how to integrate Animate.css for performant CSS animations in Elm applications, bringing proven animation techniques to functional programming.

  24. Generating sitemaps with Elm

    Demonstrates how to generate XML sitemaps for websites using Elm, helping search engines index content more effectively.

  25. Elm Catalog now lists tools in addition to packages

    Announces that the Elm Catalog has expanded to include development tools alongside packages, making it a more comprehensive resource for Elm developers.

  26. Generating land-constrained geographical point grids with PostGIS

    Demonstrates how to generate geographical point grids constrained to land areas using PostGIS, applied to visualising EV range on maps.

  27. What effects of the climate and ecological crisis will unfold this century?

    Explores the unfolding effects of the climate and ecological crisis expected this century, addressing widespread misunderstanding about the current situation and response efforts.

  28. Page state in Elm

    Addresses how to pass data between pages in Elm applications, specifically handling product selection from a list page to an individual product page.

  29. Elm Package Catalog: Complete and improved

    Announces the completion and improvements to the Elm Package Catalog, providing a more comprehensive resource for discovering Elm packages.

  30. Type-safe markup for your static site with Elmstatic and elm-markup

    Demonstrates how to use type-safe markup in static sites by combining Elmstatic with elm-markup for improved content authoring.

  31. Launching a macOS application with a custom path

    Explains how to configure macOS applications launched from Dock or Launchpad to run with custom PATH environments, overcoming the default limited path.

  32. Elmstatic: better performance and live reload with watch mode

    Announces improvements to Elmstatic including better performance and live reload functionality with watch mode for enhanced development experience.

  33. Get improved Debug.log output in the browser console

    Shows how to improve Debug.log output in browser consoles when developing Elm applications, enhancing the debugging experience.

  34. Technology retrospective 2013-2017

    Reflects on technologies and development practices used during 4 years of product development, focusing on managing complexity with constrained resources.

  35. An introduction to elm-markup by way of Elmstatic

    Introduces elm-markup through practical examples using Elmstatic, demonstrating how this markup language integrates with Elm development workflows.

  36. Elm community and project stats: 2019 update

    Provides updated statistics about the Elm community and project ecosystem as of 2019.

  37. Elm Package Catalog: Explore Elm packages and find the package you need

    Introduces a catalog to help developers discover Elm packages more easily, addressing the challenge of finding relevant packages when learning the language.

  38. How I generate static HTML from Elm code in Elmstatic

    Explains the technical approach behind Elmstatic, a static site generator that enables using Elm's html and elm-css instead of plain HTML and CSS.

  39. Elmstatic, my Elm-to-HTML static site generator, upgraded to Elm 0.19!

    Announces the upgrade of Elmstatic to Elm 0.19, overcoming challenges with elm-static-html-lib dependency and providing a new implementation.

  40. Combining HTTP requests with Task in Elm

    Demonstrates how to make sequential HTTP requests in Elm using Task, avoiding the complexity of managing multiple messages and intermediate state in the update function.

  41. Map, filter, fold

    Explains three fundamental functional programming operations in Elm: mapping (applying functions to elements), filtering (excluding elements), and folding (reducing a list to a single element).

  42. How UICards work: UI within UI in Elm

    I share my experience with implementing UICards in Elm, showing how they let me create interactive UI elements within a single application model, while also tackling the challenges of message handling and state management along the way.

  43. UICards: create UIs without the laborious reload-navigation-input test loop

    I found that UICards can really streamline the UI design process by letting me see and interact with different states of my components all in one place, saving me from the tedious back-and-forth of reloading and navigating through my app.

  44. Practical Elm book: Elm 0.19 update published

    Announces the publication of the Elm 0.19 update for Practical Elm book, explaining why Elm is worth learning and what the book covers for practical application development.

  45. Build complex forms with validation in Elm

    Demonstrates building complex forms with validation using the hecrj/composable-form package, showing type-safe, maintainable form handling with field composition and custom validation.

  46. Restarting the Elm Weekly newsletter

    Announces the revival of the Elm Weekly newsletter to help the community stay up-to-date with articles, packages, and job postings in the Elm ecosystem.

  47. Make sure your views are bug-free by testing them with elm-test

    Shows how to test Elm view functions using elm-test's HTML testing modules to avoid tedious manual testing by verifying DOM structure and user interactions.

  48. elm-ui: Forget CSS and enjoy creating UIs in pure Elm

    Introduction to elm-ui package for building UIs in pure Elm without CSS, demonstrated through creating a simplified Slack-like layout with responsive design.

  49. The missing part of the Elm guide: URL handling with Browser.application

    Fills the gap in the Elm 0.19 guide by demonstrating how to use Browser.application for URL handling, navigation, and single-page application routing.

  50. Minimal static boilerplate for Ellie

    Provides minimal boilerplate code for static content experiments in Ellie, including a shorter alternative that avoids the need for complex Program setup.

  51. The basic steps to publish a package with Elm 0.19

    Step-by-step guide to publishing Elm packages with 0.19, covering local development, testing, requirements, versioning, and the publishing process via GitHub.

  52. A straightforward introduction to custom elements

    Comprehensive introduction to custom elements and Shadow DOM for integrating complex JavaScript components into Elm applications, including practical examples and polyfill setup.

  53. How to generate JSON from Elm values using Json.Encode

    Explains how to convert Elm values back to JSON strings using Json.Encode, covering complex nested structures and integration with HTTP requests and ports.

  54. Introduction to the elm/parser package

    Practical introduction to the elm/parser package through building a phone number parser, demonstrating parser combinators and handling complex structured text input.

  55. Practical Elm book release date & Elm 0.19 updates

    Announces the final release date for Practical Elm book and provides updates on Elm 0.19 developments including new installers and package updates.

  56. Elm 0.19: details of what's new, how to install/upgrade, reading list

    Comprehensive overview of Elm 0.19 changes including language simplifications, compiler improvements, library updates, and installation/upgrade instructions with performance gains.

  57. Learning Elm in 2018: Comprehensive List of Resources

    Provides a comprehensive curated list of Elm learning resources in 2018, including books, video courses, talks, guides, and community forums for all skill levels.

  58. Some thoughts on splitting Elm code into multiple files

    Discusses principles and best practices for organising Elm applications into modules, handling messages across files, and managing the single update function architecture.

  59. How Json.Decode.Pipeline chaining works

    Explains the technical mechanics behind Json.Decode.Pipeline's chaining syntax, showing how partial application and applicative functors enable the convenient decoder DSL.

  60. Practical Elm for a Busy Developer: early access

    Announces the early access availability of the Practical Elm book for busy developers, focusing on intermediate-level practical topics rather than basic syntax.

  61. Json.Decode tricks: decode 8+ fields and nested sub-objects

    Shows techniques for decoding JSON with more than 8 fields and handling nested sub-objects using Json.Decode beyond the standard map functions.

  62. Using modules in Elm

    Explains how to organise Elm code using modules, covering module creation, imports, exports, and best practices for splitting code into manageable files.

  63. Elmstatic 0.3.1: generate subsections, make index pages, add page aliases

    Announces Elmstatic 0.3.1 features including subsections with their own posts, index pages, and page aliases for better site organisation.

  64. Introducing Elmstatic: an Elm-to-HTML static site generator

    Introduces Elmstatic, a static site generator that allows writing pages in Elm with support for CSS generation, Markdown posts, and RSS feeds.

  65. Decoding recursive JSON in Elm

    Walks through the challenges of implementing recursive JSON decoders in Elm, showing how to avoid compiler and runtime errors using `Json.Decode.lazy` and proper type structure.

  66. Generating static HTML from Elm code with elm-static-html-lib

    Explains the technical workings of elm-static-html-lib and how it converts Elm views into HTML strings by creating temporary Elm applications and using native JSON conversion.

  67. Is Elm going stale? The numbers say no.

    Uses actual data and statistics to address concerns about Elm's development activity, comparing community metrics with other functional programming languages like Haskell and PureScript.

  68. How to extract values from union types in Elm

    Demonstrates how to extract values from union types in Elm using case expressions, including the destructuring shortcut for single-tag union types.

  69. How to read Elm types like "Html msg"

    Explains how to understand generic types like `Html msg` in Elm by thinking of them as data structures that contain values of the specified type somewhere inside.

  70. Decoding JSON to nested record fields in Elm

    Explores different approaches to decoding complex JSON with many fields in Elm, ultimately settling on nested records as the cleanest solution to avoid extensible record limitations.

  71. Lessons learned from 4 years of using Cordova in production

    Shares practical insights from four years of developing a complex iOS and Android application using Cordova with about 20 plugins and advanced features like maps, camera, and offline capabilities.

  72. The case against ORMs

    Argues against using ORMs based on accumulated experience, focusing on ORMs that attempt to reimplement SQL rather than lightweight database helper libraries.

  73. Four levels of time handling in a database

    Breaks down database time handling into four complexity levels, from basic date storage to advanced temporal data management, based on experience working with PostgreSQL time features.

  74. Debugging complex PostgreSQL queries with pgdebug

    Explores debugging techniques for complex PostgreSQL queries, introducing pgdebug as a debugging tool.

  75. Back of the napkin calculations for Powersat by Ben Bova

    Analyses the feasibility of the space-based solar power satellite described in Ben Bova's 2005 novel, calculating the massive launch requirements and questioning the technological assumptions.

  76. Using Trello to track development work

    Describes how to effectively use Trello for tracking software development work across a team of developers and testers, emphasising lightweight process and minimal friction.

  77. Notes on implementing push notifications via Node.js

    Provides practical notes on implementing push notifications for iOS and Android applications using Node.js, addressing the complexity of the various moving parts.

  78. Writing readable SQL

    Shares techniques for writing readable SQL queries, particularly useful for complex 100+ line queries written without ORMs.

  79. High performing software developers: false positives

    Discusses how managers can be misled by developers who appear highly productive but produce unmaintainable code, examining the difference between short-term output and long-term quality.

  80. Misapplied abstractions and unnecessary complexity

    Examines how misapplied abstractions lead to unnecessary complexity in software development, drawing on Dijkstra's principles of simplicity and elegance.

  81. Haskell diary #6

    Applies Haskell to a real-world problem involving graph analysis, finding cycles in database-loaded graphs and writing results back.

  82. Haskell diary #5

    Explores the practical side of Haskell by attempting to build a minimal web application with database connectivity using Yesod and Scotty frameworks.

  83. Haskell diary #4

    Learning journal covering Haskell homework challenges, pattern matching on constructors, and reflections on the learning approach.

  84. Haskell concepts I'm learning

    Maps out the new concepts encountered while learning Haskell, highlighting why it's particularly challenging compared to other programming languages.

  85. Haskell diary #3

    Learning journal documenting work on CIS194 Homework 2, exploring Haskell constructs and functional programming concepts.

  86. Haskell diary #2

    Learning journal covering CIS194 Homework 1, exploring basic Haskell interactivity and fundamental programming concepts.

  87. OOP vs FP: a couple of thoughts

    Compares object-oriented and functional programming paradigms, focusing on the key difference of state management between the two approaches.

  88. Haskell diary #1

    First entry in a learning diary documenting the journey of learning Haskell and functional programming, starting with basic syntax and fundamentals.

  89. A list of Haskell learning resources

    Curated collection of Haskell learning resources for beginners, compiled during the author's functional programming learning journey.

  90. Getting started with Haskell

    Practical guide to setting up a Haskell development environment, focusing on tools and setup steps for learning functional programming.

  91. Functional programming: the next big thing?

    Reflects on the growing popularity of functional programming and whether it will become mainstream, drawing from past experiences with technology adoption.

  92. Visualising PostGIS data from the shell

    Explores methods for quickly visualising PostGIS query results from the command line, addressing the lack of convenient tools for ad hoc spatial data exploration.

  93. Uninstalling things installed via .pkg installers

    Addresses the lack of built-in uninstall mechanism for .pkg installers on macOS, presenting both automated and manual removal methods.

  94. Setting up Mac-like zsh keyboard shortcuts on a Mac

    Practical guide to configuring zsh keyboard shortcuts on macOS, navigating the complexity of shell configuration and character sequences.

  95. Showing a random quote from a file on the desktop

    Step-by-step instructions for displaying random quotes on the desktop using NerdTool and simple shell commands.

  96. Computing ideas retrospective

    Reflects on fascinating computing talks and demos from history, including Doug Engelbart's groundbreaking 1968 presentation and other influential works.

  97. Installing PostGIS with Homebrew

    Step-by-step instructions for installing PostGIS using Homebrew on macOS, since official documentation didn't cover this method.

  98. Why do we seem to be reinventing the wheel in technology all the time?

    Explores why technological advancement often appears to reinvent the wheel, examining how hardware constraints, abstraction levels, and innovation cycles drive this seemingly repetitive process.

  99. A micro-overview of some interesting HTML 5 features on iOS and Android

    A brief overview of less known HTML5 features and capabilities available on iOS and Android mobile devices as of early 2013.

  100. How to make web apps use the full screen on iPhone 5

    Explains how to configure web apps to use the full screen on iPhone 5 devices, addressing the issue of black bands when launched from Home screen shortcuts.

  101. JavaScript geolocation API broken in iOS 6 Safari

    Documents a bug with the JavaScript geolocation API in iOS 6 Safari and provides context about the issue.

  102. 98% of scientists agree that climate change is caused by human activity

    Study showing that 97-98% of actively publishing climate researchers support the tenets of anthropogenic climate change.

  103. My submission to the New Zealand Science Challenges

    Submission proposing climate change as the most urgent issue, with research themes for renewable energy, sustainable transport, and climate mitigation.

  104. Google Maps tile overlay & 45 degree imagery gotcha

    How to disable Google Maps' 45 degree imagery feature that interferes with tile overlays.

  105. Introduction to Backbone.js for Rails developers

    Presentation slides introducing Backbone.js framework to Rails developers, given at WellRailed Rails group in Wellington.

  106. Brief thought

    We are disconnected from nature - a very good observation from David Suzuki in an interview:

    What’s happened is a fundamental shift in the last 100 years that now blinds us from being able to see our place on the planet. 85 per cent of us in Canada now live in big cities. We’ve been utterly transformed in 100 years from being a farming animal to a big city dweller. And in the big city, people think, “As long as we have parks out there, where we can go camping and playing in, well who needs nature? My important thing is my job; I need a job in order to be able to go out and buy the things I want.”

  107. WordPress A/B testing with Google Analytics

    Guide on how to set up A/B testing for WordPress sites using Google Analytics Content Experiments feature.

  108. Some thoughts on Cucumber and Behaviour Driven Development

    Explores the advantages of using Cucumber for behaviour-driven development (BDD), highlighting how it forces high-level thinking and creates readable specs that double as tests. Includes a comparison with RSpec and discusses why BDD focuses on user-visible system behaviour.

  109. Using CoffeeScript in RubyMine 3

    A guide to setting up CoffeeScript in RubyMine 3 with the CoffeeBrew plugin and configuring the compiler output window. Includes advantages of CoffeeBrew over coffeescript-idea plugin.

  110. The benefits of the web as a platform

  111. CoffeeScript: an awesome alternative to JavaScript

  112. Why enums in the database are a good idea

  113. Using software specs effectively: exploration and time estimates

  114. Setup email notifications for mdadm (with a bit of Ruby)

  115. Delete expired ActiveRecord based sessions regularly

  116. How to create long integer or double precision database columns in Rails

  117. Using ActiveSupport::Dependencies outside a Rails project

  118. Add case insensitive finders by extending ActiveRecord