SlideShare a Scribd company logo
1 of 27
Phoenix Framework (Elixir)
A productive web framework that does not compromise speed and maintainability
Svein Fidjestøl
Webstep Fokus
January 2016
Intel Haswell-E
2015
?✓
Timeline
1986: Erlang 2012: Elixir 2015: Phoenix Framework
2015: 3 GHz, 8(16) Cores2002: 3 GHz, 1 Core1986: 0.016 GHz, 1 Core
Elixir
Modern programming language
Erlang Virtual Machine (BEAM)
Erlang compatible
Battle-tested concurrency and distribution model
IEx: Interactive Shell
Mix: Build and package management tool
Elixir
2012: R&D project at Plataformatec (Brazil). First public release.
2014: Version 1.0.0. Some real-world usage of Elixir in production systems.
2016: Version 1.2.0
Elixir
In Python
" ".join(map(str.capitalize, "hello_there_world".split("_")))
In Elixir
"hello_there_world"
|> String.split("_")
|> Enum.map(&String.capitalize/1)
|> Enum.join(" ")
using the pipeline operator: |>
Elixir
In C#
"hello_there_world"
.Split('_')
.Select(x => textInfo.ToTitleCase(x))
.Aggregate((a, b) => a + " " + b);
or
string.Join(" ",
"hello_there_world"
.Split('_')
.Select(x => textInfo.ToTitleCase(x)))
Erlang
Used in 50 % of all telecom switches
Erlang Virtual Machine (BEAM)
Massively Scalable
High Availability
Actor Model
Unfamiliar syntax -- Erlang started life as a modified Prolog, and this shows.
Erlang
1986: Proprietary Language (Ericsson)
1995: OTP (“Open Telecom Platform”)
1998: Erlang/OTP Open Sourced
2008: Facebook Chat
2010: WhatsApp
Other: RabbitMQ, CouchDB, Riak, Yahoo delicious.com, Pinterest, Amazon SimpleDB
Erlang
Functions are defined basically by a mathematical formula
area({square, Side}) -> Side * Side;
area({circle, Radius}) -> math:pi() * Radius * Radius.
“square” and “circle” are atoms since they start with a lowercase letter
“Side” and “Radius” are variables since they start with an uppercase letter
Erlang
Decode TCP segments:
decode(<< SourcePort:16, DestinationPort:16,
SequenceNumber:32,
AckNumber:32,
DataOffset:4, _Reserved:4, Flags:8,
WindowSize:16,
Checksum:16, UrgentPointer:16,
Payload/binary>>) when DataOffset>4
“SourcePort:16”: 16 is the number of bits to be matched to the variable SourcePort
“when DataOffset>4”: Guard expression, can use simple tests and variable comparisons
Erlang
Quicksort
qsort([]) -> [];
qsort([X|Xs]) ->
qsort([Y || Y <- Xs, Y =< X]) ++ [X] ++ qsort([Y || Y <- Xs, Y > X]).
Elixir
DEMO
Phoenix Framework
Web Framework for Elixir, inspired by Ruby on Rails
MVC (Model - View - Controller)
Optimized for “Developer joy” and productivity
Massively better performance than RoR (and concurrency actually works!)
Plug
Ecto
Channels (Sockets), PubSub, etc.
Phoenix Framework
2014: First appeared
2015: Version 1.0
2016: Version 1.1
Phoenix Framework
Linux, OS X, Windows
PostgreSQL, MySql, SQL Server
Works great on all combinations
Easy to get started
Easily deployed to Heroku
Efficient! Can even run on a Raspberry PI 2:
540 requests per second on a $35 piece of hardware using on average 90% CPU and only 16 MB RAM
Plug
Pipeline
Authentication
Other Request Headers
Logging
Ecto
ORM mapper, without the “O”
Familiar syntax
Type safe
query = from w in Weather,
where: w.prcp > 0 or is_nil(w.prcp),
select: w
Framework dependencies
node.js (optional, for development)
PostgreSQL (default)
SQL Server also works fine using the TDS Adapter for Ecto
Framework dependencies
Erlang
fs
ranch
poolboy
decimal
poison
cowlib
cowboy
Framework dependencies
Elixir
plug
ecto
Client side
brunch.io (Optional, asset management)
One convenient package
Don’t have to worry about dependencies
Mix build system (Elixir dependencies)
Hex package manager (Erlang dependencies)
Code editor: e.g. Atom with language-elixir plugin
Phoenix Framework
DEMO
Deployment
Linux / Mac / Windows
Heroku
Elixir buildpack for Heroku
Real world use
Bleacher Report: http://bleacherreport.com/
Second largest sport website in the world
80 million unique users per month
Far above 100,000 requests per minute
Highly personalized content
Previously used Ruby on Rails
Performance issues, needed lots of caching layers
Phoenix allows a real-time strategy instead of caching
Real world use
High-level benefits
Scalability
Fault-tolerance
Functional
Meta-programming
Specific benefits
List manipulation
Highly personalized real-time lists
Questions?

