Premature Optimization 2.0 - Intercon 2016

Post on 15-Jan-2017

724 views 0 download

transcript

PREMATUREOPTIMIZATION

The Root of ALL Evil

@akitaonrails

PREMATUREOPTIMIZATION

The Root of ALL Evil

@akitaonrails

2.0

@akitaonrails

Uber para segurança particular

Uber para advogados

Uber para maconha

Uber para massagem

Uber para álcool

Uber para lavanderia

Uber para passeio de cachorro

Airbnb para barcos

Airbnb para cachorros

Airbnb para equipamentos

Airbnb para acampamentos

Airbnb para banheiros (!!)

Airbnb para impressão 3D

Airbnb para cozinhas

Tinder para sapatos

Tinder para cachorros

Tinder para notícias

Tinder para networking

Tinder para empregos

Tinder para saias

http://bit.ly/1iUMuuF

elastic.co

“The Social Network" (2010)

“The Social Network" (2010)

“The Social Network" (2010)

“The Social Network" (2010)

“The Social Network" (2010)

“The Social Network" (2010)

Name Games Wins Loses Points Elo Rating

1 Kong 217 117 100 17 802

2 Samus 211 110 101 9 842

3 Wario 197 102 95 7 824

4 Luigi 186 95 91 4 841

5 Zelda 160 81 79 2 847

6 Pikachu 209 105 104 1 851

7 Yoshi 223 112 111 1 803

8 Mario 203 101 102 -1 820

9 Fox 208 95 113 -18 754

10 Bowser 186 82 104 -22 785

Name Games Wins Loses Points Elo Rating

1 Kong 217 117 100 17 802

2 Samus 211 110 101 9 842

3 Wario 197 102 95 7 824

4 Luigi 186 95 91 4 841

5 Zelda 160 81 79 2 847

6 Pikachu 209 105 104 1 851

7 Yoshi 223 112 111 1 803

8 Mario 203 101 102 -1 820

9 Fox 208 95 113 -18 754

10 Bowser 186 82 104 -22 785

Name Games Wins Loses Points Elo Rating

1 Kong 217 117 100 17 802

2 Samus 211 110 101 9 842

3 Wario 197 102 95 7 824

4 Luigi 186 95 91 4 841

5 Zelda 160 81 79 2 847

6 Pikachu 209 105 104 1 851

7 Yoshi 223 112 111 1 803

8 Mario 203 101 102 -1 820

9 Fox 208 95 113 -18 754

10 Bowser 186 82 104 -22 785

Name Games Wins Loses Points Elo Rating

1 Samus 221 120 101 19 896

2 Kong 217 117 100 17 802

3 Luigi 186 95 91 4 841

4 Zelda 160 81 79 2 847

5 Pikachu 209 105 104 1 851

6 Yoshi 223 112 111 1 803

7 Mario 203 101 102 -1 820

8 Wario 207 102 105 -3 760

9 Fox 208 95 113 -18 754

10 Bowser 186 82 104 -22 785

Samus (2nd) wins from Wario (3rd) 10 times

Name Games Wins Loses Points Elo Rating

1 Samus 221 120 101 19 896

2 Kong 217 117 100 17 802

3 Luigi 186 95 91 4 841

4 Zelda 160 81 79 2 847

5 Pikachu 209 105 104 1 851

6 Yoshi 223 112 111 1 803

7 Mario 203 101 102 -1 820

8 Wario 207 102 105 -3 760

9 Fox 208 95 113 -18 754

10 Bowser 186 82 104 -22 785

Samus (2nd) wins from Wario (3rd) 10 times

Name Games Wins Loses Points Elo Rating

1 Samus 221 120 101 19 896

2 Kong 217 117 100 17 802

3 Luigi 186 95 91 4 841

4 Zelda 160 81 79 2 847

5 Pikachu 209 105 104 1 851

6 Yoshi 223 112 111 1 803

7 Mario 203 101 102 -1 820

8 Wario 207 102 105 -3 760

9 Fox 208 95 113 -18 754

10 Bowser 186 82 104 -22 785

Samus (2nd) wins from Wario (3rd) 10 times

Name Games Wins Loses Points Elo Rating

1 Samus 221 120 101 19 896

2 Kong 227 117 110 7 732

3 Luigi 186 95 91 4 841

