SlideShare a Scribd company logo
Rapid Prototyping Chatter with a 
PHP/Hack Canvas App on Heroku 
Rodney White 
President, The Acceleration Agency 
@rodney_white
The goal is to provide a process 
and framework to rapidly prototype 
Force.com Chatter Canvas apps within 
minutes, not days or months
Agenda 
1. Introduction 
2. Rapid Prototyping Basics 
3. Tech Basics 
4. Time to code 
5. Questions
Rodney White 
Founder, The Acceleration Agency
The Acceleration Agency leverages 
iterative philosophies and methodologies to 
innovate new products, platforms, and services. 
We are Designers. 
We are Makers. 
We are Learners.
to 
a 
video, 
Rapid Prototyping Basics
Rapid Prototyping Basics* 
Maximize the Rate of Learning by 
Minimizing the time to try ideas 
- Tom Chi 
Rule #1: Find the quickest path to the experience. 
Rule #2: Making is the best kind of thinking. 
Rule #3: Use materials that move at the speed of thought. 
Rule #4: Your user’s reality is the medium. 
Rule #5: Knowing is the enemy of learning. 
Rule #6: “The first draft of anything is shit.” - Ernest Hemingway 
* Some rules are courtesy of Tom Chi. Please watch: https://www.youtube.com/watch?v=DkyMCCnNI3Q to learn more
Rapid Prototyping Basics* 
Rate based goals 
By the time you try 1 iteration 
-> 5% chance of success 
By the time you try 20 iterations 
-> 64% chance of success 
By the time you try 50 iterations 
-> 92% chance of success
to 
a 
video, 
Chatter Basics
Chatter Basics 
Publisher 
Chatter lets you create instant actions that 
are instantly mobile. For any business 
process. Expense reports, support cases, 
orders, and more. Customize actions for your 
company, and even integrate third party 
apps. So you can get more done in the feed 
from any device.
Chatter Basics 
Feeds and Feed Items 
Do everything in the feed. Keep up with 
critical projects, topics, and teams. Work 
together on sales opportunities, service 
cases, and marketing campaigns. Capture 
organizational knowledge in a single 
location. Drive progress from anywhere.
to 
a 
video, 
Canvas App Basics
Canvas App Basics 
With the force.com Canvas SDK, 
you can now integrate your Web 
app with the trusted salesforce.com 
platform: Your language, your code 
- Salesforce
Canvas App Basics 
Setup -> App Setup -> Create -> Apps -> Connected App -> New Button 
Enable 
Publisher, Feed, and 
VF page access 
During Prototype 
Allow 
Full access 
Enable 
oAuth 
Enable 
Canvas 
Enable 
Signed Request
Canvas App Basics 
Setup -> App Setup -> Create -> Apps -> Global Actions -> Actions -> New Action Button 
Choose 
Custom Canvas
Canvas App Basics 
Setup -> App Setup -> Create -> Apps -> Global Actions -> Publisher Layouts -> Edit Action 
Drag new action 
to Publisher Actions
Canvas App Basics 
New canvas app action is 
now 
available Chatter
Canvas App Basics 
iFrame of the canvas app 
in the publisher 
iFrame of the canvas app 
in the feed
to 
a 
video, 
Heroku Basics
Heroku Basics 
Heroku 
is a cloud platform as a service 
supporting several programming 
languages. Heroku was acquired by 
Salesforce.com in 2010.
Heroku Basics 
Heroku 
With Heroku, Developers may now deploy 
distributed and scalable code in minutes.
Heroku Basics 
Terminology 
- Procfiles - named commands that you may want executed. 
- Applications - consist of your source code, a description of any dependencies, 
and a Procfile. 
- Slug - is an application bundle of your source, fetched dependencies, the language 
runtime, and compiled/generated output of the build system - ready for execution. 
- Buildpacks - lie behind the slug compilation process. Buildpacks take your 
application, its dependencies, and the language runtime, and produce slugs. 
- Dynos - are isolated, virtualized Unix containers, that provide the environment 
required to run an application.
Heroku Basics 
As of May 2014, Heroku now offers an official PHP buildpack which supports: 
Packaging via Composer 
First class frameworks 
- Symfony 
- Laravel 
Heroku XL Support 
PHP 5.5 Support 
HHVM/HACK 3.2 Support 
NGINX Support 
Apache Support
Heroku Basics 
Enabling HHVM + NGINX 
Available procfiles 
heroku-hhvm-apache2 
heroku-hhvm-nginx 
heroku-php-apache2 
heroku-php-nginx 
Procfile example for nginx+hhvm 
$ echo 'web: vendor/bin/heroku-hhvm-nginx' > Procfile
to 
a 
video, 
Time To Code!
Time To Code! 
Sample App 1 
Hello World of Heroku
Time To Code! 
Hello World on heroku 
echo '<?php echo "Hello World!"; ?>' > index.php 
echo '{}' > composer.json 
git init 
git add . 
git commit -m "Initial import of Hello Heroku" 
heroku create 
git push heroku master 
heroku open 
http://taa.io/df14/app1/
Time To Code! 
Hello World 1.1 on heroku (with HHVM/NGINX support) 
This enables HHVM/HACK on heroku! 
echo '<?php phpinfo();' > index.php 
echo '{"require": {"php": "*","hhvm": ">= 3.1"}}' > composer.json 
echo 'web: vendor/bin/heroku-hhvm-nginx' > Procfile 
git init 
git add . 
git commit -m "Initial import of Hello Heroku" 
heroku create 
git push heroku master 
heroku open 
http://taa.io/df14/app1/
Time To Code! 
Hello World 1.1 
Let’s try it in the terminal 
http://taa.io/df14/app1/
Time To Code! 
Sample App 2 
Parse Force.com signed requests 
Proper Folder Structure
Time To Code! 
Parsing Force.com signed requests 
PHP/Hack on Heroku 
Signed 
Request 
Force.com 
Signed Request 
http://taa.io/df14/app2/
Time To Code! 
Parsing Signed request from Force.com 
// lifted from https://github.com/joshbirk/Canvas-PHP Canvas via SignedRequest/POST, the authentication should be passed via the signed_request header 
$signedRequest = @$_REQUEST['signed_request']; 
$consumer_secret = @$_ENV['consumer_secret']; 
if ($signedRequest == null || $consumer_secret == null) { 
echo "Error: Signed Request or Consumer Secret not found"; 
exit; 
} 
//decode the signedRequest 
$sep = strpos($signedRequest, '.'); 
$encodedSig = substr($signedRequest, 0, $sep); 
$encodedEnv = substr($signedRequest, $sep + 1); 
$calcedSig = base64_encode(hash_hmac("sha256", $encodedEnv, $consumer_secret, true)); 
if ($calcedSig != $encodedSig) { 
echo "Error: Signed Request Failed. Is the app in Canvas?"; 
exit; 
} 
//decode the signedRequest 
$sep = strpos($signedRequest, '.'); 
$encodedSig = substr($signedRequest, 0, $sep); 
$encodedEnv = substr($signedRequest, $sep + 1); 
//decode the signed request object 
$req = json_decode(base64_decode($encodedEnv)); 
//As of Spring '13: SignedRequest has a client object which holds the pertinent authentication info 
$access_token = $req->client->oauthToken; 
$instance_url = $req->client->instanceUrl; 
$_SFDC_REQ = $req; 
error_log(json_encode($_SFDC_REQ)); 
$location = @$req->context->environment->displayLocation; 
http://taa.io/df14/app2/
Time To Code! 
Integrating with Force.com signed requests 
- Using composer for package management 
- Configure NGINX via Procfile 
- Proper folder structure and router 
- Parse Force.com signed requests 
Folder Structure 
Public —static files (i.e. js/css files) 
Handlers — i.e. controllers’ish 
canvas — a handler for a canvas app 
Views — presentation layer (mustache templates) 
Webroot — entry point for web request 
Nginx.conf — custom config for nginx 
Procfile — custom config to enable nginx + hhvm 
http://taa.io/df14/app2/
Time To Code! 
- A few local dev gotchas 
- Localhost mock for heroku's $_ENV config 
- config.ini + parse_ini_file() 
if (php_sapi_name() == 'cli-server') { 
$ini_array = @parse_ini_file(__DIR__."/../config.ini"); 
foreach($ini_array as $key => $value){ 
$_ENV[$key] = $value; 
} 
} 
http://taa.io/df14/app2/
Time To Code! 
- A few local dev gotchas 
- https://localhost/ 
- NodeJS + NPM to the rescue 
var fs = require('fs'); 
var http = require(‘http'), httpProxy = require(‘http-proxy'); 
httpProxy.createServer({ 
target: { 
host: 'localhost', 
port: 80 
}, 
ssl: { 
key: fs.readFileSync('keys/server.key', 'utf8'), 
cert: fs.readFileSync('keys/server.crt', 'utf8') 
} 
}).listen(443); 
http://taa.io/df14/app2/
Time To Code! 
Sample App 2 
See it in Action 
http://taa.io/df14/app2/
Time To Code! 
Sample App 2 
http://taa.io/df14/app2/
Time To Code! 
Sample App 3 
Let’s build something…A Babel Fish* 
* Thanks Douglas Adams
Time To Code! 
Let’s build something…A Babel Fish 
Three parts to the Babel Fish chatter app 
- Publisher 
- Text Input 
- Feed Item 
- Dynamic translation 
- Integration with 3rd party api 
- Google Translate API 
* bonus: VisualForce integration with a Canvas App
Time To Code! 
Sample App 3 (A Babel Fish) 
See it in Action
Time To Code! 
Sample App 3 (A Babel Fish) 
Words into the 
babel fish 
Auto Translated into 
native language
Sample App 3 
(A Babel Fish on a Visual Force Page) 
Time To Code! 
Subject of the Case 
Auto Translated into 
native language
Sample App 3 (A Babel Fish) 
Want an installable AppExchange version? 
http://taa.io/df14/translator/ 
Time To Code!
Time To Code! 
Sample App 4 
Let’s build something…Voice Memo 
(Chrome and Firefox only)
Time To Code! 
Let’s build something…Voice Memos 
Three parts to the VoiceMemo chatter app 
- Publisher 
- HTML5 Audio Input 
- Feed Item 
- Audio Playback 
- Integration with 3rd party persistence layer (S3) 
- CDN playback
Time To Code! 
Sample App 4 (Voice Memo) 
See it in Action
Time To Code! 
Sample App 4 (Voice Memo) 
Record the Voice memo 
with HTML5 only 
(Chrome/Firefox only) 
Audio Playback 
in the feed
Sample App 4 (Voice Memo) 
Want an installable AppExchange version?* 
*? 
http://taa.io/df14/voicememo/ 
*No commercial support 
Time To Code!
Rodney White 
Rodney White 
@rodney_white 
rodney@taa.io 
Want the framework? 
http://taa.io/df14/
Rapid Prototyping Chatter with a PHP/Hack Canvas App on Heroku

