SlideShare uma empresa Scribd logo
1 de 77
Baixar para ler offline
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

Mais conteúdo relacionado

Mais procurados

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 WebGregg Kellogg
 
Sharding with MongoDB -- MongoNYC 2012
Sharding with MongoDB -- MongoNYC 2012Sharding with MongoDB -- MongoNYC 2012
Sharding with MongoDB -- MongoNYC 2012Tyler 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 LearnedSimon 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 PipelinesTom 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, GermanyAndré 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 ElasticsearchEnrico Polesel
 
Introduction to Elasticsearch
Introduction to ElasticsearchIntroduction to Elasticsearch
Introduction to ElasticsearchLuiz 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 SemaphobiaMarkus 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 MunichCraig Bradford
 
03. ElasticSearch : Data In, Data Out
03. ElasticSearch : Data In, Data Out03. ElasticSearch : Data In, Data Out
03. ElasticSearch : Data In, Data OutOpenThink Labs
 
01 ElasticSearch : Getting Started
01 ElasticSearch : Getting Started01 ElasticSearch : Getting Started
01 ElasticSearch : Getting StartedOpenThink 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
 

Mais procurados (19)

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
 
Elasticsearch Workshop
Elasticsearch WorkshopElasticsearch Workshop
Elasticsearch Workshop
 
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
 

Semelhante a 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 DocumentsMongoDB
 
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 DocumentsJoe 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 MongoDBrogerbodamer
 
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 MongoDBMongoDB
 
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 MongoDBMongoDB
 
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 WayMongoDB
 
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 2011Steven 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 DataMongoDB
 
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 TeamsMongoDB
 
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 MongoDBMongoDB
 
San Francisco Java User Group
San Francisco Java User GroupSan Francisco Java User Group
San Francisco Java User Groupkchodorow
 
Using Mongoid with Ruby on Rails
Using Mongoid with Ruby on RailsUsing Mongoid with Ruby on Rails
Using Mongoid with Ruby on RailsNicholas 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 factoryDiponkar 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 FactoryDiponkar Paul
 
Building Apps with MongoDB
Building Apps with MongoDBBuilding Apps with MongoDB
Building Apps with MongoDBNate Abele
 

Semelhante a 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
 

Último

PVC VS. FIBERGLASS (FRP) GRAVITY SEWER - UNI BELL
PVC VS. FIBERGLASS (FRP) GRAVITY SEWER - UNI BELLPVC VS. FIBERGLASS (FRP) GRAVITY SEWER - UNI BELL
PVC VS. FIBERGLASS (FRP) GRAVITY SEWER - UNI BELLManishPatel169454
 
Unit 1 - Soil Classification and Compaction.pdf
Unit 1 - Soil Classification and Compaction.pdfUnit 1 - Soil Classification and Compaction.pdf
Unit 1 - Soil Classification and Compaction.pdfRagavanV2
 
Call Girls Pimpri Chinchwad Call Me 7737669865 Budget Friendly No Advance Boo...
Call Girls Pimpri Chinchwad Call Me 7737669865 Budget Friendly No Advance Boo...Call Girls Pimpri Chinchwad Call Me 7737669865 Budget Friendly No Advance Boo...
Call Girls Pimpri Chinchwad Call Me 7737669865 Budget Friendly No Advance Boo...roncy bisnoi
 
Top Rated Pune Call Girls Budhwar Peth ⟟ 6297143586 ⟟ Call Me For Genuine Se...
Top Rated  Pune Call Girls Budhwar Peth ⟟ 6297143586 ⟟ Call Me For Genuine Se...Top Rated  Pune Call Girls Budhwar Peth ⟟ 6297143586 ⟟ Call Me For Genuine Se...
Top Rated Pune Call Girls Budhwar Peth ⟟ 6297143586 ⟟ Call Me For Genuine Se...Call Girls in Nagpur High Profile
 
Double Revolving field theory-how the rotor develops torque
Double Revolving field theory-how the rotor develops torqueDouble Revolving field theory-how the rotor develops torque
Double Revolving field theory-how the rotor develops torqueBhangaleSonal
 
Unleashing the Power of the SORA AI lastest leap
Unleashing the Power of the SORA AI lastest leapUnleashing the Power of the SORA AI lastest leap
Unleashing the Power of the SORA AI lastest leapRishantSharmaFr
 
Call Girls In Bangalore ☎ 7737669865 🥵 Book Your One night Stand
Call Girls In Bangalore ☎ 7737669865 🥵 Book Your One night StandCall Girls In Bangalore ☎ 7737669865 🥵 Book Your One night Stand
Call Girls In Bangalore ☎ 7737669865 🥵 Book Your One night Standamitlee9823
 