More Related Content

What's hot

Ansible Tutorial For Beginners | What Is Ansible And How It Works? | Ansible ...
Ansible Tutorial For Beginners | What Is Ansible And How It Works? | Ansible ...Ansible Tutorial For Beginners | What Is Ansible And How It Works? | Ansible ...
Ansible Tutorial For Beginners | What Is Ansible And How It Works? | Ansible ...
Simplilearn
 
Lightning Talk: Erlang on Xen - Mikhail Bortnyk
Lightning Talk: Erlang on Xen - Mikhail BortnykLightning Talk: Erlang on Xen - Mikhail Bortnyk
Lightning Talk: Erlang on Xen - Mikhail Bortnyk
Elixir Club
 
Vancouver Erlang Meetup cferl & Mule Transport Plug
Vancouver Erlang Meetup cferl & Mule Transport PlugVancouver Erlang Meetup cferl & Mule Transport Plug
Vancouver Erlang Meetup cferl & Mule Transport Plug
David Dossot
 

What's hot (20)

Awesome Concurrency with Elixir Tasks
Awesome Concurrency with Elixir TasksAwesome Concurrency with Elixir Tasks
Awesome Concurrency with Elixir Tasks
 
Droidcon Nigeria 2021 - Still Sleeping on KMM?
Droidcon Nigeria 2021 - Still Sleeping on KMM? Droidcon Nigeria 2021 - Still Sleeping on KMM?
Droidcon Nigeria 2021 - Still Sleeping on KMM?
 
Multiplatform shared codebase with Kotlin/Native - UA Mobile 2019
Multiplatform shared codebase with Kotlin/Native - UA Mobile 2019Multiplatform shared codebase with Kotlin/Native - UA Mobile 2019
Multiplatform shared codebase with Kotlin/Native - UA Mobile 2019
 
Ansible Tutorial For Beginners | What Is Ansible And How It Works? | Ansible ...
Ansible Tutorial For Beginners | What Is Ansible And How It Works? | Ansible ...Ansible Tutorial For Beginners | What Is Ansible And How It Works? | Ansible ...
Ansible Tutorial For Beginners | What Is Ansible And How It Works? | Ansible ...
 
Building Elixir App Release with Distillery and Docker
Building Elixir App Release with Distillery and DockerBuilding Elixir App Release with Distillery and Docker
Building Elixir App Release with Distillery and Docker
 
Intro to Erlang
Intro to ErlangIntro to Erlang
Intro to Erlang
 
Automating the Cloud with Terraform, and Ansible
Automating the Cloud with Terraform, and AnsibleAutomating the Cloud with Terraform, and Ansible
Automating the Cloud with Terraform, and Ansible
 
Productive OpenCL with Intel Xeon Phi Coprocessors
Productive OpenCL with Intel Xeon Phi CoprocessorsProductive OpenCL with Intel Xeon Phi Coprocessors
Productive OpenCL with Intel Xeon Phi Coprocessors
 
