I spent a few evenings this week redesigning this site. I usually update the HTML and CSS locally and tweak things as I go, but this time I started with a mockup in Sketch and didn’t touch the code until I had something that really looked good. This workflow worked out great.
Hmm… 🤔 pic.twitter.com/bOTBnXUFkJ— preetam (@PreetamJinka) June 14, 2019
Here’s what changed:
Now I just have to write more 🙂.
I joined ShiftLeft a year ago, and since it’s my first time in the security space I had to familiarize myself with the following terminology. I use this as a reference. Hopefully it’s useful for you too!
I implemented a small Lisp interpreter over the weekend. You can find it here: https://github.com/Preetam/mini-lisp. It’s about 400 lines of Go code so far.
I started writing an interpreter a couple of months ago using the mal - Make a Lisp guide. After step 4 my implementation felt really messy, and I felt I was just doing what the guide told me without learning too much about how things actually worked. Later I found Peter Norvig’s (How to Write a (Lisp) Interpreter (in Python)) which is a much simpler version, and that was the inspiration to start over.
Here’s what you can do with it. Let’s start with a simple factorial function:
Terrace is my new storage format for events and time series that I think can change the way we think about cloud-native time series storage. I introduced it in an earlier post and mentioned how it will use automatic indexing to optimize data layout. This post is about how the experiment is going so far, and what the next steps are.
So far, things are looking good! Early last month I only had an idea and zero code. Now I have a basic generator, file format, and some success with simulated data. Read on to see how it works.
Often times in my work I come across queries like this,
SELECT SUM(count) FROM data WHERE foo = 'bar' AND time >= '2018-08-13 00:00:00+00' AND time < '2018-09-13 00:00:00+00'
which is getting a total count for a month with a filter, and they
take a long time to run because there’s a significant number
of rows in the
data table but only a few have
foo = 'bar'.
We want these queries to execute faster, which is the same as reducing their latency. Remember that latency comes from doing work or waiting. This post is about modifying the work aspect because analytics queries don’t really have problems with waiting (at least in my experience, but there are exceptions).
I’m working on time series storage again!
My last “serious” time series storage project was Catena that I blogged about here. I wrote Catena to store time series data for a monitoring project I had, and the only use case I had was plotting charts. Since then my requirements have changed. My time series have to be more than arrays of points with simple string names. They have to be computed from events with lots of attributes that I can filter, group, aggregate, and rank.