More Related Content

What's hot

Composer - The missing package manager for PHP
Composer - The missing package manager for PHPComposer - The missing package manager for PHP
Composer - The missing package manager for PHP
Tareq Hasan
 
Ant vs Phing
Ant vs PhingAnt vs Phing
Ant vs Phing
Manuel Baldassarri
 
Dependency Management with Composer
Dependency Management with ComposerDependency Management with Composer
Dependency Management with Composer
Jordi Boggiano
 
Vagrant move over, here is Docker
Vagrant move over, here is DockerVagrant move over, here is Docker
Vagrant move over, here is Docker
Nick Belhomme
 
Plack perl superglue for web frameworks and servers
Plack perl superglue for web frameworks and serversPlack perl superglue for web frameworks and servers
Plack perl superglue for web frameworks and serversTatsuhiko Miyagawa
 
Composer
ComposerComposer
Phing: Building with PHP
Phing: Building with PHPPhing: Building with PHP
Phing: Building with PHP
hozn
 
MongoDB World 2018: Tutorial - Got Dibs? Building a Real-Time Bidding App wit...
MongoDB World 2018: Tutorial - Got Dibs? Building a Real-Time Bidding App wit...MongoDB World 2018: Tutorial - Got Dibs? Building a Real-Time Bidding App wit...
MongoDB World 2018: Tutorial - Got Dibs? Building a Real-Time Bidding App wit...
MongoDB
 
