<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Home Page on Adam Bard, Handsome Web Developer</title><link>https://adambard.com/</link><description>Recent content in Home Page on Adam Bard, Handsome Web Developer</description><generator>Hugo -- gohugo.io</generator><language>en-us</language><lastBuildDate>Fri, 31 Mar 2023 00:00:00 +0000</lastBuildDate><atom:link href="https://adambard.com/feed.xml" rel="self" type="application/rss+xml"/><item><title>One month with Github Copilot</title><link>https://adambard.com/blog/one-month-with-copilot/</link><pubDate>Fri, 31 Mar 2023 00:00:00 +0000</pubDate><guid>https://adambard.com/blog/one-month-with-copilot/</guid><description>&lt;p>I&amp;rsquo;ve been trialling Github Copilot for some weeks now, and so far I&amp;rsquo;ve been very impressed. It&amp;rsquo;s clear to me that this and similar tools will become a permanent part of many programmers&amp;rsquo; toolkits (at least until the AI gets so clever that it obviates our jobs completely).&lt;/p></description></item><item><title>Transitioning Later for Reddit from Docker Machines to Digital Ocean Kubernetes</title><link>https://adambard.com/blog/transitioning-from-docker-machines-to-kubernetes/</link><pubDate>Sun, 26 Jul 2020 00:00:00 +0000</pubDate><guid>https://adambard.com/blog/transitioning-from-docker-machines-to-kubernetes/</guid><description>&lt;p>I recently completed a migration from my old docker-machine-based infrastructure (so 2016!) to &lt;a href="https://www.digitalocean.com/products/kubernetes/?refcode=2c5db3effb6f&amp;amp;utm_campaign=Referral_Invite&amp;amp;utm_medium=Referral_Program&amp;amp;utm_source=CopyPaste">Digital Ocean&amp;rsquo;s hosted kubernetes service&lt;/a>.
The bulk of the work was completed in a single evening. It went almost seamlessly, but not so seamlessly that I wasn&amp;rsquo;t able to learn a few things.
The goal of this writeup is not to serve as comprehensive documentation, but hopefully you&amp;rsquo;ll take away some ideas about how to get your
own setup rolling.&lt;/p></description></item><item><title>Getting a handle on Reduce</title><link>https://adambard.com/blog/getting-a-handle-on-reduce/</link><pubDate>Mon, 17 Dec 2018 00:00:00 +0000</pubDate><guid>https://adambard.com/blog/getting-a-handle-on-reduce/</guid><description>&lt;p>Although traditional algol-inspired languages remain dominant, over the past
decade or so, functional programming techniques utilizing
immutable data structures have seen widespread adoption in a variety of
domains. From React and friends on the frontend to Map-Reduce and the
vast ecosystem of thus-inspired data warehousing systems that power some of
the world&amp;rsquo;s largest software applications, the ability to navigate
such applications is now a must-have skill for many programmers.&lt;/p>
&lt;p>The subject of today&amp;rsquo;s article is a &lt;a href="https://en.wikipedia.org/wiki/Higher-order_function">higher-order function&lt;/a> called &lt;code>reduce&lt;/code>,
also known as &lt;code>fold&lt;/code>, &lt;code>aggregate&lt;/code>, and others. Reduce is a fundamentally
useful tool, but I find that many developers have trouble grasping and
using it. My hope here is to make an approachable introduction to &lt;code>reduce&lt;/code>.&lt;/p></description></item><item><title>Programatically Liquidating my Steam Inventory</title><link>https://adambard.com/blog/programatically-liquidating-my-steam-inventory/</link><pubDate>Wed, 23 May 2018 00:00:00 +0000</pubDate><guid>https://adambard.com/blog/programatically-liquidating-my-steam-inventory/</guid><description>&lt;p>I don&amp;rsquo;t know about you, but every so often my Steam Inventory gets a bit out of control.
I have no use for Don&amp;rsquo;t Starve trading cards, but it&amp;rsquo;s not really worth my time to individually
sell each item for a few cents. However, what is worth my time, apparently, is creating a
script to do it for me. This turned out to be quite a winding road, which I&amp;rsquo;ve documented here.&lt;/p></description></item><item><title>One-box stream processing with CSP</title><link>https://adambard.com/blog/stream-processing-core-async/</link><pubDate>Sun, 18 Feb 2018 00:00:00 +0000</pubDate><guid>https://adambard.com/blog/stream-processing-core-async/</guid><description>&lt;p>If you&amp;rsquo;re like me (that is, employed by an ad tech company), stream processing is usually
associated with frameworks like &lt;a href="https://storm.apache.org/">Storm&lt;/a>,
&lt;a href="https://flink.apache.org/">Flink&lt;/a>, &lt;a href="https://spark.apache.org/streaming/">Spark Streaming&lt;/a>, and other such solutions. However, a
lot of real-life software can be described as stream processing &amp;ndash; data comes
in one end, is transformed or aggregated, and goes somewhere else. Many of these
workloads don&amp;rsquo;t justify the overhead of a stream processor, but that doesn&amp;rsquo;t mean
they can&amp;rsquo;t benefit from some of the lessons of stream processing systems.&lt;/p></description></item><item><title>Running a Side Business as a Programmer: The story of Later for Reddit</title><link>https://adambard.com/blog/later-for-reddit-in-review/</link><pubDate>Tue, 19 Dec 2017 00:00:00 +0000</pubDate><guid>https://adambard.com/blog/later-for-reddit-in-review/</guid><description>For the past 5 years, I&amp;rsquo;ve run a website called Later for Reddit. For the past 2 years, it&amp;rsquo;s actually been making money. Here&amp;rsquo;s how that happened.
I used to spend a lot of time on Reddit (insert Mitch Hedberg joke here). I also used to spend a lot of time writing side projects, often late into the night. One problem I frequently had at the intersection of those two hobbies was that, when I posted my sweet new thing to Reddit after I finished getting it ready at 2am, it never had a chance of getting seen.</description></item><item><title>Javascript FP design pattern: Binding functions</title><link>https://adambard.com/blog/javascript-design-pattern-binding-functions/</link><pubDate>Sat, 16 Sep 2017 00:00:00 +0000</pubDate><guid>https://adambard.com/blog/javascript-design-pattern-binding-functions/</guid><description>&lt;p>Ok, ok, monads have been done. They&amp;rsquo;ve &lt;a href="https://adambard.com/blog/acceptable-error-handling-in-clojure/">even&lt;/a>
been &lt;a href="https://adambard.com/blog/introducing-failjure/">done&lt;/a> by &lt;a href="https://adambard.com/blog/oo-vs-functional-form-validation/">me before&lt;/a>.
But, functional programming is still popular, monads are still very useful for programming
in an FP style, and people are entering the field every day. So here&amp;rsquo;s another attempt at
an approachable introduction to &lt;em>usefully&lt;/em> apply this pattern to everyday coding problems.&lt;/p></description></item><item><title>Bucklescript vs Elm vs Typescript: Typed Javascript showdown!</title><link>https://adambard.com/blog/reason-vs-elm-vs-typescript/</link><pubDate>Sun, 03 Sep 2017 00:00:00 +0000</pubDate><guid>https://adambard.com/blog/reason-vs-elm-vs-typescript/</guid><description>&lt;p>You, a web developer, have probably heard of &lt;a href="https://www.typescriptlang.org/index.html">Typescript&lt;/a>, may have heard of &lt;a href="http://elm-lang.org/">Elm&lt;/a>, and
you might even have heard of &lt;a href="https://bucklescript.github.io/bucklescript/Manual.html">Bucklescript&lt;/a>/&lt;a href="reasonml.github.io">ReasonML&lt;/a> as well. Each of these
represents a compiles-to-javascript language with strong type support, but each has some different opinions,
philosophies, and features.&lt;/p>
&lt;p>In this article I&amp;rsquo;ll walk you through the features of each of these options and compare their build ecosystems,
editor tooling, and javascript interop. In addition, as is my habit, I&amp;rsquo;ve written up a small example in each of these languages. (Well, actually,
I&amp;rsquo;ve taken one of Elm&amp;rsquo;s small demos and re-created it in the other two). I&amp;rsquo;ll discuss my impressions
of the tooling and the coding experience along the way.&lt;/p></description></item><item><title>OCaml for the impatient</title><link>https://adambard.com/blog/getting-started-with-ocaml/</link><pubDate>Mon, 28 Aug 2017 00:00:00 +0000</pubDate><guid>https://adambard.com/blog/getting-started-with-ocaml/</guid><description>&lt;p>Ocaml is a rad language with some regrettably underdocumented parts. Or, perhaps, overdocumented &amp;ndash;
since OCaml attracts people who are interested in rigorous correctness, what documentation exists tends to be rigorous
and correct, and also tedious. This guide will be none of those. Let&amp;rsquo;s go!&lt;/p></description></item><item><title>Best Practices for Javascript Library Versioning</title><link>https://adambard.com/blog/on-library-versioning/</link><pubDate>Sun, 13 Aug 2017 00:00:00 +0000</pubDate><guid>https://adambard.com/blog/on-library-versioning/</guid><description>&lt;p>I spend most of my time on this blog talking about Clojure, but IRL I work on
a lot of projects written in a lot of languages. Lately, much of my time has been spent writing and maintaining
React-based frontends in Javascript.&lt;/p>
&lt;p>As far as I can tell, no language has solved the problem of dependency management. Some
libraries are better than others, but upgrading dependencies is always an uncomfortable
experience. That being said, I&amp;rsquo;ve &lt;em>never&lt;/em> experienced more pain doing so than in Javascript&amp;rsquo;s ecosystem.&lt;/p></description></item><item><title>Domain modelling with clojure.spec</title><link>https://adambard.com/blog/domain-modeling-with-clojure-spec/</link><pubDate>Sun, 06 Aug 2017 00:00:00 +0000</pubDate><guid>https://adambard.com/blog/domain-modeling-with-clojure-spec/</guid><description>&lt;p>&lt;a href="https://clojure.org/about/spec">Clojure.spec&lt;/a> is, among other things, Clojure&amp;rsquo;s official answer to tools like &lt;a href="https://github.com/clojure/core.typed">Typed Clojure&lt;/a> and
&lt;a href="https://github.com/plumatic/schema">Plumatic&amp;rsquo;s Schema&lt;/a>. It represents an attempt to apply some validation to
data and functions, without compromising Clojure&amp;rsquo;s dynamism and data-is-data philosophy.
In this post, I&amp;rsquo;ll be working through a sample program by first outlining and modelling
it with the help of clojure.spec, then using spec to guide me while I develop the implementation.&lt;/p></description></item><item><title>What programming language should I learn? (2017 edition)</title><link>https://adambard.com/blog/what-programming-language/</link><pubDate>Thu, 23 Mar 2017 00:00:00 +0000</pubDate><guid>https://adambard.com/blog/what-programming-language/</guid><description>&lt;p>I occasionally find someone asking this question in my inbox. I&amp;rsquo;ve learned
that for every person that bothers there are a bunch more with the same question,
so I thought I&amp;rsquo;d take a break from relentlessly plugging my side hustle
&lt;a href="https://laterforreddit.com">Later for Reddit&lt;/a> to answer it publicly.&lt;/p></description></item><item><title>On Advice (featuring just one piece of it)</title><link>https://adambard.com/blog/ideas/</link><pubDate>Fri, 04 Nov 2016 00:00:00 +0000</pubDate><guid>https://adambard.com/blog/ideas/</guid><description>I&amp;rsquo;m perfectly comfortable making wild assertions about which programming technique is better than which other one, but when it comes to handing out general life or career advice, I&amp;rsquo;m a lot stingier than your average blogger 1. Even if I was wildly successful (I&amp;rsquo;m not), it&amp;rsquo;s so difficult to tell, even in retrospect, the difference between the stuff that actually mattered and the stuff that seems like it did but doesn&amp;rsquo;t 2.</description></item><item><title>Basic site monitoring with Riemann</title><link>https://adambard.com/blog/basic-website-monitoring-with-riemann/</link><pubDate>Tue, 23 Aug 2016 00:00:00 +0000</pubDate><guid>https://adambard.com/blog/basic-website-monitoring-with-riemann/</guid><description>&lt;p>&lt;a href="http://riemann.io">Riemann&lt;/a> is a general-purpose event processing system, but its most typical application
is as a place to send and generate metrics about applications. I recently set up a Riemann
server for my personal projects, and I feel like my devops game is stepped up by 1000%.&lt;/p>
&lt;p>Or, at very least, I feel like I know know about it as soon as one of my sites goes down.&lt;/p></description></item><item><title>What&amp;rsquo;s in a namespace?</title><link>https://adambard.com/blog/whats-in-a-namespace/</link><pubDate>Fri, 15 Apr 2016 00:00:00 +0000</pubDate><guid>https://adambard.com/blog/whats-in-a-namespace/</guid><description>&lt;p>Every well-behaved clojure source file starts with a namespace declaration.
The &lt;code>ns&lt;/code> macro, as we all know, is responsible for declaring the namespace
to which the definitions in the rest of the file belong, and generally also
includes some requirements and imports and whatnot. But today (at
Clojure/West, shoutout!) Stuart Sierra made a passing reference to
the internals of &lt;code>ns&lt;/code> during his talk that got me interested.&lt;/p>
&lt;p>But what is a namespace &lt;em>really&lt;/em>?&lt;/p></description></item><item><title>Write and deploy your own self-hosted Readability clone</title><link>https://adambard.com/blog/self-hosted-readability-on-heroku-with-nodejs/</link><pubDate>Tue, 29 Mar 2016 00:00:00 +0000</pubDate><guid>https://adambard.com/blog/self-hosted-readability-on-heroku-with-nodejs/</guid><description>Readability.org is a handy tool, but it also suffers from being useful, popular and free &amp;ndash; the service is (understandably) often down, or slow.
If you&amp;rsquo;re a heavy Readability user, it might interest you to know that there exist many software libraries that attempt to recreate Readability&amp;rsquo;s main function &amp;ndash; pulling the main body of text out of a page laden with ads and other distractions. Some of these work better than others, but Mozilla&amp;rsquo;s Readability.</description></item><item><title>Composible Architecture: A real-world example.</title><link>https://adambard.com/blog/composible-architecture-a-real-world-example/</link><pubDate>Sun, 27 Mar 2016 00:00:00 +0000</pubDate><guid>https://adambard.com/blog/composible-architecture-a-real-world-example/</guid><description>&lt;p>I am the primary maintainer of a significant REST API written using &lt;a href="http://flask-restful-cn.readthedocs.org/en/latest/">Flask-Restful&lt;/a>.
Flask-Restful is a pretty full-featured library for creating REST frameworks with Flask.
It features everything you need to manage routing to class-based resources, a library
for marshalling objects to JSON format, and reqparse, an argparse-inspired library
for writing input parsers.&lt;/p></description></item><item><title>React.js in the small</title><link>https://adambard.com/blog/react-in-the-small/</link><pubDate>Sat, 26 Mar 2016 00:00:00 +0000</pubDate><guid>https://adambard.com/blog/react-in-the-small/</guid><description>&lt;p>I&amp;rsquo;m a big fan of accessible technologies. I get suspicious whenever I encounter
a framework or library that is &amp;ldquo;not worth it for a small project,&amp;rdquo; because that
is a coded statement that means either &amp;ldquo;It has a broad scope of features that
a small project won&amp;rsquo;t take advantage of,&amp;rdquo; or &amp;ldquo;it trades off simplicity or
user experience for performance or other reasons.&amp;rdquo; Accessibility also helps
open-source projects move from obscure to ubiquitous; if jQuery had required a
command-line tool to compile it when it came out, I can practically guarantee you wouldn&amp;rsquo;t
have ever heard about it.&lt;/p></description></item><item><title>The Web is (finally) a mature platform</title><link>https://adambard.com/blog/the-web-is-a-mature-platform/</link><pubDate>Sat, 19 Mar 2016 00:00:00 +0000</pubDate><guid>https://adambard.com/blog/the-web-is-a-mature-platform/</guid><description>&lt;p>I started my career as a &amp;ldquo;web developer&amp;rdquo; circa 2007. I&amp;rsquo;d dabbled before
with Javascript while making sites in HTML/CSS as early as middle school,
but that was my first real job as a real software developer. Back
in those days, LAMP (Linux/Apache/MySQL/PHP) was about the only sensible way to
build a web application. You could use Java servlets, of course,
or build applications using CGI, but once PHP was stable and available
and straightforward, and it quickly became the obvious choice for a huge
range of applications.&lt;/p></description></item><item><title>Clojure SQL Migration Libaries</title><link>https://adambard.com/blog/clojure-migration-libraries/</link><pubDate>Sun, 28 Feb 2016 00:00:00 +0000</pubDate><guid>https://adambard.com/blog/clojure-migration-libraries/</guid><description>&lt;p>It is generally recommended, if you&amp;rsquo;re developing an application
that uses a database, that you manage changes to the schema of said
database using some sort of migration system or another. Luckily,
several intrepid developers in the clojure community have stepped
up with their own solutions to this problem &amp;ndash; all of which end up
being very similar indeed. Read on for an overview of your options
and to find out which one is right for you.&lt;/p></description></item><item><title>Plotting Reddit post frequencies with d3</title><link>https://adambard.com/blog/plotting-reddit-post-frequencies-with-d3/</link><pubDate>Sat, 20 Feb 2016 00:00:00 +0000</pubDate><guid>https://adambard.com/blog/plotting-reddit-post-frequencies-with-d3/</guid><description>&lt;p>This week I added a better graph to &lt;a href="https://www.redditlater.com/">Later (for Reddit)&lt;/a>&amp;rsquo;s
&lt;a href="https://www.redditlater.com/analysis/#pics">post timing analysis page&lt;/a>. Previously,
the most common time and the most common day were plotted on separate bar charts.
However, I noticed that I got called out on this in &lt;a href="https://medium.com/@dleybzon/the-best-time-to-post-on-reddit-190762d4fc71">this article on Medium&lt;/a>,
which offered a pretty sensible alternative that I wasted no time in ripping off
wholesale. I still
have the bar graphs in, but I also added a 7x24 color-coded grid plot, allowing for a more
accurate view of exactly when the most popular posts were posted.&lt;/p></description></item><item><title>Failjure: Exception-free error handling for Clojure</title><link>https://adambard.com/blog/introducing-failjure/</link><pubDate>Sat, 30 Jan 2016 00:00:00 +0000</pubDate><guid>https://adambard.com/blog/introducing-failjure/</guid><description>&lt;p>I&amp;rsquo;ve &lt;a href="https://adambard.com/blog/acceptable-error-handling-in-clojure/">written before&lt;/a> about
handling errors in Clojure without using exceptions, by making use of
ad-hoc monads. In that post, I also referenced &lt;a href="https://brehaut.net/blog/2011/error_monads">Andrew Brehaut&amp;rsquo;s error monad&lt;/a>
implementation.&lt;/p>
&lt;p>Since then, I&amp;rsquo;ve written a number of projects that use similar handling, and I
thought the time had come to wrap it up in a library, which I&amp;rsquo;m calling
&lt;a href="https://github.com/adambard/failjure">Failjure&lt;/a>.&lt;/p></description></item><item><title>Clojurescript Boot Live-Reload Weasel Vim-Fireplace Piggieback</title><link>https://adambard.com/blog/clojurescript-boot-fireplace/</link><pubDate>Mon, 11 Jan 2016 00:00:00 +0000</pubDate><guid>https://adambard.com/blog/clojurescript-boot-fireplace/</guid><description>&lt;p>My long-standing complaint about Clojurescript is that it&amp;rsquo;s a pain to get running.
People who prefer &lt;a href="">Leiningen&lt;/a> seem to have gotten a handle on this with &lt;a href="">figwheel&lt;/a>;
however, those of us who have jumped on the Boot train (it&amp;rsquo;s newer and therefore better!)
still have to do some assembly to get the live-reloading auto-compiling repl setup that&amp;rsquo;s
become the standard for Clojurescript development.&lt;/p>
&lt;p>Like &lt;a href="https://adambard.com/blog/deploying-a-clojure-project-with-pallet/">many&lt;/a>
&lt;a href="https://adambard.com/blog/easy-auth-with-friend/">problems&lt;/a>
in the Clojure universe, this is less a problem of technology and more
a problem of approachable documentation. With just a little bit of
configuration and some understanding, you too can assemble that
perfect Clojurescript dev setup using Boot.&lt;/p></description></item><item><title>Deploying a Clojure web app with Pallet</title><link>https://adambard.com/blog/deploying-a-clojure-project-with-pallet/</link><pubDate>Mon, 04 Jan 2016 00:00:00 +0000</pubDate><guid>https://adambard.com/blog/deploying-a-clojure-project-with-pallet/</guid><description>&lt;p>&lt;a href="http://palletops.com">Pallet&lt;/a> is a Clojure DevOps platform/library designed to automate
blah blah blah. We all know what these things are supposed to do, the
question is how they do it, and Pallet takes the agreeable tack of just being
a Clojure library that you can run in a repl and do devops stuff.&lt;/p></description></item><item><title>Clojure SQL library showdown</title><link>https://adambard.com/blog/clojure-sql-libs-compared/</link><pubDate>Mon, 28 Dec 2015 00:00:00 +0000</pubDate><guid>https://adambard.com/blog/clojure-sql-libs-compared/</guid><description>When it comes to database access, I&amp;rsquo;ve become less particular over the years as I&amp;rsquo;ve gotten more and more comfortable with SQL. These days I&amp;rsquo;m happier to write the SQL to get just the thing I want, than wrestle with an ORM to produce the same thing.
Nevertheless, there&amp;rsquo;s something to be said for abstractions over SQL, and they seem to have lasting popularity. In this post, I&amp;rsquo;ll compare a few popular SQL DSLs for Clojure, and contrast them all with their mutual pappy, clojure.</description></item><item><title>Password Authentication/Authorization for Clojure</title><link>https://adambard.com/blog/buddy-password-auth-example/</link><pubDate>Thu, 17 Dec 2015 00:00:00 +0000</pubDate><guid>https://adambard.com/blog/buddy-password-auth-example/</guid><description>&lt;p>In my &lt;a href="https://adambard.com/blog/clojure-auth-with-buddy/">previous post&lt;/a>, I gave a quick overview
of how the &lt;a href="https://github.com/funcool/buddy-auth/">Buddy&lt;/a> auth library for Clojure.
Today, I&amp;rsquo;ll give a more fleshed-out example of how to use it to add session-based
password authentication to an app.&lt;/p></description></item><item><title>Clojure auth with buddy</title><link>https://adambard.com/blog/clojure-auth-with-buddy/</link><pubDate>Tue, 15 Dec 2015 00:00:00 +0000</pubDate><guid>https://adambard.com/blog/clojure-auth-with-buddy/</guid><description>&lt;p>A while back, I &lt;a href="https://adambard.com/blog/easy-auth-with-friend/">wrote about&lt;/a> using &lt;a href="https://github.com/cemerick/friend/">Friend&lt;/a>
to handle auth in Clojure. I neglected to mention (or look at, in particular)
the other auth framework making waves in the Clojure community, aptly named
&lt;a href="https://github.com/funcool/buddy-auth/">Buddy&lt;/a>.&lt;/p>
&lt;p>Buddy is, well, another authentication/authorization framework. It also contains
some lower-level crypto utilities, but the main use right now seems to be
handling auth for web applications in Ring. I had heard good things about how
Buddy works, so I decided to give it a try, and now you get to hear about that.&lt;/p></description></item><item><title>Using Letsencrypt with Nginx</title><link>https://adambard.com/blog/using-letsencrypt-with-nginx/</link><pubDate>Fri, 04 Dec 2015 00:00:00 +0000</pubDate><guid>https://adambard.com/blog/using-letsencrypt-with-nginx/</guid><description>&lt;p>&lt;a href="https://letsencrypt.org">Letsencrypt.org&lt;/a> has just entered its public beta period. This means that
you can get ssl certificates really easily and for free. Letsencrypt&amp;rsquo;s certificates are up to modern specs and fully
accepted by all browsers, so you no longer have any excuse not to have SSL on all your domains.&lt;/p>
&lt;p>This post will hold your hand through the process of
moving your Nginx site from http to https.&lt;/p></description></item><item><title>Introducing Unpythonic</title><link>https://adambard.com/blog/introducing-unpython/</link><pubDate>Mon, 19 Oct 2015 00:00:00 +0000</pubDate><guid>https://adambard.com/blog/introducing-unpython/</guid><description>&lt;p>A short post to say that I&amp;rsquo;ve just launched a new project called
&lt;a href="http://unpythonic.com">Unpythonic&lt;/a>. It&amp;rsquo;s a collection of articles
introducing various concepts and techniques for functional programming
in Python.&lt;/p></description></item><item><title>Writing Friendlier Clojure</title><link>https://adambard.com/blog/write-friendlier-clojure/</link><pubDate>Thu, 01 Oct 2015 00:00:00 +0000</pubDate><guid>https://adambard.com/blog/write-friendlier-clojure/</guid><description>I love the Clojure language, but I don&amp;rsquo;t think there&amp;rsquo;s any use pretending that the combination of expressiveness, power, and repl-driven development can result in some staggeringly dense code. Everyone that writes Clojure is guilty of this at one time or another; you start with the core of your function, evaluate it, wrap it a bit, eval again, and before you know it you have a lopsided, deeply nested, organically-grown stalagmite of a program.</description></item><item><title>React.js for incremental text games</title><link>https://adambard.com/blog/incremental-text-games/</link><pubDate>Sun, 12 Jul 2015 00:00:00 +0000</pubDate><guid>https://adambard.com/blog/incremental-text-games/</guid><description>&lt;p>I have a small weakness for silly text games like &lt;a href="http://candies.aniwey.net/">Candy Box&lt;/a>
and &lt;a href="http://adarkroom.doublespeakgames.com/">A Dark Room&lt;/a>, and most recently
&lt;a href="http://bloodrizer.ru/games/kittens/#">Kittens Game&lt;/a> (&amp;ldquo;a Dark Souls of incremental gaming&amp;rdquo;).
The common feature of these games is that, for the most part, the UI is just numbers
on a web page, and you perform certain actions to increase those numbers to purchase
upgrades that further your ability to increase the numbers.&lt;/p>
&lt;p>One of the great things about this style of game is that the barrier to entry is
very low (which is probably why there are approximately &lt;a href="https://www.reddit.com/r/incremental_games">a brazilian&lt;/a> of
these things around), and the games in the genre are differentiated almost solely by the quality
of their mechanics (without silly things like &amp;ldquo;art&amp;rdquo; to get in the way).
You, the reader, might even be interested in dipping your toe in the world of
incremental games. If you want to add one to the pile, I recommend you use
React to do it.&lt;/p></description></item><item><title>Ripping off Circular.io in Clojure</title><link>https://adambard.com/blog/ripping-off-circular/</link><pubDate>Mon, 15 Jun 2015 00:00:00 +0000</pubDate><guid>https://adambard.com/blog/ripping-off-circular/</guid><description>Circular.io is a clone of Buffer, or at least the Buffer of about 5 years ago. Back then, all buffer did was let you schedule posts to Twitter, to be sent at regular intervals throughout the day. It was on HN about 3 years back, and has been running since then. And people really use it! They&amp;rsquo;ve done a great job with their little app, and the fact that it&amp;rsquo;s open-source means that for the purposes of this post, we can steal their frontend and just install a new backend.</description></item><item><title>Easy custom auth in Clojure with Friend</title><link>https://adambard.com/blog/easy-auth-with-friend/</link><pubDate>Wed, 10 Jun 2015 00:00:00 +0000</pubDate><guid>https://adambard.com/blog/easy-auth-with-friend/</guid><description>&lt;p>I&amp;rsquo;ve used &lt;a href="https://github.com/cemerick/friend">friend&lt;/a> to provide auth
in my projects a few times, and considered it many more before resorting to
my own hand-rolled business. Most of the reason for this is that is just seems
so &lt;em>complicated&lt;/em>. Workflows? Credentials? I just want to check a password
and stash a user object in the session, end of story.
After I did some investigating, though, it turns out that you can usefully
deploy friend for even very simple workflows, if you understand how it works.&lt;/p></description></item><item><title>Throwing together a weekend project with boot-clj</title><link>https://adambard.com/blog/throwing-together-worldclassifiedlist/</link><pubDate>Mon, 08 Jun 2015 00:00:00 +0000</pubDate><guid>https://adambard.com/blog/throwing-together-worldclassifiedlist/</guid><description>&lt;p>This weekend I made &lt;a href="http://worldclassifiedlist.com">http://worldclassifiedlist.com&lt;/a> on a whim. Past experience suggests that I&amp;rsquo;m
not likely to derive any value from the site itself, so before it&amp;rsquo;s completely forgotten,
overlooked by an indifferent world and relegated to an unnoticed screenshot on my portfolio
page, I thought I might wring a few ideas out of the making-of.&lt;/p></description></item><item><title>Building a graph-powered suggestion engine for redditlater with Loom</title><link>https://adambard.com/blog/building-a-suggestion-engine-for-redditlater/</link><pubDate>Sun, 07 Jun 2015 00:00:00 +0000</pubDate><guid>https://adambard.com/blog/building-a-suggestion-engine-for-redditlater/</guid><description>&lt;p>Besides the post scheduling, the main reason people come to &lt;a href="http://www.redditlater.com/">http://www.redditlater.com/&lt;/a>
is the subreddit analysis feature. This lets folks enter in a subreddit and
tells them when the best time to post on a given subreddit is.&lt;/p>
&lt;p>Little do they know, it tells me about them, too.&lt;/p></description></item><item><title>My first time using boot over leiningen</title><link>https://adambard.com/blog/i-finally-get-boot/</link><pubDate>Fri, 05 Jun 2015 00:00:00 +0000</pubDate><guid>https://adambard.com/blog/i-finally-get-boot/</guid><description>&lt;p>When &lt;a href="http://boot-clj.com/">boot&lt;/a> first appeared in my usual rotation of clojure news, I must confess that
I didn&amp;rsquo;t really see what the fuss was about. It seemed like someone had taken leiningen
and broken out all its parts into functions, which you could then use to get your dependencies,
build your project, and so forth. Don&amp;rsquo;t you see! Leiningen is just a build tool, but boot could
be anything. It could even be a build tool!&lt;/p></description></item><item><title>My favorite old webdev tools</title><link>https://adambard.com/blog/webdev-tools-rundown-2015/</link><pubDate>Thu, 09 Apr 2015 00:00:00 +0000</pubDate><guid>https://adambard.com/blog/webdev-tools-rundown-2015/</guid><description>&lt;p>The way we make websites has changed a lot since I started doing it, and it&amp;rsquo;s important
to keep up-to-date on new tools and techniques. That said, I&amp;rsquo;ve been noticing that I&amp;rsquo;ve
not spent as much time churning through new frameworks and whatnot as I used to &amp;ndash; in fact,
I&amp;rsquo;ve picked out a few tools that I&amp;rsquo;ve been using for years.&lt;/p></description></item><item><title>Interfacing Frege and Ring</title><link>https://adambard.com/blog/interfacing-frege-and-ring/</link><pubDate>Sun, 21 Dec 2014 00:00:00 +0000</pubDate><guid>https://adambard.com/blog/interfacing-frege-and-ring/</guid><description>&lt;p>&lt;a href="https://github.com/Frege/frege">Frege&lt;/a> is a strongly-typed functional language for the JVM. Its
goal is to mirror Haskell as closely as is possible on the platform, and as
far as I can tell it does a pretty decent job. It seems performant enough,
and more importantly grants access to a Haskell-esque type system. This makes
it a pretty good complement to Clojure for those problems where a strong typing
system is important.&lt;/p>
&lt;p>The downside to Frege is that, even though documentation exists (and is actually
quite expansive given the language&amp;rsquo;s limited adoption), it&amp;rsquo;s still hard to find
straightforward how-tos by googling. So here&amp;rsquo;s some much-needed frege-related blogspam
to fill out those results.&lt;/p></description></item><item><title>Implementing multimethods in Python</title><link>https://adambard.com/blog/implementing-multimethods-in-python/</link><pubDate>Thu, 11 Dec 2014 00:00:00 +0000</pubDate><guid>https://adambard.com/blog/implementing-multimethods-in-python/</guid><description>&lt;p>In Clojure (and many other languages), a multimethod is an implementation of
&lt;a href="https://en.wikipedia.org/wiki/Multiple_dispatch">multiple dispatch&lt;/a> as an
alternative to single dispatch.&lt;/p>
&lt;p>Traditionally, if you define several methods with the same name on
different classes, the type/class of the first argument (in Python, &lt;code>self&lt;/code>, in
many other languages implicit) is used to pick which method to call. This is
called &amp;ldquo;single dispatch&amp;rdquo; because the decision of which method to call is left
up to the inferred type of a single argument.&lt;/p>
&lt;p>Multimethods take the approach of leaving the dispatch up to the user; you can
dispatch on any value at all. You just need to supply a function that returns
the value on which you wish to dispatch, and a method for each possible value.
For certain cases, this is a lot more flexible than single dispatch.&lt;/p></description></item><item><title>Functional vs Object-oriented approaches to validation</title><link>https://adambard.com/blog/oo-vs-functional-form-validation/</link><pubDate>Sun, 07 Dec 2014 00:00:00 +0000</pubDate><guid>https://adambard.com/blog/oo-vs-functional-form-validation/</guid><description>&lt;p>Functional programming is often described in terms of its contrast with object-oriented programs; that is, you write functions that act on data instead of objects that wrap data and use methods to act on themselves. Functional programming wonks (like me) will tell you that writing code this way is generally better than OO, but I don&amp;rsquo;t want to do that (right now).&lt;/p>
&lt;p>However, in this post, I&amp;rsquo;m not here to argue either side. Today, I&amp;rsquo;m just going to demonstrate a few equivalent approaches to the same problem: validating data.&lt;/p></description></item><item><title>Back from Clojure Part 1: Python</title><link>https://adambard.com/blog/back-from-clojure-python/</link><pubDate>Mon, 01 Dec 2014 00:00:00 +0000</pubDate><guid>https://adambard.com/blog/back-from-clojure-python/</guid><description>&lt;p>One of my favorite genres of article to write are the ones that involve
refactoring some code to make it more functional, and (hopefully) improve
it on the way. With that in mind, I&amp;rsquo;ve decided to embark on a tour
of some of the things users of other popular dynamic languages can
take away from the ideas behind Clojure, even if they never use it
themselves. Today, I&amp;rsquo;ll be taking an old Python library I wrote and
refactoring it to fit a few ground rules.&lt;/p></description></item><item><title>My life as a homeless transient.</title><link>https://adambard.com/blog/life-as-a-homeless-transient/</link><pubDate>Thu, 27 Nov 2014 00:00:00 +0000</pubDate><guid>https://adambard.com/blog/life-as-a-homeless-transient/</guid><description>&lt;p>I hate the term &amp;ldquo;Digital Nomad&amp;rdquo;. Whenever I see it in the context
of an article or blog post, it reeks of pretension and
better-than-thou-ness &amp;ndash; which, I rush to point out, is not a vibe I ever get from actually
talking to fellow travellers in person. Usually, when I meet
someone who asks about my lifestyle, I just laugh and say I&amp;rsquo;m homeless
but employed.&lt;/p>
&lt;p>Whatever you want to call it, a life of permanent travel seems to have
a broad appeal, at least with some segment of society. And, as such,
it&amp;rsquo;s something I occasionally get asked questions about. Today,
I&amp;rsquo;ll answer questions that I haven&amp;rsquo;t been asked, but feel free to
ask more in the comments and I&amp;rsquo;ll answer.&lt;/p></description></item><item><title>Clojure is still not for geniuses</title><link>https://adambard.com/blog/clojure-is-not-even-for-clever-people/</link><pubDate>Mon, 24 Nov 2014 00:00:00 +0000</pubDate><guid>https://adambard.com/blog/clojure-is-not-even-for-clever-people/</guid><description>&lt;p>The inspiration for the article I wrote last week entitled
&lt;a href="https://adambard.com/blog/clojure-is-not-for-geniuses/">Clojure is not for geniuses&lt;/a> was inspired by &lt;a href="http://www.thattommyhall.com">Tommy Hall&amp;rsquo;s&lt;/a>
&lt;a href="http://vimeo.com/100425264">talk at Euroclojure 2014&lt;/a>, wherein
he made an offhand joke about preferring Clojure for its minimal
syntax, as he possesses a small brain (both his blog and his head suggest this assertion
is false). I had intended to bring this up with the original article, but got
sidetracked talking about immutable things and never got back around
to it. Here I&amp;rsquo;d like to address that, along with some discussion
that arose in various forums after the first article.&lt;/p></description></item><item><title>Clojure is not for geniuses</title><link>https://adambard.com/blog/clojure-is-not-for-geniuses/</link><pubDate>Tue, 18 Nov 2014 00:00:00 +0000</pubDate><guid>https://adambard.com/blog/clojure-is-not-for-geniuses/</guid><description>&lt;p>It&amp;rsquo;s a common attitude that functional languages with immutable collection
semantics, such as Clojure, are for a) pretentious language geeks, or
b) actual genius programmers. I&amp;rsquo;m in no position to defend against
point a) given the body of my writing on this blog, so today I&amp;rsquo;d
like to write an article about point b).&lt;/p></description></item><item><title>What language should you learn?</title><link>https://adambard.com/blog/what-language-should-you-learn/</link><pubDate>Thu, 30 Oct 2014 00:00:00 +0000</pubDate><guid>https://adambard.com/blog/what-language-should-you-learn/</guid><description>&lt;p>I travel a lot these days. I&amp;rsquo;d call myself a &amp;ldquo;digital nomad&amp;rdquo; as a shorthand,
if there was any way to say it without sounding impossibly smug. Let&amp;rsquo;s just say
I&amp;rsquo;m homeless but employed and my wife and I live in AirBnbs.&lt;/p>
&lt;p>One of the challenges of moving around so much is dealing with language barriers.
For the most part, even in places where English isn&amp;rsquo;t widely understood, it&amp;rsquo;s perfectly
possible to get whatever you need with gestures, chief among them pointing and
holding up money. It&amp;rsquo;s the little things that are harder when you can&amp;rsquo;t speak the language.&lt;/p></description></item><item><title>A clojure cup retrospective</title><link>https://adambard.com/blog/clojure-cup-retrospective/</link><pubDate>Mon, 29 Sep 2014 00:00:00 +0000</pubDate><guid>https://adambard.com/blog/clojure-cup-retrospective/</guid><description>&lt;p>Update: Voting is live! &lt;a href="https://clojurecup.com/#/apps/booker">Vote for my app at https://clojurecup.com/#/apps/booker&lt;/a>, then
check out some more deserving entries at &lt;a href="https://clojurecup.com/#/apps">https://clojurecup.com/#/apps&lt;/a> and vote for them too!&lt;/p>
&lt;p>I&amp;rsquo;ve just spent about 30 hours this weekend coding up &lt;a href="http://booker.clojurecup.com/">Booker&lt;/a>,
my entry to the 2014 Clojure Cup, in which I participated as a one-man team. It was pretty
exhausting, and the app doesn&amp;rsquo;t do quite as much as I was hoping it might, but I&amp;rsquo;m
still quite happy with how it all turned out. Here&amp;rsquo;s how my weekend went.&lt;/p></description></item><item><title>Compojure apps, in the style of Sinatra</title><link>https://adambard.com/blog/sinatra-docs-in-clojure/</link><pubDate>Fri, 05 Sep 2014 00:00:00 +0000</pubDate><guid>https://adambard.com/blog/sinatra-docs-in-clojure/</guid><description>&lt;p>Clojure has an approachability problem. In part, this is due to the
relatively unusual syntax, but that can&amp;rsquo;t get all the credit.
When it comes to building server-side web applications, a
major sticking point is the &amp;ldquo;lack of frameworks&amp;rdquo; problem, and
more to the point, the common Clojurian&amp;rsquo;s response:&lt;/p>
&lt;blockquote>
&lt;p>&amp;ldquo;Clojure users prefer to assemble their own stack from small, composable libraries.&amp;rdquo;&lt;/p>
&lt;/blockquote></description></item><item><title>Deploying a Clojure web app to a VPS</title><link>https://adambard.com/blog/deploying-a-clojure-web-app-on-digitalocean/</link><pubDate>Thu, 28 Aug 2014 00:00:00 +0000</pubDate><guid>https://adambard.com/blog/deploying-a-clojure-web-app-on-digitalocean/</guid><description>&lt;p>So you wrote an app. Great! Next step is to put it somewhere
where people can use it. This tutorial will walk you through
the process of deploying your app.&lt;/p></description></item><item><title>Using Kotlin from your Clojure projects</title><link>https://adambard.com/blog/use-kotlin-with-clojure/</link><pubDate>Sat, 23 Aug 2014 00:00:00 +0000</pubDate><guid>https://adambard.com/blog/use-kotlin-with-clojure/</guid><description>&lt;p>&lt;strong>Problem:&lt;/strong> You need to extends some Java interface or class to use
some Java API, and for some reason Clojure&amp;rsquo;s java interop tools are
too unwieldy to do it cleanly.&lt;/p></description></item><item><title>A url shortener service in 35 lines of Clojure</title><link>https://adambard.com/blog/a-clojure-url-shortener-service/</link><pubDate>Fri, 22 Aug 2014 00:00:00 +0000</pubDate><guid>https://adambard.com/blog/a-clojure-url-shortener-service/</guid><description>&lt;p>I saw &lt;a href="http://grasswire-engineering.tumblr.com/post/94043813041/a-url-shortener-service-in-45-lines-of-scala">this post by Grasswire&lt;/a>
today, and I couldn&amp;rsquo;t resist the urge to throw down a &lt;a href="http://blog.codinghorror.com/fizzbuzz-the-programmers-stairway-to-heaven/">Fizz-Buzz-pocalypse&lt;/a>.
So, here&amp;rsquo;s my implementation in Clojure, along with a list of ways that Clojure
clearly wins. (That last sentence was to be read tongue-in-cheek, Scala is a good language too. Besties!).&lt;/p></description></item><item><title>Using Parquet + Protobufs with Spark</title><link>https://adambard.com/blog/parquet-protobufs-spark/</link><pubDate>Wed, 20 Aug 2014 00:00:00 +0000</pubDate><guid>https://adambard.com/blog/parquet-protobufs-spark/</guid><description>&lt;p>I recently had occasion to test out using &lt;a href="http://parquet.io/">Parquet&lt;/a>
with &lt;a href="https://developers.google.com/protocol-buffers/">protobufs&lt;/a>. I got
some simple tests working, and since I had to do a lot of reading
to get to this point, I thought I&amp;rsquo;d do the world a favor and document
the process here.&lt;/p></description></item><item><title>Embedded MapReduce with Flambo</title><link>https://adambard.com/blog/embedded-mapreduce-with-flambo/</link><pubDate>Mon, 18 Aug 2014 00:00:00 +0000</pubDate><guid>https://adambard.com/blog/embedded-mapreduce-with-flambo/</guid><description>&lt;p>I recently stumbled across a neat library called &lt;a href="https://github.com/yieldbot/flambo#rdd-persistence">Flambo&lt;/a>.
Flambo is a clojure wrapper for &lt;a href="http://spark.apache.org/docs/latest/">Spark&lt;/a>, and it does a really
great job keeping everything nice and Clojure-y. I wanted
to show you so you can enjoy it too!&lt;/p></description></item><item><title>Ten reasons to use Clojure/ClojureScript on your next web dev project</title><link>https://adambard.com/blog/ten-reasons-to-use-clojure/</link><pubDate>Fri, 15 Aug 2014 00:00:00 +0000</pubDate><guid>https://adambard.com/blog/ten-reasons-to-use-clojure/</guid><description>&lt;p>&lt;em>Hello sir. I&amp;rsquo;m here to talk to you today about accepting Clojure into your workflow.
Do you have a few minutes? I&amp;rsquo;d like to show you these ten ways that Clojure can
help you make better software. Good, here we go!&lt;/em>&lt;/p></description></item><item><title>A simple Clojurescript app</title><link>https://adambard.com/blog/a-simple-clojurescript-app/</link><pubDate>Wed, 13 Aug 2014 00:00:00 +0000</pubDate><guid>https://adambard.com/blog/a-simple-clojurescript-app/</guid><description>In May, I left Canada to do some long-term travelling with my wife. I don&amp;rsquo;t mention it here because this isn&amp;rsquo;t tumblr, but it does mean that I have some problems many people don&amp;rsquo;t, such as figuring out when I can return in the Schengen Area. This is a problem that has been solved, but I&amp;rsquo;ve yet to see it solved well, so I decided to build my own calculator as an exercise using Kioo with Om.</description></item><item><title>Top Github Languages of 2014 (So far)</title><link>https://adambard.com/blog/top-github-languages-2014/</link><pubDate>Fri, 01 Aug 2014 00:00:00 +0000</pubDate><guid>https://adambard.com/blog/top-github-languages-2014/</guid><description>&lt;p>It&amp;rsquo;s that time of year again! Today, we&amp;rsquo;ll look at just over a half-year&amp;rsquo;s worth of Github
data to draw unsubstantiated conclusions about the relative popularity of programming languages.
Ok let&amp;rsquo;s go!&lt;/p></description></item><item><title>My Top Clojure Articles</title><link>https://adambard.com/blog/greatest-clojure-hits/</link><pubDate>Mon, 07 Jul 2014 00:00:00 +0000</pubDate><guid>https://adambard.com/blog/greatest-clojure-hits/</guid><description>&lt;p>For the past few years, most of my posts have been beginner-intermediate
essays on various clojure features and coding techniques. Since a lot of
people have told me that they like my blog as a genre piece, I decided to
pull some of my favorites into one place, and order them by difficulty, from
Clojure beginner on up so that folks don&amp;rsquo;t have to root around.&lt;/p></description></item><item><title>5 mistakes I made writing my first Clojure application</title><link>https://adambard.com/blog/five-mistakes-clojure-newbies-make/</link><pubDate>Wed, 02 Jul 2014 00:00:00 +0000</pubDate><guid>https://adambard.com/blog/five-mistakes-clojure-newbies-make/</guid><description>&lt;p>It&amp;rsquo;s been about two years since I undertook my first sizable application in Clojure,
and really my first experience architecting a system in a functional language.
It was a local dating application, and it&amp;rsquo;s still up and running, despite the sins
below. But, reading the code now, a few dire instances of truely bad code emerge.
So, I crawled through for some examples, which I now impart to you:&lt;/p></description></item><item><title>DIY NoSQL part deux: interchangeable parts</title><link>https://adambard.com/blog/diy-nosql-revisited/</link><pubDate>Mon, 30 Jun 2014 00:00:00 +0000</pubDate><guid>https://adambard.com/blog/diy-nosql-revisited/</guid><description>&lt;p>After my last post on &lt;a href="https://adambard.com/blog/2014-06-02-diy-nosql-in-clojure">using Clojure&amp;rsquo;s STM as a quick-and-dirty in-memory datastore&lt;/a>,
I had an &lt;a href="http://adambard.com/blog/diy-nosql-in-clojure/#comment-1438270922">interesting discussion&lt;/a> in the comments about
the wiseness of implementing my example with a static global. Coincidentally, I attended
a talk by Stuart Sierra at &lt;a href="https://twitter.com/EuroClojure">EuroClojure&lt;/a> about this very thing,
and started getting some ideas about how to make things better, which I want to share today.&lt;/p></description></item><item><title>Java to Clojure: "Refactoring" refactored functionally</title><link>https://adambard.com/blog/refactoring-refactored/</link><pubDate>Tue, 10 Jun 2014 00:00:00 +0000</pubDate><guid>https://adambard.com/blog/refactoring-refactored/</guid><description>&lt;p>I was searching for a good example to illustrate some properties of
refactoring object-oriented code into a more functional style, and
I came across this example from &lt;a href="http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672/">Martin Fowler&amp;rsquo;s Refactoring&lt;/a>.
It describes the &lt;a href="http://www.cs.unc.edu/~stotts/723/refactor/chap1.html">process of refactoring code for a video store&lt;/a>.
It&amp;rsquo;s a nice little example with a useful narrative to go along with it.&lt;/p></description></item><item><title>"DIY NoSQL" in Clojure</title><link>https://adambard.com/blog/diy-nosql-in-clojure/</link><pubDate>Mon, 02 Jun 2014 00:00:00 +0000</pubDate><guid>https://adambard.com/blog/diy-nosql-in-clojure/</guid><description>&lt;p>I saw this post, &lt;a href="http://www.underengineering.com/2014/05/22/DIY-NoSql/">&amp;ldquo;Do It Yourself NoSql&amp;rdquo;&lt;/a>,
recently, and it reminded me of something that Clojure does very very well.&lt;/p>
&lt;p>Clojure&amp;rsquo;s go-to concurrency enabler is its
&lt;a href="https://en.wikipedia.org/wiki/Software_transactional_memory">STM&lt;/a>
system: &lt;code>atoms&lt;/code>, &lt;code>agents&lt;/code>, and &lt;code>refs&lt;/code>.
I&amp;rsquo;ve &lt;a href="https://adambard.com/blog/why-clojure-part-2-async-magic/">written about it before&lt;/a>, but this seemed like
an opportunity to provide a nice example, and discuss a little more about some of the things
I often do to defer the need for a database.&lt;/p></description></item><item><title>The nitty-gritty of a Clojure web app</title><link>https://adambard.com/blog/how-redditlater-works/</link><pubDate>Wed, 14 May 2014 00:00:00 +0000</pubDate><guid>https://adambard.com/blog/how-redditlater-works/</guid><description>&lt;p>This post is a follow-up/supplement to my article
&lt;a href="http://www.sitepoint.com/anatomy-web-app-redditlater-clojure/">Anatomy of a Web App: How I Built RedditLater in Clojure&lt;/a>,
published on sitepoint.
To make the article appealing
for a mass-market audience, I had to take out most of the nitty-gritty details
that wouldn&amp;rsquo;t interest people who weren&amp;rsquo;t interested in &lt;a href="http://clojure.org">Clojure&lt;/a> to begin with (plebians!).
The details still have some good stuff in them, though, so I&amp;rsquo;ve made this post out of it.&lt;/p>
&lt;p>So I hope you&amp;rsquo;re here to read about my fiddly minutae, because off we go!&lt;/p></description></item><item><title>In Defense of Coffeescript</title><link>https://adambard.com/blog/in-defense-of-coffeescript/</link><pubDate>Sun, 06 Apr 2014 00:00:00 +0000</pubDate><guid>https://adambard.com/blog/in-defense-of-coffeescript/</guid><description>&lt;p>I often see arguments about &lt;a href="http://discuss.atom.io/t/why-coffeescript/131">whether or not using coffeescript is a good idea&lt;/a>.
Arguments against usually center around whether it&amp;rsquo;s a barrier for contributions, or
whether it&amp;rsquo;s an unnecessary abstraction over another language that the developer needs
to know anyhow.&lt;/p></description></item><item><title>Elasticsearch Rosetta Stone</title><link>https://adambard.com/blog/elasticsearch-rosetta-stone/</link><pubDate>Thu, 20 Mar 2014 00:00:00 +0000</pubDate><guid>https://adambard.com/blog/elasticsearch-rosetta-stone/</guid><description>&lt;p>I&amp;rsquo;ve recently done some work with Elasticsearch. It&amp;rsquo;s a great platform, but
I still found it pretty hard to get started. It wasn&amp;rsquo;t obvious what was what.
Perhaps I didn&amp;rsquo;t read the docs closely enough. Anyhow, I wrote up some examples
demonstrating how to get started with Elasticsearch.&lt;/p></description></item><item><title>Set up Flask with webassets</title><link>https://adambard.com/blog/fresh-flask-setup/</link><pubDate>Thu, 20 Feb 2014 00:00:00 +0000</pubDate><guid>https://adambard.com/blog/fresh-flask-setup/</guid><description>&lt;p>&lt;a href="http://flask.pocoo.org/">Flask&lt;/a> isn&amp;rsquo;t new, but it&amp;rsquo;s really great, and it&amp;rsquo;s
definitely my first choice when starting a new Python app. Today I want to
give you a quick tour of the tools I use to set up a new Flask app.&lt;/p></description></item><item><title>Just what does "code as data" mean anyway?</title><link>https://adambard.com/blog/what-is-homoiconicity/</link><pubDate>Sun, 19 Jan 2014 00:00:00 +0000</pubDate><guid>https://adambard.com/blog/what-is-homoiconicity/</guid><description>Recently, I&amp;rsquo;ve seen popular articles on macros and metaprogramming in Nimrod and Elixir. Both of these are wonderful metaprogramming systems, to be sure, but I couldn&amp;rsquo;t help but imagine some in the audience smirking inwardly &amp;ndash; and occasionally less inwardly. What odd syntax! How out-of-place they are! If only there existed a homiconic language, they think sarcastically, that could eliminate the need for awkward and forced syntax.
Of course, these smug bastards are users of any of the LISP family of languages.</description></item><item><title>The many flavors of concurrency in Clojure</title><link>https://adambard.com/blog/clojure-concurrency-smorgasbord/</link><pubDate>Fri, 06 Dec 2013 00:00:00 +0000</pubDate><guid>https://adambard.com/blog/clojure-concurrency-smorgasbord/</guid><description>&lt;p>Clojure, being the extensible, malleable, rewritable language that it is, is spoiled
for choice when it comes to making your cores work for you. You can pick your
poison when it comes to making your program concurrent.&lt;/p></description></item><item><title>Angular in the small</title><link>https://adambard.com/blog/angular-in-the-small/</link><pubDate>Sat, 16 Nov 2013 00:00:00 +0000</pubDate><guid>https://adambard.com/blog/angular-in-the-small/</guid><description>&lt;p>For those of you that aren&amp;rsquo;t familiar, Angular.js is one of a new breed
of emerging frameworks dedicated to building rich, responsive in-browser
interfaces. I&amp;rsquo;ve had the privilege of working with both &lt;a href="http://emberjs.com/">Ember.js&lt;/a>
and &lt;a href="http://angularjs.org/">Angular.js&lt;/a>, and enjoyed them both, so this won&amp;rsquo;t be a showdown
(if that&amp;rsquo;s what you came for, &lt;a href="http://eviltrout.com/2013/06/15/ember-vs-angular.html">here&amp;rsquo;s a nice one&lt;/a>).&lt;/p></description></item><item><title>Common Rules in Cryptography</title><link>https://adambard.com/blog/common-rules-of-cryptography/</link><pubDate>Thu, 07 Nov 2013 00:00:00 +0000</pubDate><guid>https://adambard.com/blog/common-rules-of-cryptography/</guid><description>&lt;p>Disclaimer: I have &lt;strong>no&lt;/strong> background in cryptography, despite
writing &lt;a href="https://adambard.com/blog/3-wrong-ways-to-store-a-password/">occasional&lt;/a>
&lt;a href="https://adambard.com/blog/the-new-ssl-basics/">ramblings&lt;/a> on the subject. I just
know what I&amp;rsquo;ve picked up along the way, of which precious little
is made available to people who don&amp;rsquo;t go searching for it.&lt;/p></description></item><item><title>What your datastore says about you</title><link>https://adambard.com/blog/what-your-datastore-says-about-you/</link><pubDate>Tue, 08 Oct 2013 00:00:00 +0000</pubDate><guid>https://adambard.com/blog/what-your-datastore-says-about-you/</guid><description>&lt;p>Disclaimer: Do I even need a disclaimer? Chill out dudes, don&amp;rsquo;t get all bent.&lt;/p></description></item><item><title>Clojure's core.typed vs Haskell</title><link>https://adambard.com/blog/core-typed-vs-haskell/</link><pubDate>Sun, 29 Sep 2013 00:00:00 +0000</pubDate><guid>https://adambard.com/blog/core-typed-vs-haskell/</guid><description>&lt;p>Ambrose Bonnaire-Sergeant&amp;rsquo;s &lt;a href="https://github.com/clojure/core.typed">core.typed&lt;/a> library
has been receiving &lt;a href="http://www.indiegogo.com/projects/typed-clojure">a lot&lt;/a>
&lt;a href="http://blog.circleci.com/supporting-typed-clojure/">of attention&lt;/a>
lately. In fact, Ambrose has just raised a well-deserved $20,000 to continue his work
on the library.&lt;/p></description></item><item><title>On secure SSL: The least every developer should know</title><link>https://adambard.com/blog/the-new-ssl-basics/</link><pubDate>Tue, 10 Sep 2013 00:00:00 +0000</pubDate><guid>https://adambard.com/blog/the-new-ssl-basics/</guid><description>The NSA, besides playing the role of Big Brother in the unfolding dystopian saga revealed by Snowden&amp;rsquo;s leaks, is at the forefront of cryptography research. Being in the business of secrecy, the NSA also has recommendations for keeping things secret.
The first of these, Suite A is naturally a secret, and apparently recommends a mysterious list of algorithms known only to the NSA. However, their Suite B recommendation for general national security use is published as an RFC, and suggests technologies available today in browsers and web servers.</description></item><item><title>Top Github Languages for 2013 (so far)</title><link>https://adambard.com/blog/top-github-languages-for-2013-so-far/</link><pubDate>Fri, 30 Aug 2013 00:00:00 +0000</pubDate><guid>https://adambard.com/blog/top-github-languages-for-2013-so-far/</guid><description>&lt;p>I just discovered the &lt;a href="http://www.githubarchive.org/">Github Archive&lt;/a>, a dataset of Github events queryable
using &lt;a href="https://developers.google.com/bigquery/">Google BigQuery&lt;/a>. What fun! So I decided to count how many
repositories have been created this year by language.&lt;/p></description></item><item><title>Fixing "Could not generate DH keypair" on RedditLater.com</title><link>https://adambard.com/blog/fixing-redditlater/</link><pubDate>Wed, 21 Aug 2013 00:00:00 +0000</pubDate><guid>https://adambard.com/blog/fixing-redditlater/</guid><description>RedditLater.com is a little app I made last April. It worked fine until sometime in July, when Reddit released an improvement to its SSL configuration on its api. Thereafter, attempts to get an access token using clj-http-lite began to fail with a javax.net.ssl.SSLException: Could not generate DH keypair exception.
Some investigation led me to a stackoverflow post (where else) which led me to this eventual workaround: hack up clj-http-lite to wrap the default SSLSocketFactory in a new class that would remove all the unsupported algorithms from the list of supported ones.</description></item><item><title>3 new programming languages to watch</title><link>https://adambard.com/blog/3-languages-to-watch/</link><pubDate>Tue, 06 Aug 2013 00:00:00 +0000</pubDate><guid>https://adambard.com/blog/3-languages-to-watch/</guid><description>On the eve of learnxinyminutes.com getting TechCrunch&amp;rsquo;d, I thought I&amp;rsquo;d write about a few of my favorite languages on the site.
Learn X in Y minutes has a lot of conventional blockbusters like C and Java now, as well as old cult favorites like Haskell and Erlang, but it was the independent films — that is, languages — that received some of the earliest attention, occasionally by their creators themselves. Being the language-dabbler/compulsive HN reader that I am, I had already heard of them, but in case you haven&amp;rsquo;t, here are three cool new languages that you can stuff in your brain hole:</description></item><item><title>3 Wrong Ways to Store a Password</title><link>https://adambard.com/blog/3-wrong-ways-to-store-a-password/</link><pubDate>Thu, 11 Jul 2013 00:00:00 +0000</pubDate><guid>https://adambard.com/blog/3-wrong-ways-to-store-a-password/</guid><description>Sooner or later, in the field of Web Development, you&amp;rsquo;re going to need to store someone&amp;rsquo;s password. This is easy to get wrong, but easy to get right, too. Today, let&amp;rsquo;s take a tour of the wrong ways, and then find out how to do it the (current) right way.
Plaintext Alice just learned PHP, and are making an app with user authentication. Her database stores an email and password in a table called users.</description></item><item><title>Live development is the way of the future</title><link>https://adambard.com/blog/fireplace-dot-vim-clojures-secret-weapon/</link><pubDate>Wed, 10 Jul 2013 00:00:00 +0000</pubDate><guid>https://adambard.com/blog/fireplace-dot-vim-clojures-secret-weapon/</guid><description>Live development is nothing new; it&amp;rsquo;s been well-explored in Lisps and in other languages like Smalltalk and Erlang since more or less the dawn of man. Emacs was for a long time &amp;ndash; and by many still is &amp;ndash; considered the only way to develop for Lisp, thanks to SLIME.
But I with projects such as Light Table, and a growing popularity of functional and dynamic languages in general, I think we&amp;rsquo;ll see live coding become seriously popular as capable mainstream tools collide with capable mainstream languages.</description></item><item><title>Reducers explained (through Python)</title><link>https://adambard.com/blog/reducers-explained-through-python/</link><pubDate>Sun, 07 Jul 2013 00:00:00 +0000</pubDate><guid>https://adambard.com/blog/reducers-explained-through-python/</guid><description>&lt;p>Last year, Clojure introduced &lt;a href="http://clojure.com/blog/2012/05/08/reducers-a-library-and-model-for-collection-processing.html">a new library called &lt;code>core.reducers&lt;/code>&lt;/a>, which
represented a new, efficient way to deal with operations across collections
in functional languages. It&amp;rsquo;s since been picked up by &lt;a href="http://elixir-lang.org/blog/2013/05/23/elixir-v0-9-0-released/">Elixir&lt;/a>, and libraries
have been written for some other languages.&lt;/p>
&lt;p>Today, I want to explain a bit about what reducers are, why they exist,
and how they can be more efficient than other functional methods of handling
collections, and help you write your code more prettier.&lt;/p></description></item><item><title>Learn C in Y minutes</title><link>https://adambard.com/blog/learn-c-n-y-minutes/</link><pubDate>Fri, 28 Jun 2013 00:00:00 +0000</pubDate><guid>https://adambard.com/blog/learn-c-n-y-minutes/</guid><description>Learn the language of strong, independent women and hairy-chested manly men alike: I&amp;rsquo;ve written a quick C overview for LearnXinYMinutes.com.
Y probably is not 15 in this case, but if you feel like brushing up, head on over to http://learnxinyminutes.com/docs/c/ and learn you some real programmin&amp;rsquo;. I&amp;rsquo;m not sure how applicable the format is to a language with as many tricks up its sleeve as C has, but feel free to tell me what you think!</description></item><item><title>Learn X in Y Minutes</title><link>https://adambard.com/blog/learn-x-in-y-minutes/</link><pubDate>Wed, 26 Jun 2013 00:00:00 +0000</pubDate><guid>https://adambard.com/blog/learn-x-in-y-minutes/</guid><description>&lt;p>Short version: Go to &lt;a href="http://learnxinyminutes.com/">http://learnxinyminutes.com/&lt;/a>&lt;/p>
&lt;p>After I posted &lt;a href="http://adambard.com/blog/clojure-in-15-minutes/">Learn Clojure in 15 minutes, perhaps&lt;/a> yesterday,
itself a knockoff of Tyler Neylon&amp;rsquo;s &lt;a href="http://tylerneylon.com/a/learn-lua/">Learn Lua in 15 minutes&lt;/a>,
I had a little &lt;a href="https://twitter.com/emarref/status/349367061937520640">twitter brainstorming session&lt;/a> with
Tyler and &lt;a href="https://twitter.com/emarref">@emarref&lt;/a>. Therein, I was inspired/encouraged to generalize the concept of
inline tutorials-as-code language primers in a community-editable site.&lt;/p></description></item><item><title>Learn Clojure in 15 minutes, perhaps</title><link>https://adambard.com/blog/clojure-in-15-minutes/</link><pubDate>Mon, 24 Jun 2013 00:00:00 +0000</pubDate><guid>https://adambard.com/blog/clojure-in-15-minutes/</guid><description>&lt;p>Moving on from &lt;a href="https://adambard.com/blog/you-write-php-because-you-dont-know-better/">pointless flamebait rants&lt;/a>,
here&amp;rsquo;s something a bit more constructive.
Inspired by Tyler Neylon&amp;rsquo;s excellent &lt;a href="http://tylerneylon.com/a/learn-lua/">Learn Lua in 15 minutes&lt;/a>,
I humbly present my original effort at an equivalent for Clojure
(also available &lt;a href="https://gist.github.com/adambard/5855667">as a gist&lt;/a>).&lt;/p></description></item><item><title>You use PHP because you don't know better.</title><link>https://adambard.com/blog/you-write-php-because-you-dont-know-better/</link><pubDate>Wed, 19 Jun 2013 00:00:00 +0000</pubDate><guid>https://adambard.com/blog/you-write-php-because-you-dont-know-better/</guid><description>&lt;p>My typical response when asked to defend a given offhand, derogatory comment I&amp;rsquo;ve
just made about PHP is to cite the most excellent
&lt;a href="http://me.veekun.com/blog/2012/04/09/php-a-fractal-of-bad-design/">PHP is a fractal of bad design&lt;/a>.
But, spurred, by the numerous comments hating on me for hating on PHP on
&lt;a href="http://imasters.com.br/linguagens/py/o-mesmo-aplicativo-4-vezes-php-vs-python-vs-ruby-vs-clojure/">this Portugese translation&lt;/a>
of my &lt;a href="http://adambard.com/blog/PHP-ruby-python-clojure-webapps-by-example/">PHP vs Python vs Ruby vs Clojure&lt;/a>
piece (which, to be fair, &lt;strong>is&lt;/strong> emphatically biased), I&amp;rsquo;m going to go ahead and let the hate out now, as one big rant,
so that I have something to refer to in the future (even though I bet I&amp;rsquo;ll find it embarrassing and childish then).&lt;/p></description></item><item><title>Clojure.core: Batteries (almost) included</title><link>https://adambard.com/blog/clojure-batteries-included/</link><pubDate>Thu, 13 Jun 2013 00:00:00 +0000</pubDate><guid>https://adambard.com/blog/clojure-batteries-included/</guid><description>&lt;p>Today, I want to provide a guided tour through some of the &lt;a href="https://github.com/clojure/">many libraries&lt;/a>
available from the Clojure team that don&amp;rsquo;t come distributed with Clojure. Consider
them Clojures standard library. Some came from old &lt;code>clojure.contrib&lt;/code> libs, others
are brand-new, but all are great.&lt;/p></description></item><item><title>Structured Clojure: Protocols and multimethods (oh my!)</title><link>https://adambard.com/blog/structured-clojure-protocols-and-multimethods/</link><pubDate>Tue, 04 Jun 2013 00:00:00 +0000</pubDate><guid>https://adambard.com/blog/structured-clojure-protocols-and-multimethods/</guid><description>&lt;p>You can use Clojure to do just about anything without ever needing to define anything
but functions and vars, but you&amp;rsquo;d be missing out. Clojure supports some very nice ways
to make your code more expressive &amp;ndash; and more structured &amp;ndash; when dealing with operations on data types.&lt;/p></description></item><item><title>Improving your Clojure code with core.reducers</title><link>https://adambard.com/blog/clojure-reducers-for-mortals/</link><pubDate>Mon, 27 May 2013 00:00:00 +0000</pubDate><guid>https://adambard.com/blog/clojure-reducers-for-mortals/</guid><description>Clojure is developed, maintained and documented by a cadre of extremely brainy people. This is mostly excellent news for users of clojure, but sometimes, I find myself feel a bit left behind reading about features and details of the language, especially coming from a background of procedural languages.
Last year I read Rich Hickey&amp;rsquo;s blog post on Clojure&amp;rsquo;s new reducers library. My takeaways on reducers at the time were thus:</description></item><item><title>Big wins: Multi-armed bandit testing.</title><link>https://adambard.com/blog/multi-armed-bandit-testing/</link><pubDate>Wed, 22 May 2013 00:00:00 +0000</pubDate><guid>https://adambard.com/blog/multi-armed-bandit-testing/</guid><description>&lt;p>I&amp;rsquo;m all about big wins. I could care less about incremental optimizations
if there&amp;rsquo;s a major victory to be had instead. That&amp;rsquo;s why I&amp;rsquo;m way into
&lt;a href="http://en.wikipedia.org/wiki/Multi-armed_bandit">multi-armed bandit testing&lt;/a> right now.&lt;/p></description></item><item><title>Idea: Device-specific screenshots (or, Abusing Retina.js on Addressbin)</title><link>https://adambard.com/blog/abusing-retina-on-addressbin/</link><pubDate>Sun, 19 May 2013 00:00:00 +0000</pubDate><guid>https://adambard.com/blog/abusing-retina-on-addressbin/</guid><description>In January I came into possession of a new retina-display Macbook Pro. The screen is amazing, but has the side effect of making images on websites look mostly like garbage, unless the developer has taken extra steps to serve double-sized images to people with fancy screens.
I ran across this problem trying to put a screenshot of Outlook on the homepage of Addressbin.com, my latest project. I knew it looked fine for almost every other visitor, but it was jarring for me, and presumably to anyone with a retina screen.</description></item><item><title>"Good Enough" error handling in Clojure</title><link>https://adambard.com/blog/acceptable-error-handling-in-clojure/</link><pubDate>Mon, 13 May 2013 00:00:00 +0000</pubDate><guid>https://adambard.com/blog/acceptable-error-handling-in-clojure/</guid><description>Writing Clojure is not like writing Java. In Java, exceptions are an accepted part of the workflow; in Clojure, they are begrudgingly supported out of necessity, but generally avoided.
Why is that?
Probably because writing code that throws exceptions makes your functional code a lot less functional &amp;ndash; that is, a lot less composable. When you can&amp;rsquo;t trust a function to execute and return a value you lose some functional purity.</description></item><item><title>Clojure web apps: Zero to 'Hello World' on Heroku in Clojure in 15 minutes.</title><link>https://adambard.com/blog/getting-started-with-clojure-web-apps/</link><pubDate>Sun, 07 Apr 2013 00:00:00 +0000</pubDate><guid>https://adambard.com/blog/getting-started-with-clojure-web-apps/</guid><description>&lt;p>I&amp;rsquo;ve been talking a lot about Clojure lately, but the pool of people who
want to listen is pretty small. I know, I know, it&amp;rsquo;s pretty different, but
I promise it&amp;rsquo;s really cool &amp;ndash; maybe even better than the languages you already
know &amp;ndash; once you get to know it. So today I want to
step back to the very basics by outlining how to get a Clojure app
up and running, and maybe produce some more Clojurenauts in the process.&lt;/p></description></item><item><title>Why Clojure? Part 2: Effortless async by design</title><link>https://adambard.com/blog/why-clojure-part-2-async-magic/</link><pubDate>Fri, 05 Apr 2013 00:00:00 +0000</pubDate><guid>https://adambard.com/blog/why-clojure-part-2-async-magic/</guid><description>&lt;p>As a second part in what I&amp;rsquo;ve decided will be a series attempting to justify
my choice of Clojure as a general-purpose web language, I&amp;rsquo;d like to talk a
little bit about writing asynchronous code in Clojure, and just how easy
the design decisions made by Mr. Hickey make that.&lt;/p></description></item><item><title>Middleman + Enlive: The best thing since PHP</title><link>https://adambard.com/blog/middleman-enlive-your-new-god/</link><pubDate>Tue, 02 Apr 2013 00:00:00 +0000</pubDate><guid>https://adambard.com/blog/middleman-enlive-your-new-god/</guid><description>&lt;p>Before I begin, the ideas in this article were introduced to me by
&lt;a href="http://www.flyingmachinestudios.com/programming/dissecting-gratefulplace/">this blog post&lt;/a>,
which I consider a must-read for anyone who uses Clojure on the web.&lt;/p>
&lt;p>I&amp;rsquo;ve been using Clojure for web development a lot more lately. This can be a contentious
topic for some people. &amp;ldquo;Clojure is hard to hire for&amp;rdquo;, they say. &amp;ldquo;It&amp;rsquo;s for
pretentious nerds&amp;rdquo;. &amp;ldquo;It&amp;rsquo;s overkill for the web&amp;rdquo;.&lt;/p></description></item><item><title>The same app 4 times: PHP vs Python vs Ruby vs Clojure</title><link>https://adambard.com/blog/php-ruby-python-clojure-webapps-by-example/</link><pubDate>Mon, 25 Mar 2013 00:00:00 +0000</pubDate><guid>https://adambard.com/blog/php-ruby-python-clojure-webapps-by-example/</guid><description>&lt;p>Here&amp;rsquo;s a toy program I wrote implemented in PHP, Python, Ruby, and Clojure.
I hope it&amp;rsquo;s helpful for someone who knows at least one of those and wants to learn
another.&lt;/p></description></item><item><title>Cover Letters: Then and now</title><link>https://adambard.com/blog/cover-letters-then-and-now/</link><pubDate>Thu, 28 Feb 2013 00:00:00 +0000</pubDate><guid>https://adambard.com/blog/cover-letters-then-and-now/</guid><description>&lt;p>I was told the other day that my communication style (as interpreted by
cover letters I sent) had changed dramatically for the better over three
years. Thanks for that! So I thought I&amp;rsquo;d share in hopes of helping someone
else do the same.&lt;/p></description></item><item><title>Trending: The iOS Stock Viewer that's better than the stock viewer</title><link>https://adambard.com/blog/you-need-trending/</link><pubDate>Thu, 03 Jan 2013 00:00:00 +0000</pubDate><guid>https://adambard.com/blog/you-need-trending/</guid><description>Trending, by Tapfolio, is an iOS app for tracking stocks, available now on the app store. It makes viewing your stock portfolio&amp;rsquo;s current pricing a snap, and sorts on most changed so you always see what you want to know about.
Also, I just started work at Tapstream, a company which may or may not be affiliated with Tapfolio. It seems pretty rad, and I&amp;rsquo;m really looking forward it.</description></item><item><title>Welcome to the blog, mark III</title><link>https://adambard.com/blog/welcome-to-the-blog-mark-3/</link><pubDate>Fri, 21 Dec 2012 00:00:00 +0000</pubDate><guid>https://adambard.com/blog/welcome-to-the-blog-mark-3/</guid><description>&lt;p>Welcome to the new blog. I hope you like it, I made it myself.&lt;/p></description></item></channel></rss>