Slide 1

Slide 1 text

No content

Slide 2

Slide 2 text

-- José Valim Zoolander

Slide 3

Slide 3 text

Keynote: Ă Dev conferences, round tables, serving spaghetti with one chop stick on each side of each person. Boutique hotel, the doub le tree.

Slide 4

Slide 4 text

Volatile! Michael Lopp talked about volatile outlets.

Slide 5

Slide 5 text

| James Duncan Davidson talked about the world being pipes

Slide 6

Slide 6 text

DHH dropped some F-bombs

Slide 7

Slide 7 text

F- DHH dropped some F-bombs

Slide 8

Slide 8 text

Sprinkle of JS! I’m last so I have the last word, I can troll all the rest of the keynote speakers and there is nothing they can do. Told DHH it was good that he spoke first so I could troll him with no rebuttal. Yehuda sprinkled us with JavaScript

Slide 9

Slide 9 text

Node.JS

Slide 10

Slide 10 text

Aaron Patterson

Slide 11

Slide 11 text

@tenderlove

Slide 12

Slide 12 text

/(Ruby|Rails) Core Team/

Slide 13

Slide 13 text

enterprise gem https://github.com/tenderlove/enterprise

Slide 14

Slide 14 text

AT&T, AT&T logo and all AT&T related marks are trademarks of AT&T Intellectual Property and/or AT&T affiliated companies.

Slide 15

Slide 15 text

Slide 16

Slide 16 text

No content

Slide 17

Slide 17 text

No content

Slide 18

Slide 18 text

No content

Slide 19

Slide 19 text

LOL NO

Slide 20

Slide 20 text

Inverse Spam Protection™

Slide 21

Slide 21 text

No content

Slide 22

Slide 22 text

Job Title: Corey Haines

Slide 23

Slide 23 text

No content

Slide 24

Slide 24 text

Job Title: Senior Facebook Integration Engineer Elect

Slide 25

Slide 25 text

I build bridges with software.

Slide 26

Slide 26 text

Job Title: Senior Software Architect I build bridges with software.

Slide 27

Slide 27 text

No content

Slide 28

Slide 28 text

No content

Slide 29

Slide 29 text

Blue Ink

Slide 30

Slide 30 text

Expense Reports

Slide 31

Slide 31 text

Concur

Slide 32

Slide 32 text

Concur PDF

Slide 33

Slide 33 text

Concur Email PDF

Slide 34

Slide 34 text

Concur Fax Email PDF

Slide 35

Slide 35 text

PDF Concur Fax Email PDF

Slide 36

Slide 36 text

PDF Concur Fax Email PDF

Slide 37

Slide 37 text

I don’t work weekends, buddy. Fax machine doesn’t work on weekends.

Slide 38

Slide 38 text

Concur

Slide 39

Slide 39 text

Concur PDF

Slide 40

Slide 40 text

Concur PDF Email

Slide 41

Slide 41 text

Concur PDF Email

Slide 42

Slide 42 text

Concur Email PDF Email

Slide 43

Slide 43 text

Concur Fax Email PDF Email

Slide 44

Slide 44 text

PDF Concur Fax Email PDF Email

Slide 45

Slide 45 text

PDF Concur Fax Email PDF Email

Slide 46

Slide 46 text

When I previewed the fax in the expense reporting system, there were tons of these at the bottom.

Slide 47

Slide 47 text

When I previewed the fax in the expense reporting system, there were tons of these at the bottom.

Slide 48

Slide 48 text

Rube Goldberg Expense Reporting System We actually hired Rube Goldberg to design the system back in the day.

Slide 49

Slide 49 text

Interfaces & Adapters It’s kind of genius because there was a legacy system, the fax machine, they needed to support. People want Email, so we give them the email interface, but it actually just adapts to the existing code Imagine being in the meeting where they decided to do this.

Slide 50

Slide 50 text

I <3 my job!

Slide 51

Slide 51 text

Talk about some of our services.

Slide 52

Slide 52 text