Dockerfiles building docker images automatically v (workdir, env, add, and ...
Dockerfiles   building docker images automatically v (workdir, env, add, and ...Dockerfiles   building docker images automatically v (workdir, env, add, and ...
Dockerfiles building docker images automatically v (workdir, env, add, and ...
ansonjonel
 
Composer for Busy Developers - php|tek13
Composer for Busy Developers - php|tek13Composer for Busy Developers - php|tek13
Composer for Busy Developers - php|tek13Rafael Dohms
 
Modern Perl for the Unfrozen Paleolithic Perl Programmer
Modern Perl for the Unfrozen Paleolithic  Perl ProgrammerModern Perl for the Unfrozen Paleolithic  Perl Programmer
Modern Perl for the Unfrozen Paleolithic Perl Programmer
John Anderson
 
How to Submit a plugin to WordPress.org Repository
How to Submit a plugin to WordPress.org RepositoryHow to Submit a plugin to WordPress.org Repository
How to Submit a plugin to WordPress.org Repository
Tareq Hasan
 
Choosing the Right Framework for Running Docker Containers in Prod
Choosing the Right Framework for Running Docker Containers in ProdChoosing the Right Framework for Running Docker Containers in Prod
Choosing the Right Framework for Running Docker Containers in Prod
Josh Padnick
 
Distributing UI Libraries: in a post Web-Component world
Distributing UI Libraries: in a post Web-Component worldDistributing UI Libraries: in a post Web-Component world
Distributing UI Libraries: in a post Web-Component world
Rachael L Moore
 
Composer for Magento 1.x and Magento 2
Composer for Magento 1.x and Magento 2Composer for Magento 1.x and Magento 2
Composer for Magento 1.x and Magento 2
Sergii Shymko
 
Deploying PHP applications with Phing
Deploying PHP applications with PhingDeploying PHP applications with Phing
Deploying PHP applications with Phing
Michiel Rook
 
Practical PHP Deployment with Jenkins
Practical PHP Deployment with JenkinsPractical PHP Deployment with Jenkins
Practical PHP Deployment with Jenkins
Adam Culp
 
Grand Rapids PHP Meetup: Behavioral Driven Development with Behat
Grand Rapids PHP Meetup: Behavioral Driven Development with BehatGrand Rapids PHP Meetup: Behavioral Driven Development with Behat
Grand Rapids PHP Meetup: Behavioral Driven Development with Behat
Ryan Weaver
 
Modern Web Application Development Workflow - web2day 2014
Modern Web Application Development Workflow - web2day 2014Modern Web Application Development Workflow - web2day 2014
Modern Web Application Development Workflow - web2day 2014
Stéphane Bégaudeau
 
PHP Dependency Management with Composer
PHP Dependency Management with ComposerPHP Dependency Management with Composer
PHP Dependency Management with Composer
Adam Englander
 

What's hot (20)

Composer - The missing package manager for PHP
Composer - The missing package manager for PHPComposer - The missing package manager for PHP
Composer - The missing package manager for PHP
 
Ant vs Phing
Ant vs PhingAnt vs Phing
Ant vs Phing
 
Dependency Management with Composer
Dependency Management with ComposerDependency Management with Composer
Dependency Management with Composer
 
Vagrant move over, here is Docker
Vagrant move over, here is DockerVagrant move over, here is Docker
Vagrant move over, here is Docker
 
Plack perl superglue for web frameworks and servers
Plack perl superglue for web frameworks and serversPlack perl superglue for web frameworks and servers
Plack perl superglue for web frameworks and servers
 
Composer
ComposerComposer
Composer
 
Phing: Building with PHP
Phing: Building with PHPPhing: Building with PHP
Phing: Building with PHP
 
MongoDB World 2018: Tutorial - Got Dibs? Building a Real-Time Bidding App wit...
MongoDB World 2018: Tutorial - Got Dibs? Building a Real-Time Bidding App wit...MongoDB World 2018: Tutorial - Got Dibs? Building a Real-Time Bidding App wit...
MongoDB World 2018: Tutorial - Got Dibs? Building a Real-Time Bidding App wit...
 
Dockerfiles building docker images automatically v (workdir, env, add, and ...
Dockerfiles   building docker images automatically v (workdir, env, add, and ...Dockerfiles   building docker images automatically v (workdir, env, add, and ...
Dockerfiles building docker images automatically v (workdir, env, add, and ...
 
Composer for Busy Developers - php|tek13
Composer for Busy Developers - php|tek13Composer for Busy Developers - php|tek13
Composer for Busy Developers - php|tek13
 
Modern Perl for the Unfrozen Paleolithic Perl Programmer
Modern Perl for the Unfrozen Paleolithic  Perl ProgrammerModern Perl for the Unfrozen Paleolithic  Perl Programmer
Modern Perl for the Unfrozen Paleolithic Perl Programmer
 
How to Submit a plugin to WordPress.org Repository
How to Submit a plugin to WordPress.org RepositoryHow to Submit a plugin to WordPress.org Repository
How to Submit a plugin to WordPress.org Repository
 
Choosing the Right Framework for Running Docker Containers in Prod
Choosing the Right Framework for Running Docker Containers in ProdChoosing the Right Framework for Running Docker Containers in Prod
Choosing the Right Framework for Running Docker Containers in Prod
 
Distributing UI Libraries: in a post Web-Component world
Distributing UI Libraries: in a post Web-Component worldDistributing UI Libraries: in a post Web-Component world
Distributing UI Libraries: in a post Web-Component world
 
Composer for Magento 1.x and Magento 2
Composer for Magento 1.x and Magento 2Composer for Magento 1.x and Magento 2
Composer for Magento 1.x and Magento 2
 
Deploying PHP applications with Phing
Deploying PHP applications with PhingDeploying PHP applications with Phing
Deploying PHP applications with Phing
 
Practical PHP Deployment with Jenkins
Practical PHP Deployment with JenkinsPractical PHP Deployment with Jenkins
Practical PHP Deployment with Jenkins
 
Grand Rapids PHP Meetup: Behavioral Driven Development with Behat
Grand Rapids PHP Meetup: Behavioral Driven Development with BehatGrand Rapids PHP Meetup: Behavioral Driven Development with Behat
Grand Rapids PHP Meetup: Behavioral Driven Development with Behat
 
Modern Web Application Development Workflow - web2day 2014
Modern Web Application Development Workflow - web2day 2014Modern Web Application Development Workflow - web2day 2014
Modern Web Application Development Workflow - web2day 2014
 
PHP Dependency Management with Composer
PHP Dependency Management with ComposerPHP Dependency Management with Composer
PHP Dependency Management with Composer
 

Similar to Rapid Prototyping Chatter with a PHP/Hack Canvas App on Heroku

Tutorial 1: Your First Science App - Araport Developer Workshop
Tutorial 1: Your First Science App - Araport Developer WorkshopTutorial 1: Your First Science App - Araport Developer Workshop
Tutorial 1: Your First Science App - Araport Developer Workshop
Vivek Krishnakumar
 
Software Quality Assurance Tooling - Wintersession 2024
Software Quality Assurance Tooling - Wintersession 2024Software Quality Assurance Tooling - Wintersession 2024
Software Quality Assurance Tooling - Wintersession 2024
Henry Schreiner
 
Scaleable PHP Applications in Kubernetes
Scaleable PHP Applications in KubernetesScaleable PHP Applications in Kubernetes
Scaleable PHP Applications in Kubernetes
Robert Lemke
 
Phonegap android angualr material design
Phonegap android angualr material designPhonegap android angualr material design
Phonegap android angualr material design
Srinadh Kanugala
 
Unleash your Symfony projects with eZ Platform
Unleash your Symfony projects with eZ PlatformUnleash your Symfony projects with eZ Platform
Unleash your Symfony projects with eZ Platform
Sébastien Morel
 
Fullstack workshop
Fullstack workshopFullstack workshop
Fullstack workshop
Assaf Gannon
 
Developing FirefoxOS
Developing FirefoxOSDeveloping FirefoxOS
Developing FirefoxOS
Fred Lin
 
Flutter festival gdsc juet guna
Flutter festival   gdsc juet gunaFlutter festival   gdsc juet guna
Flutter festival gdsc juet guna
SachinVerma869778
 
Adobe AIR. NativeProcess. FFMPEG. Awesome.
Adobe AIR. NativeProcess. FFMPEG. Awesome.Adobe AIR. NativeProcess. FFMPEG. Awesome.
Adobe AIR. NativeProcess. FFMPEG. Awesome.
Joseph Labrecque
 
Developing applications with Hyperledger Fabric SDK
Developing applications with Hyperledger Fabric SDKDeveloping applications with Hyperledger Fabric SDK
Developing applications with Hyperledger Fabric SDK
Horea Porutiu
 
LVPHP.org
LVPHP.orgLVPHP.org
LVPHP.org
Joshua Copeland
 
DevOPS training - Day 1/2
DevOPS training - Day 1/2DevOPS training - Day 1/2
DevOPS training - Day 1/2
Vincent Mercier
 
GoogleDSC_ GHRCE_ flutter_firebase.pptx
GoogleDSC_ GHRCE_  flutter_firebase.pptxGoogleDSC_ GHRCE_  flutter_firebase.pptx
GoogleDSC_ GHRCE_ flutter_firebase.pptx
GoogleDeveloperStude22
 
Comment améliorer le quotidien des Développeurs PHP ?
Comment améliorer le quotidien des Développeurs PHP ?Comment améliorer le quotidien des Développeurs PHP ?
Comment améliorer le quotidien des Développeurs PHP ?
AFUP_Limoges
 
Docker for developers on mac and windows
Docker for developers on mac and windowsDocker for developers on mac and windows
Docker for developers on mac and windows
Docker, Inc.
 
Getting Started with Adobe AIR 1.5
Getting Started with Adobe AIR 1.5Getting Started with Adobe AIR 1.5
Getting Started with Adobe AIR 1.5
Elad Elrom
 
flutterbootcamp
flutterbootcampflutterbootcamp
flutterbootcamp
RakshaAgrawal21
 
flutter_bootcamp_MUGDSC_Presentation.pptx
flutter_bootcamp_MUGDSC_Presentation.pptxflutter_bootcamp_MUGDSC_Presentation.pptx
flutter_bootcamp_MUGDSC_Presentation.pptx
RakshaAgrawal21
 
Adopt DevOps philosophy on your Symfony projects (Symfony Live 2011)
Adopt DevOps philosophy on your Symfony projects (Symfony Live 2011)Adopt DevOps philosophy on your Symfony projects (Symfony Live 2011)
Adopt DevOps philosophy on your Symfony projects (Symfony Live 2011)
Fabrice Bernhard
 
The Modern Developer Toolbox
The Modern Developer ToolboxThe Modern Developer Toolbox
The Modern Developer Toolbox
Pablo Godel
 

Similar to Rapid Prototyping Chatter with a PHP/Hack Canvas App on Heroku (20)

Tutorial 1: Your First Science App - Araport Developer Workshop
Tutorial 1: Your First Science App - Araport Developer WorkshopTutorial 1: Your First Science App - Araport Developer Workshop
Tutorial 1: Your First Science App - Araport Developer Workshop
 
Software Quality Assurance Tooling - Wintersession 2024
Software Quality Assurance Tooling - Wintersession 2024Software Quality Assurance Tooling - Wintersession 2024
Software Quality Assurance Tooling - Wintersession 2024
 
Scaleable PHP Applications in Kubernetes
Scaleable PHP Applications in KubernetesScaleable PHP Applications in Kubernetes
Scaleable PHP Applications in Kubernetes
 
Phonegap android angualr material design
Phonegap android angualr material designPhonegap android angualr material design
Phonegap android angualr material design
 
Unleash your Symfony projects with eZ Platform
Unleash your Symfony projects with eZ PlatformUnleash your Symfony projects with eZ Platform
Unleash your Symfony projects with eZ Platform
 
Fullstack workshop
Fullstack workshopFullstack workshop
Fullstack workshop
 
Developing FirefoxOS
Developing FirefoxOSDeveloping FirefoxOS
Developing FirefoxOS
 
Flutter festival gdsc juet guna
Flutter festival   gdsc juet gunaFlutter festival   gdsc juet guna
Flutter festival gdsc juet guna
 
Adobe AIR. NativeProcess. FFMPEG. Awesome.
Adobe AIR. NativeProcess. FFMPEG. Awesome.Adobe AIR. NativeProcess. FFMPEG. Awesome.
Adobe AIR. NativeProcess. FFMPEG. Awesome.
 
Developing applications with Hyperledger Fabric SDK
Developing applications with Hyperledger Fabric SDKDeveloping applications with Hyperledger Fabric SDK
Developing applications with Hyperledger Fabric SDK
 
LVPHP.org
LVPHP.orgLVPHP.org
LVPHP.org
 
DevOPS training - Day 1/2
DevOPS training - Day 1/2DevOPS training - Day 1/2
DevOPS training - Day 1/2
 
GoogleDSC_ GHRCE_ flutter_firebase.pptx
GoogleDSC_ GHRCE_  flutter_firebase.pptxGoogleDSC_ GHRCE_  flutter_firebase.pptx
GoogleDSC_ GHRCE_ flutter_firebase.pptx
 
Comment améliorer le quotidien des Développeurs PHP ?
Comment améliorer le quotidien des Développeurs PHP ?Comment améliorer le quotidien des Développeurs PHP ?
Comment améliorer le quotidien des Développeurs PHP ?
 
Docker for developers on mac and windows
Docker for developers on mac and windowsDocker for developers on mac and windows
Docker for developers on mac and windows
 
Getting Started with Adobe AIR 1.5
Getting Started with Adobe AIR 1.5Getting Started with Adobe AIR 1.5
Getting Started with Adobe AIR 1.5
 
flutterbootcamp
flutterbootcampflutterbootcamp
flutterbootcamp
 
flutter_bootcamp_MUGDSC_Presentation.pptx
flutter_bootcamp_MUGDSC_Presentation.pptxflutter_bootcamp_MUGDSC_Presentation.pptx
flutter_bootcamp_MUGDSC_Presentation.pptx
 
Adopt DevOps philosophy on your Symfony projects (Symfony Live 2011)
Adopt DevOps philosophy on your Symfony projects (Symfony Live 2011)Adopt DevOps philosophy on your Symfony projects (Symfony Live 2011)
Adopt DevOps philosophy on your Symfony projects (Symfony Live 2011)
 
The Modern Developer Toolbox
The Modern Developer ToolboxThe Modern Developer Toolbox
The Modern Developer Toolbox
 

More from Salesforce Developers

Sample Gallery: Reference Code and Best Practices for Salesforce Developers
Sample Gallery: Reference Code and Best Practices for Salesforce DevelopersSample Gallery: Reference Code and Best Practices for Salesforce Developers
Sample Gallery: Reference Code and Best Practices for Salesforce Developers
Salesforce Developers
 
Maximizing Salesforce Lightning Experience and Lightning Component Performance
Maximizing Salesforce Lightning Experience and Lightning Component PerformanceMaximizing Salesforce Lightning Experience and Lightning Component Performance
Maximizing Salesforce Lightning Experience and Lightning Component Performance
Salesforce Developers
 
Local development with Open Source Base Components
Local development with Open Source Base ComponentsLocal development with Open Source Base Components
Local development with Open Source Base Components
Salesforce Developers
 
TrailheaDX India : Developer Highlights
TrailheaDX India : Developer HighlightsTrailheaDX India : Developer Highlights
TrailheaDX India : Developer Highlights
Salesforce Developers
 
Why developers shouldn’t miss TrailheaDX India
Why developers shouldn’t miss TrailheaDX IndiaWhy developers shouldn’t miss TrailheaDX India
Why developers shouldn’t miss TrailheaDX India
Salesforce Developers
 
CodeLive: Build Lightning Web Components faster with Local Development
CodeLive: Build Lightning Web Components faster with Local DevelopmentCodeLive: Build Lightning Web Components faster with Local Development
CodeLive: Build Lightning Web Components faster with Local Development
Salesforce Developers
 
CodeLive: Converting Aura Components to Lightning Web Components
CodeLive: Converting Aura Components to Lightning Web ComponentsCodeLive: Converting Aura Components to Lightning Web Components
CodeLive: Converting Aura Components to Lightning Web Components
Salesforce Developers
 
Enterprise-grade UI with open source Lightning Web Components
Enterprise-grade UI with open source Lightning Web ComponentsEnterprise-grade UI with open source Lightning Web Components
Enterprise-grade UI with open source Lightning Web Components
Salesforce Developers
 
TrailheaDX and Summer '19: Developer Highlights
TrailheaDX and Summer '19: Developer HighlightsTrailheaDX and Summer '19: Developer Highlights
TrailheaDX and Summer '19: Developer Highlights
Salesforce Developers
 
Live coding with LWC
Live coding with LWCLive coding with LWC
Live coding with LWC
Salesforce Developers
 
Lightning web components - Episode 4 : Security and Testing
Lightning web components  - Episode 4 : Security and TestingLightning web components  - Episode 4 : Security and Testing
Lightning web components - Episode 4 : Security and Testing
Salesforce Developers
 
LWC Episode 3- Component Communication and Aura Interoperability
LWC Episode 3- Component Communication and Aura InteroperabilityLWC Episode 3- Component Communication and Aura Interoperability
LWC Episode 3- Component Communication and Aura Interoperability
Salesforce Developers
 
Lightning web components episode 2- work with salesforce data
Lightning web components   episode 2- work with salesforce dataLightning web components   episode 2- work with salesforce data
Lightning web components episode 2- work with salesforce data
Salesforce Developers
 
Lightning web components - Episode 1 - An Introduction
Lightning web components - Episode 1 - An IntroductionLightning web components - Episode 1 - An Introduction
Lightning web components - Episode 1 - An Introduction
Salesforce Developers
 
Migrating CPQ to Advanced Calculator and JSQCP
Migrating CPQ to Advanced Calculator and JSQCPMigrating CPQ to Advanced Calculator and JSQCP
Migrating CPQ to Advanced Calculator and JSQCP
Salesforce Developers
 
Scale with Large Data Volumes and Big Objects in Salesforce
Scale with Large Data Volumes and Big Objects in SalesforceScale with Large Data Volumes and Big Objects in Salesforce
Scale with Large Data Volumes and Big Objects in Salesforce
Salesforce Developers
 
Replicate Salesforce Data in Real Time with Change Data Capture
Replicate Salesforce Data in Real Time with Change Data CaptureReplicate Salesforce Data in Real Time with Change Data Capture
Replicate Salesforce Data in Real Time with Change Data Capture
Salesforce Developers
 
Modern Development with Salesforce DX
Modern Development with Salesforce DXModern Development with Salesforce DX
Modern Development with Salesforce DX
Salesforce Developers
 
Get Into Lightning Flow Development
Get Into Lightning Flow DevelopmentGet Into Lightning Flow Development
Get Into Lightning Flow Development
Salesforce Developers
 
Integrate CMS Content Into Lightning Communities with CMS Connect
Integrate CMS Content Into Lightning Communities with CMS ConnectIntegrate CMS Content Into Lightning Communities with CMS Connect
Integrate CMS Content Into Lightning Communities with CMS Connect
Salesforce Developers
 

More from Salesforce Developers (20)

Sample Gallery: Reference Code and Best Practices for Salesforce Developers
Sample Gallery: Reference Code and Best Practices for Salesforce DevelopersSample Gallery: Reference Code and Best Practices for Salesforce Developers
Sample Gallery: Reference Code and Best Practices for Salesforce Developers
 
Maximizing Salesforce Lightning Experience and Lightning Component Performance
Maximizing Salesforce Lightning Experience and Lightning Component PerformanceMaximizing Salesforce Lightning Experience and Lightning Component Performance
Maximizing Salesforce Lightning Experience and Lightning Component Performance
 
Local development with Open Source Base Components
Local development with Open Source Base ComponentsLocal development with Open Source Base Components
Local development with Open Source Base Components
 
TrailheaDX India : Developer Highlights
TrailheaDX India : Developer HighlightsTrailheaDX India : Developer Highlights
TrailheaDX India : Developer Highlights
 
Why developers shouldn’t miss TrailheaDX India
Why developers shouldn’t miss TrailheaDX IndiaWhy developers shouldn’t miss TrailheaDX India
Why developers shouldn’t miss TrailheaDX India
 
CodeLive: Build Lightning Web Components faster with Local Development
CodeLive: Build Lightning Web Components faster with Local DevelopmentCodeLive: Build Lightning Web Components faster with Local Development
CodeLive: Build Lightning Web Components faster with Local Development
 
CodeLive: Converting Aura Components to Lightning Web Components
CodeLive: Converting Aura Components to Lightning Web ComponentsCodeLive: Converting Aura Components to Lightning Web Components
CodeLive: Converting Aura Components to Lightning Web Components
 
Enterprise-grade UI with open source Lightning Web Components
Enterprise-grade UI with open source Lightning Web ComponentsEnterprise-grade UI with open source Lightning Web Components
Enterprise-grade UI with open source Lightning Web Components
 
TrailheaDX and Summer '19: Developer Highlights
TrailheaDX and Summer '19: Developer HighlightsTrailheaDX and Summer '19: Developer Highlights
TrailheaDX and Summer '19: Developer Highlights
 
Live coding with LWC
Live coding with LWCLive coding with LWC
Live coding with LWC
 
Lightning web components - Episode 4 : Security and Testing
Lightning web components  - Episode 4 : Security and TestingLightning web components  - Episode 4 : Security and Testing
Lightning web components - Episode 4 : Security and Testing
 
LWC Episode 3- Component Communication and Aura Interoperability
LWC Episode 3- Component Communication and Aura InteroperabilityLWC Episode 3- Component Communication and Aura Interoperability
LWC Episode 3- Component Communication and Aura Interoperability
 
Lightning web components episode 2- work with salesforce data
Lightning web components   episode 2- work with salesforce dataLightning web components   episode 2- work with salesforce data
Lightning web components episode 2- work with salesforce data
 
Lightning web components - Episode 1 - An Introduction
Lightning web components - Episode 1 - An IntroductionLightning web components - Episode 1 - An Introduction
Lightning web components - Episode 1 - An Introduction
 
Migrating CPQ to Advanced Calculator and JSQCP
Migrating CPQ to Advanced Calculator and JSQCPMigrating CPQ to Advanced Calculator and JSQCP
Migrating CPQ to Advanced Calculator and JSQCP
 
Scale with Large Data Volumes and Big Objects in Salesforce
Scale with Large Data Volumes and Big Objects in SalesforceScale with Large Data Volumes and Big Objects in Salesforce
Scale with Large Data Volumes and Big Objects in Salesforce
 
Replicate Salesforce Data in Real Time with Change Data Capture
Replicate Salesforce Data in Real Time with Change Data CaptureReplicate Salesforce Data in Real Time with Change Data Capture
Replicate Salesforce Data in Real Time with Change Data Capture
 
Modern Development with Salesforce DX
Modern Development with Salesforce DXModern Development with Salesforce DX
Modern Development with Salesforce DX
 
Get Into Lightning Flow Development
Get Into Lightning Flow DevelopmentGet Into Lightning Flow Development
Get Into Lightning Flow Development
 
Integrate CMS Content Into Lightning Communities with CMS Connect
Integrate CMS Content Into Lightning Communities with CMS ConnectIntegrate CMS Content Into Lightning Communities with CMS Connect
Integrate CMS Content Into Lightning Communities with CMS Connect
 

Recently uploaded

LF Energy Webinar: Electrical Grid Modelling and Simulation Through PowSyBl -...
LF Energy Webinar: Electrical Grid Modelling and Simulation Through PowSyBl -...LF Energy Webinar: Electrical Grid Modelling and Simulation Through PowSyBl -...
LF Energy Webinar: Electrical Grid Modelling and Simulation Through PowSyBl -...
DanBrown980551
 
Alt. GDG Cloud Southlake #33: Boule & Rebala: Effective AppSec in SDLC using ...
Alt. GDG Cloud Southlake #33: Boule & Rebala: Effective AppSec in SDLC using ...Alt. GDG Cloud Southlake #33: Boule & Rebala: Effective AppSec in SDLC using ...
Alt. GDG Cloud Southlake #33: Boule & Rebala: Effective AppSec in SDLC using ...
James Anderson
 
The Art of the Pitch: WordPress Relationships and Sales
The Art of the Pitch: WordPress Relationships and SalesThe Art of the Pitch: WordPress Relationships and Sales
The Art of the Pitch: WordPress Relationships and Sales
Laura Byrne
 
GridMate - End to end testing is a critical piece to ensure quality and avoid...
GridMate - End to end testing is a critical piece to ensure quality and avoid...GridMate - End to end testing is a critical piece to ensure quality and avoid...
GridMate - End to end testing is a critical piece to ensure quality and avoid...
ThomasParaiso2
 
PCI PIN Basics Webinar from the Controlcase Team
PCI PIN Basics Webinar from the Controlcase TeamPCI PIN Basics Webinar from the Controlcase Team
PCI PIN Basics Webinar from the Controlcase Team
ControlCase
 
GDG Cloud Southlake #33: Boule & Rebala: Effective AppSec in SDLC using Deplo...
GDG Cloud Southlake #33: Boule & Rebala: Effective AppSec in SDLC using Deplo...GDG Cloud Southlake #33: Boule & Rebala: Effective AppSec in SDLC using Deplo...
GDG Cloud Southlake #33: Boule & Rebala: Effective AppSec in SDLC using Deplo...
James Anderson
 
PHP Frameworks: I want to break free (IPC Berlin 2024)
PHP Frameworks: I want to break free (IPC Berlin 2024)PHP Frameworks: I want to break free (IPC Berlin 2024)
PHP Frameworks: I want to break free (IPC Berlin 2024)
Ralf Eggert
 
Transcript: Selling digital books in 2024: Insights from industry leaders - T...
Transcript: Selling digital books in 2024: Insights from industry leaders - T...Transcript: Selling digital books in 2024: Insights from industry leaders - T...
Transcript: Selling digital books in 2024: Insights from industry leaders - T...
BookNet Canada
 
Elizabeth Buie - Older adults: Are we really designing for our future selves?
Elizabeth Buie - Older adults: Are we really designing for our future selves?Elizabeth Buie - Older adults: Are we really designing for our future selves?
Elizabeth Buie - Older adults: Are we really designing for our future selves?
Nexer Digital
 
UiPath Test Automation using UiPath Test Suite series, part 5
UiPath Test Automation using UiPath Test Suite series, part 5UiPath Test Automation using UiPath Test Suite series, part 5
UiPath Test Automation using UiPath Test Suite series, part 5
DianaGray10
 
Epistemic Interaction - tuning interfaces to provide information for AI support
Epistemic Interaction - tuning interfaces to provide information for AI supportEpistemic Interaction - tuning interfaces to provide information for AI support
Epistemic Interaction - tuning interfaces to provide information for AI support
Alan Dix
 
The Future of Platform Engineering
The Future of Platform EngineeringThe Future of Platform Engineering
The Future of Platform Engineering
Jemma Hussein Allen
 
Observability Concepts EVERY Developer Should Know -- DeveloperWeek Europe.pdf
Observability Concepts EVERY Developer Should Know -- DeveloperWeek Europe.pdfObservability Concepts EVERY Developer Should Know -- DeveloperWeek Europe.pdf
Observability Concepts EVERY Developer Should Know -- DeveloperWeek Europe.pdf
Paige Cruz
 
FIDO Alliance Osaka Seminar: Passkeys and the Road Ahead.pdf
FIDO Alliance Osaka Seminar: Passkeys and the Road Ahead.pdfFIDO Alliance Osaka Seminar: Passkeys and the Road Ahead.pdf
FIDO Alliance Osaka Seminar: Passkeys and the Road Ahead.pdf
FIDO Alliance
 
Video Streaming: Then, Now, and in the Future
Video Streaming: Then, Now, and in the FutureVideo Streaming: Then, Now, and in the Future
Video Streaming: Then, Now, and in the Future
Alpen-Adria-Universität
 
DevOps and Testing slides at DASA Connect
DevOps and Testing slides at DASA ConnectDevOps and Testing slides at DASA Connect
DevOps and Testing slides at DASA Connect
Kari Kakkonen
 
Smart TV Buyer Insights Survey 2024 by 91mobiles.pdf
Smart TV Buyer Insights Survey 2024 by 91mobiles.pdfSmart TV Buyer Insights Survey 2024 by 91mobiles.pdf
Smart TV Buyer Insights Survey 2024 by 91mobiles.pdf
91mobiles
 
Microsoft - Power Platform_G.Aspiotis.pdf
Microsoft - Power Platform_G.Aspiotis.pdfMicrosoft - Power Platform_G.Aspiotis.pdf
Microsoft - Power Platform_G.Aspiotis.pdf
Uni Systems S.M.S.A.
 
State of ICS and IoT Cyber Threat Landscape Report 2024 preview
State of ICS and IoT Cyber Threat Landscape Report 2024 previewState of ICS and IoT Cyber Threat Landscape Report 2024 preview
State of ICS and IoT Cyber Threat Landscape Report 2024 preview
Prayukth K V
 
Generative AI Deep Dive: Advancing from Proof of Concept to Production
Generative AI Deep Dive: Advancing from Proof of Concept to ProductionGenerative AI Deep Dive: Advancing from Proof of Concept to Production
Generative AI Deep Dive: Advancing from Proof of Concept to Production
Aggregage
 

Recently uploaded (20)

LF Energy Webinar: Electrical Grid Modelling and Simulation Through PowSyBl -...
LF Energy Webinar: Electrical Grid Modelling and Simulation Through PowSyBl -...LF Energy Webinar: Electrical Grid Modelling and Simulation Through PowSyBl -...
LF Energy Webinar: Electrical Grid Modelling and Simulation Through PowSyBl -...
 
Alt. GDG Cloud Southlake #33: Boule & Rebala: Effective AppSec in SDLC using ...
Alt. GDG Cloud Southlake #33: Boule & Rebala: Effective AppSec in SDLC using ...Alt. GDG Cloud Southlake #33: Boule & Rebala: Effective AppSec in SDLC using ...
Alt. GDG Cloud Southlake #33: Boule & Rebala: Effective AppSec in SDLC using ...
 
The Art of the Pitch: WordPress Relationships and Sales
The Art of the Pitch: WordPress Relationships and SalesThe Art of the Pitch: WordPress Relationships and Sales
The Art of the Pitch: WordPress Relationships and Sales
 
GridMate - End to end testing is a critical piece to ensure quality and avoid...
GridMate - End to end testing is a critical piece to ensure quality and avoid...GridMate - End to end testing is a critical piece to ensure quality and avoid...
GridMate - End to end testing is a critical piece to ensure quality and avoid...
 
PCI PIN Basics Webinar from the Controlcase Team
PCI PIN Basics Webinar from the Controlcase TeamPCI PIN Basics Webinar from the Controlcase Team
PCI PIN Basics Webinar from the Controlcase Team
 
GDG Cloud Southlake #33: Boule & Rebala: Effective AppSec in SDLC using Deplo...
GDG Cloud Southlake #33: Boule & Rebala: Effective AppSec in SDLC using Deplo...GDG Cloud Southlake #33: Boule & Rebala: Effective AppSec in SDLC using Deplo...
GDG Cloud Southlake #33: Boule & Rebala: Effective AppSec in SDLC using Deplo...
 
PHP Frameworks: I want to break free (IPC Berlin 2024)
PHP Frameworks: I want to break free (IPC Berlin 2024)PHP Frameworks: I want to break free (IPC Berlin 2024)
PHP Frameworks: I want to break free (IPC Berlin 2024)
 
Transcript: Selling digital books in 2024: Insights from industry leaders - T...
Transcript: Selling digital books in 2024: Insights from industry leaders - T...Transcript: Selling digital books in 2024: Insights from industry leaders - T...
Transcript: Selling digital books in 2024: Insights from industry leaders - T...
 
Elizabeth Buie - Older adults: Are we really designing for our future selves?
Elizabeth Buie - Older adults: Are we really designing for our future selves?Elizabeth Buie - Older adults: Are we really designing for our future selves?
Elizabeth Buie - Older adults: Are we really designing for our future selves?
 
UiPath Test Automation using UiPath Test Suite series, part 5
UiPath Test Automation using UiPath Test Suite series, part 5UiPath Test Automation using UiPath Test Suite series, part 5
UiPath Test Automation using UiPath Test Suite series, part 5
 
Epistemic Interaction - tuning interfaces to provide information for AI support
Epistemic Interaction - tuning interfaces to provide information for AI supportEpistemic Interaction - tuning interfaces to provide information for AI support
Epistemic Interaction - tuning interfaces to provide information for AI support
 
The Future of Platform Engineering
The Future of Platform EngineeringThe Future of Platform Engineering
The Future of Platform Engineering
 
Observability Concepts EVERY Developer Should Know -- DeveloperWeek Europe.pdf
Observability Concepts EVERY Developer Should Know -- DeveloperWeek Europe.pdfObservability Concepts EVERY Developer Should Know -- DeveloperWeek Europe.pdf
Observability Concepts EVERY Developer Should Know -- DeveloperWeek Europe.pdf
 
FIDO Alliance Osaka Seminar: Passkeys and the Road Ahead.pdf
FIDO Alliance Osaka Seminar: Passkeys and the Road Ahead.pdfFIDO Alliance Osaka Seminar: Passkeys and the Road Ahead.pdf
FIDO Alliance Osaka Seminar: Passkeys and the Road Ahead.pdf
 
Video Streaming: Then, Now, and in the Future
Video Streaming: Then, Now, and in the FutureVideo Streaming: Then, Now, and in the Future
Video Streaming: Then, Now, and in the Future
 
DevOps and Testing slides at DASA Connect
DevOps and Testing slides at DASA ConnectDevOps and Testing slides at DASA Connect
DevOps and Testing slides at DASA Connect
 
Smart TV Buyer Insights Survey 2024 by 91mobiles.pdf
Smart TV Buyer Insights Survey 2024 by 91mobiles.pdfSmart TV Buyer Insights Survey 2024 by 91mobiles.pdf
Smart TV Buyer Insights Survey 2024 by 91mobiles.pdf
 
Microsoft - Power Platform_G.Aspiotis.pdf
Microsoft - Power Platform_G.Aspiotis.pdfMicrosoft - Power Platform_G.Aspiotis.pdf
Microsoft - Power Platform_G.Aspiotis.pdf
 
State of ICS and IoT Cyber Threat Landscape Report 2024 preview
State of ICS and IoT Cyber Threat Landscape Report 2024 previewState of ICS and IoT Cyber Threat Landscape Report 2024 preview
State of ICS and IoT Cyber Threat Landscape Report 2024 preview
 
Generative AI Deep Dive: Advancing from Proof of Concept to Production
Generative AI Deep Dive: Advancing from Proof of Concept to ProductionGenerative AI Deep Dive: Advancing from Proof of Concept to Production
Generative AI Deep Dive: Advancing from Proof of Concept to Production
 

Rapid Prototyping Chatter with a PHP/Hack Canvas App on Heroku

  • 1. Rapid Prototyping Chatter with a PHP/Hack Canvas App on Heroku Rodney White President, The Acceleration Agency @rodney_white
  • 2. The goal is to provide a process and framework to rapidly prototype Force.com Chatter Canvas apps within minutes, not days or months
  • 3. Agenda 1. Introduction 2. Rapid Prototyping Basics 3. Tech Basics 4. Time to code 5. Questions
  • 4. Rodney White Founder, The Acceleration Agency
  • 5. The Acceleration Agency leverages iterative philosophies and methodologies to innovate new products, platforms, and services. We are Designers. We are Makers. We are Learners.
  • 6. to a video, Rapid Prototyping Basics
  • 7. Rapid Prototyping Basics* Maximize the Rate of Learning by Minimizing the time to try ideas - Tom Chi Rule #1: Find the quickest path to the experience. Rule #2: Making is the best kind of thinking. Rule #3: Use materials that move at the speed of thought. Rule #4: Your user’s reality is the medium. Rule #5: Knowing is the enemy of learning. Rule #6: “The first draft of anything is shit.” - Ernest Hemingway * Some rules are courtesy of Tom Chi. Please watch: https://www.youtube.com/watch?v=DkyMCCnNI3Q to learn more
  • 8. Rapid Prototyping Basics* Rate based goals By the time you try 1 iteration -> 5% chance of success By the time you try 20 iterations -> 64% chance of success By the time you try 50 iterations -> 92% chance of success
  • 9. to a video, Chatter Basics
  • 10. Chatter Basics Publisher Chatter lets you create instant actions that are instantly mobile. For any business process. Expense reports, support cases, orders, and more. Customize actions for your company, and even integrate third party apps. So you can get more done in the feed from any device.
  • 11. Chatter Basics Feeds and Feed Items Do everything in the feed. Keep up with critical projects, topics, and teams. Work together on sales opportunities, service cases, and marketing campaigns. Capture organizational knowledge in a single location. Drive progress from anywhere.
  • 12. to a video, Canvas App Basics
  • 13. Canvas App Basics With the force.com Canvas SDK, you can now integrate your Web app with the trusted salesforce.com platform: Your language, your code - Salesforce
  • 14. Canvas App Basics Setup -> App Setup -> Create -> Apps -> Connected App -> New Button Enable Publisher, Feed, and VF page access During Prototype Allow Full access Enable oAuth Enable Canvas Enable Signed Request
  • 15. Canvas App Basics Setup -> App Setup -> Create -> Apps -> Global Actions -> Actions -> New Action Button Choose Custom Canvas
  • 16. Canvas App Basics Setup -> App Setup -> Create -> Apps -> Global Actions -> Publisher Layouts -> Edit Action Drag new action to Publisher Actions
  • 17. Canvas App Basics New canvas app action is now available Chatter
  • 18. Canvas App Basics iFrame of the canvas app in the publisher iFrame of the canvas app in the feed
  • 19. to a video, Heroku Basics
  • 20. Heroku Basics Heroku is a cloud platform as a service supporting several programming languages. Heroku was acquired by Salesforce.com in 2010.
  • 21. Heroku Basics Heroku With Heroku, Developers may now deploy distributed and scalable code in minutes.
  • 22. Heroku Basics Terminology - Procfiles - named commands that you may want executed. - Applications - consist of your source code, a description of any dependencies, and a Procfile. - Slug - is an application bundle of your source, fetched dependencies, the language runtime, and compiled/generated output of the build system - ready for execution. - Buildpacks - lie behind the slug compilation process. Buildpacks take your application, its dependencies, and the language runtime, and produce slugs. - Dynos - are isolated, virtualized Unix containers, that provide the environment required to run an application.
  • 23. Heroku Basics As of May 2014, Heroku now offers an official PHP buildpack which supports: Packaging via Composer First class frameworks - Symfony - Laravel Heroku XL Support PHP 5.5 Support HHVM/HACK 3.2 Support NGINX Support Apache Support
  • 24. Heroku Basics Enabling HHVM + NGINX Available procfiles heroku-hhvm-apache2 heroku-hhvm-nginx heroku-php-apache2 heroku-php-nginx Procfile example for nginx+hhvm $ echo 'web: vendor/bin/heroku-hhvm-nginx' > Procfile
  • 25. to a video, Time To Code!
  • 26. Time To Code! Sample App 1 Hello World of Heroku
  • 27. Time To Code! Hello World on heroku echo '<?php echo "Hello World!"; ?>' > index.php echo '{}' > composer.json git init git add . git commit -m "Initial import of Hello Heroku" heroku create git push heroku master heroku open http://taa.io/df14/app1/
  • 28. Time To Code! Hello World 1.1 on heroku (with HHVM/NGINX support) This enables HHVM/HACK on heroku! echo '<?php phpinfo();' > index.php echo '{"require": {"php": "*","hhvm": ">= 3.1"}}' > composer.json echo 'web: vendor/bin/heroku-hhvm-nginx' > Procfile git init git add . git commit -m "Initial import of Hello Heroku" heroku create git push heroku master heroku open http://taa.io/df14/app1/
  • 29. Time To Code! Hello World 1.1 Let’s try it in the terminal http://taa.io/df14/app1/
  • 30. Time To Code! Sample App 2 Parse Force.com signed requests Proper Folder Structure
  • 31. Time To Code! Parsing Force.com signed requests PHP/Hack on Heroku Signed Request Force.com Signed Request http://taa.io/df14/app2/
  • 32. Time To Code! Parsing Signed request from Force.com // lifted from https://github.com/joshbirk/Canvas-PHP Canvas via SignedRequest/POST, the authentication should be passed via the signed_request header $signedRequest = @$_REQUEST['signed_request']; $consumer_secret = @$_ENV['consumer_secret']; if ($signedRequest == null || $consumer_secret == null) { echo "Error: Signed Request or Consumer Secret not found"; exit; } //decode the signedRequest $sep = strpos($signedRequest, '.'); $encodedSig = substr($signedRequest, 0, $sep); $encodedEnv = substr($signedRequest, $sep + 1); $calcedSig = base64_encode(hash_hmac("sha256", $encodedEnv, $consumer_secret, true)); if ($calcedSig != $encodedSig) { echo "Error: Signed Request Failed. Is the app in Canvas?"; exit; } //decode the signedRequest $sep = strpos($signedRequest, '.'); $encodedSig = substr($signedRequest, 0, $sep); $encodedEnv = substr($signedRequest, $sep + 1); //decode the signed request object $req = json_decode(base64_decode($encodedEnv)); //As of Spring '13: SignedRequest has a client object which holds the pertinent authentication info $access_token = $req->client->oauthToken; $instance_url = $req->client->instanceUrl; $_SFDC_REQ = $req; error_log(json_encode($_SFDC_REQ)); $location = @$req->context->environment->displayLocation; http://taa.io/df14/app2/
  • 33. Time To Code! Integrating with Force.com signed requests - Using composer for package management - Configure NGINX via Procfile - Proper folder structure and router - Parse Force.com signed requests Folder Structure Public —static files (i.e. js/css files) Handlers — i.e. controllers’ish canvas — a handler for a canvas app Views — presentation layer (mustache templates) Webroot — entry point for web request Nginx.conf — custom config for nginx Procfile — custom config to enable nginx + hhvm http://taa.io/df14/app2/
  • 34. Time To Code! - A few local dev gotchas - Localhost mock for heroku's $_ENV config - config.ini + parse_ini_file() if (php_sapi_name() == 'cli-server') { $ini_array = @parse_ini_file(__DIR__."/../config.ini"); foreach($ini_array as $key => $value){ $_ENV[$key] = $value; } } http://taa.io/df14/app2/
  • 35. Time To Code! - A few local dev gotchas - https://localhost/ - NodeJS + NPM to the rescue var fs = require('fs'); var http = require(‘http'), httpProxy = require(‘http-proxy'); httpProxy.createServer({ target: { host: 'localhost', port: 80 }, ssl: { key: fs.readFileSync('keys/server.key', 'utf8'), cert: fs.readFileSync('keys/server.crt', 'utf8') } }).listen(443); http://taa.io/df14/app2/
  • 36. Time To Code! Sample App 2 See it in Action http://taa.io/df14/app2/
  • 37. Time To Code! Sample App 2 http://taa.io/df14/app2/
  • 38. Time To Code! Sample App 3 Let’s build something…A Babel Fish* * Thanks Douglas Adams
  • 39. Time To Code! Let’s build something…A Babel Fish Three parts to the Babel Fish chatter app - Publisher - Text Input - Feed Item - Dynamic translation - Integration with 3rd party api - Google Translate API * bonus: VisualForce integration with a Canvas App
  • 40. Time To Code! Sample App 3 (A Babel Fish) See it in Action
  • 41. Time To Code! Sample App 3 (A Babel Fish) Words into the babel fish Auto Translated into native language
  • 42. Sample App 3 (A Babel Fish on a Visual Force Page) Time To Code! Subject of the Case Auto Translated into native language
  • 43. Sample App 3 (A Babel Fish) Want an installable AppExchange version? http://taa.io/df14/translator/ Time To Code!
  • 44. Time To Code! Sample App 4 Let’s build something…Voice Memo (Chrome and Firefox only)
  • 45. Time To Code! Let’s build something…Voice Memos Three parts to the VoiceMemo chatter app - Publisher - HTML5 Audio Input - Feed Item - Audio Playback - Integration with 3rd party persistence layer (S3) - CDN playback
  • 46. Time To Code! Sample App 4 (Voice Memo) See it in Action
  • 47. Time To Code! Sample App 4 (Voice Memo) Record the Voice memo with HTML5 only (Chrome/Firefox only) Audio Playback in the feed
  • 48. Sample App 4 (Voice Memo) Want an installable AppExchange version?* *? http://taa.io/df14/voicememo/ *No commercial support Time To Code!
  • 49. Rodney White Rodney White @rodney_white rodney@taa.io Want the framework? http://taa.io/df14/