The Making of
YourClassical
Micah Taylor(@micahtaylor)
and
John Malone (@john_malone)
What are we trying to
solve?
• Streaming of APM musical properties
• Expose lots of written content
• Performant Site
• Enjoyable user experience
The actors
• Barn - the source of truth
• Meeker - the source of all order
• Potlatch - the source of configuration
• MPRStory - the source of reasonable html
• Playlist API - the source of schedule
Barn• Lucene
implementation
• Searchable
• Indexable
def author_query full_name
full_name_array = full_name.split('-')
first_name= full_name_array.shift
last_name = full_name_array.join(' ')
"(author:("#{last_name}, #{first_name}")) AND (origin=("Itasca-Feature"))"
end
Meeker
• Configures how stories are ordered
• Provides override of queries
• (origin:("Itasca-Feature")) AND (tags:("classical
music")) AND (movies or film or cinema or
soundtrack) NOT (collection:("top-score"))
Potlatch
• Settings which used to be in .yml files
MPR Story
Driver
• Combining and
formatting of story
pictures, audio
elements, and text.
Playlist API
• Radio program schedule
• When you want to see what is playing on The
Current, this is what you are using
Frontend implementation
• Twitter Bootstrap
• Seamless streaming experience
• Provide rich content
• Let’s take a look
Turbolinks versus Pjax
• Persistent media player
• I love ASCII art
.--.
/ 
## a a
( '._)
|'-- |
_.___/_ ___pjax___
."> Y/|<'. '._.-'
/  _/ / '-' /
| --'_/|/ | _/
|___.-' | |`'`
| | |
| / './
/__./` | |
 | |
 | |
; | |
/ | |
jgs |____._
`-"--'---'
if pjax_request?
render :layout => false
end
Testing
VCR is pretty sweet
caches_action :index, :show, cache_path: proc {
|c| c.params.merge(format: pjax_request?) },
:expires_in => 15.minutes
Action Caching
Action Caching
caches_action :index, :show,
cache_path: proc { |c|
c.params.merge(format: pjax_request?) }
, :expires_in => 15.minutes
• Why not Russian Doll caching?
• The right fit
Websocket
Implementation
versus Rails Streaming
protocol. It provides message servers for Node.js and R
var http = require('http'),
faye = require('faye');
var server = http.createServer(),
bayeux = new faye.NodeAdapter({mount: '/'});
bayeux.attach(server);
server.listen(8000);
Creating Faye Server
var client = new Faye.Client('http://localhost:8000/');
client.subscribe('/messages', function(message) {
alert('Got a message: ' + message.text);
});
Creating Faye Client
client.publish('/messages', {
text: 'Hello world'
});
Creating Faye Message
Lessons learned
People to thank!
• Peter Rasmussen (Main boss)
• Bruce MacDonald (Sweet UDP cowboy)
• Will Johnston (Cuttint through the weeds)
• Geoff Hankerson (Javascript druid)
• Mike Cullen (You want a complete rebrand, really?)
• Justin Heideman (Serious Full Stack dude)
• Drew Stevenson (For making all the moving pieces work)

Building YourClassical

  • 1.
    The Making of YourClassical MicahTaylor(@micahtaylor) and John Malone (@john_malone)
  • 2.
    What are wetrying to solve? • Streaming of APM musical properties • Expose lots of written content • Performant Site • Enjoyable user experience
  • 3.
    The actors • Barn- the source of truth • Meeker - the source of all order • Potlatch - the source of configuration • MPRStory - the source of reasonable html • Playlist API - the source of schedule
  • 4.
    Barn• Lucene implementation • Searchable •Indexable def author_query full_name full_name_array = full_name.split('-') first_name= full_name_array.shift last_name = full_name_array.join(' ') "(author:("#{last_name}, #{first_name}")) AND (origin=("Itasca-Feature"))" end
  • 5.
    Meeker • Configures howstories are ordered • Provides override of queries • (origin:("Itasca-Feature")) AND (tags:("classical music")) AND (movies or film or cinema or soundtrack) NOT (collection:("top-score"))
  • 6.
    Potlatch • Settings whichused to be in .yml files
  • 7.
    MPR Story Driver • Combiningand formatting of story pictures, audio elements, and text.
  • 8.
    Playlist API • Radioprogram schedule • When you want to see what is playing on The Current, this is what you are using
  • 9.
    Frontend implementation • TwitterBootstrap • Seamless streaming experience • Provide rich content • Let’s take a look
  • 10.
    Turbolinks versus Pjax •Persistent media player • I love ASCII art .--. / ## a a ( '._) |'-- | _.___/_ ___pjax___ ."> Y/|<'. '._.-' / _/ / '-' / | --'_/|/ | _/ |___.-' | |`'` | | | | / './ /__./` | | | | | | ; | | / | | jgs |____._ `-"--'---' if pjax_request? render :layout => false end
  • 11.
  • 12.
    caches_action :index, :show,cache_path: proc { |c| c.params.merge(format: pjax_request?) }, :expires_in => 15.minutes Action Caching
  • 13.
    Action Caching caches_action :index,:show, cache_path: proc { |c| c.params.merge(format: pjax_request?) } , :expires_in => 15.minutes • Why not Russian Doll caching? • The right fit
  • 14.
  • 15.
    versus Rails Streaming protocol.It provides message servers for Node.js and R
  • 16.
    var http =require('http'), faye = require('faye'); var server = http.createServer(), bayeux = new faye.NodeAdapter({mount: '/'}); bayeux.attach(server); server.listen(8000); Creating Faye Server
  • 17.
    var client =new Faye.Client('http://localhost:8000/'); client.subscribe('/messages', function(message) { alert('Got a message: ' + message.text); }); Creating Faye Client
  • 18.
    client.publish('/messages', { text: 'Helloworld' }); Creating Faye Message
  • 19.
  • 20.
    People to thank! •Peter Rasmussen (Main boss) • Bruce MacDonald (Sweet UDP cowboy) • Will Johnston (Cuttint through the weeds) • Geoff Hankerson (Javascript druid) • Mike Cullen (You want a complete rebrand, really?) • Justin Heideman (Serious Full Stack dude) • Drew Stevenson (For making all the moving pieces work)