4 Zelda 160 81 79 2 847

5 Pikachu 209 105 104 1 851

6 Yoshi 223 112 111 1 803

7 Mario 203 101 102 -1 820

8 Wario 207 102 105 -3 760

9 Bowser 196 92 104 -12 845

10 Fox 208 95 113 -18 754

Kong (2nd) loses to Bowser (10th) 10 times

Name Games Wins Loses Points Elo Rating

1 Kong 217 117 100 17 802

2 Samus 211 110 101 9 842

3 Wario 197 102 95 7 824

4 Luigi 186 95 91 4 841

5 Zelda 160 81 79 2 847

6 Pikachu 209 105 104 1 851

7 Yoshi 223 112 111 1 803

8 Mario 203 101 102 -1 820

9 Fox 208 95 113 -18 754

10 Bowser 186 82 104 -22 785

Name Games Wins Loses Points Elo Rating

1 Kong 217 117 100 17 802

2 Samus 211 110 101 9 842

3 Wario 197 102 95 7 824

4 Luigi 186 95 91 4 841

5 Zelda 160 81 79 2 847

6 Pikachu 209 105 104 1 851

7 Yoshi 223 112 111 1 803

8 Mario 203 101 102 -1 820

9 Fox 208 95 113 -18 754

10 Bowser 186 82 104 -22 785

Name Games Wins Loses Points Elo Rating

1 Pikachu 209 105 104 1 851

2 Zelda 160 81 79 2 847

3 Samus 211 110 101 9 842

4 Luigi 186 95 91 4 841

5 Wario 197 102 95 7 824

6 Mario 203 101 102 -1 820

7 Yoshi 223 112 111 1 803

8 Kong 217 117 100 17 802

9 Bowser 186 82 104 -22 785

10 Fox 208 95 113 -18 754

Name Games Wins Loses Points Elo Rating

1 Kong 217 117 100 17 802

2 Samus 211 110 101 9 842

3 Wario 197 102 95 7 824

4 Luigi 186 95 91 4 841

5 Zelda 160 81 79 2 847

6 Pikachu 209 105 104 1 851

7 Yoshi 223 112 111 1 803

8 Mario 203 101 102 -1 820

9 Fox 208 95 113 -18 754

10 Bowser 186 82 104 -22 785

Name Games Wins Loses Points Elo Rating

1 Pikachu 209 105 104 1 851

2 Zelda 160 81 79 2 847

3 Samus 211 110 101 9 842

4 Luigi 186 95 91 4 841

5 Wario 197 102 95 7 824

6 Mario 203 101 102 -1 820

7 Yoshi 223 112 111 1 803

8 Kong 217 117 100 17 802

9 Bowser 186 82 104 -22 785

10 Fox 208 95 113 -18 754

Name Games Wins Loses Points Elo Rating

1 Pikachu 209 105 104 1 851

2 Zelda 160 81 79 2 847

3 Samus 211 110 101 9 842

4 Luigi 186 95 91 4 841

5 Wario 197 102 95 7 824

6 Mario 203 101 102 -1 820

7 Yoshi 223 112 111 1 803

8 Kong 217 117 100 17 802

9 Bowser 186 82 104 -22 785

10 Fox 208 95 113 -18 754

Name Games Wins Loses Points Elo Rating

1 Pikachu 209 105 104 1 851

2 Zelda 160 81 79 2 847

3 Samus 211 110 101 9 842

4 Luigi 186 95 91 4 841

5 Wario 197 102 95 7 824

6 Mario 203 101 102 -1 820

7 Yoshi 223 112 111 1 803

8 Kong 217 117 100 17 802

9 Bowser 186 82 104 -22 785

10 Fox 208 95 113 -18 754

Name Games Wins Loses Points Elo Rating

1 Pikachu 209 105 104 1 851

2 Zelda 160 81 79 2 847

3 Samus 211 110 101 9 842

4 Luigi 186 95 91 4 841

5 Wario 197 102 95 7 824

6 Mario 203 101 102 -1 820

7 Yoshi 223 112 111 1 803

8 Kong 217 117 100 17 802

9 Bowser 186 82 104 -22 785

10 Fox 208 95 113 -18 754

Name Games Wins Loses Points Elo Rating

1 Zelda 170 91 79 12 904

2 Pikachu 209 105 104 1 851