Managing Eclipse Preferences for Teams (EclipseCon 2011)
Managing Eclipse Preferences for Teams (EclipseCon 2011)Managing Eclipse Preferences for Teams (EclipseCon 2011)
Managing Eclipse Preferences for Teams (EclipseCon 2011)
 
Configuration primer
Configuration primerConfiguration primer
Configuration primer
 
Erlang - Concurrent Language for Concurrent World
Erlang - Concurrent Language for Concurrent WorldErlang - Concurrent Language for Concurrent World
Erlang - Concurrent Language for Concurrent World
 
Lightning Talk: Erlang on Xen - Mikhail Bortnyk
Lightning Talk: Erlang on Xen - Mikhail BortnykLightning Talk: Erlang on Xen - Mikhail Bortnyk
Lightning Talk: Erlang on Xen - Mikhail Bortnyk
 
Ansible training | redhat Ansible 2.5 Corporate course - GOT
Ansible training | redhat Ansible 2.5 Corporate course - GOTAnsible training | redhat Ansible 2.5 Corporate course - GOT
Ansible training | redhat Ansible 2.5 Corporate course - GOT
 
A shallow dive into the elixir compiler
A shallow dive into the elixir compilerA shallow dive into the elixir compiler
A shallow dive into the elixir compiler
 
Creating Perl modules with Dist::Zilla
Creating Perl modules with Dist::ZillaCreating Perl modules with Dist::Zilla
Creating Perl modules with Dist::Zilla
 
Open stack and_vagrant-os-meetup-2015
Open stack and_vagrant-os-meetup-2015Open stack and_vagrant-os-meetup-2015
Open stack and_vagrant-os-meetup-2015
 
Let's Get Acquainted: Ansible! / Symfony Camp UA 2014
Let's Get Acquainted: Ansible!  / Symfony Camp UA 2014Let's Get Acquainted: Ansible!  / Symfony Camp UA 2014
Let's Get Acquainted: Ansible! / Symfony Camp UA 2014
 
Electron. Build cross platform desktop apps with web technologies!
Electron. Build cross platform desktop apps with web technologies!Electron. Build cross platform desktop apps with web technologies!
Electron. Build cross platform desktop apps with web technologies!
 
eZ Publish Platform 5.4 public webinar
eZ Publish Platform 5.4 public webinareZ Publish Platform 5.4 public webinar
eZ Publish Platform 5.4 public webinar
 
Vancouver Erlang Meetup cferl & Mule Transport Plug
Vancouver Erlang Meetup cferl & Mule Transport PlugVancouver Erlang Meetup cferl & Mule Transport Plug
Vancouver Erlang Meetup cferl & Mule Transport Plug
 

Viewers also liked

ELIXIR Node poster Denmark
ELIXIR Node poster DenmarkELIXIR Node poster Denmark
ELIXIR Node poster Denmark
ELIXIR-Europe
 
ELIXIR Node poster Finland
ELIXIR Node poster Finland ELIXIR Node poster Finland
ELIXIR Node poster Finland
ELIXIR-Europe
 
ELIXIR Node poster Italy
ELIXIR Node poster ItalyELIXIR Node poster Italy
ELIXIR Node poster Italy
ELIXIR-Europe
 
ELIXIR Node poster Switzerland
ELIXIR Node poster SwitzerlandELIXIR Node poster Switzerland
ELIXIR Node poster Switzerland
ELIXIR-Europe
 
ELIXIR Node poster Israel
ELIXIR Node poster Israel ELIXIR Node poster Israel
ELIXIR Node poster Israel
ELIXIR-Europe
 
ELIXIR Node poster EMBL EBI
ELIXIR Node poster EMBL EBI ELIXIR Node poster EMBL EBI
ELIXIR Node poster EMBL EBI
ELIXIR-Europe
 
ELIXIR Node poster Slovenia
ELIXIR Node poster SloveniaELIXIR Node poster Slovenia
ELIXIR Node poster Slovenia
ELIXIR-Europe
 
