SlideShare a Scribd company logo
Noel De Martin, CTO
Awesome Tools
2017
Backend (server)
+
Mobile Apps
++
PHP + MySQL
Web Apps
HTML + JavaScript + CSSAndroid  Java / Kotlin
iOS  Swift / ObjectiveC
/
Traditional landscape
/
Backend (server)
+
++
Laravel + MongoDB
Web Apps
Vue + TypeScript + SassIonic
Modern landscape
Mobile Apps
SELECT associations2.object_id, associations2.term_id, associations2.cat_ID, associations2
FROM (SELECT objects_tags.object_id, objects_tags.term_id, wp_cb_tags2cats.cat_ID, categor
FROM (SELECT wp_term_relationships.object_id, wp_term_taxonomy.term_id, wp_term_taxono
FROM wp_term_relationships
LEFT JOIN wp_term_taxonomy ON wp_term_relationships.term_taxonomy_id = wp_term_tax
ORDER BY object_id ASC, term_id ASC)
AS objects_tags
LEFT JOIN wp_cb_tags2cats ON objects_tags.term_id = wp_cb_tags2cats.tag_ID
LEFT JOIN (SELECT wp_term_relationships.object_id, wp_term_taxonomy.term_id as cat_ID,
FROM wp_term_relationships
LEFT JOIN wp_term_taxonomy ON wp_term_relationships.term_taxonomy_id = wp_term_tax
WHERE wp_term_taxonomy.taxonomy = 'category'
GROUP BY object_id, cat_ID, term_taxonomy_id
ORDER BY object_id, cat_ID, term_taxonomy_id)
AS categories on wp_cb_tags2cats.cat_ID = categories.term_id
WHERE objects_tags.term_id = wp_cb_tags2cats.tag_ID
GROUP BY object_id, term_id, cat_ID, term_taxonomy_id
ORDER BY object_id ASC, term_id ASC, cat_ID ASC)
AS associations2
LEFT JOIN categories ON associations2.object_id = categories.object_id
WHERE associations2.cat_ID <> categories.cat_ID
GROUP BY object_id, term_id, cat_ID, term_taxonomy_id
ORDER BY object_id, term_id, cat_ID, term_taxonomy_id
Looks familiar?
Source: How to reduce a long SQL query based on CREATE VIEW? (Stackoverflow)
SELECT associations2.object_id, associations2.term_id, associations2.cat_ID, associations2
FROM (SELECT objects_tags.object_id, objects_tags.term_id, wp_cb_tags2cats.cat_ID, categor
FROM (SELECT wp_term_relationships.object_id, wp_term_taxonomy.term_id, wp_term_taxono
FROM wp_term_relationships
LEFT JOIN wp_term_taxonomy ON wp_term_relationships.term_taxonomy_id = wp_term_tax
ORDER BY object_id ASC, term_id ASC)
AS objects_tags
LEFT JOIN wp_cb_tags2cats ON objects_tags.term_id = wp_cb_tags2cats.tag_ID
LEFT JOIN (SELECT wp_term_relationships.object_id, wp_term_taxonomy.term_id as cat_ID,
FROM wp_term_relationships
LEFT JOIN wp_term_taxonomy ON wp_term_relationships.term_taxonomy_id = wp_term_tax
WHERE wp_term_taxonomy.taxonomy = 'category'
GROUP BY object_id, cat_ID, term_taxonomy_id
ORDER BY object_id, cat_ID, term_taxonomy_id)
AS categories on wp_cb_tags2cats.cat_ID = categories.term_id
WHERE objects_tags.term_id = wp_cb_tags2cats.tag_ID
GROUP BY object_id, term_id, cat_ID, term_taxonomy_id
ORDER BY object_id ASC, term_id ASC, cat_ID ASC)
AS associations2
LEFT JOIN categories ON associations2.object_id = categories.object_id
WHERE associations2.cat_ID <> categories.cat_ID
GROUP BY object_id, term_id, cat_ID, term_taxonomy_id
ORDER BY object_id, term_id, cat_ID, term_taxonomy_id
Looks familiar?
Source: How to reduce a long SQL query based on CREATE VIEW? (Stackoverflow)
Looks familiar?
id name email data
1 Ragnar Lodbrok lodbrok@mail.com
{"phone":"(297)-707-
8575","twitter":"foobar",
"instagram":"foobar"}
2 Björn Ironside bironside@mail.com
{"phone":"(297)-707-
8575","twitter":"foobar",
"instagram":"foobar"}
3 Lagertha lagertha@mail.com
{"phone":"(297)-707-
8575","twitter":"foobar",
"instagram":"foobar"}
Looks familiar?
id name email data
1 Ragnar Lodbrok lodbrok@mail.com
{"phone":"(297)-707-
8575","twitter":"foobar",
"instagram":"foobar"}
2 Björn Ironside bironside@mail.com
{"phone":"(297)-707-
8575","twitter":"foobar",
"instagram":"foobar"}
3 Lagertha lagertha@mail.com
{"phone":"(297)-707-
8575","twitter":"foobar",
"instagram":"foobar"}
Commonly done in order to:
- Handle inconsistent data
- Avoid modifying the schema
- …
Looks familiar?
id name email data
1 Ragnar Lodbrok lodbrok@mail.com
{"phone":"(297)-707-
8575","twitter":"foobar",
"instagram":"foobar"}
2 Björn Ironside bironside@mail.com
{"phone":"(297)-707-
8575","twitter":"foobar",
"instagram":"foobar"}
3 Lagertha lagertha@mail.com
{"phone":"(297)-707-
8575","twitter":"foobar",
"instagram":"foobar"}
Commonly done in order to:
- Handle inconsistent data
- Avoid modifying the schema
- …
MongoDB
to the rescue!!
SQL vs NoSQL
SQL NoSQL
Table Collection
Row Document
Column Field
SQL vs NoSQL
SQL NoSQL
Table Collection
Row Document
Column Field
TABLES COLLECTIONS
SQL vs NoSQL
SQL NoSQL
Table Collection
Row Document
Column Field
id name age phone_number
1 Chandler Bing 10 727-647-4415
2 Rachel Green 24 757-328-3857
ROWS DOCUMENTS
{
_id: ObjectId(‚507f19…‛)
name: ‚Chandler Bing‛,
age: 10,
phone_number: ‚727-647-4415‛
}
{
_id: ObjectId(‚2a2ed9…‛)
name: ‚Rachel Green‛,
age: 24,
phone_number: ‚757-328-3857‛
}
SQL vs NoSQL
COLUMNS FIELDS
SQL NoSQL
Table Collection
Row Document
Column Field
id name age phone_number twitter
1 Chandler Bing 10 727-647-4415 ChandleringBing
2 Rachel Green 24 757-328-3857 NULL
{
_id: ObjectId(‚507f19…‛)
name: ‚Chandler Bing‛,
age: 10,
phone_number: ‚727-647-4415‛,
twitter: ‚ChandleringBing‛
}
{
_id: ObjectId(‚2a2ed9…‛)
name: ‚Rachel Green‛,
age: 24,
phone_number: ‚757-328-3857‛
}
SQL vs NoSQL
COLUMNS FIELDS
SQL NoSQL
Table Collection
Row Document
Column Field
id name age phone_number twitter
1 Chandler Bing 10 727-647-4415 ChandleringBing
2 Rachel Green 24 757-328-3857 NULL
{
_id: ObjectId(‚507f19…‛)
name: ‚Chandler Bing‛,
age: 10,
contact: {
phone_number: ‚727-647-4415‛,
twitter: ‚ChandleringBing‛
}
}
{
_id: ObjectId(‚2a2ed9…‛)
name: ‚Rachel Green‛,
age: 24,
contact: {
phone_number: ‚757-328-3857‛
}
}
Design of a NoSQL database
{
_id: ObjectId(‚507f1f77…‛),
author_id: ObjectId(‚c19729d…‛),
title: ‚Weather condition‛,
body: ‚How’s the weather?‛
}
THREADS
{
_id: ObjectId(‚f77a8w…‛),
thread_id: ObjectId(‚507f1f77…‛),
author_id: ObjectId(‚29de86…‛),
text: ‚I think today is sunny‛
}
{
_id: ObjectId(‚2f98a0…‛),
thread_id: ObjectId(‚507f1f77…‛),
author_id: ObjectId(‚c19729d…‛),
text: ‚Me too‛
}
REPLIES
{
_id: ObjectId(‚29de86…‛),
name: ‚John Doe‛,
avatar_url: ‚http://...‛,
email: ‚thedoe@mail.com‛
}
{
_id: ObjectId(‚c19729d…‛),
name: ‚Jane Smith‛,
avatar_url: ‚http://...‛,
email: ‚iamjane@mail.com‛
}
USERS
Design of a NoSQL database
Embedding
{
_id: ObjectId(‚507f1f77…‛),
author_id: ObjectId(‚c19729d…‛),
title: ‚Weather condition‛,
body: ‚How’s the weather?‛,
replies: [
{
author_id: ObjectId(‚29de86…‛),
text: ‚I think today is sunny‛
},
{
author_id: ObjectId(‚c19729d…‛),
text: ‚Me too‛
}
]
}
THREADS
{
_id: ObjectId(‚29de86…‛),
name: ‚John Doe‛,
avatar_url: ‚http://...‛,
email: ‚thedoe@mail.com‛
}
{
_id: ObjectId(‚c19729d…‛),
name: ‚Jane Smith‛,
avatar_url: ‚http://...‛,
email: ‚iamjane@mail.com‛
}
USERS
Design of a NoSQL database
Denormalization
{
_id: ObjectId(‚507f1f77…‛),
author: {
id: ObjectId(‚c19729d…‛),
name: ‚Jane Smith‛,
avatar_url: ‚http://...‛
},
title: ‚Weather condition‛,
body: ‚How’s the weather?‛,
replies: [
{
author: {
id: ObjectId(‚29de86…‛),
name: ‚John Doe‛,
avatar_url: ‚http://...‛
},
text: ‚I think today is sunny‛
},
…
]
}
{
_id: ObjectId(‚29de86…‛),
name: ‚John Doe‛,
avatar_url: ‚http://...‛,
email: ‚thedoe@mail.com‛
}
{
_id: ObjectId(‚c19729d…‛),
name: ‚Jane Smith‛,
avatar_url: ‚http://...‛,
email: ‚iamjane@mail.com‛
}
THREADS
USERS
Design of a NoSQL database
“When designing data models, always consider
the application usage of the data as well as the
inherent structure of the data itself.”
- MongoDB manual
Design of a NoSQL database
• Duplication can be the right choice.
• Favour few collections over many.
• Data doesn’t have to be structured.
“When designing data models, always consider
the application usage of the data as well as the
inherent structure of the data itself.”
- MongoDB manual
Advantages
• Flexible schema
• Speed
• Scaling
Advantages Disadvantages
• Flexible schema
• Speed
• Scaling
• Flexible schema
• Memory in disk
• Data integrity
(application-side
validation)
Learn more
• Official Website
• Recommended reads:
• Thinking in Documents
• 6 Rules of Thumb for MongoDB Schema Design
• Free online course: Data Wrangling with MongoDB
• MongoDB Source Code
Welcome to Laravel
PHP framework using Model-View-Controller Design Pattern
Model View Controller
Application
Data Layer
Application
Logic
User
Interface
MODEL VIEWCONTROLLER
Model – Eloquent ORM
Implementation of Active Record pattern
$user = User::find(2);
$user->name;
$user->email;
$user->update([
'email' => 'new@mail.com'
]);
$user->delete();
User::create([
'name' => 'Bill Finger',
'email' => 'finger@mail.com'
]);
id name email
1 Bob Kane kane@mail.com
2 Jerry Robinson robinson@mail.com
3 Bill Finger finger@mail.com
DATABASE (SQL)
CODE (PHP)
Model – Eloquent ORM
Implementation of Active Record pattern
$user = User::find('f4c7b2…');
$user->name;
$user->email;
$user->update([
'email' => 'new@mail.com'
]);
$user->delete();
User::create([
'name' => 'Bill Finger',
'email' => 'finger@mail.com'
]);
DATABASE (NoSQL)
CODE (PHP){
_id: ObjectId(‚d294b8…‛),
name: ‚Bob Kane‛,
email: ‚kane@mail.com‛
}
{
_id: ObjectId(‚f4c7b2…‛),
name: ‚Jerry Robinson‛,
email: ‚robinson@mail.com‛
}
{
_id: ObjectId(‚1fb215…‛),
name: ‚Bill Finger‛,
email: ‚finger@mail.com‛
}
Model – Eloquent ORM
Convention over configuration
<?php
use IlluminateDatabaseEloquentModel;
class Post extends Model {
public function author() {
return $this->belongsTo(User::class);
}
public function comments() {
return $this->hasMany(Comment::class);
}
}
DATABASE
CODE
Model – Query Builder
$users = DB::table('users')
->join('contacts', 'users.id', '=', 'contacts.user_id')
->join('orders', 'users.id', '=', 'orders.user_id')
->select('users.*', 'contacts.phone', 'orders.price')
->get();
$usersCount = DB::table('users')->count();
$usersByStatus = DB::table('users')
->select(DB::raw('count(*) as user_count, status'))
->where('status', '<>', 1)
->groupBy('status')
->get();
COUNT
GROUP BY
JOIN
ETC…
Controller - Routing
Route::get('hello', function () {
return 'Hello World';
});
GET mywebsite.com/hello
Controller - Routing
GET mywebsite.com/user/3
Route::get('user/{id}', 'UsersController@show');
class UsersController {
public function show($id) {
return User::find($id);
}
}
Controller - Routing
POST mywebsite.com/login
Route::post('login', 'HomeController@login');
class UsersController {
public function login() {
$credentials = [
'email' => request('email'),
'password' => request('password')
];
if (Auth::attempt($credentials))
return redirect('/home');
}
}
View - Blade
@if (auth()->check())
{!! Form::open(['url' => '/login']) !!}
{!! Form::text('email'); !!}
{!! Form::password('password'); !!}
{!! Form::submit('Login'); !!}
{!! Form::close() !!}
@else
<div class="container">
Hello, {{ auth()->user()->name }}.
</div>
@endif
<div class="container">
Hello, Bill Finger.
</div>
<form action="/login">
<input type="text" name="email">
<input type="password" name="password">
<input type="submit" value="Login">
</form>
If the user isn’t logged in
If the user is logged in
Laravel Blade can be thought
as a superset of php when
rendering views.
Out of the box with Laravel
Authentication Mailing Testing
Form
Validation
Command
Line Tools
Sessions
Database
Migrations
Task
Scheduling
And more…
We just
got started…
Learn more
• Official Website
• Laracasts (video tutorials)
• MongoDB integration with Laravel
• Laravel Source Code
TypeScript
to the rescue!!
What can Typescript do for you?
• Javascript superset.
• Compiles into Javascript.
• Compatible in all browsers.
• Provides the following:
• Classes
• Interfaces
• Typings
• File imports
• …
Example
class Car{
public run() {
console.log('I am a running car!');
}
}
let car = new Car();
car.run();
function createCar() {
return {
run: function() {
console.log('I am a running car!');
}
};
}
var car = createCar();
car.run();
JAVASCRIPT
TYPESCRIPT
Example
abstract class Vehicle {
abstract public run(): void;
}
class Car extends Vehicle {
public run() {
console.log('I am a running car!');
}
}
let car = new Car();
car.run();
TYPESCRIPT
Example
export default abstract class Vehicle {
abstract public run(): void;
}
Vehicle.ts
import Vehicle from './Vehicle.ts';
export default class Car extends Vehicle {
public run() {
console.log('I am a running car!');
}
}
import Car from './Car';
let car = new Car();
car.run();
Car.ts
index.ts
Example
index.js
Made by
Learn more
• Official Website
• Recommended Text Editor: Visual Studio Code
• TypeScript Source Code
Too basic, no structure
Too basic, no structure
Too complex,
steep learning curve
Structured
Incremental
Awesome
Vue approach to UI
JavaScript
DOM
(HTML)
Render
User Input (Events)
Hello world!
<div id="app">
{{ message }}
</div>
<script>
new Vue({
el: '#app',
data: {
message: 'Hello Vue!'
}
})
</script>
SOURCE BROWSER
Reactivity
<div id="app">
<input v-model="message"/>
<p>{{ message }}</p>
</div>
<script>
new Vue({
el: '#app',
data: {
message: 'Hello Vue!'
}
})
</script>
SOURCE BROWSER
Loops
<div id="app">
<input v-model="message"/>
<p>{{ message }}</p>
<ul>
<li v-for="item in items">
{{ item }}
</li>
</ul>
</div>
<script>
new Vue({
el: '#app',
data: {
message: 'Hello Vue!',
items: [
'Vue',
'is',
'awesome!'
]
}
})
</script>
SOURCE BROWSER
Components
SOURCE BROWSER
<div id="app">
<input v-model="message"/>
<p>{{ message }}</p>
<items-list></items-list>
</div>
<script>
Vue.component('items-list', {
template: `
<ul>
<li v-for="item in items">
{{ item }}
</li>
</ul>
`,
data() {
return {
items: [ 'Vue', 'is', 'awesome!' ]
};
}
});
new Vue({
el: '#app',
data: {
message: 'Hello Vue!‘
}
})
</script>
Learn more
• Official Website
• Interactive Examples
• Recommended Introductory Video
• Free Online Course: Learn Vue 2 Step By Step
• VueJS Source Code
Sass
to the rescue!!
What can Sass do for you?
• CSS superset.
• Compiles into CSS.
• Compatible in all browsers.
• Provides the following:
• Variables
• Functions
• Nesting
• Loops
• Conditionals
• File imports
• …
SASS
Example
$font-stack: Helvetica, sans-serif;
$primary-color: #333;
body {
font: 100% $font-stack;
color: $primary-color;
}
nav {
ul {
margin: 0;
padding: 0;
list-style: none;
}
li { display: inline-block; }
a {
display: block;
padding: 6px 12px;
text-decoration: none;
}
}
body {
font: 100% Helvetica, sans-serif;
color: #333;
}
nav ul {
margin: 0;
padding: 0;
list-style: none;
}
nav li {
display: inline-block;
}
nav a {
display: block;
padding: 6px 12px;
text-decoration: none;
}
CSS
Learn more
• Official Website
• Sass Source Code
Ionic foundations
+
HTML  Mobile
Javascript++
Hybrid Mobile Applications
What can Ionic do for you?
• Develop once, deploy everywhere
• Ready made components
• Implement native functionality when necessary
Develop once, deploy everywhere
ANDROID IOS
Same source code
Ready made components
Buttons FABs Tabs
Action Sheets Menus Modals
Toolbars Loaders And more…
Native functionality
Via Cordova Plugins
• Code written once per platform, Javascript interface
• Huge collection of available plugins:
• Camera
• GPS
• Push Notifications
• Bluetooth
• NFC
• …
• Program your own!
Learn more
• Official Website
• Components Interactive Documentation
• Ionic Source Code
Wrapping
Up
You also need to know…
Package managers
• npmjs.com
• Repository for node
(Javascript) libraries
• 400.000+ packages
• packagist.org
• Repository for php
libraries
• 140.000+ packages
You also need to know…
Open source
Timeline
2006
2009
2011
2012
2013
2014
Timeline
2006
2009
2011
2012
2013
2014
1996
1995
1995
1995
1984
2014
2011
Programming is Thinking,
not Typing.
- Casey Patton
Questions
Time
noel@geemba.com
@NoelDeMartin

