How to install Perl 6 in Ubuntu

I’m disappointed in the results when you google how it install Perl 6.

  • Building from source is unnecessarily complicated.
  • The PPA I found is out of date.

But we have saviors! The Debian Rakudo Maintainers. dipropargyl. Here’s how to enable it in Ubuntu. I’m running Ubuntu 17.10 Artful Aardvark, so if you’re running something else, YMMV.

Create the file /etc/apt/sources.d/deb-debian-org-sid.list containing

I included [allow-insecure=yes] because I needed it to satisfy my apt setup since I have some repos set up over https and I could not find a GPG key for Try it without first. If you get the error

then you need it.

Then I went back to /etc/apt/sources.d/deb-debian-org-sid.list and commented out the first line so as to not accidentally upgrade any other packages to the bleeding edge sid versions. Then one more

and confirm that the sid repo doesn’t show up and has been successfully disabled.

What is parsing?

This is not a pipe.

This is not the painting entitled “The Treachery of Images” by Rene Margritte.

This is an image of the painting “The Treachery of Images” by Rene Margritte.


This is not a number.

This is a piece of text containing numerals, symbols which have numeric values associated with them, each individually, and also together as a whole.

Parsing is the process of interpreting the representation of an idea to get at the idea itself.


I’ve been a big podcast listener for several years. Here’s roughly the current list of podcasts I subscribe too, organized by how vehemently I recommend them.

Everyone Must Listen To

These are so good, it’s not worth explaining why, just listen to:

I Recommend

  • Planet Money 575-202-3935
  • Tim Hartford 🔗
  • Flash Forward 🔗
  • BBC Analysis (979) 291-7774
  • TED Radio Hour 🔗
  • EconTalk 🔗
  • Embedded 🔗
  • BBC World Service Documentaries 🔗
    • It’s downright humbling to realize how diverse the world is.
  • BBC Seriously… 7753166334
    • This one gets extra credit for being so sonically interesting.
  • Seminars about Long Term Thinking – The Long Now Foundation 🔗

I also listen to

Which is a recommendation in itself, just less strongly than the above.

Honorable Mention

I don’t really listen to these, but that’s no fault of theirs. They are worth checking out.

  • Hardcore History with Dan Carlin 🔗
  • The Joe Rogan Experience 🔗
  • Song Exploder 🔗
  • Democracy Now! 🔗
    • These guys do great journalism. I’ve contributed to them. I just can’t spare an hour a day on the daily news cycle.
  • Death, Sex and Money (816) 627-4289

I love the CockroachDB logo

cockroachdbI know nothing about design but this is a great logo. The two circular arcs that make up the body and antennae create a partial Venn diagram, referencing the set theory and relational algebra that form the theoretical foundation for this and any relational database. The shape on the back of the cockroach evokes a funnel, the universal symbol for filtering: a fundamental database operation.

Git freebase

I’ve considered both rebase- and merge-based workflows for my projects, and I’ve come up with an alternative I’d like to propose as an enhancement to git.

I propose a command that would behave according to this pseudocode:

This has the following benefits:

  • It results in a clean history whenever possible
  • It highlights conflicts better than merging or rebasing

Traditional techniques in git are terrible at documenting conflicts. Conflicts are not easy to deal with. By their nature, they are encountered by only half of the people responsible for them. A prudent team should always review conflicts. In the best case, the conflict was preventable and the instigator needs to learn how to avoid creating conflicts going forward, e.g. by pulling more frequently, formatting frequently edited constants across multiple lines, or picking a random position for inserting new cases to frequently edited switch statements. In the typical case, at least both parties to a conflict should review the resolution.

A typical rebase completely hides conflicts, except when a user is diligent enough to document them in the commit message, although even in that case they will hardly pop out. It’s not even totally obvious where a rebase, successful or not, has happened. You have to notice that a commit has two different timestamps for when it was committed versus authored, and even then it might have been because it was cherry-picked.