ELIXIR Node poster Estonia
ELIXIR Node poster EstoniaELIXIR Node poster Estonia
ELIXIR Node poster Estonia
ELIXIR-Europe
 
ELIXIR Node poster UK
ELIXIR Node poster UKELIXIR Node poster UK
ELIXIR Node poster UK
ELIXIR-Europe
 

Viewers also liked (18)

Using Erlang in an Embedded and Cross-Compiled World
Using Erlang in an Embedded and Cross-Compiled WorldUsing Erlang in an Embedded and Cross-Compiled World
Using Erlang in an Embedded and Cross-Compiled World
 
ELIXIR Node poster Denmark
ELIXIR Node poster DenmarkELIXIR Node poster Denmark
ELIXIR Node poster Denmark
 
ELIXIR Node poster Finland
ELIXIR Node poster Finland ELIXIR Node poster Finland
ELIXIR Node poster Finland
 
ELIXIR Node poster Italy
ELIXIR Node poster ItalyELIXIR Node poster Italy
ELIXIR Node poster Italy
 
ELIXIR and Impact presentation given by Jackie Hunter, Chief Executive, BBSRC...
ELIXIR and Impact presentation given by Jackie Hunter, Chief Executive, BBSRC...ELIXIR and Impact presentation given by Jackie Hunter, Chief Executive, BBSRC...
ELIXIR and Impact presentation given by Jackie Hunter, Chief Executive, BBSRC...
 
ELIXIR Node poster Switzerland
ELIXIR Node poster SwitzerlandELIXIR Node poster Switzerland
ELIXIR Node poster Switzerland
 
ELIXIR Node poster Israel
ELIXIR Node poster Israel ELIXIR Node poster Israel
ELIXIR Node poster Israel
 
ELIXIR Node poster EMBL EBI
ELIXIR Node poster EMBL EBI ELIXIR Node poster EMBL EBI
ELIXIR Node poster EMBL EBI
 
ELIXIR Node poster Slovenia
ELIXIR Node poster SloveniaELIXIR Node poster Slovenia
ELIXIR Node poster Slovenia
 
ELIXIR Node poster Estonia
ELIXIR Node poster EstoniaELIXIR Node poster Estonia
ELIXIR Node poster Estonia
 
ELIXIR Node poster UK
ELIXIR Node poster UKELIXIR Node poster UK
ELIXIR Node poster UK
 
Current and future plans for ELIXIR presentation given by Niklas Blomberg, EL...
Current and future plans for ELIXIR presentation given by Niklas Blomberg, EL...Current and future plans for ELIXIR presentation given by Niklas Blomberg, EL...
Current and future plans for ELIXIR presentation given by Niklas Blomberg, EL...
 
Use the @types, Luke
Use the @types, LukeUse the @types, Luke
Use the @types, Luke
 
Embedded Erlang, Nerves, and SumoBots
Embedded Erlang, Nerves, and SumoBotsEmbedded Erlang, Nerves, and SumoBots
Embedded Erlang, Nerves, and SumoBots
 
Elixirs
ElixirsElixirs
Elixirs
 
Building a Network IP Camera using Erlang
Building a Network IP Camera using ErlangBuilding a Network IP Camera using Erlang
Building a Network IP Camera using Erlang
 
Introduction to Elixir
Introduction to ElixirIntroduction to Elixir
Introduction to Elixir
 
My adventure with Elm
My adventure with ElmMy adventure with Elm
My adventure with Elm
 

Similar to Introduction to Phoenix Framework (Elixir) 2016-01-07

Language Engineering in the Cloud
Language Engineering in the CloudLanguage Engineering in the Cloud
Language Engineering in the Cloud
lennartkats
 
Using Smalltalk for controlling robotics systems
Using Smalltalk for controlling robotics systemsUsing Smalltalk for controlling robotics systems
Using Smalltalk for controlling robotics systems
Serge Stinckwich
 
"Making OpenCV Code Run Fast," a Presentation from Intel
"Making OpenCV Code Run Fast," a Presentation from Intel"Making OpenCV Code Run Fast," a Presentation from Intel
"Making OpenCV Code Run Fast," a Presentation from Intel
Edge AI and Vision Alliance
 