More Related Content

What's hot

JSON-LD: JSON for the Social Web
JSON-LD: JSON for the Social WebJSON-LD: JSON for the Social Web
JSON-LD: JSON for the Social Web
Gregg Kellogg
 
Sharding with MongoDB -- MongoNYC 2012
Sharding with MongoDB -- MongoNYC 2012Sharding with MongoDB -- MongoNYC 2012
Sharding with MongoDB -- MongoNYC 2012
Tyler Brock
 
Liferay Search: Best Practices to Dramatically Improve Relevance - Liferay Sy...
Liferay Search: Best Practices to Dramatically Improve Relevance - Liferay Sy...Liferay Search: Best Practices to Dramatically Improve Relevance - Liferay Sy...
Liferay Search: Best Practices to Dramatically Improve Relevance - Liferay Sy...
André Ricardo Barreto de Oliveira
 
Heroku Waza 2013 Lessons Learned
Heroku Waza 2013 Lessons LearnedHeroku Waza 2013 Lessons Learned
Heroku Waza 2013 Lessons Learned
Simon Bagreev
 
MongoDB World 2019: How to Keep an Average API Response Time Less than 5ms wi...
MongoDB World 2019: How to Keep an Average API Response Time Less than 5ms wi...MongoDB World 2019: How to Keep an Average API Response Time Less than 5ms wi...
MongoDB World 2019: How to Keep an Average API Response Time Less than 5ms wi...
MongoDB
 