VIP Call Girls Palanpur 7001035870 Whatsapp Number, 24/07 Booking
VIP Call Girls Palanpur 7001035870 Whatsapp Number, 24/07 BookingVIP Call Girls Palanpur 7001035870 Whatsapp Number, 24/07 Booking
VIP Call Girls Palanpur 7001035870 Whatsapp Number, 24/07 Bookingdharasingh5698
 
Booking open Available Pune Call Girls Pargaon 6297143586 Call Hot Indian Gi...
Booking open Available Pune Call Girls Pargaon  6297143586 Call Hot Indian Gi...Booking open Available Pune Call Girls Pargaon  6297143586 Call Hot Indian Gi...
Booking open Available Pune Call Girls Pargaon 6297143586 Call Hot Indian Gi...Call Girls in Nagpur High Profile
 
Online banking management system project.pdf
Online banking management system project.pdfOnline banking management system project.pdf
Online banking management system project.pdfKamal Acharya
 
University management System project report..pdf
University management System project report..pdfUniversity management System project report..pdf
University management System project report..pdfKamal Acharya
 
AKTU Computer Networks notes --- Unit 3.pdf
AKTU Computer Networks notes ---  Unit 3.pdfAKTU Computer Networks notes ---  Unit 3.pdf
AKTU Computer Networks notes --- Unit 3.pdfankushspencer015
 
CCS335 _ Neural Networks and Deep Learning Laboratory_Lab Complete Record
CCS335 _ Neural Networks and Deep Learning Laboratory_Lab Complete RecordCCS335 _ Neural Networks and Deep Learning Laboratory_Lab Complete Record
CCS335 _ Neural Networks and Deep Learning Laboratory_Lab Complete RecordAsst.prof M.Gokilavani
 
chapter 5.pptx: drainage and irrigation engineering
chapter 5.pptx: drainage and irrigation engineeringchapter 5.pptx: drainage and irrigation engineering
chapter 5.pptx: drainage and irrigation engineeringmulugeta48
 
Generative AI or GenAI technology based PPT
Generative AI or GenAI technology based PPTGenerative AI or GenAI technology based PPT
Generative AI or GenAI technology based PPTbhaskargani46
 
The Most Attractive Pune Call Girls Budhwar Peth 8250192130 Will You Miss Thi...
The Most Attractive Pune Call Girls Budhwar Peth 8250192130 Will You Miss Thi...The Most Attractive Pune Call Girls Budhwar Peth 8250192130 Will You Miss Thi...
The Most Attractive Pune Call Girls Budhwar Peth 8250192130 Will You Miss Thi...ranjana rawat
 
ONLINE FOOD ORDER SYSTEM PROJECT REPORT.pdf
ONLINE FOOD ORDER SYSTEM PROJECT REPORT.pdfONLINE FOOD ORDER SYSTEM PROJECT REPORT.pdf
ONLINE FOOD ORDER SYSTEM PROJECT REPORT.pdfKamal Acharya
 

Último (20)

(INDIRA) Call Girl Meerut Call Now 8617697112 Meerut Escorts 24x7
(INDIRA) Call Girl Meerut Call Now 8617697112 Meerut Escorts 24x7(INDIRA) Call Girl Meerut Call Now 8617697112 Meerut Escorts 24x7
(INDIRA) Call Girl Meerut Call Now 8617697112 Meerut Escorts 24x7
 
PVC VS. FIBERGLASS (FRP) GRAVITY SEWER - UNI BELL
PVC VS. FIBERGLASS (FRP) GRAVITY SEWER - UNI BELLPVC VS. FIBERGLASS (FRP) GRAVITY SEWER - UNI BELL
PVC VS. FIBERGLASS (FRP) GRAVITY SEWER - UNI BELL
 
Call Girls in Ramesh Nagar Delhi 💯 Call Us 🔝9953056974 🔝 Escort Service
Call Girls in Ramesh Nagar Delhi 💯 Call Us 🔝9953056974 🔝 Escort ServiceCall Girls in Ramesh Nagar Delhi 💯 Call Us 🔝9953056974 🔝 Escort Service
Call Girls in Ramesh Nagar Delhi 💯 Call Us 🔝9953056974 🔝 Escort Service
 
Unit 1 - Soil Classification and Compaction.pdf
Unit 1 - Soil Classification and Compaction.pdfUnit 1 - Soil Classification and Compaction.pdf
Unit 1 - Soil Classification and Compaction.pdf
 
