Rob Lacey

Brighton, UK - contact@robl.me

Software Engineer working since 2008 with Ruby / Ruby on Rails, love a bit of Elixir / Phoenix. I also poke through other people's code and make PRs for OpenSource Ruby projects that sometimes make it. Currently working at Juniper Education making code for UK schools.


Fuck you RVM :(

I really want to play with Ruby 3.0.0, but oooooohhhhhhh noooooooooo. Seems I can’t un tar the rvm archive. I’m just not finding anything :( rbenv it is.

Robs-MacBook-Pro:~ rl$ \curl -sSL https://get.rvm.io | bash -s stable
Downloading https://github.com/rvm/rvm/archive/1.29.10.tar.gz
Downloading https://github.com/rvm/rvm/releases/download/1.29.10/1.29.10.tar.gz.asc
gpg: Signature made Wed 25 Mar 21:58:42 2020 GMT
gpg:                using RSA key 7D2BAF1CF37B13E2069D6956105BD0E739499BDB
gpg: Good signature from "Piotr Kuczynski <piotr.kuczynski@gmail.com>" [unknown]
gpg: WARNING: This key is not certified with a trusted signature!
gpg:          There is no indication that the signature belongs to the owner.
Primary key fingerprint: 7D2B AF1C F37B 13E2 069D  6956 105B D0E7 3949 9BDB
GPG verified '/usr/local/rvm/archives/rvm-1.29.10.tgz'
.github/: Can't restore time
bin/: Can't restore time
binscripts/: Can't restore time
config/: Can't restore time
config/solaris/: Can't restore time
contrib/: Can't restore time
contrib/hudson/: Can't restore time
docs/: Can't restore time
examples/: Can't restore time
gem-cache/: Can't restore time
gemsets/: Can't restore time
gemsets/jruby/: Can't restore time
gemsets/ruby/: Can't restore time
gemsets/ruby/1.8.5/: Can't restore time
gemsets/ruby/1.8.6/: Can't restore time
gemsets/ruby/1.8.7/: Can't restore time
help/: Can't restore time
help/gemset/: Can't restore time
help/rvmrc/: Can't restore time
hooks/: Can't restore time
lib/: Can't restore time
lib/rvm/: Can't restore time
man/: Can't restore time
man/man1/: Can't restore time
patches/: Can't restore time
patches/goruby/: Can't restore time
patches/jruby/: Can't restore time
patches/jruby/1.7.9/: Can't restore time
patches/libxslt-1.1.26/: Can't restore time
patches/rbx/: Can't restore time
patches/rbx/2.5.2/: Can't restore time
patches/readline-5.2/: Can't restore time
patches/readline-6.2/: Can't restore time
patches/ree/: Can't restore time
patches/ree/1.8.6/: Can't restore time
patches/ree/1.8.7/: Can't restore time
patches/ree/1.8.7/2010.02/: Can't restore time
patches/ruby/: Can't restore time
patches/ruby/1.8.7/: Can't restore time
---8<---
patches/ruby/2.4.1/: Can't restore time
patches/ruby/2.5.0/: Can't restore time
patches/ruby/2.5.1/: Can't restore time
patches/tcs/: Can't restore time
patchsets/: Can't restore time
patchsets/jruby/: Can't restore time
patchsets/jruby/1.7.9/: Can't restore time
patchsets/rbx/: Can't restore time
patchsets/rbx/2.5.2/: Can't restore time
patchsets/ree/: Can't restore time
patchsets/ree/1.8.6/: Can't restore time
patchsets/ree/1.8.7/: Can't restore time
patchsets/ree/1.8.7/2012.02/: Can't restore time
patchsets/ruby/: Can't restore time
patchsets/ruby/1.8.7/: Can't restore time
---8<---
patchsets/ruby/2.4.1/: Can't restore time
patchsets/ruby/2.5.0/: Can't restore time
patchsets/ruby/2.5.1/: Can't restore time
rvm-test-rvm1/: Can't restore time
rvm-test/: Can't restore time
scripts/: Can't restore time
scripts/extras/: Can't restore time
scripts/extras/bash_zsh_support/: Can't restore time
scripts/extras/bash_zsh_support/chpwd/: Can't restore time
scripts/extras/completion.zsh/: Can't restore time
scripts/extras/java_read_properties/: Can't restore time
scripts/functions/: Can't restore time
scripts/functions/detect/: Can't restore time
scripts/functions/detect/system_name/: Can't restore time
scripts/functions/detect/system_version/: Can't restore time
scripts/functions/hooks/: Can't restore time
scripts/functions/manage/: Can't restore time
scripts/functions/manage/install/: Can't restore time
scripts/functions/notes/: Can't restore time
scripts/functions/notes/warnings/: Can't restore time
scripts/functions/requirements/: Can't restore time
scripts/zsh/: Can't restore time
scripts/zsh/Completion/: Can't restore time
tar: Error exit delayed from previous errors.
Could not extract RVM sources.
Downloading https://bitbucket.org/mpapis/rvm/get/1.29.10.tar.gz
Downloading https://bitbucket.org/mpapis/rvm/downloads/1.29.10.tar.gz.asc
gpg: Signature made Wed 25 Mar 21:58:45 2020 GMT
gpg:                using RSA key 7D2BAF1CF37B13E2069D6956105BD0E739499BDB
gpg: Good signature from "Piotr Kuczynski <piotr.kuczynski@gmail.com>" [unknown]
gpg: WARNING: This key is not certified with a trusted signature!
gpg:          There is no indication that the signature belongs to the owner.
Primary key fingerprint: 7D2B AF1C F37B 13E2 069D  6956 105B D0E7 3949 9BDB
GPG verified '/usr/local/rvm/archives/rvm-1.29.10.tgz'
.github/: Can't restore time
bin/: Can't restore time
binscripts/: Can't restore time
config/: Can't restore time
config/solaris/: Can't restore time
contrib/: Can't restore time
contrib/hudson/: Can't restore time
docs/: Can't restore time
examples/: Can't restore time
gem-cache/: Can't restore time
gemsets/: Can't restore time
gemsets/jruby/: Can't restore time
gemsets/ruby/: Can't restore time
gemsets/ruby/1.8.7/: Can't restore time
help/: Can't restore time
help/gemset/: Can't restore time
help/rvmrc/: Can't restore time
hooks/: Can't restore time
lib/: Can't restore time
lib/rvm/: Can't restore time
man/: Can't restore time
man/man1/: Can't restore time
patches/: Can't restore time
patches/goruby/: Can't restore time
patches/jruby/: Can't restore time
patches/jruby/1.7.9/: Can't restore time
patches/libxslt-1.1.26/: Can't restore time
patches/rbx/: Can't restore time
patches/rbx/2.5.2/: Can't restore time
patches/readline-5.2/: Can't restore time
patches/readline-6.2/: Can't restore time
patches/ree/: Can't restore time
patches/ree/1.8.6/: Can't restore time
patches/ree/1.8.7/: Can't restore time
patches/ree/1.8.7/2010.02/: Can't restore time
patches/ruby/: Can't restore time
patches/ruby/1.8.7/: Can't restore time
---8<---
patches/ruby/2.4.1/: Can't restore time
patches/ruby/2.5.0/: Can't restore time
patches/ruby/2.5.1/: Can't restore time
patches/tcs/: Can't restore time
patchsets/: Can't restore time
patchsets/jruby/: Can't restore time
patchsets/jruby/1.7.9/: Can't restore time
patchsets/rbx/: Can't restore time
patchsets/rbx/2.5.2/: Can't restore time
patchsets/ree/: Can't restore time
patchsets/ree/1.8.6/: Can't restore time
patchsets/ree/1.8.7/: Can't restore time
patchsets/ree/1.8.7/2012.02/: Can't restore time
patchsets/ruby/: Can't restore time
patchsets/ruby/1.8.7/: Can't restore time
---8<---
patchsets/ruby/2.4.0/: Can't restore time
patchsets/ruby/2.4.1/: Can't restore time
patchsets/ruby/2.5.0/: Can't restore time
patchsets/ruby/2.5.1/: Can't restore time
patchsets/ruby/head/: Can't restore time
rvm-test-rvm1/: Can't restore time
rvm-test/: Can't restore time
scripts/: Can't restore time
scripts/extras/: Can't restore time
scripts/extras/bash_zsh_support/: Can't restore time
scripts/extras/bash_zsh_support/chpwd/: Can't restore time
scripts/extras/completion.zsh/: Can't restore time
scripts/extras/java_read_properties/: Can't restore time
scripts/functions/: Can't restore time
scripts/functions/detect/: Can't restore time
scripts/functions/detect/system_name/: Can't restore time
scripts/functions/detect/system_version/: Can't restore time
scripts/functions/hooks/: Can't restore time
scripts/functions/manage/: Can't restore time
scripts/functions/manage/install/: Can't restore time
scripts/functions/notes/: Can't restore time
scripts/functions/notes/warnings/: Can't restore time
scripts/functions/requirements/: Can't restore time
scripts/zsh/: Can't restore time
scripts/zsh/Completion/: Can't restore time
tar: Error exit delayed from previous errors.
Could not extract RVM sources.

Docker yet again

I still haven’t got to grips with Docker, I need to sort out our CI environment as it’s a bit weird and stuff is missing so….let’s give Docker a whirl. I’ve already got it installed so.

Robs-MacBook-Pro:rostering rl$ docker version
Client: Docker Engine - Community
 Version:           19.03.12
 API version:       1.40
 Go version:        go1.13.10
 Git commit:        48a66213fe
 Built:             Mon Jun 22 15:41:33 2020
 OS/Arch:           darwin/amd64
 Experimental:      false

Server: Docker Engine - Community
 Engine:
  Version:          19.03.12
  API version:      1.40 (minimum version 1.12)
  Go version:       go1.13.10
  Git commit:       48a66213fe
  Built:            Mon Jun 22 15:49:27 2020
  OS/Arch:          linux/amd64
  Experimental:     false
 containerd:
  Version:          v1.2.13
  GitCommit:        7ad184331fa3e55e52b890ea95e65ba581ae3429
 runc:
  Version:          1.0.0-rc10
  GitCommit:        dc9208a3303feef5b3839f4323d9beb36df0a9dd
 docker-init:
  Version:          0.18.0
  GitCommit:        fec3683

Run a Ruby command without that version of Ruby installed.

Robs-MacBook-Pro:rostering rl$ docker run ruby:2.7 ruby -e "puts :hello"
Unable to find image 'ruby:2.7' locally
2.7: Pulling from library/ruby
d6ff36c9ec48: Pull complete 
c958d65b3090: Pull complete 
edaf0a6b092f: Pull complete 
80931cf68816: Pull complete 
bc1b8aca3825: Pull complete 
e64edafe3f35: Pull complete 
5f7e31a225bc: Pull complete 
a7a2582e3a28: Pull complete 
Digest: sha256:4cdd89e947cc52c78c273953e42a6e9d94ca4cd182875fd50745550580b772f4
Status: Downloaded newer image for ruby:2.7
hello

And now after

Robs-MacBook-Pro:rostering rl$ docker run ruby:2.7 ruby -e "puts :hello"
hello

Ok that’s pretty cool :)

Now if we want to mount an existing directory inside our Docker instance, and boot it with interactive mode

Robs-MacBook-Pro:rostering rl$ docker run -it -v ${PWD}:/apps/rostering  ruby:2.6.6 bash
Unable to find image 'ruby:2.6.6' locally
2.6.6: Pulling from library/ruby
d6ff36c9ec48: Already exists 
root@520c19cb27a6:/# cd apps/rostering/
root@520c19cb27a6:/apps/rostering# bundle install
Traceback (most recent call last):
	2: from /usr/local/bin/bundle:23:in `<main>'
	1: from /usr/local/lib/ruby/2.6.0/rubygems.rb:302:in `activate_bin_path'
/usr/local/lib/ruby/2.6.0/rubygems.rb:283:in `find_spec_for_exe': Could not find 'bundler' (2.1.4) required by your /apps/rostering/Gemfile.lock. (Gem::GemNotFoundException)
To update to the latest version installed on your system, run `bundle update --bundler`.
To install the missing version, run `gem install bundler:2.1.4`
root@520c19cb27a6:/apps/rostering# gem install bundler:2.1.4
Fetching bundler-2.1.4.gem
Successfully installed bundler-2.1.4
1 gem installed

It’s effectively a new version of Ruby with no dependencies, so we need to install bundler, etc.

root@520c19cb27a6:/apps/rostering# gem install bundler:2.1.4
Fetching bundler-2.1.4.gem
Successfully installed bundler-2.1.4
1 gem installed
root@520c19cb27a6:/apps/rostering# bundle install
Fetching gem metadata from https://rubygems.org/.........
Fetching https://github.com/shorelabs/js-exception-notifier.git
Fetching rake 13.0.1
Installing rake 13.0.1
Fetching concurrent-ruby 1.1.6
Installing concurrent-ruby 1.1.6
Fetching aasm 5.1.0
Installing aasm 5.1.0
Fetching i18n 1.8.5
Installing i18n 1.8.5
Fetching minitest 5.14.1
.....

I'm a bit Rust(y), thought I'd learn summat new

use std::io::stdin;

struct Visitor {
    name: String,
    greeting: String
}

impl Visitor {
    fn new(name: &str, greeting: &str) -> Self {
        Self {
            name: name.to_lowercase(),
            greeting: greeting.to_string(),
        }
    }

    fn greet_visitor(&self) {
        println!("{}", self.greeting);
    }
}

fn main() {
    println!("Hello, what's your name?");
    let your_name = what_is_your_name();

    if your_name == "bert" {
        println!("Hello, {:?}", your_name);
    } else {
        println!("No, {}, Just no", your_name)
    }

    let visitor_list: [&str; 2] = ["bert", "ernie"];

    for i in 0..=10 {
        println!("{}", i);
    }

    let mut allow = false;

    for v in 0..visitor_list.len() {
        if visitor_list[v] == your_name {
            allow = true;
            println!("Yeah, whatever {}", your_name);
        }
    }

    if allow {
        println!("OK, {}. After much debate. You smell!", your_name)
    }
}

fn what_is_your_name() -> String {
    let mut your_name = String::new();
    stdin().read_line(&mut your_name).expect("FAAIIIILLLED!!!");
    your_name.trim().to_lowercase()
}

MySQL OpenSSL missing?

Ever had this one?

rails aborted!
LoadError: dlopen(/Users/b/.rbenv/versions/2.6.6/lib/ruby/gems/2.6.0/gems/mysql2-0.5.3/lib/mysql2/mysql2.bundle, 9): Library not loaded: libssl.1.1.dylib
  Referenced from: /Users/b/.rbenv/versions/2.6.6/lib/ruby/gems/2.6.0/gems/mysql2-0.5.3/lib/mysql2/mysql2.bundle
  Reason: image not found - /Users/b/.rbenv/versions/2.6.6/lib/ruby/gems/2.6.0/gems/mysql2-0.5.3/lib/mysql2/mysql2.bundle
/Users/b/rails_projects/ring/config/application.rb:29:in `<top (required)>'
/Users/b/rails_projects/ring/Rakefile:4:in `require_relative'
/Users/b/rails_projects/ring/Rakefile:4:in `<top (required)>'
bin/rails:4:in `require'
bin/rails:4:in `<main>'
(See full trace by running task with --trace)

I get the impression this is the solution.

gem install mysql2 -v 0.5.3 -- --with-cppflags=-I/usr/local/opt/openssl/include --with-ldflags=-L/usr/local/opt/openssl/lib

How many routes does my Rails app have?

Simple.

::Rails.application.routes.routes.size

I don't normally do Python, but...

Needs must, as all the best cool kids are making Constraints Solvers in Python. Shall I rewrite Practical Python AI Projects: Mathematical Models of Optimization Problems in Ruby? Might be funs.

Anyway, Chapter 1 introduced a simple solver, but this is even simpler.

A Whole Lotta Ruby

Trying to clean up this machine and it would appear I’ve got 21Gb of just Ruby.

I mean I like Ruby, sure. But I don’t need 4billion versions.

Styling broken images like a boss

Found this little gem for styling broken images so they don’t look all of the wrong.

I am not here. No really I am not.

Really liking this, the empty images default is just awful.

img {  
  position: relative;
}

/* style this to fit your needs */
/* and remove [alt] to apply to all images*/
img[alt]:after {  
  display: block;
  position: absolute;
  top: 0;
  left: 0;
  width: 100%;
  height: 100%;
  background-color: #fff;
  font-family: 'Helvetica';
  font-weight: 300;
  line-height: 2;  
  text-align: center;
  content: attr(alt);
}

The Big Learn - Elixir

1. Elixir is not Ruby

2. It’s not quite Erlang either, Elixir is different

3. Assignment is not assignment, it’s making sure stuff matches

iex(18)> a = 1
1
iex(19)> 1 = a
1
iex(20)> 2 = a
** (MatchError) no match of right hand side value: 1
    (stdlib) erl_eval.erl:453: :erl_eval.expr/5
    (iex) lib/iex/evaluator.ex:257: IEx.Evaluator.handle_eval/5
    (iex) lib/iex/evaluator.ex:237: IEx.Evaluator.do_eval/3
    (iex) lib/iex/evaluator.ex:215: IEx.Evaluator.eval/3
    (iex) lib/iex/evaluator.ex:103: IEx.Evaluator.loop/1
    (iex) lib/iex/evaluator.ex:27: IEx.Evaluator.init/4
iex(20)> a = 2
2
iex(21)> 2 = a

_why this is the only book you ever need

If you’ve never heard of why the lucky stiff perhaps you’ve been living under a rock for the past 10 years and hitting your Ruby apps with a blunt tuna. They wrote a ton of stuff in Ruby such as Hpricot, Shoes, Syck, Camping, I could go on I won’t.

_why also wrote an online book called why’s (poignant) guide to ruby, it’s inspirational and funny and bat shit silly. You should read it. I managed to get a physical copy because someone decided to put lots of effort into making it so.

If you ever find this, buy it, read it, code till your fingers are a bit sore.