.NET Framework Overview
.NET Framework Overview.NET Framework Overview
.NET Framework Overview
Doncho Minkov
 

Similar to Introduction to Phoenix Framework (Elixir) 2016-01-07 (20)

ElixirでFPGAを設計する
ElixirでFPGAを設計するElixirでFPGAを設計する
ElixirでFPGAを設計する
 
.Net Core 1.0 vs .NET Framework
.Net Core 1.0 vs .NET Framework.Net Core 1.0 vs .NET Framework
.Net Core 1.0 vs .NET Framework
 
Flink Forward Berlin 2018: Robert Bradshaw & Maximilian Michels - "Universal ...
Flink Forward Berlin 2018: Robert Bradshaw & Maximilian Michels - "Universal ...Flink Forward Berlin 2018: Robert Bradshaw & Maximilian Michels - "Universal ...
Flink Forward Berlin 2018: Robert Bradshaw & Maximilian Michels - "Universal ...
 
SynapseIndia java and .net development
SynapseIndia java and .net developmentSynapseIndia java and .net development
SynapseIndia java and .net development
 
TechWiseTV Workshop: Catalyst Switching Programmability
TechWiseTV Workshop: Catalyst Switching ProgrammabilityTechWiseTV Workshop: Catalyst Switching Programmability
TechWiseTV Workshop: Catalyst Switching Programmability
 
Language Engineering in the Cloud
Language Engineering in the CloudLanguage Engineering in the Cloud
Language Engineering in the Cloud
 
Moving forward with ASP.NET Core
Moving forward with ASP.NET CoreMoving forward with ASP.NET Core
Moving forward with ASP.NET Core
 
Using Smalltalk for controlling robotics systems
Using Smalltalk for controlling robotics systemsUsing Smalltalk for controlling robotics systems
Using Smalltalk for controlling robotics systems
 
"Making OpenCV Code Run Fast," a Presentation from Intel
"Making OpenCV Code Run Fast," a Presentation from Intel"Making OpenCV Code Run Fast," a Presentation from Intel
"Making OpenCV Code Run Fast," a Presentation from Intel
 
Building a modern SaaS in 2020
Building a modern SaaS in 2020Building a modern SaaS in 2020
Building a modern SaaS in 2020
 
Nakov dot net-framework-overview-english
Nakov dot net-framework-overview-englishNakov dot net-framework-overview-english
Nakov dot net-framework-overview-english
 
Net Framework Overview
Net Framework OverviewNet Framework Overview
Net Framework Overview
 
Silverlight
SilverlightSilverlight
Silverlight
 
.NET Framework Overview
.NET Framework Overview.NET Framework Overview
.NET Framework Overview
 
Ropython-windbg-python-extensions
Ropython-windbg-python-extensionsRopython-windbg-python-extensions
Ropython-windbg-python-extensions
 
.Net overview
.Net overview.Net overview
.Net overview
 
GeekCampSG - Nodejs , Websockets and Realtime Web
GeekCampSG - Nodejs , Websockets and Realtime WebGeekCampSG - Nodejs , Websockets and Realtime Web
GeekCampSG - Nodejs , Websockets and Realtime Web
 
Building Hopsworks, a cloud-native managed feature store for machine learning
Building Hopsworks, a cloud-native managed feature store for machine learning Building Hopsworks, a cloud-native managed feature store for machine learning
Building Hopsworks, a cloud-native managed feature store for machine learning
 
Brk2051 sql server on linux and docker
Brk2051 sql server on linux and dockerBrk2051 sql server on linux and docker
Brk2051 sql server on linux and docker
 
.net framework
.net framework.net framework
.net framework
 

Recently uploaded

Why Teams call analytics are critical to your entire business
Why Teams call analytics are critical to your entire businessWhy Teams call analytics are critical to your entire business
Why Teams call analytics are critical to your entire business
panagenda
 