Advanced MongoDB Aggregation Pipelines
Advanced MongoDB Aggregation PipelinesAdvanced MongoDB Aggregation Pipelines
Advanced MongoDB Aggregation Pipelines
Tom Schreiber
 
Harnessing The Power of Search - Liferay DEVCON 2015, Darmstadt, Germany
Harnessing The Power of Search - Liferay DEVCON 2015, Darmstadt, GermanyHarnessing The Power of Search - Liferay DEVCON 2015, Darmstadt, Germany
Harnessing The Power of Search - Liferay DEVCON 2015, Darmstadt, Germany
André Ricardo Barreto de Oliveira
 
Faster and better search results with Elasticsearch
Faster and better search results with ElasticsearchFaster and better search results with Elasticsearch
Faster and better search results with Elasticsearch
Enrico Polesel
 
JSON-LD Update
JSON-LD UpdateJSON-LD Update
JSON-LD Update
Gregg Kellogg
 
SEOgadget Links API Extension for Excel - Mozcon 2012
SEOgadget Links API Extension for Excel - Mozcon 2012SEOgadget Links API Extension for Excel - Mozcon 2012
SEOgadget Links API Extension for Excel - Mozcon 2012
removed_0c0b4c2772c06b1f9e8a61187e1dfa9f
 
Introduction to Elasticsearch
Introduction to ElasticsearchIntroduction to Elasticsearch
Introduction to Elasticsearch
Luiz Messias
 
A Semantic Description Language for RESTful Data Services to Combat Semaphobia
A Semantic Description Language for RESTful Data Services to Combat SemaphobiaA Semantic Description Language for RESTful Data Services to Combat Semaphobia
A Semantic Description Language for RESTful Data Services to Combat Semaphobia
Markus Lanthaler
 
Semantic Optimization with Structured Data - SMX Munich
Semantic Optimization with Structured Data - SMX MunichSemantic Optimization with Structured Data - SMX Munich
Semantic Optimization with Structured Data - SMX Munich
Craig Bradford
 
03. ElasticSearch : Data In, Data Out
03. ElasticSearch : Data In, Data Out03. ElasticSearch : Data In, Data Out
03. ElasticSearch : Data In, Data Out
OpenThink Labs
 
Google Dorks
Google DorksGoogle Dorks
Google Dorks
Andrea D'Ubaldo
 
01 ElasticSearch : Getting Started
01 ElasticSearch : Getting Started01 ElasticSearch : Getting Started
01 ElasticSearch : Getting Started
OpenThink Labs
 
Aligning Web Services with the Semantic Web to Create a Global Read-Write Gra...
Aligning Web Services with the Semantic Web to Create a Global Read-Write Gra...Aligning Web Services with the Semantic Web to Create a Global Read-Write Gra...
Aligning Web Services with the Semantic Web to Create a Global Read-Write Gra...
Markus Lanthaler
 
HarryPotterDatabase
HarryPotterDatabaseHarryPotterDatabase
HarryPotterDatabase
Charles Harrill
 

What's hot (18)

JSON-LD: JSON for the Social Web
JSON-LD: JSON for the Social WebJSON-LD: JSON for the Social Web
JSON-LD: JSON for the Social Web
 
Sharding with MongoDB -- MongoNYC 2012
Sharding with MongoDB -- MongoNYC 2012Sharding with MongoDB -- MongoNYC 2012
Sharding with MongoDB -- MongoNYC 2012
 
Liferay Search: Best Practices to Dramatically Improve Relevance - Liferay Sy...
Liferay Search: Best Practices to Dramatically Improve Relevance - Liferay Sy...Liferay Search: Best Practices to Dramatically Improve Relevance - Liferay Sy...
Liferay Search: Best Practices to Dramatically Improve Relevance - Liferay Sy...
 
Heroku Waza 2013 Lessons Learned
Heroku Waza 2013 Lessons LearnedHeroku Waza 2013 Lessons Learned
Heroku Waza 2013 Lessons Learned
 