3 Luigi 186 95 91 4 841

4 Wario 197 102 95 7 824

5 Mario 203 101 102 -1 820

6 Yoshi 223 112 111 1 803

7 Kong 217 117 100 17 802

8 Bowser 186 82 104 -22 785

9 Samus 221 110 111 -1 775

10 Fox 208 95 113 -18 754

Zelda (2nd) wins from Samus (3rd) 10 times

Name Games Wins Loses Points Elo Rating

1 Zelda 170 91 79 12 904

2 Pikachu 209 105 104 1 851

3 Luigi 186 95 91 4 841

4 Wario 197 102 95 7 824

5 Mario 203 101 102 -1 820

6 Yoshi 223 112 111 1 803

7 Kong 217 117 100 17 802

8 Bowser 186 82 104 -22 785

9 Samus 221 110 111 -1 775

10 Fox 208 95 113 -18 754

Zelda (2nd) wins from Samus (3rd) 10 times

Name Games Wins Loses Points Elo Rating

1 Zelda 170 91 79 12 904

2 Pikachu 209 105 104 1 851

3 Luigi 186 95 91 4 841

4 Wario 197 102 95 7 824

5 Mario 203 101 102 -1 820

6 Yoshi 223 112 111 1 803

7 Kong 217 117 100 17 802

8 Bowser 186 82 104 -22 785

9 Samus 221 110 111 -1 775

10 Fox 208 95 113 -18 754

Zelda (2nd) wins from Samus (3rd) 10 times

Name Games Wins Loses Points Elo Rating

1 Zelda 170 91 79 12 904

2 Luigi 186 95 91 4 841

3 Fox 218 105 113 -8 829

4 Wario 197 102 95 7 824

5 Mario 203 101 102 -1 820

6 Yoshi 223 112 111 1 803

7 Kong 217 117 100 17 802

8 Bowser 186 82 104 -22 785

9 Samus 221 110 111 -1 775

10 Pikachu 219 105 114 -9 766

Pikachu (2nd) loses to Fox (10th) 10 times

ELO Rating System

Microsoft TrueSkill Rating System

Google PageRank

Facebook EdgeRank

.NETC

CoffeeScriptElixir

F#

Groovy

Java

JavaScriptObjective-C

PHP

Perl PythonRuby

Swift

Visual Basic .NET

.NET

C

CoffeeScript

ElixirF#

Groovy

Java JavaScript

Objective-C

PHPPerl

Python

Ruby

Swift

Visual Basic .NET

1960

1965

1970

1975

1980

1985

1990

1995

2000

2005

2010

1960

1965

1970

1975

1980

1985

1990

1995

2000

2005

2010

Speedcode (1953) John Backus

- interpreter took 310 memory words, about 30% of the memory available on a 701

- twenty times that of machine code

1960

1965

1970

1975

1980

1985

1990

1995

2000

2005

2010

Fortran (1957) John Backus

- first optimizing compiler - complex number types/

electric engineering

1960

1965

1970

1975

1980

1985

1990

1995

2000

2005

2010

CPL (1963) Christopher Strachey

- Combined/Cambridge/Combined Programming Language

- low and high level

1960

1965

1970

1975

1980

1985

1990

1995

2000

2005

2010

BCPL (1966) Martin Richards

- Basic CPL - Bootstrap CPL - popular choice

for bootstrapping a system

1960

1965

1970

1975

1980

1985

1990

1995

2000

2005

2010

occam (1983) INMOS

- concurrent programming language - Bootstrap CPL - communication between processes

work through named channels

1960

1965

1970

1975

1980

1985

1990

1995

2000

2005

2010

1960

1965

1970

1975

1980

1985

1990

1995

2000

2005

2010

1960

1965

1970

1975

1980

1985

1990

1995

2000

2005

2010

Algol (1958) ETH Zürich committee

- Algol 58, Algol 60, Algol 68, Algol W - Context-free Grammars (Backus-Naur Form/BNF) - "ALGOL 68 was the first (and possibly one of the last)

major language for which a full formal definition was made before it was implemented”

- “ALGOL 68 has been criticized, most prominently by some members of its design committee such as Hoare and Dijkstra, for abandoning the simplicity of ALGOL 60”