Finding Java's Hidden Performance Traps @ DevoxxUK 2024
Finding Java's Hidden Performance Traps @ DevoxxUK 2024Finding Java's Hidden Performance Traps @ DevoxxUK 2024
Finding Java's Hidden Performance Traps @ DevoxxUK 2024
Victor Rentea
 

Recently uploaded (20)

ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemkeProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
 
TrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
TrustArc Webinar - Unlock the Power of AI-Driven Data DiscoveryTrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
TrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
 
Understanding the FAA Part 107 License ..
Understanding the FAA Part 107 License ..Understanding the FAA Part 107 License ..
Understanding the FAA Part 107 License ..
 
Why Teams call analytics are critical to your entire business
Why Teams call analytics are critical to your entire businessWhy Teams call analytics are critical to your entire business
Why Teams call analytics are critical to your entire business
 
Vector Search -An Introduction in Oracle Database 23ai.pptx
Vector Search -An Introduction in Oracle Database 23ai.pptxVector Search -An Introduction in Oracle Database 23ai.pptx
Vector Search -An Introduction in Oracle Database 23ai.pptx
 
ICT role in 21st century education and its challenges
ICT role in 21st century education and its challengesICT role in 21st century education and its challenges
ICT role in 21st century education and its challenges
 
Artificial Intelligence Chap.5 : Uncertainty
Artificial Intelligence Chap.5 : UncertaintyArtificial Intelligence Chap.5 : Uncertainty
Artificial Intelligence Chap.5 : Uncertainty
 
Apidays New York 2024 - Passkeys: Developing APIs to enable passwordless auth...
Apidays New York 2024 - Passkeys: Developing APIs to enable passwordless auth...Apidays New York 2024 - Passkeys: Developing APIs to enable passwordless auth...
Apidays New York 2024 - Passkeys: Developing APIs to enable passwordless auth...
 
Navigating the Deluge_ Dubai Floods and the Resilience of Dubai International...
Navigating the Deluge_ Dubai Floods and the Resilience of Dubai International...Navigating the Deluge_ Dubai Floods and the Resilience of Dubai International...
Navigating the Deluge_ Dubai Floods and the Resilience of Dubai International...
 
CNIC Information System with Pakdata Cf In Pakistan
CNIC Information System with Pakdata Cf In PakistanCNIC Information System with Pakdata Cf In Pakistan
CNIC Information System with Pakdata Cf In Pakistan
 
Exploring Multimodal Embeddings with Milvus
Exploring Multimodal Embeddings with MilvusExploring Multimodal Embeddings with Milvus
Exploring Multimodal Embeddings with Milvus
 
Apidays New York 2024 - The value of a flexible API Management solution for O...
Apidays New York 2024 - The value of a flexible API Management solution for O...Apidays New York 2024 - The value of a flexible API Management solution for O...
Apidays New York 2024 - The value of a flexible API Management solution for O...
 
Finding Java's Hidden Performance Traps @ DevoxxUK 2024
Finding Java's Hidden Performance Traps @ DevoxxUK 2024Finding Java's Hidden Performance Traps @ DevoxxUK 2024
Finding Java's Hidden Performance Traps @ DevoxxUK 2024
 
Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...
Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...
Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...
 
Repurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost Saving
Repurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost SavingRepurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost Saving
Repurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost Saving
 
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, AdobeApidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
 
Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
Strategize a Smooth Tenant-to-tenant Migration and Copilot TakeoffStrategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
 
Elevate Developer Efficiency & build GenAI Application with Amazon Q​
Elevate Developer Efficiency & build GenAI Application with Amazon Q​Elevate Developer Efficiency & build GenAI Application with Amazon Q​
Elevate Developer Efficiency & build GenAI Application with Amazon Q​
 
Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...
Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...
Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...
 
Corporate and higher education May webinar.pptx
Corporate and higher education May webinar.pptxCorporate and higher education May webinar.pptx
Corporate and higher education May webinar.pptx
 

Introduction to Phoenix Framework (Elixir) 2016-01-07