MongoDB World 2019: How to Keep an Average API Response Time Less than 5ms wi...
MongoDB World 2019: How to Keep an Average API Response Time Less than 5ms wi...MongoDB World 2019: How to Keep an Average API Response Time Less than 5ms wi...
MongoDB World 2019: How to Keep an Average API Response Time Less than 5ms wi...
 
Advanced MongoDB Aggregation Pipelines
Advanced MongoDB Aggregation PipelinesAdvanced MongoDB Aggregation Pipelines
Advanced MongoDB Aggregation Pipelines
 
Harnessing The Power of Search - Liferay DEVCON 2015, Darmstadt, Germany
Harnessing The Power of Search - Liferay DEVCON 2015, Darmstadt, GermanyHarnessing The Power of Search - Liferay DEVCON 2015, Darmstadt, Germany
Harnessing The Power of Search - Liferay DEVCON 2015, Darmstadt, Germany
 
Faster and better search results with Elasticsearch
Faster and better search results with ElasticsearchFaster and better search results with Elasticsearch
Faster and better search results with Elasticsearch
 
JSON-LD Update
JSON-LD UpdateJSON-LD Update
JSON-LD Update
 
SEOgadget Links API Extension for Excel - Mozcon 2012
SEOgadget Links API Extension for Excel - Mozcon 2012SEOgadget Links API Extension for Excel - Mozcon 2012
SEOgadget Links API Extension for Excel - Mozcon 2012
 
Introduction to Elasticsearch
Introduction to ElasticsearchIntroduction to Elasticsearch
Introduction to Elasticsearch
 
A Semantic Description Language for RESTful Data Services to Combat Semaphobia
A Semantic Description Language for RESTful Data Services to Combat SemaphobiaA Semantic Description Language for RESTful Data Services to Combat Semaphobia
A Semantic Description Language for RESTful Data Services to Combat Semaphobia
 
Semantic Optimization with Structured Data - SMX Munich
Semantic Optimization with Structured Data - SMX MunichSemantic Optimization with Structured Data - SMX Munich
Semantic Optimization with Structured Data - SMX Munich
 
03. ElasticSearch : Data In, Data Out
03. ElasticSearch : Data In, Data Out03. ElasticSearch : Data In, Data Out
03. ElasticSearch : Data In, Data Out
 
Google Dorks
Google DorksGoogle Dorks
Google Dorks
 
01 ElasticSearch : Getting Started
01 ElasticSearch : Getting Started01 ElasticSearch : Getting Started
01 ElasticSearch : Getting Started
 
Aligning Web Services with the Semantic Web to Create a Global Read-Write Gra...
Aligning Web Services with the Semantic Web to Create a Global Read-Write Gra...Aligning Web Services with the Semantic Web to Create a Global Read-Write Gra...
Aligning Web Services with the Semantic Web to Create a Global Read-Write Gra...
 
HarryPotterDatabase
HarryPotterDatabaseHarryPotterDatabase
HarryPotterDatabase
 

Similar to Awesome Tools 2017

Back to Basics Webinar 3: Schema Design Thinking in Documents
 Back to Basics Webinar 3: Schema Design Thinking in Documents Back to Basics Webinar 3: Schema Design Thinking in Documents
Back to Basics Webinar 3: Schema Design Thinking in Documents
MongoDB
 
Back to Basics Webinar 3 - Thinking in Documents
Back to Basics Webinar 3 - Thinking in DocumentsBack to Basics Webinar 3 - Thinking in Documents
Back to Basics Webinar 3 - Thinking in Documents
Joe Drumgoole
 
How to use Schema to enrich search results and improve your CTR - Andrew Mart...
How to use Schema to enrich search results and improve your CTR - Andrew Mart...How to use Schema to enrich search results and improve your CTR - Andrew Mart...
How to use Schema to enrich search results and improve your CTR - Andrew Mart...
SearchNorwich
 
Schema Design with MongoDB
Schema Design with MongoDBSchema Design with MongoDB
Schema Design with MongoDB
rogerbodamer
 
Intro to MongoDB and datamodeling
Intro to MongoDB and datamodeling Intro to MongoDB and datamodeling
Intro to MongoDB and datamodeling
rogerbodamer
 
Introduction to MongoDB
Introduction to MongoDBIntroduction to MongoDB
Introduction to MongoDB
MongoDB
 
MongoDB .local Chicago 2019: Best Practices for Working with IoT and Time-ser...
MongoDB .local Chicago 2019: Best Practices for Working with IoT and Time-ser...MongoDB .local Chicago 2019: Best Practices for Working with IoT and Time-ser...
MongoDB .local Chicago 2019: Best Practices for Working with IoT and Time-ser...
MongoDB
 
Managing Social Content with MongoDB
Managing Social Content with MongoDBManaging Social Content with MongoDB
Managing Social Content with MongoDB
MongoDB
 
MongoDB Europe 2016 - ETL for Pros – Getting Data Into MongoDB The Right Way
MongoDB Europe 2016 - ETL for Pros – Getting Data Into MongoDB The Right WayMongoDB Europe 2016 - ETL for Pros – Getting Data Into MongoDB The Right Way
MongoDB Europe 2016 - ETL for Pros – Getting Data Into MongoDB The Right Way
MongoDB
 
MongoDB, PHP and the cloud - php cloud summit 2011
MongoDB, PHP and the cloud - php cloud summit 2011MongoDB, PHP and the cloud - php cloud summit 2011
MongoDB, PHP and the cloud - php cloud summit 2011
Steven Francia
 
MongoDB SoCal 2020: Best Practices for Working with IoT and Time-series Data
MongoDB SoCal 2020: Best Practices for Working with IoT and Time-series DataMongoDB SoCal 2020: Best Practices for Working with IoT and Time-series Data
MongoDB SoCal 2020: Best Practices for Working with IoT and Time-series Data
MongoDB
 
Webinar: General Technical Overview of MongoDB for Dev Teams
Webinar: General Technical Overview of MongoDB for Dev TeamsWebinar: General Technical Overview of MongoDB for Dev Teams
Webinar: General Technical Overview of MongoDB for Dev Teams
MongoDB
 
MongoDB With Style
MongoDB With StyleMongoDB With Style
MongoDB With Style
Gabriele Lana
 
MongoDB .local Munich 2019: Best Practices for Working with IoT and Time-seri...
MongoDB .local Munich 2019: Best Practices for Working with IoT and Time-seri...MongoDB .local Munich 2019: Best Practices for Working with IoT and Time-seri...
MongoDB .local Munich 2019: Best Practices for Working with IoT and Time-seri...
MongoDB
 
ETL for Pros: Getting Data Into MongoDB
ETL for Pros: Getting Data Into MongoDBETL for Pros: Getting Data Into MongoDB
ETL for Pros: Getting Data Into MongoDB
MongoDB
 
San Francisco Java User Group
San Francisco Java User GroupSan Francisco Java User Group
San Francisco Java User Group
kchodorow
 
Using Mongoid with Ruby on Rails
Using Mongoid with Ruby on RailsUsing Mongoid with Ruby on Rails
Using Mongoid with Ruby on Rails
Nicholas Altobelli
 
Baton rouge - sql vs no sql and azure data factory
Baton rouge - sql vs no sql and azure data factoryBaton rouge - sql vs no sql and azure data factory
Baton rouge - sql vs no sql and azure data factory
Diponkar Paul
 
SQL vs. NoSQL and Moving data by Azure Data Factory
SQL vs. NoSQL and Moving data by Azure Data FactorySQL vs. NoSQL and Moving data by Azure Data Factory
SQL vs. NoSQL and Moving data by Azure Data Factory
Diponkar Paul
 
Building Apps with MongoDB
Building Apps with MongoDBBuilding Apps with MongoDB
Building Apps with MongoDB
Nate Abele
 

Similar to Awesome Tools 2017 (20)

Back to Basics Webinar 3: Schema Design Thinking in Documents
 Back to Basics Webinar 3: Schema Design Thinking in Documents Back to Basics Webinar 3: Schema Design Thinking in Documents
Back to Basics Webinar 3: Schema Design Thinking in Documents
 
Back to Basics Webinar 3 - Thinking in Documents
Back to Basics Webinar 3 - Thinking in DocumentsBack to Basics Webinar 3 - Thinking in Documents
Back to Basics Webinar 3 - Thinking in Documents
 
