Recently I've been on the "I should write a blog post" to "spend 2 hours updating dependencies across 4 language ecosystems in my blog's Bazel monorepo" pipeline. I should still write that blog post though #hypstatic #bazel
On Tuesday, a weekly CI run triggered a Miri failure for a crate I maintain which has some unsafe code. Two days later I had a fix validated, reviewed, and released plus a RustSec advisory published at https://rustsec.org/advisories/RUSTSEC-2023-0048.html. From advisory being published to the dependabot PR was about 16 hours. #rust #artichoke #security
And proof that this setup is both good and bad – CI failed because I forgot to set the publish timestamp in the post YAML on the previous post. But CI ALSO failed because I forgot to run gazelle. #win #fail #bazel #hypstatic
My artisanally hand-crafted blog generator is an unholy mix of JavaScript, YAML, Markdown, assets distributed by npm package, Golang, Rust, and Python these days, glued together with Starlark in Bazel (deployed to GH Pages) #hypstatic #bazel
I recently published a demo Bazel workspace that shows off many of the rules and tools I use in the monorepo for this website. #hypstatic #bazel #github https://github.com/lopopolo/bazel_tools_demo
I did my first octopus merge today! #git #artichoke https://github.com/artichoke/project-infrastructure/commit/45b6926ba389ebf0971a6e64e7a5fcfea74bb593
Most frequently used commands, redux https://hyperbo.la/lifestream/560/
Just used exiftool and lots of zsh globbing to strip all metadata from JPEGs and PNGs used to build the static hyperbola site. #hypstatic
hyperbola/logo repository was merged into the hyperbola-static monorepo! There is only one repo used to build this site now! #hypstatic #bazel #monorepo
force a rebuild #hypstatic
Woo! hyperbola no longer requires webpack to build. Hundreds of dependencies removed! The build uses eslint for bundling. #webpack #hypstatic
I just removed all pagination from the #hypstatic lifestream section #win this design choice dates all the way back to the first implementation of lifestream in 2010 #history
I've been toying with the idea of removing all pagination from #hypstatic
There is no more #webpack in #artichoke. All web properties have been migrated to esbuild, eta template engine, the Node fs API, and custom build scripts. This is simple, this is good. #hypstatic is next but there is a lot to unwind. #win
with the lopopolo IAM user gone, the only ones left were the IAM users in the #artichoke and #hypstatic GitHub organizations used for terraform CI in the project-infrastructure repos. I used the new GitHub Actions OpenID Connect provider to wire up AWS identity federation following this guide – https://scalesec.com/blog/identity-federation-for-github-actions-on-aws/ #security #github #aws #win
With AWS SSO in place, I started using aws-vault locally for #terraform and AWS CLI. I learned about this tool at work. No IAM access keys with inline IAM policies! SSO + assume role for administrator access! #security #win
I'm not sure how long ago this happened, but I got ownership of the @hyperbola handle on #github to match the npm namespace. Some js libs, old infrastructure for dynamic hyperbola, and #hypstatic live there now. I've added a 'project-infrastructure' repo like in Artichoke which does infra as code for the GitHub organization and #aws setup.
I took a hacksaw to my homebrew installation. I'm not sure how this happened but the brewfile I've been carrying around at one point had the entire dependency graph in it rather than the explicitly installed deps ... which made everything on my new Mac an explicitly installed dep. I had hundreds of libs installed for no reason. Burned everything down and started from scratch. #fail #win https://github.com/lopopolo/dotfiles/blob/fb9af6bd19df2149dba5a63a8db161702bcbe5db/homebrew-packages/Brewfile.rooster
macOS things – I tried out alacritty and tmux again but didn't switch away from iTerm2. I tried a bunch of fancy neovim LSP, floating pane, and lua config and then stripped all IDE bits out of vimrc to keep it just an editor. Finally enabled dark mode on my Mac (synced with the sunrise and sunset), switched to dark terminal and neovim color schemes. #win #vim
It's been a while since I've posted about #artichoke, but I recently landed a #rust implementation of #ruby's `String` class. #win https://github.com/artichoke/artichoke/pull/1222
yikes and pagintated navigation for archive pages had month and year mixed up in the link. #hypstatic #fail
ooof. While hacking on the lifestream part of the static site generator, uncovered that previous and next buttons for traversing lifestream permalinks had their polarity swapped. That bug has been there for over a year. #hypstatic #fail
I got a PR in artichoke suggesting to bump down the frequency of dependabot updates to monthly. I applied this change across all artichoke, hyperbola, and lopopolo repositories. It has been a big quality of life improvement and cuts down on a lot of churn in JS dependencies. Applying dep updates once a month is 👍 #win #artichoke
Yay! hyperbo.la is running Bootstrap v5. This upgrade was actually really small! Just some small changes to the Sass for customizing colors and updates to the navbar. #win
focaccia and roe are UTF-8 case manipulation crates for implementing parts of `String` and `Symbol` in #artichoke. intaglio is Artichoke's symbol table, boba is an implementation of Bubble Babble Encoding which will be used in the `digest` stdlib package. #rust #patch
Published a few more #rust crates since I last checked in: boba, focaccia, intaglio, and roe. https://crates.io/crates/boba https://crates.io/crates/focaccia https://crates.io/crates/intaglio https://crates.io/crates/roe #patch
Since cutting hyperbo.la over to GitHub Pages and tearing down most of the AWS infra, monthly AWS costs have been about $1.25. The biggest two items have been ~$0.50 each for S3 and Route53. #aws #cost #hypstatic
This PR also took the opportunity to hand-optimize and hand-make retina variants of all images in the blog and lifestream. This eliminated most of the large asset warnings from #webpack #performance #hypstatic
In the process nukes 1000s of lines from package-lock.json #hypstatic
Just upgraded hyperbo.la's build pipeline to #webpack 5 #hypstatic
Correctness test that the lifestream handles rendering dates correctly when the week year and year are not the same. https://twitter.com/fasterthanlime/status/1342967204153876482
As of last night, all hyperbo.la AWS infrastructure is torn down. https://github.com/hyperbola/hyperbola/pull/111 #aws #terraform #devops #hypstatic
To make this change on dynamic hyperbola would have meant 5-10 Ansible deploys to a Vagrant VM. Iteration speed would have been terrible. #devops #a11y #lighthouse #hypstatic
The static site with local #webpack development environment is already paying off! Google Lighthouse accessibility score for hyperbo.la is now 100 with increased text contrast. #a11y #lighthouse #hypstatic
hyperbola is deployed to GitHub Pages now! Executed via DNS cutover with terraform. Now to destroy the old infrastructure in AWS. #github #hypstatic #aws #terraform #hypstatic
And just like that, dependabot is enabled for hyperbola-static, the WIP lifeastream branch is merged, and the CI is spruced up #hypstatic
There have been over 600 PRs in the last year of Artichoke. https://hyperbo.la/lifestream/737/ https://github.com/artichoke/artichoke/pull/847 #artichoke #git
This is a setup that has worked well for www.artichokeruby.org. Set dependabot to autoupdate deps and the "maintenance" has been updating content. Deploys are automatic, regression testing of dep upgrades is automatic. #automation #hypstatic
There is Ansible, Packer, Terraform, JavaScript, Webpack, Python, Django, Ubuntu, nginx, EC2, Route53, ALB, S3. I think I can simplify this to GitHub Actions, GitHub Pages, Node, Webpack, and statically configured DNS with my registrar. #hypstatic
Looking at the commit history for Python hyperbola over the last 3 years shows that it hasn't been developed, only maintained. It is done, but the current repo is expensive to maintain. #hypstatic
Switching to a static site built with webpack at least affords the opportunity to have an integration test that the site compiles. #automation #hypstatic
There is no automated build and no test suite. #automation #hypstatic
Dependency management in Python makes me sad. #fail #python #hypstatic
I've lost my ability to develop locally since I don't want to install VirtualBox on my new laptop. #fail #hypstatic
I run an outdated version of Django. #django #fail #hypstatic
The terraform config for this project is on 0.12 and I have no desire to update it to 0.13. #fail #terraform #automation #hypstatic
I will miss the ease of adding lifestream posts via the Django admin UI, but given that I'm posting elsewhere these days, I don't think I'll miss it too much #hypstatic
Remaining pieces are implementing hashtag browsing pages and the date archive browsing pages #hypstatic
Most of my updates these days are either in the Artichoke Discord or @artichokeruby Twitter #hypstatic
The AWS infra that the current site runs on is $50 a month I do not need to spend. #aws #cost #hypstatic
I've had a work in progress fork of hyperbola to migrate to a static site hosted on GitHub pages for over 6 months. I can't find the time to finish it. #hypstatic
More #artichoke updates since March: a marketing site at www.artichokeruby.org, prebuilt containers on Docker Hub https://hub.docker.com/r/artichokeruby/artichoke, and prebuilt nightlies https://github.com/artichoke/nightly/releases/latest #win
#vscode and LLDB in VSCode were SO amazing to use. Within a couple of iterations, I was able to track down the use-after-free: https://github.com/artichoke/artichoke/pull/674 #fail #win #artichoke
After repeated attempts of replicating my windows CI setup in a developer VM, I sloppily installed software via web installers. With every VS component, rustup, RubyInstaller, LLVM, choco, and winflexbison, I was running with a reproducer #artichoke
Once GH-670 was merged, I had a segfault that only (and reliably) reproduced on one test in Windows #artichoke #rust #windows
After 50 PRs, I was able to put GH-442 to bed and remove the Rc wrapper from the Artichoke state https://github.com/artichoke/artichoke/pull/670 #win This refactor took 4 months #fail #rust #artichoke
Nightly builds of Artichoke are available via ruby-build: rbenv install artichoke-dev #artichoke #win
I published my first #rust crate (and package of any kind, ever)! rand_mt is a fork of an existing Mersenne Twister crate which adds compatibility with the latest rand_core and makes it no_std https://crates.io/crates/rand_mt #patch
I contributed a feature to #rust! Added an implementation to allow turning a &mut str into a String using the standard From trait #win #patch https://github.com/rust-lang/rust/pull/69661
Migrated all #artichoke CI to GitHub Actions #github #win Jobs and workflows are so much easier to reason about. And it's free 💪
I've been absent from the lifestream for a bit. I've been busy implementing!
Pushing errors to the edge and forcing callers to handle them makes for better code #artichoke https://github.com/artichoke/artichoke/pull/434
Nothing like a little build breakage to start the weekend https://github.com/artichoke/artichoke/pull/417 #artichoke #fail
Lol following up on https://hyperbo.la/lifestream/743/ ... https://github.com/artichoke/artichoke/pull/348 disabled most converters to improve compilation times and https://github.com/artichoke/artichoke/pull/397 added them back behind a feature
#artichoke RubyConf recording here: https://www.youtube.com/watch?v=QMni48MBqFw
I missed a couple of months posting! I was working on my RubyConf talk about #artichoke. slides here: https://artichoke.github.io/rubyconf/2019/
Just explicitly shut down the frklft.tires site by doing a terraform destroy. Sad, but that code didn't need to live forever.
I added a feature to rust-bindgen to make a dependency optional to make the build lighter #github #patch https://github.com/rust-lang/rust-bindgen/pull/1615
Reported a critical bug in rustfmt #fail #github #patch https://github.com/rust-lang/rustfmt/issues/3770
Also added many more converter implementations with macros. There are 988 TryConvert implementations. #win #fail #artichoke
Led to reporting this #mruby bug: https://github.com/mruby/mruby/issues/4684 #github #fail although I was able to work around it #artichoke
This change added new functionality: Converting to and from byte and string slices #win #artichoke
The converters are central to #artichoke. Changing this core abstraction was painful: 84 files changed, 2000 lines added, 2800 lines removed. #fail #git
The converters allow the runtime to convert between Rust and Ruby types. They are the glue that the entire Ruby Core and Ruby Standard Library implementation is built upon. #artichoke
I'm separating the core of #artichoke from the #mruby backend specific glue. This step involved reimplementing the converters with the new traits in core.
This was a nasty PR https://github.com/artichoke/artichoke/pull/242 #artichoke #fail
I added a macro to oniguruma to enable it to build on clang for #wasm targets #patch #github #artichoke https://github.com/kkos/oniguruma/pull/150
I reported an undocumented panic in #rust that was fixed today #patch #win https://github.com/rust-lang/rust/issues/63456
Reported a build issue on #mruby with gperf 3.1 #ci #build #patch #github #artichoke https://github.com/mruby/mruby/issues/4628
#artichoke is the top trending repo on all of #github right now #win
I'm trying to improve Regexp performance in #artichoke by using the regex crate instead of oniguruma in some cases. It turns out not to be faster in all cases #patch #rust #fail https://github.com/rust-lang/regex/issues/604
I built an #artichoke #Wasm playground in the browser https://artichoke.github.io/artichoke/ #win
That is a lot of code #artichoke #github #patch #win
That is a lot of code #artichoke #github #patch #win
Neither mruby-sys nor onig can build with wasm-unknown-unknown or wasm-wasi, so I was stuck with wasm-unknown-emscripten. The linker on mruby-sys would dead code eliminate artichoke_backend::Artichoke #fail #Wasm #artichoke #mruby
One of the goals is to have a #Wasm build target. This is what nerdsniped me this weekend. #artichoke
The biggest accomplishment was redoing the #artichoke README https://github.com/artichoke/artichoke#readme Thought about project goals and differentiators from MRI. Added milestones to track progress in achieving goals #win #ruby #artichoke
With renewed focus of building my own #Ruby instead of extending #mruby, I put in some effort to make mruby an implementation detail of #artichoke. Lots of refactoring with sed. #fail
ferrocarril had different goals than artichoke: it wanted to run Rails. To do that, it had a lot of extra bits in it like gems, a Rack server, and sample apps. Nuked all of it #win #artichoke
Step 3: create the #artichoke repository where the core #ruby development will take place. #artichoke
Step 2: transfer ownership of ferrocarril to artichoke organization #artichoke #github. Not much to do here, updated some links, fixed some branding, got CircleCI building again #artichoke
CactusRef is still an incredibly unsafe crate, but at least it aborts if it detects a use-after-free #fail #artichoke
Extracting cactusref required completely rewriting #git history, updating docs, adding a build, adding benches, importing my blog post, updating links in the blog post #artichoke
Step 1: extract CactusRef from ferrocarril into its own repository https://github.com/artichoke/cactusref #artichoke
This weekend I did the migration, which took place in multiple parts #artichoke #github
ferrocarril is all grown up. I've moved development of my #ruby to a dedicated #GitHub organization. The project is called Artichoke https://github.com/artichoke/artichoke
I’ve been uncovering a few bugs in mruby trying to get ruby/spec to at least run to completion. This bug report fixed an infinite loop that unblocked that #mruby #patch https://github.com/mruby/mruby/issues/4555
Reported a bug in layout generation for structure with flexible array members to #rust bindgen that was recently fixed #patch https://github.com/rust-lang/rust-bindgen/issues/1589
Reported an uninitialized memory access to #mruby upstream that was recently fixed #patch https://github.com/mruby/mruby/issues/4556
That memory leak turned out to be quite the yak shave. setjmp/longjmp from C leaving #rust memory in inconsistent state #fail https://github.com/artichoke/ferrocarril/pull/168
Optimized String#scan in ferrocarril to be comparable to CRuby performance #rust #ruby #mruby #performance https://github.com/artichoke/ferrocarril/pull/138
Added a feature (both a new capability and a compile time feature!) to rust-embed to allow it to embed sources relative to crate root which is useful in workspaces #rust #patch https://github.com/pyros2097/rust-embed/pull/67
Adding paragraph mode to String#each_line in mruby core #ruby #patch https://github.com/mruby/mruby/pull/4527
I've proposed a couple of PRs to speed up UTF-8 String handling in mruby https://github.com/mruby/mruby/pull/4529 https://github.com/mruby/mruby/pull/4531 #patch #ruby #github
ruby/spec is a set of specifications for the Ruby language shared across implementations. I had a fix accepted to the StringScanner spec! #patch #ruby https://github.com/ruby/spec/pull/671
I reported a compiler improvement for suggestion diagnostics #rust #patch https://github.com/rust-lang/rust/issues/61555
I have Regexp#match? https://github.com/artichoke/ferrocarril/pull/93 #win #rust #ruby
Filed a couple more issues I ran into while working on ferrocarril: https://github.com/SergioBenitez/Rocket/issues/1019 https://github.com/rust-onig/rust-onig/issues/102 #patch
here's another Clippy bug #rust #fail https://github.com/rust-lang/rust-clippy/issues/4143
I reported a #segfault in mruby and spoke directly with @matz! #win https://github.com/mruby/mruby/issues/4460 #patch
It only took 49 build jobs, but the ferrocarril build is passing on CircleCI https://circleci.com/gh/artichoke/ferrocarril/47 This is the first time I've ever set up #ci for a side project #win
ferrocarril is a new project I've been working on to embed #ruby on Rails in #rust https://github.com/artichoke/ferrocarril
#patch got another PR accepted in the Ansible + ACME + Route53 role I use for the hyperbola dev env load balancer #win https://github.com/mprahl/ansible-role-lets-encrypt-route-53/pull/15
I just used #github to create a reproducer case for a panic in a #rust library #win https://github.com/lopopolo/rust-embed-panic https://github.com/pyros2097/rust-embed/issues/61 #patch
I found an ICE (internal compiler error) in clippy in #rust nightly #fail https://github.com/rust-lang/rust/issues/60067
looks like I didn't finalize the deploy in January so I had a few extra AMIs kicking around that I was needlessly paying for #aws #cost #fail #automation
When asking someone to do something via email, the fact that they’ve even opened it is a big hurdle. Make their life easy: in-line as much as you can, minimize clicks, make links easy to scan, be direct, have a tl;dr #communication #email
I'm speaking at Monitorama on June 4-6. My talk is titled The AWS Billing Machine and Optimizing Cloud Costs. #conference #aws #cost
I'm speaking at DevOpsDays Seattle on April 23. My talk is titled The AWS Billing Machine and Optimizing Cloud Costs. #conference #aws #cost
Larson Media Training 101: Answer the question you wish you were asked. #communication
I live in Seattle now. First week at the Stripe office was quiet due to the snow. Working on expanding Stripe into Latin America.
I have eliminated all explicit casts in punchtop #rust #win https://github.com/lopopolo/punchtop/commit/1e41ca3
More #rust safety: removed a cast to usize with the new usize::from_be_bytes converter https://github.com/lopopolo/punchtop/commit/2263c80 #win
#marketing is easier if you have metrics to support your impact. I like to always tie my metrics back to dollars.
One common hangup I've encountered when discussing #marketing my work with other engineers is the notion that the work was easy or trivial to implement. That's not the important part! What the org cares about is impact. Tell a good story!
To be good at #marketing yourself, you need to be good at communication, both written and verbal. Don't be afraid to talk about your work, either to your manager, your skip level, your users, an email list, or the company all hands meeting.
As an engineer, I care very much about #marketing myself, my team, and my work. I am of the impression that my work does not speak for itself, I have to speak for my work. Being high impact means making sure the org knows it, too.
The game that I'm working on is punchtop https://github.com/lopopolo/punchtop #win #rust #powerhour
I made a small #rust crate called stream-util for a game I'm working on. https://github.com/lopopolo/punchtop/tree/master/stream-util allows graceful drains of tokio mpsc channels or canceling a futures Stream. Clippy pedantic and fully documented #win
I implemented a #rust client for the #chromecast protocol for a game I'm working on. I collected a fairly exhaustive set of protocol documentation: https://github.com/lopopolo/punchtop/tree/master/cast-client
First #rust #patch accepted https://github.com/asomers/futures-locks/pull/10 closing out 2018 with a bang
Took 4.5 years but I've finally started to learn #rust: https://hyperbo.la/lifestream/298/. I'm implementing a power hour game that plays to a #chromecast with a #react webview UI.
I had a #patch accepted to an Ansible role I use in my Vagrant environment https://github.com/mprahl/ansible-role-lets-encrypt-route-53/pull/14
I promised a postmortem: https://hyperbo.la/w/secrets-in-parameter-store-postmortem/
I was hard down for ~5min last night while rolling out secrets in parameter store. 0.149.0, 0.149.1, 0.149.2, and 0.149.3 were bad releases #fail. 0.149.4 is stable: https://github.com/hyperbola/hyperbola/compare/v0.148.0...v0.149.4. Postmortem pending.
Add in some manual #terraform state edits and deleting things in the #aws console and we're recovered #fail #win
A red herring was adding a call to dd in the cleanup script to zero the free space on the disk. I thought I was somehow filling the disk and not reclaiming space.
Removing just the dev package with #ansible #provisioning had no effect in local env, but combined with the apt purge in the #packer script, uninstalled mysqlclient
Root cause: My app depends on the python package mysqlclient, which in turn depends on the libmysqlclient system package. I was pulling this in transitively via the dev package required for building.
Undeployable manifested as healthz returning 502 when adding a new instance to the ALB, marking it as unhealthy and timing out #terraform
I recently started cleaning up after myself during #provisioning. There are two steps to this: #ansible uninstalls build deps and #packer executes a cleanup script that does an apt purge and autoremove
Got into an undeployable state due to differences in #provisioning between local and prod environments #fail https://github.com/hyperbola/hyperbola/commit/a914992
code yellow 😕
That was a 35-commit weekend. New features and improved code quality. #win https://github.com/hyperbola/hyperbola/compare/918f6d0f..4c331eee
Significantly refactored my #webpack static asset pipeline today. No longer build assets locally and check them in. Build happens as part of #ansible provisioning. #win https://github.com/hyperbola/hyperbola/commit/eaf5b3197
I added code block and syntax highlighting to my new #blog. Planning on using it for an upcoming post about #terraform.
I made a post on how your org chart shows up in your infrastructure: https://hyperbo.la/w/aws-org-chart/ #blog
I made a post on Prosperity's partnership with Finance: https://hyperbo.la/w/engineering-finance-partnership/ #blog
Further #cost optimized my #AWS infra. Saved $3/month by turning off CloudWatch monitoring and making my ASG out of spot instances https://github.com/hyperbola/hyperbola/commit/ffa0e34 #win
I had a #patch accepted to gunicorn https://github.com/benoitc/gunicorn/pull/1889
That was easy! hyperbola running on t3s now. #aws #terraform #win
docker lessons: https://github.com/hyperbola/hyperbola/pull/94
I also pruned a lot of config from my 12factor env, favoring convention for things like DB connection strings. In doing so, migrated to one hostname for DB across all environments. /etc/hosts alias in Vagrant, network in Docker, private hosted zone in AWS
One hack I've been using to enhance my productivity in the face of KTLO work is to write lots of things down. Project plans, system diagrams, user interviews. It helps organize the work that I have done and keeps me motivated.
The past 4ish months I've been a team of one. Been a decent slog. It's been hard to be productive when all of the KTLO work falls on me. Getting a new teammate in a couple weeks. Excited. 🤩
I've been retraining myself to say "Hey Google" instead of "OK Google"
I published a post about AWS Reserved Instances today https://stripe.com/blog/aws-reserved-instances
Last week I tried to build hyperbola with #docker. I ended up with 5 containers to deploy a stage environment. https://github.com/hyperbola/hyperbola/pull/92
hyperbola is ready for #django 2.1. https://github.com/hyperbola/hyperbola/commit/d92a79f. That was easy #win
Switched from community PPA to official nginx-provided binaries. That was ... really easy: https://github.com/hyperbola/hyperbola/commit/5461837 #win #ansible
for www.frklft.tires, I stopped using #terraform for managing the static content of the site. It now lives outside of my terraform code in a public directory, published explicitly with a make target #win
I launched https://www.frklft.tires/ last week. Built with S3, CloudFront, and Lambda.
My current understanding of this column is that it is the instance family if the usage type is eligible for RI instance size flexibility
What they neglect to mention is that DedicatedUsage types do not have an instance family associated with them
AWS says that product/instanceTypeFamily is "The instance family that is associated with the given usage. For example, t2 or m4."
https://hyperbo.la/lifestream/347/ was an anti-pattern which got fixed when I moved to pipenv
When all you have is a rock, everything looks like a hammer
This is a great article: https://rachelbythebay.com/w/2018/02/26/frame/
pandas and jupyter notebooks are my new favorite hammers
So it turns out I shouldn't have ignored that MySQL backtrace when printing the help text of my new django management command in dev. That's why it hung when building the AMI. #fail One line fix: https://github.com/hyperbola/hyperbola/commit/728f1d68
it looks like prod peaks at 75 req/s #performance
Not to mention Let's Encrypt to Amazon back to Let's Encrypt again (for vagrant) for certs
I've had significant churn on tools in the past year for building hyperbola: pip to pip-tools to pipenv. gulp to webpack. linode to AWS. bespoke deployment and scripts to ansible. All good, just exhasuting.
vagrant-lb PR: https://github.com/hyperbola/hyperbola/pull/86
I suspect that NTP traffic was the trickle of traffic that traversed my recently decomissioned NAT
I made a thing! https://www.burnfastburnbright.com/ Bootstrap 4, route53 domains, and terraform made this really easy. went from 0 to 100 in about 1.5 hours. #win
New features in v0.116.0: bootstrap4, removed RSS and Atom feeds, 100% webpack frontend build, css purification improvements, and healthz middleware
Most frequently used commands, redux https://hyperbo.la/lifestream/146/
LOL that was only six years ago ... don't let your dreams stay dreams: https://hyperbo.la/lifestream/51/ #aws
welp that didn't last long. CloudFlare only queries a subset of NS records to check for liveness and has determined that I no longer use CloudFlare. Working on purging them from #terraform and registrar now #fail
Even more cost savings: dynamically provisioned bastion cloudformation stack #terraform #aws
hyperbola: now with multi-homed DNS. AWS Route 53 and CloudFlare, made possible by terraform. (In the process upgraded hyperbo.la mail to a 2048-bit DKIM key) #win #redundancy #devops
mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql -u root mysql was the magic incantation required to get lifestream archive views working locally
Today's shipped email featuring subtly modified lyrics from Kanye's Flashing Lights
#history throwback to the time that my wiki was spammed by a bot that turned all the pages into link spam for discount pharmaceuticals https://github.com/hyperbola/hyperbola/commit/1a3725b84bf82982945f68d14ff09ae7aa00d0ba #fail
and no more chrome on iOS. Using safari there. The only value chrome brings is unified history and being logged in to my google account. I use neither of these features
I switched to Firefox Developer Edition today on my mac. It is pretty blazing fast. Looking forward to 58 making it to the dev channel in November
With @huff's help, I have discovered ETL's True Name. ETL is just indexes. Indexes are just caching. Caching is just named replication. Names are the only problem in computer science.
#terraform is now a package manager. Great. #fail. For some reason plugin downloads hang if the download gets an IPV6 edge node in their CDN.
thinking of removing dependency on #cloudflare. currently only used for hyperbo.la DNS. Email records are the scary part. #terraform makes this mostly easy
I just realized that by merging hyperbola-tools into hyperbola and converting my ad hoc ruby scripts to python, I moved to a monorepo and standardized on a language
4. addendum: I used #LetsEncrypt before migrating to AWS with a combination of cron, systemd timers, and dehydrated. ACM is easier, less error prone, and set-it-and-forget-it #win
4. problem: https is hard. solution: ACM + #terraform + ALB + CloudFront
2. django-backup.py sucks. problems: email based, backup size is limited, unconfirmed delivery, plaintext transmission. solution: move media to versioned S3 bucket, daily RDS snapshots, logical backup json to S3
1. problem: python not running the latest 2.7.x release. solution: pyenv for local development and xenial (python3.5) + ansible + (future) deadsnakes ppa
my #terraform life became much easier by using name_prefix instead of name. name and name_prefix parameters were never interpolated. Instead, use interpolation in tags. In practice this means config can change without rebuilding the world #win
I initially went with the unclustered variants of elasticache and rds. Once I wrapped my head around the topology, #redis cluster mode and #aurora were much easier to work with in #terraform
buliding the #aws infra took about 30 commits, two #terraform destroys, and two terraform code rewrites. some fun bits in the following posts
2am hot take: all systems problems are best solved with pointers and routing. aka dependency and service injection
Rebuilt everything and modulo some zombie deposed resources, everything is good again
Discovered I had duplicate stanzas in my tfvars file. Removed the extraneous one. Broke EVERYTHING. #fail The worst was my admin IAM account losing access in the midst of a terraform apply. destroyed module.network, module.iam, and module.hyperbola-wiki
Converted wiki from ELB to ALB this morning ... took a couple of hours. modified #terraform config and updated #ansible ... also converted from Let's Encrypt to ACM. https://github.com/hyperbola/hyperbola-tools/commit/23fb9a7 #win
2 minutes of #downtime for libc security upgrade https://www.ubuntu.com/usn/usn-3323-1/
OMG just rewrote my #git PS1 which runs as part of my PROMPT_COMMAND. Now 20% faster both inside and outside a repo. terminal feels so much faster now #win #performance https://github.com/lopopolo/dotfiles/commit/2d5054c4ce
I am living the dream with an n/ac-only network
I hope my next laptop has 32GB of RAM
Migrated terraform state from a private github repo to a private, encrypted S3 bucket. State infra is bulkheaded from main app and protected with prevent_destroy lifecycle #win #terraform #aws
and the #monitoring even triggered when I took the box down. #win
All done. Downgraded from 8GB of RAM to a more reasonable 2GB of RAM. Went from 4 cores down to one though 😱 #devops #maintenance
Also, I have a google analytics snippet on the site. I have never once checked the analytics.
sure an ELB + managed MySQL & redis + redundant frontends are "better" but I'm not sure I need the complexity
Not sure if it is worth the effort to migrate hyperbola to #AWS. Maintenance burden is pretty low. Log in maybe once a month, run an apt upgrade, and do a fresh deploy. Takes less time than a packer/terraform cycle would. #maintenance
Code that is organized in pipelines is easier to grok than code that is organized in trees #functionalprogramming
Software shouldn't be "delightful." It should be invisible.
Today I learned about octopus merges #git https://marc.info/?l=linux-kernel&m=139033182525831
ELB for wiki does a basic healthcheck of nginx, but a backend can be down while the ELB thinks the node is healthy #monitoring
Added liveness monitoring of healthz endpoints on wiki and hyperbo.la today #monitoring #devops #win healthz goes all the way through to rack/django
Media backups have been failing since I moved the site to the new server. I've been uploading empty, corrupted tarballs. #fail fix here: https://github.com/hyperbola/hyperbola/commit/859128 Thank you gitlab & national check your backups day
#django feature request and #patch accepted https://code.djangoproject.com/ticket/27541
bastion is now in an ASG with an automatically bound (with user data) elastic IP. Yay fault-tolerant infra! #win #aws #terraform
mucking around in settings.py I ended up doing a top-level import from debug_toolbar. Yay for staging. #fail https://github.com/hyperbola/hyperbola/commit/26c4e1d
diff of yesterday's backups and current backup confirm all that has been altered are filenames
Fixing this required parsing a db dump (django fixtures much easier to read than mysqldump output) and manually running UPDATE queries in MySQL
just automated a spreadsheet (concatenating several columns) with filter #win filter(L6:L, L6:L<>"") vs manually updating ranges #automation
DOMContentLoaded in less than 200ms on lifestream index #performance #cdn
Enabled cloudflare cdn on www.hyperbolacdn.com today. Took 4 clicks. #win
Some changes since moving to the new host: assets and user uploads served off of www.hyperbolacdn.com; TLS; frontend deps managed with bower
hyperbo.la staging and production are TLS enabled. Still have to turn on HSTS. #win #letsencrypt
❤️ Emoji: 🔥🔥🔥
Successfully migrated hyperbo.la and staging.hyperbo.la to a new host, hyperbola3. Ubuntu 16.04 and 8GB of RAM. Just shut down hyperbola1. #win
#throwback #cruft just cleared out MIT client certs from 4 years ago that were hanging around in my keychain
Also found the samba password to the file server named supersecret that I built
All this discovered while clearing out my OS X Keychain
That was when hyperbo.la ran on a reclaimed Dell workstation in a network closet at MIT
I think I also used to host a redmine instance on dev.hyperbo.la back in the day ~2010
#throwback http://dev.hyperbo.la:80 hyperbo.la subversion repositories
successfully did an out of band release not of master while in the process of migrating hyperbola to a new host #win #deployment #automation
Forgot to blog about this: My printer ran out of toner a week before my move. Had the printer since 2010. RIP printer
The only times I have ever run ant as a build tool were a couple of CS classes back at MIT—4 years ago. Even today, it remains my 8th most frequently used command on my mac
Filed a site issue JIRA on my last day. It was eventually closed as invalid. By the time this happened, though, I had lost systems access and couldn't discuss it further
Today was the day of linters. Added eslint, flake8 config, and isort to hyperbola
Someone forked my senior thesis ... what? https://github.com/nmoutana/sr
<ENTER>~.
Reading about the LMAX Disruptor https://martinfowler.com/articles/lmax.html ... pretty cool. I've seen similar patterns (at lower optimization levels) at Box.
Switching from yui-compressor to yuglify saved me 1KB on bootstrap.js and 30 bytes on bootstrap+hyperbola css #performance
With this latest release, hyperbola has surpassed 500 commits! #win https://github.com/hyperbola/hyperbola/tree/2015-11-21-lifestream-template-refactor
lifestream template refactor didn't yield any #performance wins, but the code is much cleaner now. #win
Front page warm nginx latency is 12ms; contact page is 20ms #performance
Current prod gunicorn time (measured at nginx) for the lifestream index page is 70ms with no partial caching and 40ms with the sidebar cached #performance
Tested rendering the lifestream index with all 3 interpreters. pypy is slower than python2.7 by 2x. python3.5 is faster than python2.7 by 2x. #performance
Local development lets me run cool experiments. I have python2.7, python3.5, and pypy virtualenvs.
Sped up the lifestream page by 30ms by caching the archive sidebar. More template speedups to be had by switching to python3 (str to unicode coercion in python2) #win #performance
Root fs usage is down to 3.5G.
Finally started cleaning old deployments. After each deploy, my deploy script removes all but the latest 5 deployments for a given env. https://hyperbo.la/lifestream/352/ can rest peacefully.
90mbps upload to Box from the corporate network is pretty nice when backing up my photos (all 25GB of them).
Did some archeology today to unearth an ancient version of hyperbo.la. Same color scheme as today. Yes, there was an assets domain. Had to do forensic analysis to reconstruct the index.html.
It continually amazes me at how much conflict is solved with "assume good intent."
15 commit night on hyperbola, 5 on hyperbola-tools, and 12 on my dotfiles. Mostly code and style cleanups, some correctness fixes.
Last bits of major feature work were bootstrapifying several pages and adding automatic deployment (June 2014)
Just realized that hyperbo.la has been in maintenance mode for a while. Last few projects: upgrade to django 1.8, upgrade to django 1.7, upgrade vendored dependencies (bootstrap, retinajs).
I bought IntelliJ Ultimate and it has already been decently valuable: https://github.com/hyperbola/hyperbola/pull/28 ... fixing lots of warnings #win
Wondering why the response to some external asks isn't, "No, we're not ready yet."
We are loading the racks onto trucks and moving them to a real datacenter. Bye bye servers.
Responding "maybe" to a calendar invite is the equivalent of the SF "we should do lunch"
The only things that are truly unique in a relational DB are auto inc pks. Even uniques such as username may be duplicated across time.
So this is what a real oncall rotation feels like. So many things.
This week at work I settled on a secret delivery mechanism that bootstraps with #kubernetes (or puppet if a service isn't containerized)
still hanging around: 4GB of old staging installs and 2GB of old prod installs
Just did some disk usage cleanup on hyperbola. Had 4 old ruby installs hanging out (2GB), a 700MB gunicorn logfile that was being written to every second, and a very full apt cache (1GB)
even with a staging env, deploys still require a site check
I love Apple's "quit unexpectedly" euphemism for crash
On the plus side my build script now dumps metadata about installed python packages to disk so I have one place to look instead of wondering
Playing with some JSON data and jQuery ... created a rudimentary VX points trip planner #javascript
I don't like structured identifiers because they presume data fits into a hierarchy
Borg paper was a fun read. Kubernetes is really exciting.
feast or famine on the hyperbola microblog
sudo lsof | grep libssl | cut -d" " -f1 | sort | uniq -c | sort -rn #fail https://mta.openssl.org/pipermail/openssl-announce/2015-March/000020.html
#bug fixed https://github.com/hyperbola/hyperbola/commit/01b34d with minor staging break caused by django-pipeline renaming their templatetags #django
Upcoming Xen vuln was the forcing function to get my gunicorn upstart scripts able to work after a reboot. There is some nasty in them https://github.com/hyperbola/hyperbola-tools/commit/8e5c4 #bash
Just spent the last 25 minutes installing homebrew packages on my work machine. My code is literally compiling. Took the time to do some scooter laps.
(function _() {console.log('('+_+')()')})()
#hyperbola is down to 200 lines of #CSS, half of which is used to render the logo and navbar
Finally bootstrap-ified the last bits of #hyperbola: the frontpage and the lifestream entry panel #win
Just added CORS headers for web-fonts on my 2 assets domains through cloudflare ... whoa. This has apparently been broken for a while #fail #win #hyperbola
why does any C program of sufficient complexity have its own allocator? Just use jemalloc?
I now understand the difference between teasing apart complexity versus simply moving it around
Just did 2 fully automated deployments to staging! #win #automation
Listened to a pretty intense #scala rant today: https://www.youtube.com/watch?v=uiJycy6dFSQ ... Highlights some of my gripes about the language, most notable implementation details leaking everywhere
60ms server-side latency on the lifestream page now #performance
"It's Not Right but It's Okay" -- A poem by Whitney Houston about continually evolving software projects.
#ruby has object tainting and security levels. So cool! https://ruby-doc.org/core-2.1.1/Object.html#method-i-taint
Hyperbola, now with retina graphics! The logo and feed icons will come through as retina.
Lack of agency is the thing I fear most as an engineer. It's something I need to get better at dealing with.
Ways you can tell we have a major release coming up: Being in the office until 10:30 and 9:30 on consecutive nights.
Upgraded to Mavericks ... relinked all homebrew formulae like this: https://gist.github.com/lopopolo/9427762
Open-source #patch: https://github.com/fge/json-patch/pull/7
next project: convert #hyperbola to UTC, server, #django, and #mysql
got another big #performance win by not minifying HTML in python not doing so shaved ~100ms off response time which means my server was spending more than 100ms of CPU time for the pleasure #fail
about ~20% of server time for lifestream is spent reversing URLs for hashtags :/ #performance #fail
Latency at nginx for hyperbola: frontpage: 25ms, contact: 40ms, lifestream: 200ms #performance
Switching gunicorn to a domain socket instead of a TCP port sped up the site by 2x #performance
Hyperbola, now with more html5-boilerplate and bootstrap ... it made CSS so much easier than I normally find it to be ... and the site is now mostly responsive and looks good on mobile
Spent the last week optimizing, re-styling, and significantly refactoring hyperbola. The lifestream page loads ~300ms faster and DOMReady is ~600ms faster #performance
Get optimized, HTML! Just added some middleware that minifies Django template HTML output #performance Google pagespeed really likes my site now (on Desktops) ... 94/100 #win
My wiki is getting filled up with #devops documentation for #hyperbola #win Runbooks are fun!
The last bits of the #hyperbola deployment are gone from my home directory ... finally productionized a cron to do a #database and media backup #devops
https://howfuckedismydatabase.com/ hehe database problems. #fail #scale
woo! #hyperbola is now #pep8 and #flake8 compliant! Woooo linting! #python
Now it's time to figure out what part of the stack is preventing #concurrency from exceeding 100 connections #jetty #linux
Throughput on the #box #metadata backend is limited by the rate at which our load driver can make requests. 2ms latency at the client. This thing is #fast #performance
Won best performance hack at the #Box #Hackathon last night #win
Woo: hyperbola, now with thumbnailing #performance
mac #safari can attach to webviews running in the iOS simulator and open a web inspector. This is cool but ... what? #debugging
#databases Two things that amaze me: (1) idempotent writes, (2) idempotent and reorderable writes
I am super excited to see the results of the move to the T3 #javascript architecture at #box
The Fundamental Theorem of Software Engineering: "We can solve any problem by introducing an extra level of indirection."
Running unit tests is the equivalent of waiting for code to compile.
Just updated the firmware on my Air. First two reboots = #kernelpanic. 3rd reboot = no mouse or keyboard. 4th reboot, everything works? #fail
9 months since the last reboot isn't too shabby. And now I have a 3.5 kernel!
#metaprogramming is awesome. In a new project, adding an API endpoint is as simple as defining a single constant
Changed my terminal and vim fontsize from 14pt to 24pt at work. zOMG so much better
Just added #solarized and a #vim plugin (vrapper) to #eclipse. zOMG this is so awesome
#java gets #functional. Hooray chainable methods! https://datumedge.blogspot.com/2012/06/java-8-lambdas.html
#versioncontrol, or the lack thereof. This was my first major software project. I was a junior in high school. I was making a symbolic math thing. #fail or the reasons any CS class should teach #git
http://songza.com Not only is it awesome, but logging in doesn't stop my music from playing. sweet #ux
google docs for #LaTeX https://www.sharelatex.com/
#notetoself: Next time you need to run more than 3 tasks that take 10 minutes or more to run, invest in figuring out how to script it #fail #thesis2012
A watched pot never boils. Neither does a long running task when you're not tailing the log file. #thesis2012
Running experiments. It's been 9 hours now. #thesis2012
ssh and an html/js terminal that will run anywhere I have chrome because of native client? Yes please #win #awesome https://chrome.google.com/webstore/detail/pnhechapfaindjhompbnflcldabbghjo/details
T-minus 2.5 weeks #thesis2012 OMG I HAVE 70 EXPERIMENTS TO RUN,
screen wipes are the best things ever for both laptop screens and glasses #win #thingsineedtobuy
#lessonlearned: Don't create a billion Timer objects. One is probably enough. Managed to get #eclipse to fail at repainting itself because it was running about 700 threads #java #fail
I do not care whether your API is RESTful. Does it work and will it do what I want? #marketing #fail
I remember when I first upgraded from notepad to scite when I first installed #ruby. You had to modify this conf file to get monospace all the time ... #vim is so much better #nostalgia
all your heapspace are belong to me! #java #outofmemory #fail
The number of posts on #hackernews about people reinventing/whining about #git never ceases to amaze me #fanboy
https://github.com/lopopolo/dotfiles/blob/master/scripts/cron-update-remotes.bash All of my problems with this script had to do with adding passphrases to my #ssh keys #fail
just discovered that once you're in cmd+TAB mode on OS X, cmd+` cycles backward. So much easier than cmd+shift+TAB #learnability? #fail #win
#ssh public key auth setup on hyperbola #womp #programmerresolutions
I just saw a commercial for #IE9 with a dubstep music track. Um ... #browserwars?
Cute ad on stackoverflow. It reads "<heart> Your Job" #adtargeted (apparently my db doesn't like unicode #fail)
Today I learned that #vim and #emacs treat newlines as line terminators. This means files written by them always end in a newline. #learnsomethingnew
Linus Torvalds is a boss http://harmful.cat-v.org/software/c++/linus #c
I'd post about how #adtargeted I feel every time I see a New Relic ad, but it'd only make it worse
Math m = null; m.sin(0.5); is valid #java and computes the sin of 0.5. #learnsomethingnew Type resolution is cool.
the newest xcode download slimmed down a lot. less than 1.5 gigs #thingsthataregood
Laptop is using full disk encryption and #hyperbola now backs up the db and all of its media to dropbox #swag #programmerresolutions
Process for rendering pset: Type in vim using markdown > render to html and open in chrome > print to pdf #doingitthehardway
After a struggle to import data from Firefox, I've switched to Chrome #thingsthatarenew The only extensions I'm running are 3 greasemonkey scripts I can't live w/o
A productive day: made my PS1 better and fixed a bug in the hashtag regex on hyperbola (again)
ok so setting up 4 VMs all at once was a pain in the ass sr-master.xvm.mit.edu sr-worker-1.xvm.mit.edu sr-worker-2.xvm.mit.edu sr-worker-3.xvm.mit.edu #thesis2012
Thank goodness xml compresses so well
This is the longest-lived and most consistently updated #blog I've ever had. Averaged a post every 2.5 days. I still post to #twitter more often. #socialmedia
My most frequently used commands on my laptop
learn sometihng new about #ruby everyday https://patshaughnessy.net/2012/1/4/never-create-ruby-strings-longer-than-23-characters #interpreter
Just exported 1GB of article dumps from #wikipedia #thesis2012 is on
you can see the xcode in my eyes ... #allidoiscode
lol my site looks like this http://twitter.github.com/bootstrap/examples/container-app.html #bootstrap
^(void) { NSLog(@"Closures are cool"); } https://spicedcocoa.wordpress.com/2010/06/16/working-with-blocks-in-objective-c/
history of version control. An entertaining read https://www.flourish.org/2011/12/astonishments-ten-in-the-history-of-version-control/ woo #git
https://johnkary.net/git-1-7-8-changes-for-the-everyday-developer/ #git grep is pretty cool, but I think i'll stick to #ack
sweet, there's been a patch since may, but no need to put out a bugfix release or anything https://github.com/github/gollum/issues/147 #fail #git
a CSS rule to make images sane in fluid gmail: html > body > img { max-width: 100%; max-height: 100%; }
speaking of proxies ... hyperbo.la, now with 100% more reverse proxying (apache to gollum) #gemsanity
I first used Charles this past summer. A very valuable tool for network observation and debugging https://www.charlesproxy.com/
I don't know why, but I am excited about home automation today. Z-Wave looks really cool
A libc-free world, eh? https://blogs.oracle.com/linux/post/hello-from-a-libc-free-world-part-1 #overkill
6 doesn't byte 00110110 00100001 00111101 01100010 01111001 01110100
#backintheday, before I understood how the relational part of MySQL worked, I made 20 columns to hold metadata about a record. 20 columns wasn't enough. Foreign keys #ftw. learning #fail
This article is so cool https://en.wikipedia.org/wiki/List_of_company_name_etymologies #wikipedia
Way to steal my MEng thesis idea Twitter https://github.com/nathanmarz/storm/wiki/Rationale
#timeboxed this gcc cross compiler nonsense. Using debathena in a VM is easier. #hammer
#compiling #gcc from source to get an ELF cross-compiler on OSX. This is so #fail
Because kernel.org is down, I used airdrop to copy over a cached version of the git source and formula from another computer so I could install it with homebrew #fail
bookmarking for later: useful defaults for OS X apps. https://github.com/mathiasbynens/dotfiles/blob/master/.osx
Abiding by the principle of least surprise is, to me at least, least surprising.
https://stabyourself.net/mari0/ #mario + #portal = awesome
I'm going to miss #ruby's hash rocket http://blog.peepcode.com/tutorials/2011/rip-ruby-hash-rocket-syntax
for the number of times i ssh'd into my iMac this sumer, you would think that I'd have just put my ssh key on it #fail #doingitthehardway
https://developer.ibm.com/articles/wa-ruby/ #ruby on #android. This is pretty awesome, as is the name.
It's been real California; can't wait to come back
RSS and Atom feeds now render posts the same way I render them on the lifestream page. Thanks to my one reader derenrich for the feature request.
Woo! my #django #patch got accepted. https://code.djangoproject.com/changeset/16609
this is way cooler than rvm: https://github.com/sstephenson/rbenv #ruby
next project: install rvm and homebrew
Got a #django bug accepted: https://code.djangoproject.com/ticket/16573
yet again, #vim is awesome: https://danielchoi.com/software/vitunes.html
And so I wait for the dns change to propagate ... soon, we'll be live here from NJ
I haven't posted about #music in a while: #songkick is the best. I'm going to so many more concerts now. I get too immersed in #turntable for it to be a regular thing.
#thisisa.pathological#testcase.#dealwithit
duplicity: https://duplicity.gitlab.io/ #backups
the hyperbola repos have been migrated to github. and so begins the death of dev.hyperbo.la
I avoid adding punctuation after my #hashtags because there's a #bug in my regex that parses them. #thingsishouldfix #django
My new favicon welcomes my site to 1996 #itsgreattobehere #fail
Thinking about migrating this site to EC2. Probably gonna stick with #django. http://dev.hyperbo.la will probably die; github does it way better. Moving all media assets to s3: maybe. ssl: probably not
open("|-"), you are a tricky beast. Successfully fork bombed myself 5 times before I sorted that out.
hyperbola, now with 500% more cache-control headers
Finally fixed the css on my site to be less of an abomination. width: auto, you are wonderful
wrote my first MapReduce job today!
have access to one of ESPN's private repos on github
finally broke down and got a github account. My username is lopopolo
this weekend's project, get all my config files on github
vi mode is the best thing I have ever discovered about the command line
pushed my first bugfix today!!!!
I got accepted to the EECS MEng program!!! woooo!!
broing out is somehow making studying for algorithms not suck
its amazing how the time melts away when you're playing portal
it's amazing how the time melts away when ur mucking around on a server
I need a 512GB iPhone
killed my own email solution because I had no confidence it would work reliably. Rolling with Google Apps now
got my offer today. will be working for ooyala for 3 months this summer.
This is why I like django's pluggable apps. I can get distracted and not finish a project, but the site still works. #django #distractions
working on a sort of app store for projects i've done, a glorified portfolio
props to a friend for giving me some tips on how to make my logo better. this is the tweaked version.