Call Girls Pimpri Chinchwad Call Me 7737669865 Budget Friendly No Advance Boo...
Call Girls Pimpri Chinchwad Call Me 7737669865 Budget Friendly No Advance Boo...Call Girls Pimpri Chinchwad Call Me 7737669865 Budget Friendly No Advance Boo...
Call Girls Pimpri Chinchwad Call Me 7737669865 Budget Friendly No Advance Boo...
 
Top Rated Pune Call Girls Budhwar Peth ⟟ 6297143586 ⟟ Call Me For Genuine Se...
Top Rated  Pune Call Girls Budhwar Peth ⟟ 6297143586 ⟟ Call Me For Genuine Se...Top Rated  Pune Call Girls Budhwar Peth ⟟ 6297143586 ⟟ Call Me For Genuine Se...
Top Rated Pune Call Girls Budhwar Peth ⟟ 6297143586 ⟟ Call Me For Genuine Se...
 
Double Revolving field theory-how the rotor develops torque
Double Revolving field theory-how the rotor develops torqueDouble Revolving field theory-how the rotor develops torque
Double Revolving field theory-how the rotor develops torque
 
Unleashing the Power of the SORA AI lastest leap
Unleashing the Power of the SORA AI lastest leapUnleashing the Power of the SORA AI lastest leap
Unleashing the Power of the SORA AI lastest leap
 
Call Girls In Bangalore ☎ 7737669865 🥵 Book Your One night Stand
Call Girls In Bangalore ☎ 7737669865 🥵 Book Your One night StandCall Girls In Bangalore ☎ 7737669865 🥵 Book Your One night Stand
Call Girls In Bangalore ☎ 7737669865 🥵 Book Your One night Stand
 
VIP Call Girls Palanpur 7001035870 Whatsapp Number, 24/07 Booking
VIP Call Girls Palanpur 7001035870 Whatsapp Number, 24/07 BookingVIP Call Girls Palanpur 7001035870 Whatsapp Number, 24/07 Booking
VIP Call Girls Palanpur 7001035870 Whatsapp Number, 24/07 Booking
 
NFPA 5000 2024 standard .
NFPA 5000 2024 standard                                  .NFPA 5000 2024 standard                                  .
NFPA 5000 2024 standard .
 
Booking open Available Pune Call Girls Pargaon 6297143586 Call Hot Indian Gi...
Booking open Available Pune Call Girls Pargaon  6297143586 Call Hot Indian Gi...Booking open Available Pune Call Girls Pargaon  6297143586 Call Hot Indian Gi...
Booking open Available Pune Call Girls Pargaon 6297143586 Call Hot Indian Gi...
 
Online banking management system project.pdf
Online banking management system project.pdfOnline banking management system project.pdf
Online banking management system project.pdf
 
University management System project report..pdf
University management System project report..pdfUniversity management System project report..pdf
University management System project report..pdf
 
AKTU Computer Networks notes --- Unit 3.pdf
AKTU Computer Networks notes ---  Unit 3.pdfAKTU Computer Networks notes ---  Unit 3.pdf
AKTU Computer Networks notes --- Unit 3.pdf
 
CCS335 _ Neural Networks and Deep Learning Laboratory_Lab Complete Record
CCS335 _ Neural Networks and Deep Learning Laboratory_Lab Complete RecordCCS335 _ Neural Networks and Deep Learning Laboratory_Lab Complete Record
CCS335 _ Neural Networks and Deep Learning Laboratory_Lab Complete Record
 
chapter 5.pptx: drainage and irrigation engineering
chapter 5.pptx: drainage and irrigation engineeringchapter 5.pptx: drainage and irrigation engineering
chapter 5.pptx: drainage and irrigation engineering
 
Generative AI or GenAI technology based PPT
Generative AI or GenAI technology based PPTGenerative AI or GenAI technology based PPT
Generative AI or GenAI technology based PPT
 
The Most Attractive Pune Call Girls Budhwar Peth 8250192130 Will You Miss Thi...
The Most Attractive Pune Call Girls Budhwar Peth 8250192130 Will You Miss Thi...The Most Attractive Pune Call Girls Budhwar Peth 8250192130 Will You Miss Thi...
The Most Attractive Pune Call Girls Budhwar Peth 8250192130 Will You Miss Thi...
 
ONLINE FOOD ORDER SYSTEM PROJECT REPORT.pdf
ONLINE FOOD ORDER SYSTEM PROJECT REPORT.pdfONLINE FOOD ORDER SYSTEM PROJECT REPORT.pdf
ONLINE FOOD ORDER SYSTEM PROJECT REPORT.pdf
 

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