Rob Lacey

Brighton, UK - contact@robl.me

Software Engineer specialising in Ruby on Rails. I do occasional freelance work, I love working for SARD JV Ltd, they are awesome and give me my pocket money every month. By all means dangle a carrot.


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.

Copying S3 objects around, even between buckets.

Saved some bandwidth and moved stuff around to get our house in order. Need to remember this example.

source = 'downloads.bigblindmedia/download/files/files/000/000/929/original/Banded_Sandwich_by_Iain_Moran_Download.mp4'
target = 'download/videos/files/000/000/929/original/Banded_Sandwich_by_Iain_Moran_Download.mp4'

s3 = Aws::S3::Client.new(
  region: 'eu-west-2',
  access_key_id: '********',
  secret_access_key: '********'
)

s3.copy_object(
  copy_source: source, 
  bucket: 'downloads.bigblindmedia',
  key: target
)