- "Steve Bourne, who was on the Algol 68 revision committee, took some of its ideas to his Bourne shell (and thereby, to descendant shells such as Bash) and to C (and thereby to descendants such as C++)."

1960

1965

1970

1975

1980

1985

1990

1995

2000

2005

2010

Modula (1960) Niklaus Wirth

- "One of the first languages designed from the start for modular programming"

1960

1965

1970

1975

1980

1985

1990

1995

2000

2005

2010

MUMPS (1966) Neil Pappalardo

- "Massachusetts General Hospital Utility Multi-Programming System”

- hierarchical ACID built-in database - InterSystems Caché (SQL driver)

1960

1965

1970

1975

1980

1985

1990

1995

2000

2005

2010

ADA (1966) MIL-STD

- strong typing, generics - modularity mechanisms (packages) - run-time checking

- access to unallocated memory, buffer overflow errors, range violations, off-by-one errors, array access errors, and other detectable bugs

- parallel processing (tasks, synchronous message passing, protected objects, and

- nondeterministic select statements) - exception handling - widely used in critical systems, where any anomaly might

lead to very serious consequences, e.g., accidental death, injury or severe financial loss. Examples of systems where Ada is used include avionics,ATC, railways, banking, military and space technology

1960

1965

1970

1975

1980

1985

1990

1995

2000

2005

2010

Hope (1970s) Edinburgh University

- NPL and Hope: first languages with call-by-pattern evaluation

- influenced Standard ML, Haskell

1960

1965

1970

1975

1980

1985

1990

1995

2000

2005

2010

1960

1965

1970

1975

1980

1985

1990

1995

2000

2005

2010

1960

1965

1970

1975

1980

1985

1990

1995

2000

2005

2010

SNOBOL (1962) AT&T Bell Labs

- patterns as a first-class data type - operators for pattern

concatenation and alternation - early regular expressions/pattern

matching

1960

1965

1970

1975

1980

1985

1990

1995

2000

2005

2010

FLOW-MATIC (1955) Grace Hopper

- 1952 - A0 compiler - 1959 - COBOL - English-like high level

language

1960

1965

1970

1975

1980

1985

1990

1995

2000

2005

2010

Simula (1967) Ole-Johan Dahl, Kristen Nygaard

- object-oriented programming - inheritance and subclasses - virtual methods, coroutines - Garbage Collector

1960

1965

1970

1975

1980

1985

1990

1995

2000

2005

2010

CLU (1974) Barbara Liskov

- early object-oriented programming - classes with constructors and methods,

without inheritance - iterators, abstract data types, type-safe

parameterized/variant types - multiple return values (parallel

assignment)

1960

1965

1970

1975

1980

1985

1990

1995

2000

2005

2010

1960

1965

1970

1975

1980

1985

1990

1995

2000

2005

2010

1960

1965

1970

1975

1980

1985

1990

1995

2000

2005

2010

ISWIM (1965) Peter J. Landin

- "If you See What I Mean" - functional programming

(SASL, Miranda, ML, Haskell) - lazy evaluation