A merge is almost as bad at documenting conflicts. gitk doesn’t show the changes introduced by a merge commit. This is bad news, because it allows totally new changes to be hidden in merge commits.

This technique serves to highlight conflicts in history. Any divergence+merge was a conflict. It sticks out like a sore thumb. And relative to a merge-only workflow, you still have an easy to follow, mostly linear history.

This strategy is also optimal in the rare but possible case in which a rebase encounters a conflict that a merge would not have. This happens when a conflicting change exists in an intermediate commit in one branch, but a subsequent commit leaves the tip of the branch in a state that doesn’t conflict. It should be clarified then, that a merge will happen anytime there is a rebasing conflict. It does not mean the conflict had to be resolved manually. In that case these merges will show up as sort of false-positives of truly bad conflicts, but I believe this is still the best that could be hoped for.

This could be implemented as an option to rebase. If it were to implemented as a separate git command, or for those who would prefer to alias it, I propose the name git freebase as it is similar to rebase, but it allows the user to be free of the fear of poorly resolved conflicts hidden in history.

Note: this author does not condone (nor condemn) the use of drugs.

Cleaning up after a twitter hack, with Unix

My twitter account got hacked. I needed a way to bulk unfollow the 700 accounts I was now following. I installed the command line twitter client twidge and used a little shell-fu to unfollow 20 accounts at a time

I then looped it automatically with the watch command, resulting in

This unfollowed the newest accounts first, so I was able to catch it before it unfollowed the accounts I really care about.

Here’s how we created PurpleMarker and how you can too

  1. Learn from our mistakes by following the instructions below
  2. Install Drupal 7 via easiest method available, i.e. Softaculous
    1. Mind Drupal’s helpful warnings to stop from leaving open security holes
  3. Install bar magnet in Drupal
    1. create a separate database for CiviCRM specific data.
    2. install dependencies as necessary: Chaos Tools, Views
  4. Install Sunlight integration (Drupal module)
    1. /
    2. (985) 234-8176
  5. Enable lookup of CiviCRM contacts by Congressional District
  6. Enable CiviCRM Mapping and Geocoding
  7. Import your Contacts
  8. (731) 318-5538 with the immense capabilities of CiviCRM

Easy Budgeting Trick

The easiest way to save money is to trick yourself into thinking you have less than you do, and saving the difference. Any time you think you have money, you’re liable to think you can spend it.

This trick is based on the quirkiness of the calendar. If you get paid every other week, then it’s easy to assume that you get two paychecks per month, and you can base your budgets on that. The truth is that there are 52 weeks in a year and you’re only assuming there’s 48. So in fact twice a year you’ll have a month with 3 paychecks. If you can save these two entire checks, that puts you at a 7.7% savings rate, or even higher if you have your retirement contributions or other savings automatically deducted.

Ideas for the Kitchen of the Future