How to use Schema to enrich search results and improve your CTR - Andrew Mart...
How to use Schema to enrich search results and improve your CTR - Andrew Mart...How to use Schema to enrich search results and improve your CTR - Andrew Mart...
How to use Schema to enrich search results and improve your CTR - Andrew Mart...
 
Schema Design with MongoDB
Schema Design with MongoDBSchema Design with MongoDB
Schema Design with MongoDB
 
Intro to MongoDB and datamodeling
Intro to MongoDB and datamodeling Intro to MongoDB and datamodeling
Intro to MongoDB and datamodeling
 
Introduction to MongoDB
Introduction to MongoDBIntroduction to MongoDB
Introduction to MongoDB
 
MongoDB .local Chicago 2019: Best Practices for Working with IoT and Time-ser...
MongoDB .local Chicago 2019: Best Practices for Working with IoT and Time-ser...MongoDB .local Chicago 2019: Best Practices for Working with IoT and Time-ser...
MongoDB .local Chicago 2019: Best Practices for Working with IoT and Time-ser...
 
Managing Social Content with MongoDB
Managing Social Content with MongoDBManaging Social Content with MongoDB
Managing Social Content with MongoDB
 
MongoDB Europe 2016 - ETL for Pros – Getting Data Into MongoDB The Right Way
MongoDB Europe 2016 - ETL for Pros – Getting Data Into MongoDB The Right WayMongoDB Europe 2016 - ETL for Pros – Getting Data Into MongoDB The Right Way
MongoDB Europe 2016 - ETL for Pros – Getting Data Into MongoDB The Right Way
 
MongoDB, PHP and the cloud - php cloud summit 2011
MongoDB, PHP and the cloud - php cloud summit 2011MongoDB, PHP and the cloud - php cloud summit 2011
MongoDB, PHP and the cloud - php cloud summit 2011
 
MongoDB SoCal 2020: Best Practices for Working with IoT and Time-series Data
MongoDB SoCal 2020: Best Practices for Working with IoT and Time-series DataMongoDB SoCal 2020: Best Practices for Working with IoT and Time-series Data
MongoDB SoCal 2020: Best Practices for Working with IoT and Time-series Data
 
Webinar: General Technical Overview of MongoDB for Dev Teams
Webinar: General Technical Overview of MongoDB for Dev TeamsWebinar: General Technical Overview of MongoDB for Dev Teams
Webinar: General Technical Overview of MongoDB for Dev Teams
 
MongoDB With Style
MongoDB With StyleMongoDB With Style
MongoDB With Style
 
MongoDB .local Munich 2019: Best Practices for Working with IoT and Time-seri...
MongoDB .local Munich 2019: Best Practices for Working with IoT and Time-seri...MongoDB .local Munich 2019: Best Practices for Working with IoT and Time-seri...
MongoDB .local Munich 2019: Best Practices for Working with IoT and Time-seri...
 
ETL for Pros: Getting Data Into MongoDB
ETL for Pros: Getting Data Into MongoDBETL for Pros: Getting Data Into MongoDB
ETL for Pros: Getting Data Into MongoDB
 
San Francisco Java User Group
San Francisco Java User GroupSan Francisco Java User Group
San Francisco Java User Group
 
Using Mongoid with Ruby on Rails
Using Mongoid with Ruby on RailsUsing Mongoid with Ruby on Rails
Using Mongoid with Ruby on Rails
 
Baton rouge - sql vs no sql and azure data factory
Baton rouge - sql vs no sql and azure data factoryBaton rouge - sql vs no sql and azure data factory
Baton rouge - sql vs no sql and azure data factory
 
SQL vs. NoSQL and Moving data by Azure Data Factory
SQL vs. NoSQL and Moving data by Azure Data FactorySQL vs. NoSQL and Moving data by Azure Data Factory
SQL vs. NoSQL and Moving data by Azure Data Factory
 
Building Apps with MongoDB
Building Apps with MongoDBBuilding Apps with MongoDB
Building Apps with MongoDB
 

Recently uploaded

Casting-Defect-inSlab continuous casting.pdf
Casting-Defect-inSlab continuous casting.pdfCasting-Defect-inSlab continuous casting.pdf
Casting-Defect-inSlab continuous casting.pdf
zubairahmad848137
 
Literature Review Basics and Understanding Reference Management.pptx
Literature Review Basics and Understanding Reference Management.pptxLiterature Review Basics and Understanding Reference Management.pptx
Literature Review Basics and Understanding Reference Management.pptx
Dr Ramhari Poudyal
 
哪里办理(csu毕业证书)查尔斯特大学毕业证硕士学历原版一模一样
哪里办理(csu毕业证书)查尔斯特大学毕业证硕士学历原版一模一样哪里办理(csu毕业证书)查尔斯特大学毕业证硕士学历原版一模一样
哪里办理(csu毕业证书)查尔斯特大学毕业证硕士学历原版一模一样
insn4465
 
ML Based Model for NIDS MSc Updated Presentation.v2.pptx
ML Based Model for NIDS MSc Updated Presentation.v2.pptxML Based Model for NIDS MSc Updated Presentation.v2.pptx
ML Based Model for NIDS MSc Updated Presentation.v2.pptx
JamalHussainArman
 
Understanding Inductive Bias in Machine Learning
Understanding Inductive Bias in Machine LearningUnderstanding Inductive Bias in Machine Learning
Understanding Inductive Bias in Machine Learning
SUTEJAS
 
Manufacturing Process of molasses based distillery ppt.pptx
Manufacturing Process of molasses based distillery ppt.pptxManufacturing Process of molasses based distillery ppt.pptx
Manufacturing Process of molasses based distillery ppt.pptx
Madan Karki
 
132/33KV substation case study Presentation
132/33KV substation case study Presentation132/33KV substation case study Presentation
132/33KV substation case study Presentation
kandramariana6
 
Modelagem de um CSTR com reação endotermica.pdf
Modelagem de um CSTR com reação endotermica.pdfModelagem de um CSTR com reação endotermica.pdf
Modelagem de um CSTR com reação endotermica.pdf
camseq
 
Textile Chemical Processing and Dyeing.pdf
Textile Chemical Processing and Dyeing.pdfTextile Chemical Processing and Dyeing.pdf
Textile Chemical Processing and Dyeing.pdf
NazakatAliKhoso2
 
basic-wireline-operations-course-mahmoud-f-radwan.pdf
basic-wireline-operations-course-mahmoud-f-radwan.pdfbasic-wireline-operations-course-mahmoud-f-radwan.pdf
basic-wireline-operations-course-mahmoud-f-radwan.pdf
NidhalKahouli2
 
Iron and Steel Technology Roadmap - Towards more sustainable steelmaking.pdf
Iron and Steel Technology Roadmap - Towards more sustainable steelmaking.pdfIron and Steel Technology Roadmap - Towards more sustainable steelmaking.pdf
Iron and Steel Technology Roadmap - Towards more sustainable steelmaking.pdf
RadiNasr
 
Properties Railway Sleepers and Test.pptx
Properties Railway Sleepers and Test.pptxProperties Railway Sleepers and Test.pptx
Properties Railway Sleepers and Test.pptx
MDSABBIROJJAMANPAYEL
 
A SYSTEMATIC RISK ASSESSMENT APPROACH FOR SECURING THE SMART IRRIGATION SYSTEMS
A SYSTEMATIC RISK ASSESSMENT APPROACH FOR SECURING THE SMART IRRIGATION SYSTEMSA SYSTEMATIC RISK ASSESSMENT APPROACH FOR SECURING THE SMART IRRIGATION SYSTEMS
A SYSTEMATIC RISK ASSESSMENT APPROACH FOR SECURING THE SMART IRRIGATION SYSTEMS
IJNSA Journal
 
官方认证美国密歇根州立大学毕业证学位证书原版一模一样
官方认证美国密歇根州立大学毕业证学位证书原版一模一样官方认证美国密歇根州立大学毕业证学位证书原版一模一样
官方认证美国密歇根州立大学毕业证学位证书原版一模一样
171ticu
 
学校原版美国波士顿大学毕业证学历学位证书原版一模一样
学校原版美国波士顿大学毕业证学历学位证书原版一模一样学校原版美国波士顿大学毕业证学历学位证书原版一模一样
学校原版美国波士顿大学毕业证学历学位证书原版一模一样
171ticu
 