☑Adequate Everything. Adequately. Talk about some of our services.

Slide 53

Slide 53 text

“You get what we think you paid for”

Slide 54

Slide 54 text

Disrupt Space

Slide 55

Slide 55 text

Disrupt the Space of Space Disruption

Slide 56

Slide 56 text

Disrupt the Space of Space Disruption

Slide 57

Slide 57 text

SEO Optimization To understand SEO, we must understand the search engine. It says Search Engine Optimization Optimization, but that is what we do.

Slide 58

Slide 58 text

First Search Engine First search engines were invented in 1547 and were steam powered.

Slide 59

Slide 59 text

Invented in holland and came to the united states along with Lief Erikson (who later went on to invent cell phones). In the US they were improved to be gasoline powered with pistons. You can tell this bit of history from the names.

Slide 60

Slide 60 text

Invented in holland and came to the united states along with Lief Erikson (who later went on to invent cell phones). In the US they were improved to be gasoline powered with pistons. You can tell this bit of history from the names.

Slide 61

Slide 61 text

Invented in holland and came to the united states along with Lief Erikson (who later went on to invent cell phones). In the US they were improved to be gasoline powered with pistons. You can tell this bit of history from the names.

Slide 62

Slide 62 text

Leif Erikson

Slide 63

Slide 63 text

Leif Erikson (Later invented Cell Phones)

Slide 64

Slide 64 text

Google The number of pistons their search engine has.

Slide 65

Slide 65 text

Yahoo! The sound the exhaust system for the engine makes.

Slide 66

Slide 66 text

Bing The sound of a broken engine.

Slide 67

Slide 67 text

By shouting, we can actually improve the performance of the search engine. Back when shouting at machines actually did something.

Slide 68

Slide 68 text

By shouting, we can actually improve the performance of the search engine. Back when shouting at machines actually did something.

Slide 69

Slide 69 text

Alexander Searchkeyword This lead to search engine dowsers. They would use dowsing rods to find the right keywords from dictionaries and shout them at the search engine.

Slide 70

Slide 70 text

Alexander Searchkeyword This lead to search engine dowsers. They would use dowsing rods to find the right keywords from dictionaries and shout them at the search engine.

Slide 71

Slide 71 text

Doing Client Work. For a small fee, I will come to your house, read your web page, and dowse the right keywords for the search engine

Slide 72

Slide 72 text

New Stuff in Rails Security Open Source Software

Slide 73

Slide 73 text

New Stuff

Slide 74

Slide 74 text

I wanted to head West.

Slide 75

Slide 75 text

No content

Slide 76

Slide 76 text

Me: 2003

Slide 77

Slide 77 text

Me: 2003

Slide 78

Slide 78 text

Caching: SOLVED

Slide 79

Slide 79 text

def halts?(code) # ... end ActiveSupport.halts?(‘your code’) AS.halts? Rails core is pushing the boundaries of computer science.

Slide 80

Slide 80 text

def halts?(code) # ... end ActiveSupport.halts?(‘your code’) AS.halts? SOLVED! Rails core is pushing the boundaries of computer science.

Slide 81

Slide 81 text

Rails.queue

Slide 82

Slide 82 text

Using the Queue job = MyJob.new Rails.queue << job

Slide 83

Slide 83 text

Consumer Thread.new { while job = Rails.queue.pop job.run end }

Slide 84

Slide 84 text

Problems.

Slide 85

Slide 85 text

No content

Slide 86

Slide 86 text

“What about exceptions?”

Slide 87

Slide 87 text

“What about exceptions?” “It’s queue specific.”

Slide 88

Slide 88 text

No content

Slide 89

Slide 89 text

“What about serialization?”

Slide 90

Slide 90 text

“What about serialization?” “It’s queue specific.”

Slide 91

Slide 91 text

No content

Slide 92

Slide 92 text

“What about job construction?”

Slide 93

Slide 93 text

“What about job construction?” “It must be marshallable.”

Slide 94

Slide 94 text

