Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with
or
.
Download ZIP
Browse files

Manually merge notes together.

  • Loading branch information...
commit de5ca138f275d354295cb53fc69dc35442a818fa 1 parent 319fe45
@benjaminoakes benjaminoakes authored
View
79 01_Writing_A_Rails_Engine.md
@@ -1,79 +0,0 @@
-# Writing a Rails Engine
-## Erik Michael-Ober [@sferik](https://twitter.com/sferik)
-
-### Introduction
-All a rails app is a bootable rails engine
-Engines do not know how to start themselves, but are everything else, MVC
-Engines can plugin to engines
-
-Rails engines are fundamental building block of rails
-
-### History
-James Adam is creator of rails engines
-1st commit to engines plugin was 10/31/2005
-Rails 0.14.2
-Really old concept/feature
-
-DHH was against engines!
-
-James Adam thought it would be "Madness" to have engines in rails
-
-Merb slices introduced on 05/21/2008
-Slice out bits of functionality and use across multiple applications
-
-Rails and Merb merge on 12/23/2008
-Concepts of merb, including engines, were built into rails core
-
-The Russian Doll Pattern by Carl Lerche and Yehuda Katz
-Apps within apps
-
-Ruby Summer of Code 2010
-Piotr Sarnacki used Russian Doll Pattern and implemented it in rails
-Mentored by Carl, Yehuda and Jose Valim
-
-Bogdan Gaza rebuilt MerbAdmin
-
-Rails 3.0 uses engines!
-Pain point was assets which had to be copied via rake task or generator
-
-Rails 3.1 Asset Pipeline, FTW
-Puts every engine in load path for assets
-Looks in all engines to load assets
-Engines became first class citizens!
-
-Rails 3.2 deprecates vendor/plugins
-The way forward is engines
-Rails 4, engines are the only way
-
-### Write a Rails engine
-
-Easy, same as writing a rails app
-`$ rails plugin new my_engine --mountable`
-very similar file system
-
- * Engines are namespaced by modules
- * Engines inherit from Rails::Engine which adds engine to load path
- * Engine is not added to Gemfile, specify via gemspec
- * Can have custom rake tasks in lib/tasks and scoped to engine name
- * Can define generators lib/generators and scoped by engine name
- * Can write migrations db/migrations and scoped by engine name
- * `rake my_engine::install::migrations` only copy in new migrations
- * Routes are defined in engine and engine is mounted in client app
- routes at a certain path
-
-### Testing a Rails engine
-
-Best practice is
- 1. to create a dummy app in test directory
- 2. mount engine in dummy app
- 3. test the dummy app
-
-For more info: http://guides.rubyonrails.org/engines.html
-
-### When should I write an engine?
-
-1. If you are at a point and you have two apps which need to share logic,
-slice out the logic into a gem to be shared.
-2. A base like scaffolding, assets or template which can be mounted
-into multiple apps and reused
-
View
107 02_Sugar-Free_Ruby:_An_Experiment_in_Object-first_Teaching.md
@@ -1,107 +0,0 @@
-# Sugar-Free Ruby: An Experiment in Object-first Teaching
-## Steven! Ragnarök [@nuclearsandwich](https://twitter.com/nuclearsandwich)
-
-https://speakerdeck.com/u/nuclearsandwich/p/sugar-free-ruby
-
-### Introduction
-
-Sugar-free emphasizes Ruby is Objects
-
-### Teaching Programming
-
-If we don't teach it, its going away
-
-You owe it to your teachers to continue the tradition
-
-Teaching programming is very hard!!
- * Its really hard to learn to program
- * Your assumptions aren't natural
- * Takes a lot of empathy
- * Its hard to share something valuable
- * We always want to gain value out of an interaction
- * You will be rewarded for your knowledge and sharing!
-
-It takes a lot of self reflection to teach well
-Just like getting better at programming, you must always be a student
-
-### CoderDojo
-
-Dedicated to setting up kids coding projects
-In small groups, children learn to program
-Kids learn that **Programming Is Fun!**
- * Encourages children to continue to program
- * Its best way to engage kids, is to make an activity fun
-
-### Rails Bridge
-
-For anyone in this world, programming is hard but attainable
-Focus on fun parts like Rails instead of installing language and dependencies
-
-### Challenge with Teaching Ruby
-
-You have to know why the student is trying to learn
-You have to ask, "Why do you want to learn Ruby?"
- * I hate my job and programmers make bank
- * I know how to program but not Ruby, the Ruby community is awesome!
- * I'm curious about programming
-
-### How are we teaching Ruby right now?
-
- * Data types
- * True and false
- * Collection structures
- * Expressions
- * Console
- * Variables
- * Conditionals
- * Loops
- * If we are lucky, we might talk about `foo.upcase` aka objects
-
-Where are students' minds blown? Information overload.
-
-Whats wrong with this picture?
-Too many concepts before discussing methods or even mentioning classes.
-
-Ruby is not a computer a language!
-Ruby doesn't care its on a computer.
-
-### Teach Ruby as Objects!
-
-Reservation: students head will explode, but it already does with first way to teach via data types through loops.
-
-Give the students an idea of Objects and let them explore via irb
-
-Use `#send` to emphasize message passing
-Be explicit to really reveal the fact that messages are being passed
-
-**Objects and classes are one in the same!**
-
-### Now we can talk about a narrative
-
-Gives student a thread to follow
-
-`Object.new`
- * A message called new
- * Can be sent to any class
- * Gives you back and instance of that class
- * We give a name to the object
-
-Helps student link in their minds exactly what is happening!
-
-Kernal.puts is better than puts since mixins are _too complicated_ for now
-Keep the student on the narrative instead of going down a tangent
-
-### What have we introduced at this point?
-
-Objects have methods which accept and send messages
-Introduce Classes except Class is a Class which creates new Classes
-
-### Wrap up
-
-**Teach objects with Ruby instead of teach Ruby with objects**
-Better foundation because Ruby cares about Objects and how they interact
-
-Details on better foundation:
- * https://speakerdeck.com/u/nuclearsandwich/p/sugar-free-ruby?slide=61
- * https://speakerdeck.com/u/nuclearsandwich/p/sugar-free-ruby?slide=62
- * https://speakerdeck.com/u/nuclearsandwich/p/sugar-free-ruby?slide=63
View
156 04_High_Performance_Ruby.md
@@ -1,156 +0,0 @@
-# High Performance Ruby
-## Charles Nutter [@headius](https://twitter.com/headius)
-
-http://www.slideshare.net/CharlesNutter/high-performance-ruby-golden-gate-rubyconf-2012
-
-### Introduction
-
-JRuby
-How do we make Ruby fast?
-
-### What does performance mean?
-Man hours vs. CPU
-Straightline, time
-
-### High Performance?
-which ruby implementation
-ruby faster than other runtimes?
-
-### Fast Enough?
-1.9.3 fast enough and 1.8.7 is slow
-
-### Performance Wall
-Can't get done what you want to get done
-You're bound by your architecture
-Move to different runtime
-
-*If you're not writing performance sensitive code in Ruby, you're giving up too easily!!!*
-
-### Native Extensions
-Not universally bad, but bad in MRI
-What is bad is the way their implemented within CRuby
-Unless you're in MRI, you're limited when writing native extensions
-
-### What We Want
-Faster execution
-Better GC, non-blocking
-Parallel Execution via threads or actors within a process
-Big data by continuous scans
-
-*Can't have any of these with current C extension implementations!*
-
-### Different Approach
-Don't fallback to C, so lets improve Ruby to make it faster.
-
-1. Build your own runtime like YARV, Rubinius or MacRuby
-2. Use an existing runtime like JRuby
-
-### Build or Buy
-Making a new VM is easy (early rubinuius was simple)
-Making a new VM competitive is *really really hard*
-
-### JRuby choose JVM
-15 years of open source experience and super quick
-Best GCs available
-Full parallel threading
-Broad platform support so wide adoption
-
-### But Java Is Slow?
-
-Rumor is dying because Java is now C fast
-Java is terrible for application development because too many abstractions
-Simple algorithms can compile to same bytecode as C
-*The way you write code is much more important than what you write it in*
-
-### JRuby
-Java implementation of Ruby on JVM
-1 to 1 compatible with MRI
-JRuby JITs to JVM bytecode
-
-### Can Still Be Faster
-Still things about Ruby which defy optimization such as interpreter optimization
-
-(see slides for great timeline of commits)
-
-### Goal is to Align Ruby with JVM
-Ruby local variables are JVM local variables
-Avoid inter-call goo
-*Eliminate unnecessary work*
-
-### Unnecessary Work
-Everything is a map such as modules, instance variables
-
-### Method Lookup
-Method lookups go up-hierarchy
-Lookup target caches result (child caches method defined in parent)
-Modification cascades down
-
-### Bottom Line of Optimizing Ruby
-Make calls fast
-Make constants free
-
-### Invokedynamics
-
-### JVM 101
-Opcodes / Data endpoints
- * Invocation
- * Field access getting data out of object
- * Array access
- *
-All Java code revolves around these endpoints
-
-If you every stray outside of opcodes, you are stuck!
-We need millions of operations!
-
-With invokedynamic, we can get around this problem
- 1. invokedynamic bytecode
- 2. bootstrap method
- 3. method handles
- 4. find target method on JVM (see diagram on slides)
-
-Now the path is cached and optimized!
-
-*InvokeDynamic lets JRuby teach the JVM how Ruby works, so the JVM can optimize like any other language on the JVM*
-
-### How do we know JRuby is fast?
-
-**Benchmarking is really hard**
-
-### JVM opto 101
-JITs code bodies after 10k calls
-Inlines up to two targets
-Optimistic by making very aggressive decisions
- * Makes optimistic decisions for a small system, but those decisions
- * Will have to be reversed for large systems
-Inlining optimizes and writes bytecode for a chunk of code instead of pieces
-
-Benchmarking is not always enough, you have to read the assembly generated by JVM
-
-### Moral
-Benchmarks are synthetic
-Every system is different
-Figure out what is slow in your system, and benchmark this part of your system
-
-### Rails?
-Significant gains for some folks
-
-### What is next?
-Expand where JRuby optimizes such as super
-
-### Wacky stuff?
-Optimize things like `respond_to?` or `method_missing`
-
-_Ruby flip-flops_
-http://stackoverflow.com/questions/1111286/when-would-a-ruby-flip-flop-be-useful
-
-### The Future
-JRuby will get faster!
-InvokeDynamic will get faster!
-
-
-
-
-
-
-
-
View
89 05_Modern_Cryptography.md
@@ -1,89 +0,0 @@
-# Modern Cryptography
-## John Downey [@jtdowney](https://twitter.com/jtdowney)
-
-https://speakerdeck.com/u/jtdowney/p/cryptography-gogaruco
-
-## Cryptography
-1. Keep something secret
-2. Authentication, message has not changed in transit
-3. Identification, who sent this message
-
-## Modern Cryptography
-Based on hard math problems which aren't easy on classical computers
-Cryptography should be peer-reviewed
-Do not invent your algorithm!
-Stick go government standards which have been rigorously reviewed
-Key should always be private, but not algorithms (security through obscurity)
-Algorithms don't fail, but composing algorithms commonly fails
-Anytime you deal with Cryptography, you should be skeptic
-
-## Recommendations
-GET YOUR DATA INTO ONE OF THESE STATES, so you can use trusted patterns
-For data in transit
-(see slides)
-
-For data at rest
-(see slides)
-
-**NOTE: Disable TSL and SSL compression on your servers!**
-
-## Where Cryptography Goes Wrong
-What developers do wrong
-
-1. Random number generation
- Kernal.rand is not a Cryptographically strong
-
- "Good Cryptography looks as good as bad Cryptography"
-
- See slides for recommendations
-
-2. Length Extension Attacks
- They attack hash functions or fingerprints
- Hash functions are one-way and not reversible
- No two hash functions have the same output
- Output is a fingerprint or digest
- SHA-2 is current recommendation for hash functions
-
- Current generation of hash functions return the internal state of a loop
- They reveal to you exactly what happened inside the function
- At the end, the value of internal variables become the output
- (see slides)
-
- Recommendations to be resistant to Length Extension Attack
- (see slides)
-
-3. Password Storage
- sha1(password) is NOT CORRECT!
- Only useful for one way protection
-
- sha1(salt + password) randomizes
- (see slides)
- sha1 is extremely fast
-
- Recommendation
- * Use Adaptive Hashing such as bcrypt
- * has_secure_password
- * devise
-
- Make sure to calibrate number of iterations to tune how slow you want it to be
-
-## Trust
-Who actually verified fingerprint?
-Make sure the system you're connecting to is the system you want to connect to
-Trust on the internet is a very broken thing
-We can't rely on the user
-
-## Krypt
-Replace openssl bindings in Ruby because they are very bad
-Unified API to openssl or JAVA + SSL
-
-Slides have tons of resources
-
-## Questions
-Clients can have SSL certificates
-Internal applications use it
-Most users just want to see padlock icon
-
-If all requests aren't behind ssl, an unprotected request can intercept a request and change the DOM.
-
-
View
106 06_Go_Ahead_Make_a_Mess.md
@@ -1,106 +0,0 @@
-# Go Ahead, Make a Mess
-## Sandi Metz [@sandimetz](https://twitter.com/sandimetz)
-
-https://speakerdeck.com/u/skmetz/p/go-ahead-make-a-mess
-
-### Life Cycle of a Rails Project
-Satisfaction == Getting stuff done
-App is done and awesome
-Customer asks for changes
-Customer changes their mind
-Now you make 50 changes
-Customer asks for new feature tomorrow!
-Now you hack the code into submission
-You checkin code and don't want your name on it
-Now you hate ruby, rails and your life
-App was amazing and now its just a mess
-Until you change this pattern, it will repeat
-
-App is interwoven by knowledge
-
-Objects have to collaborate
-
-Objects will always have dependencies
-
-Controlling dependencies keeps an app stable
-
-Stability is relative
-
-The developer is confused and we don't know enough about our app
-
-Object Oriented Design gives us hope!
- * helps you write code your future self will love
- * lets you stop worrying and love mess
- * keeps satisfaction high!
-
-### Object Oriented Design Examples
-
-1. Label the Knowledge
- no dependants
- no dependencies
- End of the Line
- mess is completely self contained, its called an Omega Mess, huge scary method
- Omega Mess hides behind the message since its just one method
-
- "Its not about the code. Its about the running, living, breathing objects as the interact in memory. Its about the message."
-
- Knowledge Plot
- extremely helpful
- tells us how to model our knowledge
- (see slides)
-
- Its common to not know how stable code is.
- "What is the future cost of doing nothing now?"
- "Refactoring to simplify code is like buying a ticket in a lottery which
- is rigged in my favor."
- Its worth it to neaten the Omega Mess.
-
-2. Complicate the Code
- Conditional with messes in each branch
- Not an omega mess
- A case statement caused an explosion of dependencies
- It is called Meta Knowledge
- * Knowing how a puzzle fits together
- * The domain of design
-
- Method is not only costly to change, but it is likely to change
- A number is an indicator to this problem
-
- Preference: "I'd rather send a message than implement behavior"
- We can remove dependencies by asking, "what message should I send?"
-
-3. Composition
- Don't want to know things, we just want to ask somebody
- Don't want to know calculation, so we need to figure out message to send
- Calculations are isolated
- Make Compositions better with Convention over Configuration
- Use metaprogramming to _manufacture_ a class
- We just made a factory!
- We love Factories - something that manufactures an object is a factory
-
- Composition: it does not matter what is behind the interface
-
-### Reprise
-Object Oriented Design is a set tools that tells you the consequences of how you organize code
-
-We can all learn from those who have come before
-
-You should depend on things more stable than you are
-
-Isolate uncertainty and arrange code so you can't see the mess
-
-Stand on the Shoulder of Giants
-
-The best thoughts of anyone are available to everyone
-
-We can grow, learn and teach each other
-
-You can never outgrow the principal of design!!!
-
-**THIS talk was really really awesome**
-
-### NOTES
-http://www.websequencediagrams.com/
-Visual representation of knowledge and messages passed in the code
-
-
View
56 08_Cargo_Cult_Web_Performance_Optimization.md
@@ -1,56 +0,0 @@
-# Cargo Cult Web Performance Optimization
-## Ilya Grigorik [@igrigorik](https://twitter.com/igrigorik)
-
-http://www.igvita.com/slides/2012/gogaruco-web-performance/
-
-### Webkit is important
-1 billion mobile devices
-2 million new activations a day
-They all run webkit
-Webkit is the largest development platform in the world
-We are missing browser fundamentals
-Whole compsci program could be taught from browser source
-Every branch of computer science is within the browser
-
-### Developers are responsible for furthering their education
-Understanding how a browser works pays really high dividends
-
-### Observations
-Browser is an open box, not a black box
-(see slides for components diagram)
-
-Webkit is a browser engine which has a lot of components like chrome and bookmarks
-Webkit ships with many components
- * Webkit at its core is WebCore
- * WebCore is reused by all WebKit browsers
- * WebCore is responsible for
- * Resource dispatch
- * JavaScript Engine
- * Platform APIs
-
-### Network Stack
-Just because its webkit doesn't mean its uniform and all the same!
-
-The browser gets faster as you use like with things like DNS prefetch
-
-chrome://histograms/
-
-Flush allows parser to forge ahead instead of waiting for the entire page
-
-Pushing logic into JavaScript hides details from browser and the browser cant help
-
-Read through Document Parser code and understand comments
-
-DOM Tree has a lot elements which we don't care about, we only care about visual elements
-
-DOM Tree is made of many different trees, some elements get their own render layer
-
-Its better to be consistent instead of jumping all over with FPS
-Its worse to jump from 15FPS to 60FPS
-
-IF you only remember one thing!
-Read the source, and use code.google.com to search the source
-
-Ilya says browser education is very important
-Its the single best investment we can all make
-It will enable more innovation in the future
View
91 12_Schemas_for_the_Real_World.md
@@ -1,91 +0,0 @@
-# Schemas for the Real World
-## Carina C. Zona [@cczona](https://twitter.com/cczona)
-
-https://speakerdeck.com/u/cczona/p/gogaruco-2012-v1
-
-### Intro
-Relationships are really hard!
-Facebook had to double its options
-G+ uses the same list, but removed a few
-
-Allowing users to identify their relationships is for enhancing UX
-
-### Three core problems
-
-1. Deeply personal stuff about humans can be reduced to a list
-2. These lists should exists and be created
-3. The first two can be solved by adding more items
-
-This happens when we throw more labels at the relationship is an indicator that the schema is wrong!
-
-Relational databases cant model real life, a graph database is needed
-
-How do we bring modern relationships into a database?
-
-### Approaches
-
-1. Get schemas into alignment
- * Mental schema which represents some aspect of the world
- * UX is a manifestation of mental schemas
- * Database schema
-2. (see slides)
-
-What benefit will the user notice?
-You have to evaluate trade-offs
-
-Evaluating from the user perspective gives us focus
-
-(see slides for good examples of UX)
-
-Schemas trust in users allowed users to ask for more freedom
-The user can make their profile exactly as they want it
-
-**Data doesn't have to be for analysis, it can be for shear expressiveness**
-
-You should avoid gender pronouns! Its too hard. (see slides)
-
-### Vision of good codebase
-We want structure, order, relational and predictable
-Nice easy clean analytics to make good decisions
-
-What we get is tons of conditions and exceptions
-We're never going to stop making lists, so all assumptions will be invalidated
-(see slides)
-
-### Balance between approaches
-We can strike middle ground through guided-response or auto-suggest
-Structure can be had through minimal-suggest
- * If they don't type something from list, you can open the field, opt-out
- * Data quality improves when user is able to choose what and when they share
-
-**Analytics run from bad data are bullshit since we forced the user to lie (restrictive options)**
-
-Make stuff flexible upfront and decide on validations and all that code later
-Allow NULL is making a statement of intent
-`t.string "gender", null: true`
-
-### Takeaways
-1. Modeling real world is hard and OK
-2. Assuming we know who the users are doesn't allow us to learn about the users (no constraints at first)
-3. More freedom won't kill us
-
-Data quality, specificity and loyalty are foundations for great UX
-
-
-**NO WAY TO MAKE EVERYONE HAPPY!**
-The earlier you do this, the more polarization happens
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
View
97 19_Mega_Rails.md
@@ -1,97 +0,0 @@
-# MonoRail: Monolithic Rails Application
-## Jack Danger Canty [@jackdanger](https://twitter.com/jackdanger)
-
-http://www.slideshare.net/jackdanger/monorails-gogaruco-2012
-
-### Intro
-Common pattern from inception to huge app
-
-1. Rails apps go in the same direction, but it can be corrected
-2. The problem is primarily about ownership
-
-### Greenfield app
-(see slides)
-
-### MonoRail
-(see slides)
-
-### Actual Scaling Problems
-(see slides)
-Scaling data
- * Data structure
-Codebase
- * GitHub
-Customers
-Feature Count
-Developer Headcount
- * No pattern in the community to help us do this
-
-### First day of greenfield development
-Rails can do everything! Lets make it do everything!
-You have to test your product in the market, so Rails gets us their quickly
-We get MonoRails because we keep on going and validating product in market
-
-### What is the problem?
-Rails is optimized to getting up and going quickly
-Makes your first 30 days magical, but its not optimized for 3 years into development
-All software has trade-offs
-
-(See Young & Mature slides)
-Postgres is super fast and doesn't have to do copy on write when adding a new column
-ActionMailer should be a mail service not a part of your Rails app
-User should be only authentication
-Abstract libraries to internal gems these are dependencies not your application
-You need database validations
-Log every significant action
-Analyze your data not in production!
- * Extract to a replica
- * ETL http://en.wikipedia.org/wiki/Extract,_transform,_load
- * Get data out of relational database
-
-### Conway's Law
-"The shape of your people defines the shape of the products they make"
-There is a reason these Rails apps fail which is both technical and emotional
-If you fail, you should take ownership and make amends
-Your effort combined with your skill, you can make it right
-Energy combined with skill produces success
-The problem is you could still fail because of interaction with others on the project
-Rails can grow and be split, but it'll take foresight
-We should work on ownership
-The moment you split one team into small teams you get a MonoRail
-
-### Closing
-Three Step Process for taking ownership on pieces of code and abstracting
-1 is the same
-2 & 3 will vary from organization, product and use cases
-
-1. Build a service interfaces inside your app, internal APIs
- Just pass data to services interfaces which is resilient to change
- (See slides for simple examples)
-2. Extract the code
- Copy the app and delete pieces you don't need, but nothing has really changed!
- You could start over from scratch
-3. Move the data
- You can talk to a replicate
-
-There is a real human cost for not realizing we need these human services immediately.
-As soon as we split our one team into multipleteams, we should go into work and be happy everyday and not just debug a MonoRail.
-
-MegaRails is a poor job of optimizing happiness.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
View
58 Cargo-Cult-Web-Performance-Optimization.md
@@ -1,3 +1,61 @@
+From [[Gogaruco 2012]]
+
+**Presenter:** [[Ilya Grigorik]]
+
+## Notes from @simeonwillbanks
+
+### Webkit is important
+1 billion mobile devices
+2 million new activations a day
+They all run webkit
+Webkit is the largest development platform in the world
+We are missing browser fundamentals
+Whole compsci program could be taught from browser source
+Every branch of computer science is within the browser
+
+### Developers are responsible for furthering their education
+Understanding how a browser works pays really high dividends
+
+### Observations
+Browser is an open box, not a black box
+(see slides for components diagram)
+
+Webkit is a browser engine which has a lot of components like chrome and bookmarks
+Webkit ships with many components
+ * Webkit at its core is WebCore
+ * WebCore is reused by all WebKit browsers
+ * WebCore is responsible for
+ * Resource dispatch
+ * JavaScript Engine
+ * Platform APIs
+
+### Network Stack
+Just because its webkit doesn't mean its uniform and all the same!
+
+The browser gets faster as you use like with things like DNS prefetch
+
+chrome://histograms/
+
+Flush allows parser to forge ahead instead of waiting for the entire page
+
+Pushing logic into JavaScript hides details from browser and the browser cant help
+
+Read through Document Parser code and understand comments
+
+DOM Tree has a lot elements which we don't care about, we only care about visual elements
+
+DOM Tree is made of many different trees, some elements get their own render layer
+
+Its better to be consistent instead of jumping all over with FPS
+Its worse to jump from 15FPS to 60FPS
+
+IF you only remember one thing!
+Read the source, and use code.google.com to search the source
+
+Ilya says browser education is very important
+Its the single best investment we can all make
+It will enable more innovation in the future
+
## External Links
* [Slides](http://www.igvita.com/slides/2012/gogaruco-web-performance/#1)
View
2  Carina-C.-Zona.md
@@ -1,4 +1,4 @@
-* Twitter: cczona
+* Twitter: [@cczona](https://twitter.com/cczona)
## Talks
View
2  Charles-Nutter.md
@@ -1,4 +1,4 @@
-* Twitter: headius
+* Twitter: [@headius](https://twitter.com/headius)
* Website: http://blog.headius.com/
## Talks
View
5 Erik-Michaels-Ober.md
@@ -0,0 +1,5 @@
+* Twitter: [@sferik](https://twitter.com/sferik)
+
+## Talks
+
+* [[Writing a Rails Engine]]
View
107 Go-Ahead-Make-a-Mess.md
@@ -1,6 +1,6 @@
From [[Gogaruco 2012]]
-**Presenter:** Sandi Metz
+**Presenter:** [[Sandi Metz]]
## Bio
@@ -27,7 +27,7 @@ From [[Gogaruco 2012]]
> those that let you get software out the door today without regretting
> your actions tomorrow.
-## Notes
+## Notes from @myronmarston
* Learn to understand the mess of a code base
* The source of the problem is objects having knowledge of other objects
@@ -45,3 +45,106 @@ From [[Gogaruco 2012]]
* Preference: send a message rather than implement behavior
* "What message should I send?" -- create the object if need be
+## Notes from @simeonwillbanks
+
+https://speakerdeck.com/u/skmetz/p/go-ahead-make-a-mess
+
+### Life Cycle of a Rails Project
+Satisfaction == Getting stuff done
+App is done and awesome
+Customer asks for changes
+Customer changes their mind
+Now you make 50 changes
+Customer asks for new feature tomorrow!
+Now you hack the code into submission
+You checkin code and don't want your name on it
+Now you hate ruby, rails and your life
+App was amazing and now its just a mess
+Until you change this pattern, it will repeat
+
+App is interwoven by knowledge
+
+Objects have to collaborate
+
+Objects will always have dependencies
+
+Controlling dependencies keeps an app stable
+
+Stability is relative
+
+The developer is confused and we don't know enough about our app
+
+Object Oriented Design gives us hope!
+ * helps you write code your future self will love
+ * lets you stop worrying and love mess
+ * keeps satisfaction high!
+
+### Object Oriented Design Examples
+
+1. Label the Knowledge
+ no dependants
+ no dependencies
+ End of the Line
+ mess is completely self contained, its called an Omega Mess, huge scary method
+ Omega Mess hides behind the message since its just one method
+
+ "Its not about the code. Its about the running, living, breathing objects as the interact in memory. Its about the message."
+
+ Knowledge Plot
+ extremely helpful
+ tells us how to model our knowledge
+ (see slides)
+
+ Its common to not know how stable code is.
+ "What is the future cost of doing nothing now?"
+ "Refactoring to simplify code is like buying a ticket in a lottery which
+ is rigged in my favor."
+ Its worth it to neaten the Omega Mess.
+
+2. Complicate the Code
+ Conditional with messes in each branch
+ Not an omega mess
+ A case statement caused an explosion of dependencies
+ It is called Meta Knowledge
+ * Knowing how a puzzle fits together
+ * The domain of design
+
+ Method is not only costly to change, but it is likely to change
+ A number is an indicator to this problem
+
+ Preference: "I'd rather send a message than implement behavior"
+ We can remove dependencies by asking, "what message should I send?"
+
+3. Composition
+ Don't want to know things, we just want to ask somebody
+ Don't want to know calculation, so we need to figure out message to send
+ Calculations are isolated
+ Make Compositions better with Convention over Configuration
+ Use metaprogramming to _manufacture_ a class
+ We just made a factory!
+ We love Factories - something that manufactures an object is a factory
+
+ Composition: it does not matter what is behind the interface
+
+### Reprise
+Object Oriented Design is a set tools that tells you the consequences of how you organize code
+
+We can all learn from those who have come before
+
+You should depend on things more stable than you are
+
+Isolate uncertainty and arrange code so you can't see the mess
+
+Stand on the Shoulder of Giants
+
+The best thoughts of anyone are available to everyone
+
+We can grow, learn and teach each other
+
+You can never outgrow the principal of design!!!
+
+**THIS talk was really really awesome**
+
+### NOTES
+http://www.websequencediagrams.com/
+Visual representation of knowledge and messages passed in the code
View
148 High-Performance-Ruby.md
@@ -29,7 +29,7 @@ From [[Gogaruco 2012]]
> invokedynamic, the JVM, and JRuby, and I'm going to show you how it
> all fits together.
-## Notes
+## Notes from @myronmarston
* High Perf = faster than you need it to be.
* You hit a performance wall at some point.
@@ -76,6 +76,152 @@ From [[Gogaruco 2012]]
* Invoke Dynamic improvements at VM-level
* Compiler improvements at Ruby level
+## Notes from @simeonwillbanks
+
+### Introduction
+
+JRuby
+How do we make Ruby fast?
+
+### What does performance mean?
+Man hours vs. CPU
+Straightline, time
+
+### High Performance?
+which ruby implementation
+ruby faster than other runtimes?
+
+### Fast Enough?
+1.9.3 fast enough and 1.8.7 is slow
+
+### Performance Wall
+Can't get done what you want to get done
+You're bound by your architecture
+Move to different runtime
+
+*If you're not writing performance sensitive code in Ruby, you're giving up too easily!!!*
+
+### Native Extensions
+Not universally bad, but bad in MRI
+What is bad is the way their implemented within CRuby
+Unless you're in MRI, you're limited when writing native extensions
+
+### What We Want
+Faster execution
+Better GC, non-blocking
+Parallel Execution via threads or actors within a process
+Big data by continuous scans
+
+*Can't have any of these with current C extension implementations!*
+
+### Different Approach
+Don't fallback to C, so lets improve Ruby to make it faster.
+
+1. Build your own runtime like YARV, Rubinius or MacRuby
+2. Use an existing runtime like JRuby
+
+### Build or Buy
+Making a new VM is easy (early rubinuius was simple)
+Making a new VM competitive is *really really hard*
+
+### JRuby choose JVM
+15 years of open source experience and super quick
+Best GCs available
+Full parallel threading
+Broad platform support so wide adoption
+
+### But Java Is Slow?
+
+Rumor is dying because Java is now C fast
+Java is terrible for application development because too many abstractions
+Simple algorithms can compile to same bytecode as C
+*The way you write code is much more important than what you write it in*
+
+### JRuby
+Java implementation of Ruby on JVM
+1 to 1 compatible with MRI
+JRuby JITs to JVM bytecode
+
+### Can Still Be Faster
+Still things about Ruby which defy optimization such as interpreter optimization
+
+(see slides for great timeline of commits)
+
+### Goal is to Align Ruby with JVM
+Ruby local variables are JVM local variables
+Avoid inter-call goo
+*Eliminate unnecessary work*
+
+### Unnecessary Work
+Everything is a map such as modules, instance variables
+
+### Method Lookup
+Method lookups go up-hierarchy
+Lookup target caches result (child caches method defined in parent)
+Modification cascades down
+
+### Bottom Line of Optimizing Ruby
+Make calls fast
+Make constants free
+
+### Invokedynamics
+
+### JVM 101
+Opcodes / Data endpoints
+ * Invocation
+ * Field access getting data out of object
+ * Array access
+ *
+All Java code revolves around these endpoints
+
+If you every stray outside of opcodes, you are stuck!
+We need millions of operations!
+
+With invokedynamic, we can get around this problem
+ 1. invokedynamic bytecode
+ 2. bootstrap method
+ 3. method handles
+ 4. find target method on JVM (see diagram on slides)
+
+Now the path is cached and optimized!
+
+*InvokeDynamic lets JRuby teach the JVM how Ruby works, so the JVM can optimize like any other language on the JVM*
+
+### How do we know JRuby is fast?
+
+**Benchmarking is really hard**
+
+### JVM opto 101
+JITs code bodies after 10k calls
+Inlines up to two targets
+Optimistic by making very aggressive decisions
+ * Makes optimistic decisions for a small system, but those decisions
+ * Will have to be reversed for large systems
+Inlining optimizes and writes bytecode for a chunk of code instead of pieces
+
+Benchmarking is not always enough, you have to read the assembly generated by JVM
+
+### Moral
+Benchmarks are synthetic
+Every system is different
+Figure out what is slow in your system, and benchmark this part of your system
+
+### Rails?
+Significant gains for some folks
+
+### What is next?
+Expand where JRuby optimizes such as super
+
+### Wacky stuff?
+Optimize things like `respond_to?` or `method_missing`
+
+_Ruby flip-flops_
+http://stackoverflow.com/questions/1111286/when-would-a-ruby-flip-flop-be-useful
+
+### The Future
+JRuby will get faster!
+InvokeDynamic will get faster!
+
## External Links
* [An experiment in static compilation of Ruby: FASTRUBY!](http://blog.headius.com/2012/09/an-experiment-in-static-compilation-of.html)
View
5 Ilya-Grigorik.md
@@ -0,0 +1,5 @@
+* Twitter: [@igrigorik](https://twitter.com/igrigorik)
+
+## Talks
+
+* [[Cargo Cult Web Performance Optimization]]
View
5 Jack-Danger-Canty.md
@@ -0,0 +1,5 @@
+* Twitter: [@jackdanger](https://twitter.com/jackdanger)
+
+## Talks
+
+* [[Mega Rails]]
View
5 John-Downey.md
@@ -0,0 +1,5 @@
+* Twitter: [@jtdowney](https://twitter.com/jtdowney)
+
+## Talks
+
+* [[Modern Cryptography]]
View
82 Mega-Rails.md
@@ -1,3 +1,85 @@
+From [[Gogaruco 2012]]
+
+**Presenter:** [[Jack Danger Canty]]
+**Chagned title:** MonoRail: Monolithic Rails Application (TODO the title of this page and links to it)
+
+## Notes from @simeonwillbanks
+
+### Intro
+Common pattern from inception to huge app
+
+1. Rails apps go in the same direction, but it can be corrected
+2. The problem is primarily about ownership
+
+### Greenfield app
+(see slides)
+
+### MonoRail
+(see slides)
+
+### Actual Scaling Problems
+(see slides)
+Scaling data
+ * Data structure
+Codebase
+ * GitHub
+Customers
+Feature Count
+Developer Headcount
+ * No pattern in the community to help us do this
+
+### First day of greenfield development
+Rails can do everything! Lets make it do everything!
+You have to test your product in the market, so Rails gets us their quickly
+We get MonoRails because we keep on going and validating product in market
+
+### What is the problem?
+Rails is optimized to getting up and going quickly
+Makes your first 30 days magical, but its not optimized for 3 years into development
+All software has trade-offs
+
+(See Young & Mature slides)
+Postgres is super fast and doesn't have to do copy on write when adding a new column
+ActionMailer should be a mail service not a part of your Rails app
+User should be only authentication
+Abstract libraries to internal gems these are dependencies not your application
+You need database validations
+Log every significant action
+Analyze your data not in production!
+ * Extract to a replica
+ * ETL http://en.wikipedia.org/wiki/Extract,_transform,_load
+ * Get data out of relational database
+
+### Conway's Law
+"The shape of your people defines the shape of the products they make"
+There is a reason these Rails apps fail which is both technical and emotional
+If you fail, you should take ownership and make amends
+Your effort combined with your skill, you can make it right
+Energy combined with skill produces success
+The problem is you could still fail because of interaction with others on the project
+Rails can grow and be split, but it'll take foresight
+We should work on ownership
+The moment you split one team into small teams you get a MonoRail
+
+### Closing
+Three Step Process for taking ownership on pieces of code and abstracting
+1 is the same
+2 & 3 will vary from organization, product and use cases
+
+1. Build a service interfaces inside your app, internal APIs
+ Just pass data to services interfaces which is resilient to change
+ (See slides for simple examples)
+2. Extract the code
+ Copy the app and delete pieces you don't need, but nothing has really changed!
+ You could start over from scratch
+3. Move the data
+ You can talk to a replicate
+
+There is a real human cost for not realizing we need these human services immediately.
+As soon as we split our one team into multipleteams, we should go into work and be happy everyday and not just debug a MonoRail.
+
+MegaRails is a poor job of optimizing happiness.
+
## External Links
* [Slides](http://www.slideshare.net/jackdanger/monorails-gogaruco-2012)
View
90 Modern-Cryptography.md
@@ -1,6 +1,6 @@
From [[Gogaruco 2012]]
-**Presenter:** John Downey
+**Presenter:** [[John Downey]]
## Bio
@@ -26,7 +26,7 @@ Specific topics:
* Subtle flaws that can leave you insecure
* Why you should use TLS/SSL and GPG instead
-## Notes
+## Notes from @myronmarston
* Don't invent algorithms on your own.
* Stick to government standards.
@@ -59,3 +59,89 @@ Specific topics:
* Krypt - github.com/krypt
* Meant to replace Open SSL bindings in Ruby
+## Notes from @simeonwillbanks
+
+https://speakerdeck.com/u/jtdowney/p/cryptography-gogaruco
+
+### Cryptography
+1. Keep something secret
+2. Authentication, message has not changed in transit
+3. Identification, who sent this message
+
+### Modern Cryptography
+Based on hard math problems which aren't easy on classical computers
+Cryptography should be peer-reviewed
+Do not invent your algorithm!
+Stick go government standards which have been rigorously reviewed
+Key should always be private, but not algorithms (security through obscurity)
+Algorithms don't fail, but composing algorithms commonly fails
+Anytime you deal with Cryptography, you should be skeptic
+
+### Recommendations
+GET YOUR DATA INTO ONE OF THESE STATES, so you can use trusted patterns
+For data in transit
+(see slides)
+
+For data at rest
+(see slides)
+
+**NOTE: Disable TSL and SSL compression on your servers!**
+
+### Where Cryptography Goes Wrong
+What developers do wrong
+
+1. Random number generation
+ Kernal.rand is not a Cryptographically strong
+
+ "Good Cryptography looks as good as bad Cryptography"
+
+ See slides for recommendations
+
+2. Length Extension Attacks
+ They attack hash functions or fingerprints
+ Hash functions are one-way and not reversible
+ No two hash functions have the same output
+ Output is a fingerprint or digest
+ SHA-2 is current recommendation for hash functions
+
+ Current generation of hash functions return the internal state of a loop
+ They reveal to you exactly what happened inside the function
+ At the end, the value of internal variables become the output
+ (see slides)
+
+ Recommendations to be resistant to Length Extension Attack
+ (see slides)
+
+3. Password Storage
+ sha1(password) is NOT CORRECT!
+ Only useful for one way protection
+
+ sha1(salt + password) randomizes
+ (see slides)
+ sha1 is extremely fast
+
+ Recommendation
+ * Use Adaptive Hashing such as bcrypt
+ * has_secure_password
+ * devise
+
+ Make sure to calibrate number of iterations to tune how slow you want it to be
+
+### Trust
+Who actually verified fingerprint?
+Make sure the system you're connecting to is the system you want to connect to
+Trust on the internet is a very broken thing
+We can't rely on the user
+
+### Krypt
+Replace openssl bindings in Ruby because they are very bad
+Unified API to openssl or JAVA + SSL
+
+Slides have tons of resources
+
+### Questions
+Clients can have SSL certificates
+Internal applications use it
+Most users just want to see padlock icon
+
+If all requests aren't behind ssl, an unprotected request can intercept a request and change the DOM.
View
5 Sandi-Metz.md
@@ -0,0 +1,5 @@
+* Twitter: [@sandimetz](https://twitter.com/sandimetz)
+
+## Talks
+
+* [[Go Ahead Make a Mess]]
View
81 Schemas-for-the-Real-World.md
@@ -1,3 +1,84 @@
+From [[Gogaruco 2012]]
+
+**Presenter:** [[Carina C. Zona]]
+
## Memorable Quotes
<blockquote class="twitter-tweet"><p>"Assuming we know who users are keeps us from learning who they really are." -Fantastic talk by @<a href="https://twitter.com/cczona">cczona</a>. <a href="https://twitter.com/search/%23gogaruco">#gogaruco</a></p>&mdash; Sarah Mei (@sarahmei) <a href="https://twitter.com/sarahmei/status/247053729478627329" data-datetime="2012-09-15T19:26:13+00:00">September 15, 2012</a></blockquote>
+
+## Notes from @simeonwillbanks
+
+### Intro
+Relationships are really hard!
+Facebook had to double its options
+G+ uses the same list, but removed a few
+
+Allowing users to identify their relationships is for enhancing UX
+
+### Three core problems
+
+1. Deeply personal stuff about humans can be reduced to a list
+2. These lists should exists and be created
+3. The first two can be solved by adding more items
+
+This happens when we throw more labels at the relationship is an indicator that the schema is wrong!
+
+Relational databases cant model real life, a graph database is needed
+
+How do we bring modern relationships into a database?
+
+### Approaches
+
+1. Get schemas into alignment
+ * Mental schema which represents some aspect of the world
+ * UX is a manifestation of mental schemas
+ * Database schema
+2. (see slides)
+
+What benefit will the user notice?
+You have to evaluate trade-offs
+
+Evaluating from the user perspective gives us focus
+
+(see slides for good examples of UX)
+
+Schemas trust in users allowed users to ask for more freedom
+The user can make their profile exactly as they want it
+
+**Data doesn't have to be for analysis, it can be for shear expressiveness**
+
+You should avoid gender pronouns! Its too hard. (see slides)
+
+### Vision of good codebase
+We want structure, order, relational and predictable
+Nice easy clean analytics to make good decisions
+
+What we get is tons of conditions and exceptions
+We're never going to stop making lists, so all assumptions will be invalidated
+(see slides)
+
+### Balance between approaches
+We can strike middle ground through guided-response or auto-suggest
+Structure can be had through minimal-suggest
+ * If they don't type something from list, you can open the field, opt-out
+ * Data quality improves when user is able to choose what and when they share
+
+**Analytics run from bad data are bullshit since we forced the user to lie (restrictive options)**
+
+Make stuff flexible upfront and decide on validations and all that code later
+Allow NULL is making a statement of intent
+`t.string "gender", null: true`
+
+### Takeaways
+1. Modeling real world is hard and OK
+2. Assuming we know who the users are doesn't allow us to learn about the users (no constraints at first)
+3. More freedom won't kill us
+
+Data quality, specificity and loyalty are foundations for great UX
+
+**NO WAY TO MAKE EVERYONE HAPPY!**
+The earlier you do this, the more polarization happens
+
+## External Links
+
+* [Slides](https://speakerdeck.com/u/cczona/p/gogaruco-2012-v1)
View
5 Steven-Ragnarök.md
@@ -0,0 +1,5 @@
+* Twitter: [@nuclearsandwich](https://twitter.com/nuclearsandwich)
+
+## Talks
+
+* [[Sugar-Free Ruby An Experiment in Object-first Teaching]]
View
110 Sugar-Free-Ruby-An-Experiment-in-Object-first-Teaching.md
@@ -1,6 +1,6 @@
From [[Gogaruco 2012]]
-**Presenter:** Steven! Ragnarök
+**Presenter:** [[Steven Ragnarök]]
## Bio
@@ -26,7 +26,7 @@ From [[Gogaruco 2012]]
> greater ease. This talk explores the advantages and pitfalls of the
> technique as well as other ways to teach Ruby.
-## Notes
+## Notes from @myronmarston
* Teaching programming is really, really hard.
* Programming tkes a lot of self-reflection to teach well.
@@ -66,3 +66,109 @@ From [[Gogaruco 2012]]
* This is better because the object metaphor provides a
context for everything else we learn about Ruby.
+## Notes from @simeonwillbanks
+
+https://speakerdeck.com/u/nuclearsandwich/p/sugar-free-ruby
+
+### Introduction
+
+Sugar-free emphasizes Ruby is Objects
+
+### Teaching Programming
+
+If we don't teach it, its going away
+
+You owe it to your teachers to continue the tradition
+
+Teaching programming is very hard!!
+ * Its really hard to learn to program
+ * Your assumptions aren't natural
+ * Takes a lot of empathy
+ * Its hard to share something valuable
+ * We always want to gain value out of an interaction
+ * You will be rewarded for your knowledge and sharing!
+
+It takes a lot of self reflection to teach well
+Just like getting better at programming, you must always be a student
+
+### CoderDojo
+
+Dedicated to setting up kids coding projects
+In small groups, children learn to program
+Kids learn that **Programming Is Fun!**
+ * Encourages children to continue to program
+ * Its best way to engage kids, is to make an activity fun
+
+### Rails Bridge
+
+For anyone in this world, programming is hard but attainable
+Focus on fun parts like Rails instead of installing language and dependencies
+
+### Challenge with Teaching Ruby
+
+You have to know why the student is trying to learn
+You have to ask, "Why do you want to learn Ruby?"
+ * I hate my job and programmers make bank
+ * I know how to program but not Ruby, the Ruby community is awesome!
+ * I'm curious about programming
+
+### How are we teaching Ruby right now?
+
+ * Data types
+ * True and false
+ * Collection structures
+ * Expressions
+ * Console
+ * Variables
+ * Conditionals
+ * Loops
+ * If we are lucky, we might talk about `foo.upcase` aka objects
+
+Where are students' minds blown? Information overload.
+
+Whats wrong with this picture?
+Too many concepts before discussing methods or even mentioning classes.
+
+Ruby is not a computer a language!
+Ruby doesn't care its on a computer.
+
+### Teach Ruby as Objects!
+
+Reservation: students head will explode, but it already does with first way to teach via data types through loops.
+
+Give the students an idea of Objects and let them explore via irb
+
+Use `#send` to emphasize message passing
+Be explicit to really reveal the fact that messages are being passed
+
+**Objects and classes are one in the same!**
+
+### Now we can talk about a narrative
+
+Gives student a thread to follow
+
+`Object.new`
+ * A message called new
+ * Can be sent to any class
+ * Gives you back and instance of that class
+ * We give a name to the object
+
+Helps student link in their minds exactly what is happening!
+
+Kernal.puts is better than puts since mixins are _too complicated_ for now
+Keep the student on the narrative instead of going down a tangent
+
+### What have we introduced at this point?
+
+Objects have methods which accept and send messages
+Introduce Classes except Class is a Class which creates new Classes
+
+### Wrap up
+
+**Teach objects with Ruby instead of teach Ruby with objects**
+Better foundation because Ruby cares about Objects and how they interact
+
+Details on better foundation:
+ * https://speakerdeck.com/u/nuclearsandwich/p/sugar-free-ruby?slide=61
+ * https://speakerdeck.com/u/nuclearsandwich/p/sugar-free-ruby?slide=62
+ * https://speakerdeck.com/u/nuclearsandwich/p/sugar-free-ruby?slide=63
View
81 Writing-a-Rails-Engine.md
@@ -1,6 +1,6 @@
From [[Gogaruco 2012]]
-**Presenter:** Erik Michaels-Ober
+**Presenter:** [[Erik Michaels-Ober]]
## Bio
@@ -39,7 +39,84 @@ From [[Gogaruco 2012]]
## Memorable Quotes
-## Notes
+## Notes from @simeonwillbanks
+
+### Introduction
+All a rails app is a bootable rails engine
+Engines do not know how to start themselves, but are everything else, MVC
+Engines can plugin to engines
+
+Rails engines are fundamental building block of rails
+
+### History
+James Adam is creator of rails engines
+1st commit to engines plugin was 10/31/2005
+Rails 0.14.2
+Really old concept/feature
+
+DHH was against engines!
+
+James Adam thought it would be "Madness" to have engines in rails
+
+Merb slices introduced on 05/21/2008
+Slice out bits of functionality and use across multiple applications
+
+Rails and Merb merge on 12/23/2008
+Concepts of merb, including engines, were built into rails core
+
+The Russian Doll Pattern by Carl Lerche and Yehuda Katz
+Apps within apps
+
+Ruby Summer of Code 2010
+Piotr Sarnacki used Russian Doll Pattern and implemented it in rails
+Mentored by Carl, Yehuda and Jose Valim
+
+Bogdan Gaza rebuilt MerbAdmin
+
+Rails 3.0 uses engines!
+Pain point was assets which had to be copied via rake task or generator
+
+Rails 3.1 Asset Pipeline, FTW
+Puts every engine in load path for assets
+Looks in all engines to load assets
+Engines became first class citizens!
+
+Rails 3.2 deprecates vendor/plugins
+The way forward is engines
+Rails 4, engines are the only way
+
+### Write a Rails engine
+
+Easy, same as writing a rails app
+`$ rails plugin new my_engine --mountable`
+very similar file system
+
+ * Engines are namespaced by modules
+ * Engines inherit from Rails::Engine which adds engine to load path
+ * Engine is not added to Gemfile, specify via gemspec
+ * Can have custom rake tasks in lib/tasks and scoped to engine name
+ * Can define generators lib/generators and scoped by engine name
+ * Can write migrations db/migrations and scoped by engine name
+ * `rake my_engine::install::migrations` only copy in new migrations
+ * Routes are defined in engine and engine is mounted in client app
+ routes at a certain path
+
+### Testing a Rails engine
+
+Best practice is
+ 1. to create a dummy app in test directory
+ 2. mount engine in dummy app
+ 3. test the dummy app
+
+For more info: http://guides.rubyonrails.org/engines.html
+
+### When should I write an engine?
+
+1. If you are at a point and you have two apps which need to share logic,
+slice out the logic into a gem to be shared.
+2. A base like scaffolding, assets or template which can be mounted
+into multiple apps and reused
+
## Discussion
Please sign in to comment.
Something went wrong with that request. Please try again.