CSM Cloud Service Management Presentarion
CSM Cloud Service Management PresentarionCSM Cloud Service Management Presentarion
CSM Cloud Service Management Presentarion
rpskprasana
 
Recycled Concrete Aggregate in Construction Part III
Recycled Concrete Aggregate in Construction Part IIIRecycled Concrete Aggregate in Construction Part III
Recycled Concrete Aggregate in Construction Part III
Aditya Rajan Patra
 
ISPM 15 Heat Treated Wood Stamps and why your shipping must have one
ISPM 15 Heat Treated Wood Stamps and why your shipping must have oneISPM 15 Heat Treated Wood Stamps and why your shipping must have one
ISPM 15 Heat Treated Wood Stamps and why your shipping must have one
Las Vegas Warehouse
 
Computational Engineering IITH Presentation
Computational Engineering IITH PresentationComputational Engineering IITH Presentation
Computational Engineering IITH Presentation
co23btech11018
 
Recycled Concrete Aggregate in Construction Part II
Recycled Concrete Aggregate in Construction Part IIRecycled Concrete Aggregate in Construction Part II
Recycled Concrete Aggregate in Construction Part II
Aditya Rajan Patra
 

Recently uploaded (20)

Casting-Defect-inSlab continuous casting.pdf
Casting-Defect-inSlab continuous casting.pdfCasting-Defect-inSlab continuous casting.pdf
Casting-Defect-inSlab continuous casting.pdf
 
Literature Review Basics and Understanding Reference Management.pptx
Literature Review Basics and Understanding Reference Management.pptxLiterature Review Basics and Understanding Reference Management.pptx
Literature Review Basics and Understanding Reference Management.pptx
 
哪里办理(csu毕业证书)查尔斯特大学毕业证硕士学历原版一模一样
哪里办理(csu毕业证书)查尔斯特大学毕业证硕士学历原版一模一样哪里办理(csu毕业证书)查尔斯特大学毕业证硕士学历原版一模一样
哪里办理(csu毕业证书)查尔斯特大学毕业证硕士学历原版一模一样
 
ML Based Model for NIDS MSc Updated Presentation.v2.pptx
ML Based Model for NIDS MSc Updated Presentation.v2.pptxML Based Model for NIDS MSc Updated Presentation.v2.pptx
ML Based Model for NIDS MSc Updated Presentation.v2.pptx
 
Understanding Inductive Bias in Machine Learning
Understanding Inductive Bias in Machine LearningUnderstanding Inductive Bias in Machine Learning
Understanding Inductive Bias in Machine Learning
 
Manufacturing Process of molasses based distillery ppt.pptx
Manufacturing Process of molasses based distillery ppt.pptxManufacturing Process of molasses based distillery ppt.pptx
Manufacturing Process of molasses based distillery ppt.pptx
 
132/33KV substation case study Presentation
132/33KV substation case study Presentation132/33KV substation case study Presentation
132/33KV substation case study Presentation
 
Modelagem de um CSTR com reação endotermica.pdf
Modelagem de um CSTR com reação endotermica.pdfModelagem de um CSTR com reação endotermica.pdf
Modelagem de um CSTR com reação endotermica.pdf
 
Textile Chemical Processing and Dyeing.pdf
Textile Chemical Processing and Dyeing.pdfTextile Chemical Processing and Dyeing.pdf
Textile Chemical Processing and Dyeing.pdf
 
basic-wireline-operations-course-mahmoud-f-radwan.pdf
basic-wireline-operations-course-mahmoud-f-radwan.pdfbasic-wireline-operations-course-mahmoud-f-radwan.pdf
basic-wireline-operations-course-mahmoud-f-radwan.pdf
 
Iron and Steel Technology Roadmap - Towards more sustainable steelmaking.pdf
Iron and Steel Technology Roadmap - Towards more sustainable steelmaking.pdfIron and Steel Technology Roadmap - Towards more sustainable steelmaking.pdf
Iron and Steel Technology Roadmap - Towards more sustainable steelmaking.pdf
 
Properties Railway Sleepers and Test.pptx
Properties Railway Sleepers and Test.pptxProperties Railway Sleepers and Test.pptx
Properties Railway Sleepers and Test.pptx
 
A SYSTEMATIC RISK ASSESSMENT APPROACH FOR SECURING THE SMART IRRIGATION SYSTEMS
A SYSTEMATIC RISK ASSESSMENT APPROACH FOR SECURING THE SMART IRRIGATION SYSTEMSA SYSTEMATIC RISK ASSESSMENT APPROACH FOR SECURING THE SMART IRRIGATION SYSTEMS
A SYSTEMATIC RISK ASSESSMENT APPROACH FOR SECURING THE SMART IRRIGATION SYSTEMS
 
官方认证美国密歇根州立大学毕业证学位证书原版一模一样
官方认证美国密歇根州立大学毕业证学位证书原版一模一样官方认证美国密歇根州立大学毕业证学位证书原版一模一样
官方认证美国密歇根州立大学毕业证学位证书原版一模一样
 
学校原版美国波士顿大学毕业证学历学位证书原版一模一样
学校原版美国波士顿大学毕业证学历学位证书原版一模一样学校原版美国波士顿大学毕业证学历学位证书原版一模一样
学校原版美国波士顿大学毕业证学历学位证书原版一模一样
 
CSM Cloud Service Management Presentarion
CSM Cloud Service Management PresentarionCSM Cloud Service Management Presentarion
CSM Cloud Service Management Presentarion
 
Recycled Concrete Aggregate in Construction Part III
Recycled Concrete Aggregate in Construction Part IIIRecycled Concrete Aggregate in Construction Part III
Recycled Concrete Aggregate in Construction Part III
 
ISPM 15 Heat Treated Wood Stamps and why your shipping must have one
ISPM 15 Heat Treated Wood Stamps and why your shipping must have oneISPM 15 Heat Treated Wood Stamps and why your shipping must have one
ISPM 15 Heat Treated Wood Stamps and why your shipping must have one
 
Computational Engineering IITH Presentation
Computational Engineering IITH PresentationComputational Engineering IITH Presentation
Computational Engineering IITH Presentation
 
Recycled Concrete Aggregate in Construction Part II
Recycled Concrete Aggregate in Construction Part IIRecycled Concrete Aggregate in Construction Part II
Recycled Concrete Aggregate in Construction Part II
 