Job Construction user = User.find 1 job = Job.new user Rails.queue << job

Slide 95

Slide 95 text

Job Construction user = User.find 1 job = Job.new user Rails.queue << job NOPE

Slide 96

Slide 96 text

Job Construction user = User.find 1 job = Job.new user.id Rails.queue << job

Slide 97

Slide 97 text

Job Definition class Job def initialize(user_id) @user_id = user_id end def run user = User.find @user_id # .... end end

Slide 98

Slide 98 text

Too Many Open Questions.

Slide 99

Slide 99 text

Rails.queue

Slide 100

Slide 100 text

No content

Slide 101

Slide 101 text

No content

Slide 102

Slide 102 text

F-

Slide 103

Slide 103 text

minitest/spec

Slide 104

Slide 104 text

describe "whatever" do setup do # ... end it "does some stuff" do 1.must_equal 1 end describe "some other stuff" do it "does some other stuff" do 'foo'.must_match /foo/ end end end This is what a minitest/ spec looks like. It looks very similar to RSpec, but it isn’t.

Slide 105

Slide 105 text

class SomeTest < ActiveSupport::TestCase setup { # ... } test "some thing" do # ... end end Rails Tests Here is a Rails test with some of the DSL features that Rails adds on.

Slide 106

Slide 106 text

MiniTest::Spec class SomeTest < MiniTest::Spec setup { # ... } it "some thing" do # ... end end If we compare this to a minitest/spec test, it looks very similar.

Slide 107

Slide 107 text

Refactor class SomeTest < MiniTest::Spec class << self alias :test :it end setup { # ... } test "some thing" do # ... end end We can make the appropriate change to minitest/spec and now it looks exactly the same.

Slide 108

Slide 108 text

AS::TestCase class ActiveSupport::TestCase < MiniTest::Spec class << self alias :test :it end end class SomeTest < ActiveSupport::TestCase setup { # ... } test "some thing" do # ... end end The cool thing is that it’s 100% backwards compatible. Works exactly the same as minitest/unit.

Slide 109

Slide 109 text

mt/spec superclass > MiniTest::Spec.ancestors => [MiniTest::Spec, MiniTest::Unit::TestCase, ... ]

Slide 110

Slide 110 text

Free goodies! describe "whatever" do it "does some stuff" do 1.must_equal 1 end describe "some other stuff" do it "does some other stuff" do 'foo'.must_match /foo/ end end end

Slide 111

Slide 111 text

“I don’t like the aesthetic”

Slide 112

Slide 112 text

“I don’t like the aesthetic”

Slide 113

Slide 113 text

minitest/spec

Slide 114

Slide 114 text

No content

Slide 115

Slide 115 text

No content

Slide 116

Slide 116 text

F-

Slide 117

Slide 117 text

Someone Talked!

Slide 118

Slide 118 text

TurboLinks

Slide 119

Slide 119 text

TurboLinks I kid, I kid!

Slide 120

Slide 120 text

New Stuff Stuff that hasn’t been deleted (yet)

Slide 121

Slide 121 text

Streaming Responses

Slide 122

Slide 122 text

Example class BrowserController < ApplicationController include ActionController::Live def index 100.times do response.stream.write "hello!\n" end response.stream.close end end

Slide 123

Slide 123 text

Example class BrowserController < ApplicationController include ActionController::Live def index 100.times do response.stream.write "hello!\n" end response.stream.close end end Mix in Stream

Slide 124

Slide 124 text

No content

Slide 125

Slide 125 text

Server Sent Events

Slide 126

Slide 126 text

Puma Browser FS-Events FS Events When the FS changes, it tells the webserver, webserver tells the browser All in the same process.

Slide 127

Slide 127 text

Puma Browser FS-Events FS Events When the FS changes, it tells the webserver, webserver tells the browser All in the same process.

Slide 128

Slide 128 text

Puma Browser FS-Events FS Events When the FS changes, it tells the webserver, webserver tells the browser All in the same process.

Slide 129

Slide 129 text

Puma Browser Console DRB DB Events When a model changes, a message is sent via DRB running in the Puma process. That also notifies the browser.

Slide 130

Slide 130 text

Puma Browser Console DRB DB Events Socket When a model changes, a message is sent via DRB running in the Puma process. That also notifies the browser.

Slide 131

Slide 131 text

PG UUID PK

Slide 132

Slide 132 text

create_table(:foos, id: :uuid) do |t| # ... end Generates a unique ID rather than sequential. We can easily partition based on this ID.

Slide 133

Slide 133 text

create_table(:foos, id: :uuid) do |t| t.hstore “my_stuff” end HStore too!

Slide 134

Slide 134 text

Faster Tests* *they’re not actually faster (well, they might be) Look at the speed improvement, then talk about how it works.

Slide 135

Slide 135 text

3.2.x $ time rake test [snip] real 0m4.756s user 0m4.147s sys 0m0.582s

Slide 136

Slide 136 text

4.0.0.beta $ time rake test [snip] real 0m1.934s user 0m1.701s sys 0m0.224s

Slide 137

Slide 137 text

Speed 0 1.25 2.5 3.75 5 Time 3.2 4.0

Slide 138

Slide 138 text

Where is the bottleneck?

Slide 139

Slide 139 text

Rails 3.2 (1 test) $ time ruby -I lib:test test/functional/ line_items_controller_test.rb real 0m1.733s user 0m1.518s sys 0m0.203s

Slide 140

Slide 140 text

Rails 4.0 (1 test) $ time ruby -I lib:test test/controllers/ line_items_controller_test.rb real 0m1.753s user 0m1.535s sys 0m0.208s

Slide 141

Slide 141 text

Environment $ time ruby -Ilib:test:. -rconfig/ environment -e ' ' real 0m1.442s user 0m1.255s sys 0m0.179s Require the environment, and do nothing. Loads the application.

Slide 142

Slide 142 text

Sample Test Task # Rakefile Rake::TestTask.new do |t| t.libs << "test" t.verbose = true t.warning = true end

Slide 143

Slide 143 text

Test Run /Users/aaron/.rbenv/versions/2.1.0-dev/bin/ruby -w -I"lib:test" -I"/Users/aaron/.rbenv/versions/2.1.0-dev/lib/ruby/ gems/2.1.0/gems/rake-10.0.4/lib" \ "/Users/aaron/.rbenv/versions/2.1.0-dev/lib/ruby/ gems/2.1.0/gems/rake-10.0.4/lib/rake/ rake_test_loader.rb" \ "test/test*.rb"

Slide 144

Slide 144 text

Test Run /Users/aaron/.rbenv/versions/2.1.0-dev/bin/ruby -w -I"lib:test" -I"/Users/aaron/.rbenv/versions/2.1.0-dev/lib/ruby/ gems/2.1.0/gems/rake-10.0.4/lib" \ "/Users/aaron/.rbenv/versions/2.1.0-dev/lib/ruby/ gems/2.1.0/gems/rake-10.0.4/lib/rake/ rake_test_loader.rb" \ "test/test*.rb"

Slide 145

Slide 145 text

`rake test` runs Ruby twice. How does this relate to Rails?

Slide 146

Slide 146 text

Rake + Rails

Slide 147

Slide 147 text

`rake test:units` Rakefile shells out ruby test/**/*_test

Slide 148

Slide 148 text

`rake test:units` Rakefile shells out ruby test/**/*_test

Slide 149

Slide 149 text

`rake test:units` Rakefile shells out ruby test/**/*_test App Load

Slide 150

Slide 150 text

`rake test:units` Rakefile shells out ruby test/**/*_test App Load

Slide 151

Slide 151 text

`rake test:units` = 2 * app load time

Slide 152

Slide 152 text

`rake test` = 4 * app load time

Slide 153

Slide 153 text

Multiple Loads

Slide 154

Slide 154 text

No content

Slide 155

Slide 155 text

Just Require task :test do Dir['test/**/*_test'].each do |file| require file end end

Slide 156

Slide 156 text

Challenges

Slide 157

Slide 157 text

Switching Environments

Slide 158

Slide 158 text

Your app is a singleton

Slide 159

Slide 159 text

What env is `rake`?

Slide 160

Slide 160 text

Change the env before app load If it loosk like you’re running a test task, then change the env to the test env.

Slide 161

Slide 161 text

Migrations $ rake test You have 1 pending migrations: 20130401175825 CreateUsers Run `rake db:migrate` to update your database then try again.

Slide 162

Slide 162 text

Real Solution: Remove Singleton R ails 4.1

Slide 163

Slide 163 text

Security * I am not a security expert

Slide 164

Slide 164 text

Security * I am not a security expert I just pretend :’(

Slide 165

Slide 165 text

I hate Security * I am not a security expert Wasted money, wasted effort. Tiny percentage of people are ruining it for everyone.

Slide 166

Slide 166 text

Ok, I don’t hate Security * I am not a security expert I don’t want people’s sites to be hacked.

Slide 167

Slide 167 text

“Security is a process” - Bruce Schneier Security is iterative, but we’ll talk about something much more pedestrian which is the actual process

Slide 168

Slide 168 text

Rails Security Process

Slide 169

Slide 169 text

Process 1. [email protected] 2. < 24hr response 3. Analyze and Patch 4. Obtain CVE 5. Release

Slide 170

Slide 170 text

Analyze and Patch Determine severity, figure out which versions are impacted, create backports and include version info for CVE.

Slide 171

Slide 171 text

Secrecy We keep issues secret until release because it takes time to find impacted versions, make fixes, information must be through official channels.

Slide 172

Slide 172 text

Symbol DoS

Slide 173

Slide 173 text

Symbols are not GC’d At a high level, there are strings coming in to the system, and Rails is converting them to symbols. I’ll show you two popular methods for getting strings converted to symbols.

Slide 174

Slide 174 text

Max Symbol Size irb(main):002:0> ("x" * 1024).to_sym; nil => nil irb(main):003:0> ("x" * 1000024).to_sym; nil => nil irb(main):004:0> ("x" * 10000000024).to_sym; nil ^C^C^C^CKilled: 9

Slide 175

Slide 175 text

No content

Slide 176

Slide 176 text

34%

Slide 177

Slide 177 text

5.59GB 34%

Slide 178

Slide 178 text

Max Symbol Size irb(main):001:0> ("x" * 100000024).to_sym; nil => nil irb(main):002:0> ("x" * 1000000024).to_sym; nil => nil irb(main):003:0> Tried again, and this worked.

Slide 179

Slide 179 text

The sky is the limit with memory consumption.

Slide 180

Slide 180 text

1.04GB The sky is the limit with memory consumption.

Slide 181

Slide 181 text

Foreign Entry Bugs that people reported to us.

Slide 182

Slide 182 text

XML params This Becomes a Symbol

Slide 183

Slide 183 text

XML params This Becomes a Symbol

Slide 184

Slide 184 text

No content

Slide 185

Slide 185 text

F-

Slide 186

Slide 186 text

Active Record def index User.where(params[:foo]) end In the controller there is something like this. Someone posts JSON so the params are automatically converted to a hash, and the strings are converted to symbols

Slide 187

Slide 187 text

No content

Slide 188

Slide 188 text

F-

Slide 189

Slide 189 text

Detection

Slide 190

Slide 190 text

assert_difference('Symbol.all_symbols.count', 0) do # some code end Symbol.all_symbols Helps if there is a specific place you know to check for symbols in your system.

Slide 191

Slide 191 text

ruby$target:::symbol-create { @_[copyinstr(arg1), arg2] = count(); } DTrace This will give you an aggregate of where the symbols are created.

Slide 192

Slide 192 text

rubygems/specification.rb 39 17 rubygems.rb 1073 22 enc/encdb.bundle 0 204 rubygems.rb 1070 307

Slide 193

Slide 193 text

YAML RCE

Slide 194

Slide 194 text

Any Foreign Objects Are Bad Talk about YAML, but having any foreign objects injected to your system is incredibly bad.

Slide 195

Slide 195 text

User.where(params[:foo]) def where(hash_or_obj) if hash_or_obj.respond_to?(:xxx) # Do something dangerous else # escape the hash params end end

Slide 196

Slide 196 text

Fundamentals

Slide 197

Slide 197 text

A Hash > puts Psych.dump("foo" => "bar") --- foo: bar

Slide 198

Slide 198 text

A Hash Subclass > class Foo < Hash; end > x = Foo.new > x[:y] = "hello" > puts Psych.dump x --- !ruby/hash:Foo :y: hello

Slide 199

Slide 199 text

Creating a Hash hash = Hash.new hash[key] = value

Slide 200

Slide 200 text

Creating a Hash Subclass hash = Foo.new hash[key] = value

Slide 201

Slide 201 text

Exploitation

Slide 202

Slide 202 text

Troubled Code class Helpers def initialize @module = Module.new end def []=(key, value) @module.module_eval <<-END_EVAL def #{value}(*args) # ... other stuff end END_EVAL end end Have essentially this in rails where helpers are defined.

Slide 203

Slide 203 text

Exploit --- !ruby/hash:Helpers foo: |- mname; end; puts 'hello!'; def oops Here is the YAML we can use to exploit this. Tell the parser to load a hash with the class Helpers

Slide 204

Slide 204 text

Exploit --- !ruby/hash:Helpers foo: |- mname; end; puts 'hello!'; def oops Here is the YAML we can use to exploit this. Tell the parser to load a hash with the class Helpers

Slide 205

Slide 205 text

Exploit --- !ruby/hash:Helpers foo: |- mname; end; puts 'hello!'; def oops Here is the YAML we can use to exploit this. Tell the parser to load a hash with the class Helpers

Slide 206

Slide 206 text

Parser calls []= obj['foo'] = "mname; end; puts 'hello!'; def oops"

Slide 207

Slide 207 text

Eval’d code def mname; end; puts 'hello!'; def oops(*args) # ... other stuff end

Slide 208

Slide 208 text

Eval’d code def mname end puts 'hello!' def oops(*args) # ... other stuff end

Slide 209

Slide 209 text

No content

Slide 210

Slide 210 text

F-

Slide 211

Slide 211 text

Foreign Entry

Slide 212

Slide 212 text

XML params --- this is parsed

Slide 213

Slide 213 text

XML params --- this is parsed

Slide 214

Slide 214 text

No content

Slide 215

Slide 215 text

F- F- F-

Slide 216

Slide 216 text

XML params <yodawg> I heard you like XML </yodawg>

Slide 217

Slide 217 text

No content

Slide 218

Slide 218 text

I hate Security * I am not a security expert

Slide 219

Slide 219 text

No Beta Releases

Slide 220

Slide 220 text

Bearer of Bad News “Hey guys, you’re gonna laugh when you hear this, but someone can execute arbitrary Ruby code on your system”

Slide 221

Slide 221 text

No SemVer

Slide 222

Slide 222 text

F: interesting arel behavior change that led to our email debacle this morning Me: huh? Me: email debacle? F: oh boy F: interesting thing is that it happened because of an arel behavior change in one of the recent 3.x security bumps

Slide 223

Slide 223 text

3.2.12 User.where(:id => 10) .find(100) `users`.`id` = 10 AND `users`.`id` = 100 User.where(:id => 10) .find_by_id(100) `users`.`id` = 10 AND `users`.`id` = 100 Empty Model User.where(:id => 10) .find(100) `users`.`id` = 10 AND `users`.`id` = 100 User.where(:id => 10) .find_by_id(100) `users`.`id` = 100 Default Scope Model

Slide 224

Slide 224 text

3.2.12 User.where(:id => 10) .find(100) `users`.`id` = 10 AND `users`.`id` = 100 User.where(:id => 10) .find_by_id(100) `users`.`id` = 10 AND `users`.`id` = 100 Empty Model User.where(:id => 10) .find(100) `users`.`id` = 10 AND `users`.`id` = 100 User.where(:id => 10) .find_by_id(100) `users`.`id` = 100 Default Scope Model

Slide 225

Slide 225 text

3.2.12 User.where(:id => 10) .find(100) `users`.`id` = 10 AND `users`.`id` = 100 User.where(:id => 10) .find_by_id(100) `users`.`id` = 10 AND `users`.`id` = 100 Empty Model User.where(:id => 10) .find(100) `users`.`id` = 10 AND `users`.`id` = 100 User.where(:id => 10) .find_by_id(100) `users`.`id` = 100 Default Scope Model

Slide 226

Slide 226 text

No content

Slide 227

Slide 227 text

User.where(:id => 10).find(100) Stored as a symbol, other is stored as a string.

Slide 228

Slide 228 text

User.where(:id => 10).find(100) Stored as a symbol, other is stored as a string.

Slide 229

Slide 229 text

User.where(:id => 10).find(100) Stored as a symbol, other is stored as a string.

Slide 230

Slide 230 text

3.2.13 User.where(:id => 10) .find(100) `users`.`id` = 10 AND `users`.`id` = 100 User.where(:id => 10) .find_by_id(100) `users`.`id` = 10 AND `users`.`id` = 100 Empty Model User.where(:id => 10) .find(100) `users`.`id` = 100 User.where(:id => 10) .find_by_id(100) `users`.`id` = 100 Default Scope Model

Slide 231

Slide 231 text

Secrecy XML symbol issue lead to the YAML issue. Can’t tell people to stop because I’ll give legitimacy. Painful to watch

Slide 232

Slide 232 text

No content

Slide 233

Slide 233 text

F- F- F- F- F- F-

Slide 234

Slide 234 text

Open Source * I am not an open source expert

Slide 235

Slide 235 text

First Open Source Lingua NameCase, classmates namecasing registrants correctly.

Slide 236

Slide 236 text

Getting Serious Mechanize, buying tickets for Lord of the Rings. 2005

Slide 237

Slide 237 text

Getting a Job Presentation to my boss about tools that I’ve written for my team mates.

Slide 238

Slide 238 text

No content

Slide 239

Slide 239 text

Managing Burnout

Slide 240

Slide 240 text

͜Μʹͪ͸ɺ Θ͕ͨࣾ͠௕Ͱ͢ɻ I think he only speaks Japanese.

Slide 241

Slide 241 text

No content

Slide 242

Slide 242 text

No content

Slide 243

Slide 243 text

No content

Slide 244

Slide 244 text

No content

Slide 245

Slide 245 text

No content

Slide 246

Slide 246 text

Support Group

Slide 247

Slide 247 text

Wife

Slide 248

Slide 248 text

Rails Core Swear and curse but they put up with me.

Slide 249

Slide 249 text

Coworkers

Slide 250

Slide 250 text

Aggressively trim Negativity Remove negative people from social media.

Slide 251

Slide 251 text

FOCUS on the future Talking about the past only results in blaming, talking about the present divides people, separating in to groups (like this VM has a better GC, this VM is faster) Focusing on the future is what brings us together and pushes life forward.

Slide 252

Slide 252 text

Mamba Time

Slide 253

Slide 253 text

My Weight

Slide 254

Slide 254 text

Health Walk. Go to 7-11, find gummies, start buying them every week. One day the guy says “hey! Mamba Time!” I am the guy that buys gummy bears. I will be the best damn gummy candy buyer ever.

Slide 255

Slide 255 text

Find your Mamba Time Contributing impacts people whether or not you know it. You need to find that thing, and stick to that thing.

Slide 256

Slide 256 text

Be the Best Mamba Timer Once you find it, be the best at it you can be.

Slide 257

Slide 257 text

THANK YOU!

Slide 258

Slide 258 text

No content

Slide 259

Slide 259 text

F-