(SASL, KRC, Hope, Miranda, Haskell,

1960

1965

1970

1975

1980

1985

1990

1995

2000

2005

2010

Miranda (1985) David Turner

- lazy, purely functional programming - list comprehensions (Haskell)

1960

1965

1970

1975

1980

1985

1990

1995

2000

2005

2010

Clean (1987) Radboud University Nijmegen

- mutable state and I/O is done through a uniqueness typing system (Haskell Monads)

- performance comparable to Haskell

1960

1965

1970

1975

1980

1985

1990

1995

2000

2005

2010

Self (1987) David Ungar, Randall Smith

- dialect of Smalltalk (OOP) - prototype-based (Javascript) - Just in time Compiling (JVM)

1960

1965

1970

1975

1980

1985

1990

1995

2000

2005

2010

Prolog (1972) Alain Colmerauer

- logic programming (influenced Erlang) - natural language processing - relations, represented as facts and rules

- running a query over these relations

1960

1965

1970

1975

1980

1985

1990

1995

2000

2005

2010

1960

1965

1970

1975

1980

1985

1990

1995

2000

2005

2010

1960

1965

1970

1975

1980

1985

1990

1995

2000

2005

2010

Erlang (1986) Joe Armstrong, Robert Virding and Mike Williams

- distributed, fault-tolerant, soft-real-time, non-stop applications. It supports hot swapping

- processes communicate using message passing

1960

1965

1970

1975

1980

1985

1990

1995

2000

2005

2010

ML (1973) Robin Milner/University of Edinburgh

- Hindley–Milner type system - parametric polymorphism - “Type Inference”

- ML Family (Standard ML, OCaml), Clean, Haskell

1960

1965

1970

1975

1980

1985

1990

1995

2000

2005

2010

REBOL (1997) Carl Sassenrath

- "Relative Expression Based Object Language"

- dialecting: small, optimized, Domain-Specific Language (DSL) for code and data

- influenced JSON

1960

1965

1970

1975

1980

1985

1990

1995

2000

2005

2010

• APL (1964) introduced: array programming, influenced: functional programming

• ALGOL (1958) refined both structured procedural programming and the discipline of language specification.

• Simula (1967) first language designed to support object-oriented programming; Smalltalk (1972) followed with the first "purely" object-oriented language.

• C (1969 - 1973) popular system programming language

• Prolog (1972), first logic programming language. • ML (1978) built a polymorphic type system on top of

Lisp, pioneering statically typed functional programming languages.

1960

1965

1970

1975

1980

1985

1990

1995

2000

2005

2010

2015

1960

1965

1970

1975

1980

1985

1990

1995

2000

2005

2010

2015FORTRAN (1957) John Backus

- FORTRAN 2015

1960

1965

1970

1975

1980

1985

1990

1995

2000

2005

2010

2015

COBOL (1959) Conference on Data Systems Languages (CODASYL)

- COBOL 2014

1960

1965

1970

1975

1980

1985

1990

1995

2000

2005

2010

2015

1960

1965

1970

1975

1980

1985

1990

1995

2000

2005

2010

2015

1960

1965

1970

1975

1980

1985

1990

1995

2000

2005

2010

2015

23%

32%

45%

Python Fortran C

500k LOC

Gordon Moore - Intel co-founder

0

1,000,000,000

2,000,000,000

3,000,000,000

4,000,000,000

5,000,000,000

6,000,000,000

7,000,000,000

8,000,000,000

1965 1970 1975 1980 1985 1990 1995 2000 2005 2010 2015 2020

Intel1Processors1Transistor1Count

0

1,000,000,000

2,000,000,000

3,000,000,000

4,000,000,000

5,000,000,000

6,000,000,000

7,000,000,000

8,000,000,000

1965 1970 1975 1980 1985 1990 1995 2000 2005 2010 2015 2020

Intel1Processors1Transistor1Count

Intel 400410 µm Intel 80386 Pentium

0.8 µm

Itanium 2

Six-core Xeon 7400

8-core Itanium Poulson32 nm

18-core Xeon Haswell-E522 nm

15-core Xeon Ivy Bridge-EX

Duo-core + GPU Core i7 Broadwell-U14 nm

0

1,000,000,000

2,000,000,000

3,000,000,000

4,000,000,000

5,000,000,000

6,000,000,000

7,000,000,000

8,000,000,000

1965 1970 1975 1980 1985 1990 1995 2000 2005 2010 2015 2020

Intel1Processors1Transistor1Count

Intel 400410 µm Intel 80386 Pentium

0.8 µm

Itanium 2

Six-core Xeon 7400

8-core Itanium Poulson32 nm

18-core Xeon Haswell-E522 nm

15-core Xeon Ivy Bridge-EX

Duo-core + GPU Core i7 Broadwell-U14 nm

Apple A7

Apple A8

Apple A8X20 nm

Gordon Bell - DEC early employee

$100M

$10M

$1M

$100K

$10k

$1k

$100

$10

1940 1960 1970 1980 1990 2000 2010

$100M

$10M

$1M

$100K

$10k

$1k

$100

$10

1940 1960 1970 1980 1990 2000 2010

Supercomputadores

$100M

$10M

$1M

$100K

$10k

$1k

$100

$10

1940 1960 1970 1980 1990 2000 2010

Supercomputadores

Minicomputadores

$100M

$10M

$1M

$100K

$10k

$1k

$100

$10

1940 1960 1970 1980 1990 2000 2010

Supercomputadores

Minicomputadores

Workstations

$100M

$10M

$1M

$100K

$10k

$1k

$100

$10

1940 1960 1970 1980 1990 2000 2010

Supercomputadores

Minicomputadores

Workstations

PersonalComputers

$100M

$10M

$1M

$100K

$10k

$1k

$100

$10

1940 1960 1970 1980 1990 2000 2010

Supercomputadores

Minicomputadores

Workstations

PersonalComputers

ScalableClusters

$100M

$10M

$1M

$100K

$10k

$1k

$100

$10

1940 1960 1970 1980 1990 2000 2010

Supercomputadores

Minicomputadores

Workstations

PersonalComputers

Small Devices

ScalableClusters

$100M

$10M

$1M

$100K

$10k

$1k

$100

$10

1940 1960 1970 1980 1990 2000 2010

Supercomputadores

Minicomputadores

Workstations

PersonalComputers

Small Devices

ScalableClusters

Vaticano 2005

Vaticano 2013

2010 2011 2012 2013 20142006 2007 2008 2009

2010 2011 2012 2013 20142006 2007 2008 2009

2010 2011 2012 2013 20142006 2007 2008 2009

2017 60 anos de FORTRAN

2017 60 anos de FORTRAN

2014 55 anos de COBOL

2017 60 anos de FORTRAN

2014 55 anos de COBOL

2013 55 anos de LISP

2017 60 anos de FORTRAN

2014 55 anos de COBOL

2013 55 anos de LISP

2012 40 anos de Smalltalk

2017 60 anos de FORTRAN

2014 55 anos de COBOL

2013 55 anos de LISP

2012 40 anos de Smalltalk

2015 35 anos de ADA

Séc XVII Cálculo Newton/Leibniz

Séc XVII Cálculo Newton/Leibniz

1930's Lambda Calculus Alonzo Church

Séc XVII Cálculo Newton/Leibniz

1930's Lambda Calculus Alonzo Church

1939 Elo Rating System Arpad Elo

Séc XVII Cálculo Newton/Leibniz

1930's Lambda Calculus Alonzo Church

1939 Elo Rating System Arpad Elo

1975 Vector Space Model Gerald Salton

SPA e-commerce

SPA e-commercehttp://www.loja.com.br/#!/produtos/item-001

SPA e-commercehttp://www.loja.com.br/#!/produtos/item-001

http://www.loja.com.br/?_escaped_fragment_=/produtos/item-001

High Level Numbers

Client #1

$ 4,000

$ 4,000($ 7 MI/yr revenue - 0.68%)

Client #2

$ 100,000+

$ 100,000+($ 800 MI/yr revenue - 0.15%)

• Minimum IT Cost:

• Minimum IT Cost:

• USD 1000 - Cloud Services

• Minimum IT Cost:

• USD 1000 - Cloud Services

• USD 3000 - 1 Developer

• Minimum IT Cost:

• USD 1000 - Cloud Services

• USD 3000 - 1 Developer

• USD 4000 - 1 “Responsible” (Manager, Marketing, etc)

• Minimum IT Cost:

• USD 1000 - Cloud Services

• USD 3000 - 1 Developer

• USD 4000 - 1 “Responsible” (Manager, Marketing, etc)

• Total: USD 8.000/month (USD 96.000/year)

• Minimum IT Cost:

• USD 1000 - Cloud Services

• USD 3000 - 1 Developer

• USD 4000 - 1 “Responsible” (Manager, Marketing, etc)

• Total: USD 8.000/month (USD 96.000/year)

• Minimum Business Requirement:

• Minimum IT Cost:

• USD 1000 - Cloud Services

• USD 3000 - 1 Developer

• USD 4000 - 1 “Responsible” (Manager, Marketing, etc)

• Total: USD 8.000/month (USD 96.000/year)

• Minimum Business Requirement:

• Revenue: > USD 2 MI / year

• Minimum IT Cost:

• USD 1000 - Cloud Services

• USD 3000 - 1 Developer

• USD 4000 - 1 “Responsible” (Manager, Marketing, etc)

• Total: USD 8.000/month (USD 96.000/year)

• Minimum Business Requirement:

• Revenue: > USD 2 MI / year

• IT Cost / Revenue ratio: < 5%

Increase Revenue>

Lower Costs

Innovation

Impossible Yesterday

Possible Today

Innovation

Constraints

PREMATUREOPTIMIZATIONis the Root of all Evil

THANKS!slideshare.net/akitaonrails