Pixels and Palettes: Extracting Color Palettes From Images

Color palettes are usually carefully hand-selected to reflect a desired design aesthetic. Although there have been some attempts to procedurally generate palettes, automated palette creation is very difficult. It’s easy to choose some random colors, but generating a coherent and aesthetically pleasing palette in an automated way is not easy.
Read more on Pixels and Palettes: Extracting Color Palettes From Images…

Exploring Logic Programming in Clojure’s core.logic – Finite Domain Constraints

In my last blog post, I went over a basic introduction to some of the concepts of logic programming. In this post, we’ll extend our last example to produce some real values (with meaning outside of the logic engine) using finite domain constraints. Read more on Exploring Logic Programming in Clojure’s core.logic – Finite Domain Constraints…

Exploring Logic Programming in Clojure’s core.logic – Overview & Understanding Palindromes

Ever since I saw William Byrd and Dan Friedman present on miniKanren at Clojure/conj a few years ago, I’ve been distantly interested in the topic of logic programming. Recently, my interest has intensified, so I picked up a copy of The Reasoned Schemer and have been working through it.
Read more on Exploring Logic Programming in Clojure’s core.logic – Overview & Understanding Palindromes…

An Introduction to Taxicab Geometry

The narrator of Edwin Abbott’s classic Victorian satire Flatland is a commoner, a simple, two-dimensional square. He lives in a two-dimensional world filled with other flat characters: line segments, triangles, higher-sided polygons, and circles.

Circles, in Flatland, constitute the upper classes of society, but if Abbott’s humble narrator had been born in a different flatland, he could have been a square and a circle.

Impossible, you say? Allow me to introduce you to TaxicabLand. Read more on An Introduction to Taxicab Geometry…

Thinking in Aggregates – Moving Beyond the Singular

Aggregate \Ag”gre*gate\ n. – a mass, assemblage, or sum of particulars; as, a house is an aggregate of stone, brick, timber, etc.

When we first learn a new thing, it’s the particulars that stand out to us. A pre-toddler learning to walk must focus on each and every step. But as we grow, the particulars fade into higher-level ideas and skills. As adults, we rarely think about individual steps; instead, we simply go for a walk.

The same pattern is found in professional fields, such as science. The particulars of orbits and falling things gave way to the aggregate idea of gravity. When scientists first discovered electrons, they imagined them as single, planet-like points orbiting an atomic nucleus. Since then, scientists have given up the idea of point-like electrons, replacing it with the aggregate concept of an electron probability cloud.

The science and art of programming trends the same direction. Read more on Thinking in Aggregates – Moving Beyond the Singular…

A Comparison of 5 Uniprocessor OS Scheduling Policies

In my recent post on Uniprocessor OS Scheduling Policies, I covered the algorithms for five short-term operating system scheduling policies:

  • First-come-first-served
  • Round robin
  • Shortest process next
  • Shortest remaining time
  • Highest response ratio next

But I didn’t compare, analyze, or go over the use cases for each policy. I would like to do that in this post. Note that the concepts covered in my previous post are required to understand this one.

Read more on A Comparison of 5 Uniprocessor OS Scheduling Policies…

Understanding Uniprocessor OS Scheduling Policies

How does an operating system determine how much processing time a single process receives? There are a number of fundamental “scheduling policies” that an architect of an operating system may consider implementing: Read more on Understanding Uniprocessor OS Scheduling Policies…