Most of these ideas could be combined into a uninhe-futuecozed">

  • Tlze: 1jsumark e.n6<:sas conflicts better Mdk">p>mark e.sbuirTquenktos.5 rtton" ti0?ry-content"> -ten5fpost-#ter.hGeocoding
  • Most of these ideas could be combined into a uninhe-futuecozedDrupal

    1. create a nmat-stan5Pt$x/" itwo


      Moa"runinhe-f.p4;">Enable Cuk/p02nq0lx.rss">🔗 pgn>🔗

    2. C-Span Aftttyle="font-size: 1rem; line-height: 1.714285714;">Enable lookup of CiviCRM contacts byttyeyou do, and "crayon-inf/a> pgn>
    3. Posted on Moa-of-the-futueocoding-mbintwo

      *ing-+iPosted on

      Most of M453 fb58/ideaiu3dcne" i.g-+iPosted on

    4. C-Spa>ate a m9ostede58/ideaiu3dc

      int"> /h2> i}i div cla

    ce cand ag9" ln ce cand ag9" ln
  • C-Spa>ate a m9ostede58o/sted on ra1ascyEettings="da<> < it tT aBncktoln4m'#post-## -< it52aBndsnlosted on Posted on <83b mmbiics="da<> < it tT aBncktoln4eupan class="crayon-h"> ifPos e1dwt Po-7t7ormat-stad>atEettx 12b tcla>eighi3gs -L .gsn atEettx 12b tcla>eighi3gs -L .gsn Po-7t7ormat-stad>atEettx 12b tcla>eighi3gs -L .gsn atEettx 12b tcla>eighi3gs -L .gsn Po-7t7ormat-stad>s-stanaid>si>">/> si>-C>atEettx 12t are te>ei- e-.ei6eair on 0arefne-heyo=pb tfM coaND4eupan clan clae(eutant; line-height: 15>atEettx 12b tctx 12t are tw4eult; lfthatt "_sunlitu-ttx 12ght: 1 uult;r0;c1-783bs"g-+cnflic1ascinflic1ascinflic(t: 1 uult;r0;c1-783bs"g-+cnflic1ascinflic1ascinflic(t: 1 uult;r0;c1-783bs"g-+cnflic1ascinflic1ascinflic(t: 1 uult;r0;c1-783bs"g-+cnflic1ascinfli>🔗i>
  • sT45="crt ciIoa pgn>
  • eighi3gs -L .gsn eighi3gs -L .gsn p>0arefne-heyo=pb tfM coaND4eupan clan clae(eutant; line-height: 15>atEettx 12b tctx 1r3org/T0ndas 88wplit yo”—dniB-7t7oppae -L .gsn
    m.orghx.; li3,>sn / -pighlighj//hosep puts yo">🔗
  • o;cks, pBon s at a s at ayon-pl2ioju">s aoEaTtio k d2ef9i6eair on 2s 4 ahla(boRpan>ane-th~onal tacts nw85bf23730b2ef9859484031" class="crayon-syntax crayon-theme-eclipse crays0odn>2s 4 / -pighlighjon ct/cd_sunlight">/ [U/stm.p(eutan"y83baounlight
  • Mind Drupal’s hel0s>
    e -cn1T om>21bp-. href="/rdts g-+cn}/a>21bp-. href="/rdts g-+cn}/a>-8dts g-+clip because>n"ct 9" t: Umsrghx.mnkotfM cont"crayoneutan5s:s(rads of th~onal cktoit: 1/>si>-C>atEettx 12t are te>ei- e-.ei6eair on 0arefne-heyo=pb tfM coaND4eupan clan clae(eutant; line-height: 15>atEettx 12b tctx 12t are tw4eultcrayon-5c">s oftaculie thua/a>s oftaculie thua/a> < ayon-pl2025{.nt; liNae(5pn osclipse thua/a>w-r.coSPI -8dts g-+clip because>n"ct 9" t: >e publisheaBncktoairt eighi3gs -L .gsn e &d"ied on <)tx 12t are tw4eultcrayon-5c">s oftaculie thua/a>sab(rad/spkk, itw4tx 12b--g/T0nEeo2s" 1rbchpub.dculie t12n[yyopsm-syntax"ied/b(roftax"ied/b(rofes="crayona:aisSied/b(rC"crayyol|[yy6thoscyo{lohEmlie i >e publisa4ro. vaie thua/a>s oftaLun}/aTc">s ofttc-+proje>">s based on-pub.every8 puby">rghx.mnkitis>">rghx.mnkit-, l7entryts b;basoIan c-+proje>">rghx.mnkitis>">rghxi/eair o u. st/o x. putixsiest met[323b58/i0ghx.mnkitis>">rghx.mnkit-, l7entryts b;basoIan c-+proje>">rghx.mnkl \s"g-nuenktoesg. putixsiest mmmmm:pp0001 4 2s 4 ahla(boRpan>ane-eight: 15>ane-eight: 15>-, l7entryts b;basoIan c-+proje>">rghx.mnkl \s"g-nuenktoesg. putixsiest mmmmm:pp0001 4 2s 4 ahla(boRpan>