Awesome Tools 2017

  • 1. Noel De Martin, CTO Awesome Tools 2017
  • 2. Backend (server) + Mobile Apps ++ PHP + MySQL Web Apps HTML + JavaScript + CSSAndroid  Java / Kotlin iOS  Swift / ObjectiveC / Traditional landscape /
  • 3. Backend (server) + ++ Laravel + MongoDB Web Apps Vue + TypeScript + SassIonic Modern landscape Mobile Apps
  • 4.
  • 5. SELECT associations2.object_id, associations2.term_id, associations2.cat_ID, associations2 FROM (SELECT objects_tags.object_id, objects_tags.term_id, wp_cb_tags2cats.cat_ID, categor FROM (SELECT wp_term_relationships.object_id, wp_term_taxonomy.term_id, wp_term_taxono FROM wp_term_relationships LEFT JOIN wp_term_taxonomy ON wp_term_relationships.term_taxonomy_id = wp_term_tax ORDER BY object_id ASC, term_id ASC) AS objects_tags LEFT JOIN wp_cb_tags2cats ON objects_tags.term_id = wp_cb_tags2cats.tag_ID LEFT JOIN (SELECT wp_term_relationships.object_id, wp_term_taxonomy.term_id as cat_ID, FROM wp_term_relationships LEFT JOIN wp_term_taxonomy ON wp_term_relationships.term_taxonomy_id = wp_term_tax WHERE wp_term_taxonomy.taxonomy = 'category' GROUP BY object_id, cat_ID, term_taxonomy_id ORDER BY object_id, cat_ID, term_taxonomy_id) AS categories on wp_cb_tags2cats.cat_ID = categories.term_id WHERE objects_tags.term_id = wp_cb_tags2cats.tag_ID GROUP BY object_id, term_id, cat_ID, term_taxonomy_id ORDER BY object_id ASC, term_id ASC, cat_ID ASC) AS associations2 LEFT JOIN categories ON associations2.object_id = categories.object_id WHERE associations2.cat_ID <> categories.cat_ID GROUP BY object_id, term_id, cat_ID, term_taxonomy_id ORDER BY object_id, term_id, cat_ID, term_taxonomy_id Looks familiar? Source: How to reduce a long SQL query based on CREATE VIEW? (Stackoverflow)
  • 6. SELECT associations2.object_id, associations2.term_id, associations2.cat_ID, associations2 FROM (SELECT objects_tags.object_id, objects_tags.term_id, wp_cb_tags2cats.cat_ID, categor FROM (SELECT wp_term_relationships.object_id, wp_term_taxonomy.term_id, wp_term_taxono FROM wp_term_relationships LEFT JOIN wp_term_taxonomy ON wp_term_relationships.term_taxonomy_id = wp_term_tax ORDER BY object_id ASC, term_id ASC) AS objects_tags LEFT JOIN wp_cb_tags2cats ON objects_tags.term_id = wp_cb_tags2cats.tag_ID LEFT JOIN (SELECT wp_term_relationships.object_id, wp_term_taxonomy.term_id as cat_ID, FROM wp_term_relationships LEFT JOIN wp_term_taxonomy ON wp_term_relationships.term_taxonomy_id = wp_term_tax WHERE wp_term_taxonomy.taxonomy = 'category' GROUP BY object_id, cat_ID, term_taxonomy_id ORDER BY object_id, cat_ID, term_taxonomy_id) AS categories on wp_cb_tags2cats.cat_ID = categories.term_id WHERE objects_tags.term_id = wp_cb_tags2cats.tag_ID GROUP BY object_id, term_id, cat_ID, term_taxonomy_id ORDER BY object_id ASC, term_id ASC, cat_ID ASC) AS associations2 LEFT JOIN categories ON associations2.object_id = categories.object_id WHERE associations2.cat_ID <> categories.cat_ID GROUP BY object_id, term_id, cat_ID, term_taxonomy_id ORDER BY object_id, term_id, cat_ID, term_taxonomy_id Looks familiar? Source: How to reduce a long SQL query based on CREATE VIEW? (Stackoverflow)
  • 7. Looks familiar? id name email data 1 Ragnar Lodbrok lodbrok@mail.com {"phone":"(297)-707- 8575","twitter":"foobar", "instagram":"foobar"} 2 Björn Ironside bironside@mail.com {"phone":"(297)-707- 8575","twitter":"foobar", "instagram":"foobar"} 3 Lagertha lagertha@mail.com {"phone":"(297)-707- 8575","twitter":"foobar", "instagram":"foobar"}
  • 8. Looks familiar? id name email data 1 Ragnar Lodbrok lodbrok@mail.com {"phone":"(297)-707- 8575","twitter":"foobar", "instagram":"foobar"} 2 Björn Ironside bironside@mail.com {"phone":"(297)-707- 8575","twitter":"foobar", "instagram":"foobar"} 3 Lagertha lagertha@mail.com {"phone":"(297)-707- 8575","twitter":"foobar", "instagram":"foobar"} Commonly done in order to: - Handle inconsistent data - Avoid modifying the schema - …
  • 9. Looks familiar? id name email data 1 Ragnar Lodbrok lodbrok@mail.com {"phone":"(297)-707- 8575","twitter":"foobar", "instagram":"foobar"} 2 Björn Ironside bironside@mail.com {"phone":"(297)-707- 8575","twitter":"foobar", "instagram":"foobar"} 3 Lagertha lagertha@mail.com {"phone":"(297)-707- 8575","twitter":"foobar", "instagram":"foobar"} Commonly done in order to: - Handle inconsistent data - Avoid modifying the schema - …
  • 11. SQL vs NoSQL SQL NoSQL Table Collection Row Document Column Field
  • 12. SQL vs NoSQL SQL NoSQL Table Collection Row Document Column Field TABLES COLLECTIONS
  • 13. SQL vs NoSQL SQL NoSQL Table Collection Row Document Column Field id name age phone_number 1 Chandler Bing 10 727-647-4415 2 Rachel Green 24 757-328-3857 ROWS DOCUMENTS { _id: ObjectId(‚507f19…‛) name: ‚Chandler Bing‛, age: 10, phone_number: ‚727-647-4415‛ } { _id: ObjectId(‚2a2ed9…‛) name: ‚Rachel Green‛, age: 24, phone_number: ‚757-328-3857‛ }
  • 14. SQL vs NoSQL COLUMNS FIELDS SQL NoSQL Table Collection Row Document Column Field id name age phone_number twitter 1 Chandler Bing 10 727-647-4415 ChandleringBing 2 Rachel Green 24 757-328-3857 NULL { _id: ObjectId(‚507f19…‛) name: ‚Chandler Bing‛, age: 10, phone_number: ‚727-647-4415‛, twitter: ‚ChandleringBing‛ } { _id: ObjectId(‚2a2ed9…‛) name: ‚Rachel Green‛, age: 24, phone_number: ‚757-328-3857‛ }
  • 15. SQL vs NoSQL COLUMNS FIELDS SQL NoSQL Table Collection Row Document Column Field id name age phone_number twitter 1 Chandler Bing 10 727-647-4415 ChandleringBing 2 Rachel Green 24 757-328-3857 NULL { _id: ObjectId(‚507f19…‛) name: ‚Chandler Bing‛, age: 10, contact: { phone_number: ‚727-647-4415‛, twitter: ‚ChandleringBing‛ } } { _id: ObjectId(‚2a2ed9…‛) name: ‚Rachel Green‛, age: 24, contact: { phone_number: ‚757-328-3857‛ } }
  • 16. Design of a NoSQL database { _id: ObjectId(‚507f1f77…‛), author_id: ObjectId(‚c19729d…‛), title: ‚Weather condition‛, body: ‚How’s the weather?‛ } THREADS { _id: ObjectId(‚f77a8w…‛), thread_id: ObjectId(‚507f1f77…‛), author_id: ObjectId(‚29de86…‛), text: ‚I think today is sunny‛ } { _id: ObjectId(‚2f98a0…‛), thread_id: ObjectId(‚507f1f77…‛), author_id: ObjectId(‚c19729d…‛), text: ‚Me too‛ } REPLIES { _id: ObjectId(‚29de86…‛), name: ‚John Doe‛, avatar_url: ‚http://...‛, email: ‚thedoe@mail.com‛ } { _id: ObjectId(‚c19729d…‛), name: ‚Jane Smith‛, avatar_url: ‚http://...‛, email: ‚iamjane@mail.com‛ } USERS
  • 17. Design of a NoSQL database Embedding { _id: ObjectId(‚507f1f77…‛), author_id: ObjectId(‚c19729d…‛), title: ‚Weather condition‛, body: ‚How’s the weather?‛, replies: [ { author_id: ObjectId(‚29de86…‛), text: ‚I think today is sunny‛ }, { author_id: ObjectId(‚c19729d…‛), text: ‚Me too‛ } ] } THREADS { _id: ObjectId(‚29de86…‛), name: ‚John Doe‛, avatar_url: ‚http://...‛, email: ‚thedoe@mail.com‛ } { _id: ObjectId(‚c19729d…‛), name: ‚Jane Smith‛, avatar_url: ‚http://...‛, email: ‚iamjane@mail.com‛ } USERS
  • 18. Design of a NoSQL database Denormalization { _id: ObjectId(‚507f1f77…‛), author: { id: ObjectId(‚c19729d…‛), name: ‚Jane Smith‛, avatar_url: ‚http://...‛ }, title: ‚Weather condition‛, body: ‚How’s the weather?‛, replies: [ { author: { id: ObjectId(‚29de86…‛), name: ‚John Doe‛, avatar_url: ‚http://...‛ }, text: ‚I think today is sunny‛ }, … ] } { _id: ObjectId(‚29de86…‛), name: ‚John Doe‛, avatar_url: ‚http://...‛, email: ‚thedoe@mail.com‛ } { _id: ObjectId(‚c19729d…‛), name: ‚Jane Smith‛, avatar_url: ‚http://...‛, email: ‚iamjane@mail.com‛ } THREADS USERS
  • 19. Design of a NoSQL database “When designing data models, always consider the application usage of the data as well as the inherent structure of the data itself.” - MongoDB manual
  • 20. Design of a NoSQL database • Duplication can be the right choice. • Favour few collections over many. • Data doesn’t have to be structured. “When designing data models, always consider the application usage of the data as well as the inherent structure of the data itself.” - MongoDB manual
  • 22. Advantages Disadvantages • Flexible schema • Speed • Scaling • Flexible schema • Memory in disk • Data integrity (application-side validation)
  • 23. Learn more • Official Website • Recommended reads: • Thinking in Documents • 6 Rules of Thumb for MongoDB Schema Design • Free online course: Data Wrangling with MongoDB • MongoDB Source Code
  • 24.
  • 25. Welcome to Laravel PHP framework using Model-View-Controller Design Pattern
  • 26. Model View Controller Application Data Layer Application Logic User Interface MODEL VIEWCONTROLLER
  • 27. Model – Eloquent ORM Implementation of Active Record pattern $user = User::find(2); $user->name; $user->email; $user->update([ 'email' => 'new@mail.com' ]); $user->delete(); User::create([ 'name' => 'Bill Finger', 'email' => 'finger@mail.com' ]); id name email 1 Bob Kane kane@mail.com 2 Jerry Robinson robinson@mail.com 3 Bill Finger finger@mail.com DATABASE (SQL) CODE (PHP)
  • 28. Model – Eloquent ORM Implementation of Active Record pattern $user = User::find('f4c7b2…'); $user->name; $user->email; $user->update([ 'email' => 'new@mail.com' ]); $user->delete(); User::create([ 'name' => 'Bill Finger', 'email' => 'finger@mail.com' ]); DATABASE (NoSQL) CODE (PHP){ _id: ObjectId(‚d294b8…‛), name: ‚Bob Kane‛, email: ‚kane@mail.com‛ } { _id: ObjectId(‚f4c7b2…‛), name: ‚Jerry Robinson‛, email: ‚robinson@mail.com‛ } { _id: ObjectId(‚1fb215…‛), name: ‚Bill Finger‛, email: ‚finger@mail.com‛ }
  • 29. Model – Eloquent ORM Convention over configuration <?php use IlluminateDatabaseEloquentModel; class Post extends Model { public function author() { return $this->belongsTo(User::class); } public function comments() { return $this->hasMany(Comment::class); } } DATABASE CODE
  • 30. Model – Query Builder $users = DB::table('users') ->join('contacts', 'users.id', '=', 'contacts.user_id') ->join('orders', 'users.id', '=', 'orders.user_id') ->select('users.*', 'contacts.phone', 'orders.price') ->get(); $usersCount = DB::table('users')->count(); $usersByStatus = DB::table('users') ->select(DB::raw('count(*) as user_count, status')) ->where('status', '<>', 1) ->groupBy('status') ->get(); COUNT GROUP BY JOIN ETC…
  • 31. Controller - Routing Route::get('hello', function () { return 'Hello World'; }); GET mywebsite.com/hello
  • 32. Controller - Routing GET mywebsite.com/user/3 Route::get('user/{id}', 'UsersController@show'); class UsersController { public function show($id) { return User::find($id); } }
  • 33. Controller - Routing POST mywebsite.com/login Route::post('login', 'HomeController@login'); class UsersController { public function login() { $credentials = [ 'email' => request('email'), 'password' => request('password') ]; if (Auth::attempt($credentials)) return redirect('/home'); } }
  • 34. View - Blade @if (auth()->check()) {!! Form::open(['url' => '/login']) !!} {!! Form::text('email'); !!} {!! Form::password('password'); !!} {!! Form::submit('Login'); !!} {!! Form::close() !!} @else <div class="container"> Hello, {{ auth()->user()->name }}. </div> @endif <div class="container"> Hello, Bill Finger. </div> <form action="/login"> <input type="text" name="email"> <input type="password" name="password"> <input type="submit" value="Login"> </form> If the user isn’t logged in If the user is logged in Laravel Blade can be thought as a superset of php when rendering views.
  • 35. Out of the box with Laravel Authentication Mailing Testing Form Validation Command Line Tools Sessions Database Migrations Task Scheduling And more…
  • 37. Learn more • Official Website • Laracasts (video tutorials) • MongoDB integration with Laravel • Laravel Source Code
  • 38.
  • 39.
  • 41. What can Typescript do for you? • Javascript superset. • Compiles into Javascript. • Compatible in all browsers. • Provides the following: • Classes • Interfaces • Typings • File imports • …
  • 42. Example class Car{ public run() { console.log('I am a running car!'); } } let car = new Car(); car.run(); function createCar() { return { run: function() { console.log('I am a running car!'); } }; } var car = createCar(); car.run(); JAVASCRIPT TYPESCRIPT
  • 43. Example abstract class Vehicle { abstract public run(): void; } class Car extends Vehicle { public run() { console.log('I am a running car!'); } } let car = new Car(); car.run(); TYPESCRIPT
  • 44. Example export default abstract class Vehicle { abstract public run(): void; } Vehicle.ts import Vehicle from './Vehicle.ts'; export default class Car extends Vehicle { public run() { console.log('I am a running car!'); } } import Car from './Car'; let car = new Car(); car.run(); Car.ts index.ts
  • 47. Learn more • Official Website • Recommended Text Editor: Visual Studio Code • TypeScript Source Code
  • 48.
  • 49.
  • 50. Too basic, no structure
  • 51. Too basic, no structure Too complex, steep learning curve Structured Incremental Awesome
  • 52. Vue approach to UI JavaScript DOM (HTML) Render User Input (Events)
  • 53. Hello world! <div id="app"> {{ message }} </div> <script> new Vue({ el: '#app', data: { message: 'Hello Vue!' } }) </script> SOURCE BROWSER
  • 54. Reactivity <div id="app"> <input v-model="message"/> <p>{{ message }}</p> </div> <script> new Vue({ el: '#app', data: { message: 'Hello Vue!' } }) </script> SOURCE BROWSER
  • 55. Loops <div id="app"> <input v-model="message"/> <p>{{ message }}</p> <ul> <li v-for="item in items"> {{ item }} </li> </ul> </div> <script> new Vue({ el: '#app', data: { message: 'Hello Vue!', items: [ 'Vue', 'is', 'awesome!' ] } }) </script> SOURCE BROWSER
  • 56. Components SOURCE BROWSER <div id="app"> <input v-model="message"/> <p>{{ message }}</p> <items-list></items-list> </div> <script> Vue.component('items-list', { template: ` <ul> <li v-for="item in items"> {{ item }} </li> </ul> `, data() { return { items: [ 'Vue', 'is', 'awesome!' ] }; } }); new Vue({ el: '#app', data: { message: 'Hello Vue!‘ } }) </script>
  • 57. Learn more • Official Website • Interactive Examples • Recommended Introductory Video • Free Online Course: Learn Vue 2 Step By Step • VueJS Source Code
  • 58.
  • 59.
  • 61. What can Sass do for you? • CSS superset. • Compiles into CSS. • Compatible in all browsers. • Provides the following: • Variables • Functions • Nesting • Loops • Conditionals • File imports • …
  • 62. SASS Example $font-stack: Helvetica, sans-serif; $primary-color: #333; body { font: 100% $font-stack; color: $primary-color; } nav { ul { margin: 0; padding: 0; list-style: none; } li { display: inline-block; } a { display: block; padding: 6px 12px; text-decoration: none; } } body { font: 100% Helvetica, sans-serif; color: #333; } nav ul { margin: 0; padding: 0; list-style: none; } nav li { display: inline-block; } nav a { display: block; padding: 6px 12px; text-decoration: none; } CSS
  • 63. Learn more • Official Website • Sass Source Code
  • 64.
  • 65. Ionic foundations + HTML  Mobile Javascript++ Hybrid Mobile Applications
  • 66. What can Ionic do for you? • Develop once, deploy everywhere • Ready made components • Implement native functionality when necessary
  • 67. Develop once, deploy everywhere ANDROID IOS Same source code
  • 68. Ready made components Buttons FABs Tabs Action Sheets Menus Modals Toolbars Loaders And more…
  • 69. Native functionality Via Cordova Plugins • Code written once per platform, Javascript interface • Huge collection of available plugins: • Camera • GPS • Push Notifications • Bluetooth • NFC • … • Program your own!
  • 70. Learn more • Official Website • Components Interactive Documentation • Ionic Source Code
  • 72. You also need to know… Package managers • npmjs.com • Repository for node (Javascript) libraries • 400.000+ packages • packagist.org • Repository for php libraries • 140.000+ packages
  • 73. You also need to know… Open source
  • 76. Programming is Thinking, not Typing. - Casey Patton