Google account suspended: A post mortem| justin.abrah.ms
27 Mar 2023 Last week, I attended SREcon 2023. I was invited to attend the "next-gen delivery" working group meetings, due to my involvement within the Continuous Delivery Foundation (CDF). I used the opportunity to attend the rest of the conference as well. While I've never been an SRE by title, I've toed the line between operations and software development for many years. Conference makeup Surprisingly, the makeup of the conference attendees were different than I expected. It appeared that ...| Justin Abrahms
17 Jul 2013 In an effort to clean up some code, I wanted to find a list of files not imported by my app. I didn't see anything in a brief search, so I wrote this little script. Hopefully its helpful. It finds all javascript files in directories you specify as parameters to the script, greps your git repository for references to those files and echos those that should be removed. This script does have the possibility for false negatives (ie: things that aren't used that we don't mention) becau...| Justin Abrahms
17 Jul 2013 Pisces is a Python web framework that was written with testing in mind. It was birthed as a reaction to the typical workflow in a Django project, which I've come to dislike as it encourages you to make your code tightly coupled and less testable. What's wrong with Django? The majority of my issues with Django can be summed up with one code block pulled from the Sprint.ly code base which is indicative of how I've seen things work elsewhere. @login_required@owns_account@render_to('a...| Justin Abrahms
17 Jul 2013 In releasing the web framework I've been working on, I went about providing the things any upstanding python project does: a CI configuration file, a setup.py and some tests. The setup.py file was simple enough. PyCharm wrote one automatically. I was surprised to learn that when using distutils defining dependencies in your setup.py doesn't install them with easyinstall or pip. Its just a bit of metadata that is sent upstream. The other gotcha is that I wanted single-command acces...| Justin Abrahms
17 Jul 2013 Bitten by the bug to write more and for others, I've brought back syndication (via Atom rather than RSS) to the blog. I found a few hundred subscribers still checking in on me, so thanks to you all for sticking around. As I run a static site, generating RSS can be a bit of a pain. After a brief search of not finding anything for generating RSS or Atom for static blogs, I started writing something in Go which would take a YAML file and dump it into an ATOM format. A bit demoralized...| Justin Abrahms
17 Jul 2013 Bitten by the bug to write more and for others, I've brought back syndication (via Atom rather than RSS) to the blog. I found a few hundred subscribers still checking in on me, so thanks to you all for sticking around. As I run a static site, generating RSS can be a bit of a pain. After a brief search of not finding anything for generating RSS or Atom for static blogs, I started writing something in Go which would take a YAML file and dump it into an ATOM format. A bit demoralized...| Justin Abrahms
21 May 2013 One of the best talks at PyCon 2013 was Gary Barnhardt's Boundaries talk. One aspect of the talk was avoiding mocking by making the data interchange format based around value types. This is distinctly separate from entity types (where the identity of the object is more than the value). The canonical example value types is money. A $5 bill is a value type because it can be evenly exchanged with any other $5 bill. Entity types on the other hand are closely correlated with their iden...| Justin Abrahms
21 May 2013 In playing with GitStreams, I've made the switch from MySQL to Postgres. The reason for the switch was mostly shaming from Jeremy Dunck, Selena Deckelmann and a few others. The results, however were quite surprising. Storage Efficiency Operating on a budget $20/month Linode server (affiliate link), disk space is precious to me. In using MySQL, my data files were hovering just under 8GB for a couple of million rows of mostly-JSON data. After the migration, my size-on-disk dropped t...| Justin Abrahms
21 May 2013 In playing with GitStreams, I've made the switch from MySQL to Postgres. The reason for the switch was mostly shaming from Jeremy Dunck, Selena Deckelmann and a few others. The results, however were quite surprising. Storage Efficiency Operating on a budget $20/month Linode server (affiliate link), disk space is precious to me. In using MySQL, my data files were hovering just under 8GB for a couple of million rows of mostly-JSON data. After the migration, my size-on-disk dropped t...| Justin Abrahms
12 Mar 2013 I've recently volunteered to help out Code Scouts, a non-profit organization tasked with helping people learn programming and increase diversity in the field. One of the other mentors, Peter Banka, had a very interesting take on project-based work. Programming projects as an MMORPG Peter's idea was simple. Instead of requiring everyone to know everything, let them specialize. The way he explained it was in terms of looking for a quest group in an MMORPG. It takes a fighter and a w...| Justin Abrahms
01 Nov 2012 Justin {Lilly,Abrahms} I got married, my wife and I chose to change our names. My new name is Justin Abrahms. As I expect there will be several people who have questions mostly around the question of "Why?". So.. Why? I've been sort of interested in changing my name conceptually. I have a fascination with weird polish names like Poliskiewicz (Po-lis-ko-witz), Kowalski (Ko-wal-ski), or my good friend Andrew's last name. I've joked with Tracy for years that we would change our names...| Justin Abrahms
23 Sep 2012 Great possibilities, solid direction Gittip is a service for donating money to people (initially, open source developers, but could be for anyone) with no strings attached. Just keep being awesome. It's being lead by Chad Whitacre. While the service is still a few months old, folks seem to be using it and deriving benefit. All successful markers for the system. How it works Donations made through gittip are anonymous in that recipients don't know who is giving them the money. This...| Justin Abrahms
23 Sep 2012 Same stuff, less money. In an effort to be more frugal, I've recently altered my cellphone plan to one in which I get unlimited data and text messages for $30/mo. When I say frugal, I don't mean cheap. The goal here isn't to spend as close to 0 dollars as possible, but rather to minimize the expense things to the point feasible, given your values. I value having a smartphone with maps (specifically with bicycling directions) quite a lot, so I'm willing to spend money for it. Eric ...| Justin Abrahms
15 Sep 2012 Beliefs in action I've been doing a bit of thinking lately about my own personal values and how they drive my decisions on a day-to-day basis. I think, to some degree, this is normal when going through a big move and starting at a new job. You're faced with people who don't know much about you. It also draws into focus some of the differences between you and others. As such, I thought I would list a few things that I personally believe both in hopes that you might learn something ...| Justin Abrahms
15 Jan 2012 As part of my ongoing love affair with emacs, I've started annotating my dotfiles with org-babel. This may on the surface sound syncing these things would be a tedious task, but thanks to literate programming, its not too bad. Literate programming? Literate programming is a concept in which you write prose and embed in it source code. You can see examples of it in my article on git. It has the benefit of being written for humans in the first place. I haven't spent enough time with...| Justin Abrahms
12 Jan 2012 While the majority of my shell work these days is done from within emacs using eshell, there are remote servers where its nice to have things setup in a familiar way. There's also always launching emacs. ;) Dependencies I have some dependencies for my config. sudo apt-get install -y zsh{,-doc} git virtualenvwrapper jq source-highlight python3-pip cargo snapd lsd bat dust duf dog gping sudo snap install hub --classic Run chsh to set your prompt to /usr/bin/zsh. Download hub at http...| Justin Abrahms
12 Jan 2012 Tmux is a Terminal MUltipleXer, which is a fancy way of saying its a tabbing system for terminals. Unlike native GUI terminals, it curses based. While this may initially sound like a disadvantage, it actually allows for some interesting features. The biggest of these is you can "detach" from your current tab session, resume it at a later time and everything is as you left it. Why I like it My original reasons for choosing tmux were that it supported both vertical and horizontal sp...| Justin Abrahms
04 Aug 2011 I've found, during my brief experience with EasyMock, that trudging through the documentation makes it terribly difficult to get things done. From my reading, I wrote a handful of tests which use the reset(), replay(), verify() dance. When I changed trivial things in my implementation, all of my tests broke. "We expected you to call uselessMethod() but you didn't!" Simply fulfilling an interface Simply put, verify() is overrated. It turns out that the majority of what I want out o...| Justin Abrahms
25 Jul 2011 You might look at Python code every day, but what is the lens through which you view code? It's your text editor. This article was written for Python Magazine and was first in a series on Python development environments. Here, we look at how Vim users can boost their productivity by having Vim tell you as much as possible about your program, while you're writing it. As developers, we spend a majority of our productive day interacting with code. How we interact with this code is of...| Justin Abrahms
25 Jul 2011 Note: This article was originally published in the September 2008 edition of Python Magazine. It is published here edited only for formatting. Django is a full-stack web framework based in Python that allows you to achieve fast turnaround times. "Full-stack web framework" basically means it comes with tools necessary to access information in your database(s), report that information back to the user and many of the other functions you need on an everyday basis when dealing with we...| Justin Abrahms
14 Jul 2011 This site is now generated through org-mode, an emacs library which is used for outlining. The generation of the HTML lies in the export functionality of outlines. The benefits of this system is that its easy, uses a tool that I'm already familiar with, and extensible. Motivations My old site was written in Django and was consuming a fair amount of system resources. This has little to do with Django itself, but more with my hosting setup. In an effort to simplify, I've changed hos...| Justin Abrahms
17 Jun 2011 This is a relatively short screencast on a few different ways to select text in Vim. Vim's visual mode is a very powerful feature of the editor which allows you to select data in different, yet meaningful, ways. The screencast goes over normal visual mode, visual block mode, and text object selection. The relevant helpfiles are:: :h visual-mode :h v_b_i :h text-objects As a developer, its as important to know your editor as well as a carpenter knows his hammer. You can find this v...| Justin Abrahms
17 Jun 2011 Here's another in my series of vim screencasts. This one talks about the various uses of the % operator. You can find the video at http://showmedo.com/videotutorials/video?name%3D3160020 (likely dead) In non-editing mode, the % operator swaps between (), [] or {} style braces. This is super helpful for PHP style syntax that wraps large portions of code in these. The real power of the % operator comes in Ex mode, however. Ex mode is the mode that is triggered by the colon ( : ). It...| Justin Abrahms
17 Jun 2011 Having tried for literally days to get a legible screencast uploaded and online to any of a number of video services, I've decided to link to the actual file itself. This is a very quick and simple screencast of how to use macros in Vim. You can find the video at showmedo.com/videotutorials/video?name%3D3160000&fromSeriesID%3D316 (likely dead).| Justin Abrahms
17 Jun 2011 In my latest screencast, I've gone a bit longer than normal (about 7 minutes) in order to cover an introduction to vim. In this screencast, I give a brief overview of modal editing and what that means. I then go over how to move around in vim, how to enter editing mode in various and interesting ways. After that, how to cut / copy and paste were next on the list. Finally, I showed how to save and exit a vim file. You can find the video at http://showmedo.com/videotutorials/video?n...| Justin Abrahms
17 Jun 2011 On Michael Trier's suggestion, I've decided to make Vim my primary editor once again. Having recently switched from Textmate, there were a few things that I needed to get up and running to stay productive. Here they are in no particular order. NERDtree Figure 1: An example of NERDtree from zalaz.eu The NERDtree plugin functions much the same way that TM's project drawer works. It allows a hierarchal view of a folder structure. From this view, you can open files in new tabs, in the...| Justin Abrahms
17 Jun 2011 Just a quick tidbit for anyone googling like I have been all morning: If you're attempting to pipe a command in a buildbot script, you need to issue it as a single string, not a list of strings. By using a single string, buildbot uses a shell, otherwise it doesn't. The > necessary for output redirection is a shell thing, which will only work in this method. To recap: f1.addStep(ShellCommand(command=['/home/www/bin/django', 'build_solr_schema', '>', '/etc/solr/conf/schema.xml'], de...| Justin Abrahms
17 Jun 2011 For those who've hit the following complaint with django (like I just did): psycopg2.InternalError: current transaction is aborted, commands ignored until end of transaction block You need to set up PostGIS and ensure that the table you're looking at has been created from the templatepostgis template. Just a warning, check your database logs for more info.| Justin Abrahms
17 Jun 2011 I've spent a portion of this evening trying to get caught up with the crazy amounts of development that have been going on with the oebfare blogging engine over the past few weeks. I have a nice little Ubuntu VM setup that works really nicely, but when gathering the requirements for the projects, I hit a snag. I apparently had a borked setuptools (installed via apt) which resulted in the error:: NameError: global name 'log' is not defined To fix this, find your setuptools location...| Justin Abrahms
17 Jun 2011 Setting up my new macbook, I've had to go through the joy and pleasure that is macports. Overall, it wasn't so bad. A few missing packages here or there. Everything was going fine until I tried to install Fabric. Its dependency on pycrypto kept failing. I had installed pycrypto via macports and no luck. Turns out there are two paths under opt which need to be added to the python path in order to get it to work. /opt/local/lib/python/site-packages /opt/local/Library/Frameworks/Pyth...| Justin Abrahms
17 Jun 2011 Here's a handy bash shortcut for automatically checking out a google-code project. # SVN ALIASESexportGOOGLE_CODE_CHECKOUTS="$HOME/Code/trunks"gcco () { svn checkout http://$@.googlecode.com/svn/trunk/ $GOOGLE_CODE_CHECKOUTS/$@ }| Justin Abrahms
17 Jun 2011 For those of you who keep your models in a subdirectory, you may have noticed that you can't properly load fixtures. This is because Django checks for the location of your models file to determine your app directory. To fix this, move your models directory to something like modeldir and create a models.py which imports the models from inside. Before: myapp |__ views.py |__ __init__.py |__ models/ |____ __init__.py |____ mymodel1.py |____ mymodel2.py After: myapp |__ views.py |__ _...| Justin Abrahms
17 Jun 2011 So I'm a huge fan of Panic's Transmit application, as referenced by my favorites post. Its ease of use makes editing remote files not suck. One very cool feature of Transmit is its ability to edit remote files with any sort of editor. This works famously with both Textmate and Vim, but didn't quite work for me in emacs. After sending an email to the fellows at Panic, I got the fix in about 20 minutes. Those guys completely rock (go buy their software!). The trick is based on how e...| Justin Abrahms
17 Jun 2011 My first project for the new job has been creating an internationalized version of the website. I think it also serves as a good test run for how django works with the infrastructure that's in place. Instead of having two separate django installations, each with mirrored files (save settings.LANGUAGECODE), I wrote a quick middleware which will add a session key for djangolanguage, which is used by the locale middleware to determine which version of the site to show you, based on t...| Justin Abrahms
17 Jun 2011 For those poor souls who are forced to deploy Django on IIS, I feel your pain. I spent the better part of my morning fixing a broken PyISAPIe. To shortcut your trek, here's what I've found. Signals have changed since the last release. To fix this, I altered the call to signals to directly call the signals instead of importing the signals module. I then updated the signal calls themselves to reflect the new style. Another change in Django since the latest version of PyISAPIe was re...| Justin Abrahms
17 Jun 2011 django-voting is a reusable application which gives you reddit-style voting capabilities on generic objects. The application, itself, is a very well documented piece of software. Then again, that's not saying a lot considering its from Jonathan Buchannan. All of his projects are famously documented. Installation The installation of this application was standard fare for a google code app. SVN Checkout the application to a point on your python path and that's about it. For me, the ...| Justin Abrahms
17 Jun 2011 As I near the end of my run with AiO, I've been asked to come up with a portfolio. This has been pretty time consuming as there have been several rounds of critiques as I went through the process. The last stage of this journey, at least as far as the school is concerned, is the creation of an interactive portfolio. While the class will be doing theirs in Dreamweaver (eew), I've elected to create a reusable application for django to handle this. This is basically a mind dump of wh...| Justin Abrahms
17 Jun 2011 This once contained slides to a talk I gave to django-nyc. While I don't know where those are anymore, you can find the resulting code demonstration on github.| Justin Abrahms
17 Jun 2011 Database views will make their appearance in the upcoming Django 1.1 release. Having used them for my latest project, there are a few gotchas when it comes to using them. In our project, we were using South for our database migrations. To ensure our database views were created, we added them to a south migration using db.execute. This worked very well for 90% of our use case. The biggest hurdle for this ended up being testing. When syncdb runs, your unmanaged models (ie: database ...| Justin Abrahms
17 Jun 2011 In deploying my latest side project, I came across a conundrum. How do you manage production specific settings files (complete with passwords, API keys and other secrets), while still publishing the source code? Until now, I've had unversioned production settings sitting around the file system. While this hasn't failed me yet, its only a matter of time. Sensing an opportunity to derail a perfectly good deployment for another half hour, I've come up with what I think is a seemingly...| Justin Abrahms
17 Jun 2011 Insert jQuery: This bookmarklet is amazing if you're a firebug user. It allows you to use jquery in firebug, even when the site doesn't support it. I use it for things ranging from checking a bunch of checkboxes or checking the number of uses for a particular css class. You don't know that you're missing it until you don't have jQuery at your fingertips. (The bookmarklet is towards the middle) Url Shortening Service: This allows you to convert huge urls into really small ones. My ...| Justin Abrahms
17 Jun 2011 The general idea for JS Test Driver is that it allows you to run javascript unit tests. While this is nothing new, there are some interesting bits. JSTD provides XML output of tests running, which can be used for CI integration and test coverage. It can also run your tests across multiple browsers. JS Test Driver Installation JSTD's only dependencies are java and a browser, which makes it very easy to get it setup. I'm assuming you are on an Ubuntu machine, if you aren't, you're o...| Justin Abrahms
Importance of Documentation| justin.abrah.ms
03 Jul 2013 With the recent news surrounding privacy implications here in the US, I’ve taken it as an opportunity to encrypt and sign more emails that I send. Motivations The motivations I have behind sending encrypted email aren’t to hide secrets, as I don’t really have anything to hide from the government. That said, I dislike the act of surveillence without cause in itself. I believe the simple act of passively recording all information is an inherintly immoral one and is easily corr...| Justin Abrahms
Meaning is not zero-sum| justin.abrah.ms
Consul leader election issues| justin.abrah.ms
{ config, pkgs, ... }:| justin.abrah.ms
The open source strategy at many companies is rooted in security and compliance. I think that a data-driven, risk-management approach may offer an interesting framework for driving a broader open source strategy.| justin.abrah.ms
I read an Etsy engineering article that was over my head. After a bit of research, this is my new understanding.| justin.abrah.ms
A brief explaination of the differences, as I see them, of feature flags, dynamic config and experimentation| justin.abrah.ms
An example of what deploying on push looks like for self-hosted git repos| justin.abrah.ms
A response to someone's concerns with using emacs for Zettlekasten.| justin.abrah.ms
Designing what I think an ideal pipeline would look like.| justin.abrah.ms
A few of my current thoughts on crypto so I can look back on my position.| justin.abrah.ms
Notes for my future self: How to solve this error| justin.abrah.ms
Large enterprises talk a lot about governance, but stewardship may be a better model.| justin.abrah.ms
There are a few operational concerns when moving to GraphQL. Here are the ones I know.| justin.abrah.ms
Learning from Production Incidents| justin.abrah.ms
First and Second order metrics| justin.abrah.ms
Is web scraping ethical?| justin.abrah.ms
Biogas Digestion system.| justin.abrah.ms
How to make a font on Ubuntu with PPAs| justin.abrah.ms
Whiteboard photo snapper| justin.abrah.ms
Stub Stewart Bike Ride| justin.abrah.ms
Serene Lake| justin.abrah.ms
Will binary always be the lowest level way to program?| justin.abrah.ms
What is an algorithm?| justin.abrah.ms
Understanding the formal definition of Big-O| justin.abrah.ms
Software engineering vs other engineering| justin.abrah.ms
An overview of Guice| justin.abrah.ms
Nifty tools for my system| justin.abrah.ms
Literate API Testing with Dredd| justin.abrah.ms
Altruism in the job hunt| justin.abrah.ms
MicroConf 2015 Recap| justin.abrah.ms
Real-time code coverage analysis| justin.abrah.ms
Thinking like a programmer: Inputs & outputs| justin.abrah.ms
Why a community might want a Python Software Foundation| justin.abrah.ms
Meaning of Community| justin.abrah.ms
Imhotep helps you enforce your styleguide during code review| justin.abrah.ms
New programmers shouldn't learn vim or emacs.| justin.abrah.ms
So why should we prefer composition over inheritence?| justin.abrah.ms
(defun abrahms/org-mode-setup ()| justin.abrah.ms
Setuptools Entrypoints Explained| justin.abrah.ms
PyCon 2014 was awesome| justin.abrah.ms
Pull request templates make code review easier| justin.abrah.ms
NodeConf 2014: A story of aspiration and community| justin.abrah.ms
Obseletion through Programming| justin.abrah.ms
Node Knockout: A chance to play & experiment| justin.abrah.ms
Book Review: Backbone.js Testing by Ryan Roemer| justin.abrah.ms
Selenium's Page Object Pattern: The Key to Maintainable Tests| justin.abrah.ms
#!/usr/bin/env node| justin.abrah.ms
Pricing books as a function of risk| justin.abrah.ms
A list of scary topics.| justin.abrah.ms
In a word: Stagnant.| justin.abrah.ms
Thinking of Databases as an Excel file| justin.abrah.ms
This is the second in a three post series. The first post explains| justin.abrah.ms
Big-O notation explained by a self-taught programmer| justin.abrah.ms
Git's config files are structured like INI files. In addition to the| justin.abrah.ms
Most Used Programs: An Index| justin.abrah.ms