SlideShare a Scribd company logo
Effective Code Transformations in C++
Marco Arena

Paolo Polce

marco@italiancpp.org

paolo@webshell.it

Reggio Emilia, 30 Novembre 2013
Italian C++ Community

www.italiancpp.org
@italiancpp

2
Ancora evolvono il C++??!

3
When I hear they’re adding features to C++
This PLT Life - http://this-plt-life.tumblr.com/
4
Outline
• C++11, benvenuto nel team!
– C++98  C++11 & snippet C#

• Il team cambia stile & coding standards
– Design patterns
– Multi-threaded C++

• Alcune linee guida
5
Outline
• C++11, benvenuto nel team!
– C++98  C++11 & snippet C#

• Il team cambia stile & coding standards
– Design patterns
– Multi-threaded C++

• Alcune linee guida
6
C++ o C#?!

var dati = new List<int>(){1,2,3,4,5};

7
C++ o C#?!

var dati = new List<int>(){1,2,3,4,5};
auto dati = vector<int>{1,2,3,4,5};

8
auto
// C++98
vector<int> vec (10);
vector<int>::iterator it = vec.begin();
auto
// C++98
vector<int> vec (10);
vector<int>::iterator it = vec.begin();
it

10
1

2

3

4
12

6

it

5

7

11

13
10
auto
// C++98
vector<int> vec (10);
vector<int>::iterator it = vec.begin();

// C++11

vector<int> vec (10);
auto it = vec.begin();
auto
// C++98
vector< pair<string, int> > cards = ... ;
vector< pair<string, int> >::iterator it = cards.begin();

12
auto
// C++98
vector< pair<string, int> > cards = ... ;
vector< pair<string, int> >::iterator it = cards.begin();

// C++11

auto it = cards.begin();
13
range-based iteration
// C++98
for (vector<int>::iterator it = vec.begin();
it != vec.end();
++it)
{
cout << *it << " ";
}

14
range-based iteration
// C++11
for (auto i : vec)
{
cout << i << " ";
}

15
range-based iteration
// C++11

for (auto i : vec)
{
cout << i << " ";
}
for (const auto& i : vec)
{
cout << i << " ";
}
16
range-based iteration
C++98

C++11

for ( vector<int>::iterator it =
vec.begin();
it != vec.end();
++it)
{
cout << *it << " ";
}

for (auto i : vec)
{
cout << i << " ";
}

C#
foreach (var i in arrayList)
{
System.Console.Write(i);
}
17
lambdas & algorithms
// C++98
vector<int>::const_iterator find_in_range(const vector<int>& vec)

{
vector<int>::const_iterator i = vec.begin();

for( ; i != vec.end(); ++i )
{
if( *i > 0 && *i < 10 ) break;
}
return i;

}
18
lambdas & algorithms
// C++98
bool elem_in_range(int elem)
{
return elem > 0 && elem < 10;
}
vector<int>::const_iterator it =
find_if (vec.begin(), vec.end(), elem_in_range);

19
lambdas & algorithms
// C++11
auto it = find_if (begin(vec), end(vec),
[](int i) {
return i > 0 && i < 10;
});

20
lambdas & algorithms
// C++14
auto it = find_if (begin(vec), end(vec),
[](auto i) {
return i > 0 && i < 10;
});

21
lambdas & algorithms
C++14

[](auto i) { return i > 0 && i < 10; }

C#
(int i) => i > 0 && i < 10;

22
C++ o C#?!

var dati = new List<int>(){1,2,3,4,5};
auto dati = vector<int>{1,2,3,4,5};

23
initializer lists
// C++98
int arr[] = {1,2,3,4,5};
vector<int> data;
data.push_back(1);
data.push_back(2);
...
vector<int> data (arr, arr + 5);
24
initializer lists
// C++98
int arr[] = {1,2,3,4,5};
vector<int> data (arr, arr + 5);

// C++11
vector<int> data = {1,2,3,4,5};
// oppure (auto-everything syntax):

auto data = vector<int>{1,2,3,4,5};

25
initializer lists
C++98

C++11

vector<int> data;
data.push_back(1);
data.push_back(2);
data.push_back(3);
...

auto data = vector<int>{1,2,3,4,5};

C#

var dati = new List<int>() {1, 2, 3, 4, 5};

26
smart pointers
// C++98
{
Car* car = new Car(...);
...
car->Move();
...
delete car;
}
27
smart pointers
// C++98
{
Car* car = new Car(...);
...
car->Move();
throw exception(…)
...
delete car;
}
28
smart pointers
// C++98

Car *car = NULL;
try
{
car = new Car(...);
car->Move();
delete car;
}
catch(...)
{
delete car;
ASSERT(FALSE);
LOG(ERROR) << "critical";
throw;
}
29
smart pointers
// C++98

catch(...)
{
delete car;
ASSERT(FALSE);
LOG(ERROR) << "critical";

throw;
}

30
smart pointers
{ // C++11
unique_ptr<Car> car {new Car{arg1}};
...
car->Move();
...

} // delete automatico
// C++14
auto car = make_unique<Car>(arg1)
31
Outline
• C++11, benvenuto nel team!
– C++98  C++11 & snippet C#

• Il team cambia stile & coding standards
– Design patterns
– Multi-threaded C++

• Alcune linee guida
32
Modern C++: Factory
// C++98
IWriter* Create(...)
{
...
return new CoutWriter(...);
}
// chiamante:
IWriter* writer = Create (...);
...
delete writer;

33
Modern C++: Factory
// C++11
unique_ptr<IWriter> Create (...)
{
...
return unique_ptr<IWriter>(new CoutWriter(...));
}
// chiamante:

auto writer = Create(...);

34
Modern C++: Factory
// C++98
class WriterFactory
{
public:
IWriter* Create(const string& where)
{
if (where == "cout")
return new CoutWriter();
if (where == "dbgview")
return new DbgViewWriter();
if (where == " null")
return new NullWriter();
throw exception("where to write?");
}
};

35
Modern C++: Factory
// C++11-14
class WriterFactory
{
public:
unique_ptr<IWriter> Create(const string& where)
{
static map<string, function<unique_ptr<IWriter>()>> m =
{
{"cout", []{return make_unique<CoutWriter>()}},
{"dbgview", []{return make_unique<DbgViewWriter>()}},
{"null", []{return make_unique<NullWriter>()}}
};
return m.at(where)(); // può sollevare eccezione
// oppure una policy diversa
}
36
};
Modern C++: RAII & DEFER
bool FileExists(const char* path)
{
ifstream file{path}; // file.open()
return file.is_open();
} // file.close() automatico

37
Modern C++: RAII & DEFER
void SomeFuntion()
{
... Anything ...
Log("SomeFunction executed");
}

38
Modern C++: RAII & DEFER
void SomeFuntion()
{
... Anything ...

throw exception(…)

Log("SomeFunction executed");
}

39
Modern C++: RAII & DEFER
// go style
func SomeFuntion()
{
defer func() {
Log("SomeFunction executed")
}
... Anything ...
}

40
Modern C++: RAII & DEFER
void SomeFuntion()
{
defer d{ []{
Log("SomeFunction executed");
}};
... Anything ...
}

41
Modern C++: RAII & DEFER
class defer
{
function<void()> m_toExec;
public:
defer(function<void()> f) : m_toExec{f} { }

~defer()
{
m_toExec();
}
};
Qui una versione migliore e completa: http://www.italiancpp.org/2013/07/16/defer-con-raii-lambda/
42
Modern C++: RAII & DEFER

Live Demo
git clone https://ilpropheta@bitbucket.org/ilpropheta/iad2013.git

main.cpp: DeferTest

43
Outline
• C++11, benvenuto nel team!
– C++98  C++11 & snippet C#

• Il team cambia stile & coding standards
– Design patterns
– Multi-threaded C++

• Alcune linee guida
44
Multi-Threaded C++
int main()
{
vector<int> vec(100000);
iota(begin(vec), end(vec), 0); // 0 1 2 3 4 ...
int avg = 0;
thread t1 { [&]{
avg = accumulate(begin(vec), end(vec), 0)/vec.size();
}};
auto maxEl = max_element(begin(vec), end(vec));
t1.join();

cout << "max: " << *maxEl << endl;
cout << "avg: " << avg << endl;
}
45
Multi-Threaded C++

Live Demo
git clone https://ilpropheta@bitbucket.org/ilpropheta/iad2013.git

main.cpp: ThreadTest

46
Multi-Threaded C++
int main()
{
vector<int> vec(100000);
iota(begin(vec), end(vec), 0);
auto willbeAvg = async ( [&]{
return accumulate(begin(vec), end(vec), 0)/vec.size();
}};
cout << "max: " << *max_element(begin(vec), end(vec)) << endl;
cout << "avg: " << willbeAvg.get() << endl;
}

47
Multi-Threaded C++

Live Demo
git clone https://ilpropheta@bitbucket.org/ilpropheta/iad2013.git

main.cpp: FutureTest

48
Multi-Threaded C++

future

promise

get()

v

set_value(v)

Thread 1

Thread 2
49
Multi-Threaded C++

Live Demo
git clone https://ilpropheta@bitbucket.org/ilpropheta/iad2013.git

main.cpp: PromiseTest

50
Multi-Threaded C++: PPL

void vector_mult(vector<double>& v, double c)
{
for_each( begin(v), end(v),
[&](double& n) {
n *= c;
}
);
}

51
Multi-Threaded C++: PPL
#include <ppl.h>
using namespace Concurrency;
void vector_mult(vector<double>& v, double c)
{
parallel_for_each( begin(v), end(v),
[&](double& n) {
n *= c;
}
);
}

52
Multi-Threaded C++: PPL

Live Demo
git clone https://ilpropheta@bitbucket.org/ilpropheta/iad2013.git

PPLSesame.cpp

53
Outline
• C++11, benvenuto nel team!
– C++98  C++11 & snippet C#

• Il team cambia stile & coding standards
– Design patterns
– Multi-threaded C++

• Alcune linee guida
54
Alcune linee guida
• Devo migrare tutto subito?
– No, intanto assicurati di cosa supporta il tuo
compilatore.
– Inizia migrando le cose deprecate (e.g. auto_ptr).
– Aggiungi qualche test su quello che stai
modificando.
– Vale sempre il principio del boyscout…
55
Alcune linee guida
• Il mio compilatore non supporta alcune
feature del C++11. Che devo fare?
– Se puoi, pianifica una migrazione del compilatore.
– Individua cosa potrà beneficiare del C++11 e come
lo riscriveresti.
– Metti dei reminder per quando migrerai, tipo:
//TO-DO-CPP11: …
56
Alcune linee guida
• Il miglior consiglio per usare C++11/C++14?
– Provalo!
– Il materiale di qualità sul C++ è aumentato.
– Frequenta isocpp.org
– Frequenta italiancpp.org 

57
Marco & Paolo
Marco Arena
marco@italiancpp.org
http://marcoarena.wordpress.com
Paolo Polce
paolo@webshell.it
@paolopolce

webshell.it

agileworks.it
58
~talk() noexcept
{
answer_questions();
}

59
~talk() noexcept
{
answer_questions();
}
Quanto è nerd questa slide?

60
Grazie!

61
Bonus: non-member begin/end
// C++98
vector<int>::iterator it = vec.begin();
int arr[] = {1,2,3,4,5};
arr.begin(); // eh ???
// C++11
auto it = begin(vec);
auto it = begin(arr); // ok!
62
Bonus: make_unique (1)
// C++14
auto car = make_unique<Car>(arg1)
• auto-everything syntax
• Exception-safety:
void func(unique_ptr<Car> c1, unique_ptr<Car> c2);
func(unique_ptr<Car>{new Car{}}, unique_ptr<Car>{new Car{}});

• Le istruzioni per creare i due Car* possono essere riordinate
dal compilatore.
63
Bonus: make_unique (2)
func(unique_ptr<Car>{new Car{}}, unique_ptr<Car>{new Car{}});
Esempio di possibile esecuzione:

1. Allocazione memoria per la prima Car
2. Allocazione memoria per la seconda Car
3. Costruzione prima Car
4. Costruzione seconda Car
5. Costruzione primo unique_ptr
6. Costruzione secondo unique_ptr
Che succede se 4 tira un’eccezione? Memory leak della prima Car!

Se chiamiamo due funzioni (come make_unique), il compilatore è costretto
a fare 1,2,5 insieme e poi 3,4,6! Più dettagli a questo link (Sutter)
64
Ad

More Related Content

What's hot (20)

Dal waterfall allo scrum
Dal waterfall allo scrumDal waterfall allo scrum
Dal waterfall allo scrum
Raffaello Torraco
 
Scrum! Sopravvivere e gestire progetti tra polli, maiali e clienti
Scrum! Sopravvivere e gestire progetti tra polli, maiali e clientiScrum! Sopravvivere e gestire progetti tra polli, maiali e clienti
Scrum! Sopravvivere e gestire progetti tra polli, maiali e clienti
Marco Da Rin Zanco
 
Lezione 2: Pianificazione in Extreme Programming
Lezione 2: Pianificazione in Extreme ProgrammingLezione 2: Pianificazione in Extreme Programming
Lezione 2: Pianificazione in Extreme Programming
Andrea Della Corte
 
Agile in 45 minuti
Agile in 45 minutiAgile in 45 minuti
Agile in 45 minuti
Giulio Roggero
 
Agile@core - Scrum
Agile@core - ScrumAgile@core - Scrum
Agile@core - Scrum
Felice Pescatore
 
Scrum? E' come fare il bucato!
Scrum? E' come fare il bucato!Scrum? E' come fare il bucato!
Scrum? E' come fare il bucato!
Manuel Scapolan
 
Redistributable Intro To Scrum Ita
Redistributable Intro To Scrum ItaRedistributable Intro To Scrum Ita
Redistributable Intro To Scrum Ita
Luciano Benetti
 
Semplicemente Agile
Semplicemente AgileSemplicemente Agile
Semplicemente Agile
Stefano Gallotti
 
Lean anche io! No tu no! - Italian Agile Days 2013
Lean anche io! No tu no! - Italian Agile Days 2013Lean anche io! No tu no! - Italian Agile Days 2013
Lean anche io! No tu no! - Italian Agile Days 2013
Andrea Scavolini
 
2014 07-08 7° webinar pmi-rome agile scrum
2014 07-08 7° webinar pmi-rome agile scrum2014 07-08 7° webinar pmi-rome agile scrum
2014 07-08 7° webinar pmi-rome agile scrum
Emiliano Soldi
 
Introduzione a Scrum
Introduzione a ScrumIntroduzione a Scrum
Introduzione a Scrum
Giulio Roggero
 
Sviluppo Agile secondo l'approccio SCRUM
Sviluppo Agile secondo l'approccio SCRUMSviluppo Agile secondo l'approccio SCRUM
Sviluppo Agile secondo l'approccio SCRUM
Matteo Papadopoulos
 
Le pratiche ingegneristiche di eXtreme Programming
Le pratiche ingegneristiche di eXtreme ProgrammingLe pratiche ingegneristiche di eXtreme Programming
Le pratiche ingegneristiche di eXtreme Programming
Andrea Francia
 
Agile Project Management
Agile Project ManagementAgile Project Management
Agile Project Management
Giulio Roggero
 
Un Approccio Sistematico Ed Organizzato Allo Sviluppo Del Software
Un Approccio Sistematico Ed Organizzato Allo Sviluppo Del SoftwareUn Approccio Sistematico Ed Organizzato Allo Sviluppo Del Software
Un Approccio Sistematico Ed Organizzato Allo Sviluppo Del Software
Alessandro Martellone
 
Riccardo it starts_with_a_goal_DevOps_Heroes_Parma
Riccardo it starts_with_a_goal_DevOps_Heroes_ParmaRiccardo it starts_with_a_goal_DevOps_Heroes_Parma
Riccardo it starts_with_a_goal_DevOps_Heroes_Parma
Riccardo Porrini
 
Webinar: "Il database: l’equipaggiamento su cui fare affidamento"
Webinar: "Il database: l’equipaggiamento su cui fare affidamento"Webinar: "Il database: l’equipaggiamento su cui fare affidamento"
Webinar: "Il database: l’equipaggiamento su cui fare affidamento"
Emerasoft, solutions to collaborate
 
Scrum! Sopravvivere e gestire progetti tra polli, maiali e clienti
Scrum! Sopravvivere e gestire progetti tra polli, maiali e clientiScrum! Sopravvivere e gestire progetti tra polli, maiali e clienti
Scrum! Sopravvivere e gestire progetti tra polli, maiali e clienti
Marco Da Rin Zanco
 
Lezione 2: Pianificazione in Extreme Programming
Lezione 2: Pianificazione in Extreme ProgrammingLezione 2: Pianificazione in Extreme Programming
Lezione 2: Pianificazione in Extreme Programming
Andrea Della Corte
 
Scrum? E' come fare il bucato!
Scrum? E' come fare il bucato!Scrum? E' come fare il bucato!
Scrum? E' come fare il bucato!
Manuel Scapolan
 
Redistributable Intro To Scrum Ita
Redistributable Intro To Scrum ItaRedistributable Intro To Scrum Ita
Redistributable Intro To Scrum Ita
Luciano Benetti
 
Lean anche io! No tu no! - Italian Agile Days 2013
Lean anche io! No tu no! - Italian Agile Days 2013Lean anche io! No tu no! - Italian Agile Days 2013
Lean anche io! No tu no! - Italian Agile Days 2013
Andrea Scavolini
 
2014 07-08 7° webinar pmi-rome agile scrum
2014 07-08 7° webinar pmi-rome agile scrum2014 07-08 7° webinar pmi-rome agile scrum
2014 07-08 7° webinar pmi-rome agile scrum
Emiliano Soldi
 
Sviluppo Agile secondo l'approccio SCRUM
Sviluppo Agile secondo l'approccio SCRUMSviluppo Agile secondo l'approccio SCRUM
Sviluppo Agile secondo l'approccio SCRUM
Matteo Papadopoulos
 
Le pratiche ingegneristiche di eXtreme Programming
Le pratiche ingegneristiche di eXtreme ProgrammingLe pratiche ingegneristiche di eXtreme Programming
Le pratiche ingegneristiche di eXtreme Programming
Andrea Francia
 
Agile Project Management
Agile Project ManagementAgile Project Management
Agile Project Management
Giulio Roggero
 
Un Approccio Sistematico Ed Organizzato Allo Sviluppo Del Software
Un Approccio Sistematico Ed Organizzato Allo Sviluppo Del SoftwareUn Approccio Sistematico Ed Organizzato Allo Sviluppo Del Software
Un Approccio Sistematico Ed Organizzato Allo Sviluppo Del Software
Alessandro Martellone
 
Riccardo it starts_with_a_goal_DevOps_Heroes_Parma
Riccardo it starts_with_a_goal_DevOps_Heroes_ParmaRiccardo it starts_with_a_goal_DevOps_Heroes_Parma
Riccardo it starts_with_a_goal_DevOps_Heroes_Parma
Riccardo Porrini
 
Webinar: "Il database: l’equipaggiamento su cui fare affidamento"
Webinar: "Il database: l’equipaggiamento su cui fare affidamento"Webinar: "Il database: l’equipaggiamento su cui fare affidamento"
Webinar: "Il database: l’equipaggiamento su cui fare affidamento"
Emerasoft, solutions to collaborate
 

Viewers also liked (9)

From Vision To Product
From Vision To ProductFrom Vision To Product
From Vision To Product
Stefano Leli
 
Bravi si diventa
Bravi si diventaBravi si diventa
Bravi si diventa
Filippo Liverani
 
TDD anche su iOS
TDD anche su iOSTDD anche su iOS
TDD anche su iOS
Andrea Francia
 
Se “Embrace Change” è difficile.
Se “Embrace Change” è difficile.Se “Embrace Change” è difficile.
Se “Embrace Change” è difficile.
Fabio Mora
 
One, No One, One Hundred Thousand Projects (Uno, Nessuno, Centomila Progetti)
One, No One, One Hundred Thousand Projects (Uno, Nessuno, Centomila Progetti)One, No One, One Hundred Thousand Projects (Uno, Nessuno, Centomila Progetti)
One, No One, One Hundred Thousand Projects (Uno, Nessuno, Centomila Progetti)
Gaetano Mazzanti
 
When Tdd Goes Awry (IAD 2013)
When Tdd Goes Awry (IAD 2013)When Tdd Goes Awry (IAD 2013)
When Tdd Goes Awry (IAD 2013)
Uberto Barbini
 
Outcome not Output: A Story of Lean UX Adoption
Outcome not Output: A Story of Lean UX AdoptionOutcome not Output: A Story of Lean UX Adoption
Outcome not Output: A Story of Lean UX Adoption
Steve Maraspin
 
Agileday Coderetreat 2013
Agileday Coderetreat 2013Agileday Coderetreat 2013
Agileday Coderetreat 2013
Gabriele Lana
 
From Vision To Product
From Vision To ProductFrom Vision To Product
From Vision To Product
Stefano Leli
 
Se “Embrace Change” è difficile.
Se “Embrace Change” è difficile.Se “Embrace Change” è difficile.
Se “Embrace Change” è difficile.
Fabio Mora
 
One, No One, One Hundred Thousand Projects (Uno, Nessuno, Centomila Progetti)
One, No One, One Hundred Thousand Projects (Uno, Nessuno, Centomila Progetti)One, No One, One Hundred Thousand Projects (Uno, Nessuno, Centomila Progetti)
One, No One, One Hundred Thousand Projects (Uno, Nessuno, Centomila Progetti)
Gaetano Mazzanti
 
When Tdd Goes Awry (IAD 2013)
When Tdd Goes Awry (IAD 2013)When Tdd Goes Awry (IAD 2013)
When Tdd Goes Awry (IAD 2013)
Uberto Barbini
 
Outcome not Output: A Story of Lean UX Adoption
Outcome not Output: A Story of Lean UX AdoptionOutcome not Output: A Story of Lean UX Adoption
Outcome not Output: A Story of Lean UX Adoption
Steve Maraspin
 
Agileday Coderetreat 2013
Agileday Coderetreat 2013Agileday Coderetreat 2013
Agileday Coderetreat 2013
Gabriele Lana
 
Ad

Similar to Effective Code Transformations in C++ (20)

Pycon Jungle
Pycon JunglePycon Jungle
Pycon Jungle
guest6b08a5
 
Presentazione: uno studio sull'efficacia di checker automatici per la moderni...
Presentazione: uno studio sull'efficacia di checker automatici per la moderni...Presentazione: uno studio sull'efficacia di checker automatici per la moderni...
Presentazione: uno studio sull'efficacia di checker automatici per la moderni...
Idriss Riouak
 
Riepilogo Java C/C++
Riepilogo Java C/C++Riepilogo Java C/C++
Riepilogo Java C/C++
Pasquale Paola
 
Marco Arena - Perché nel 2015 parliamo ancora di C++? | Codemotion Milan 2015
Marco Arena - Perché nel 2015 parliamo ancora di C++? | Codemotion Milan 2015Marco Arena - Perché nel 2015 parliamo ancora di C++? | Codemotion Milan 2015
Marco Arena - Perché nel 2015 parliamo ancora di C++? | Codemotion Milan 2015
Codemotion
 
.Net 4.0 Preview @ UGIdotNet
.Net 4.0 Preview @ UGIdotNet.Net 4.0 Preview @ UGIdotNet
.Net 4.0 Preview @ UGIdotNet
Mauro Servienti
 
A brief intro to TDD for a JUG-TAA event
A brief intro to TDD for a JUG-TAA eventA brief intro to TDD for a JUG-TAA event
A brief intro to TDD for a JUG-TAA event
Pietro Di Bello
 
AlgoMOOC 05.01. La complessità computazionale
AlgoMOOC 05.01. La complessità computazionaleAlgoMOOC 05.01. La complessità computazionale
AlgoMOOC 05.01. La complessità computazionale
Alessandro Bogliolo
 
Hexagonal architecture ita
Hexagonal architecture itaHexagonal architecture ita
Hexagonal architecture ita
Alessandro Minoccheri
 
How create a single page apps using html5 and javascript
How create a single page apps using html5 and javascript How create a single page apps using html5 and javascript
How create a single page apps using html5 and javascript
Stefano Marchisio
 
PyPaPi Qt Java Framework
PyPaPi Qt Java FrameworkPyPaPi Qt Java Framework
PyPaPi Qt Java Framework
Tiziano Lattisi
 
Mobile APPs con Objective-C (iOS 3.1+) - Day 01/02
Mobile APPs con Objective-C (iOS 3.1+) - Day 01/02Mobile APPs con Objective-C (iOS 3.1+) - Day 01/02
Mobile APPs con Objective-C (iOS 3.1+) - Day 01/02
Alberto Pasca
 
Perl Template Toolkit
Perl Template ToolkitPerl Template Toolkit
Perl Template Toolkit
Stefano Rodighiero
 
Introduzione a TypeScript
Introduzione a TypeScriptIntroduzione a TypeScript
Introduzione a TypeScript
Sinergia Totale
 
DotNetToscana - Sessione TypeScript
DotNetToscana - Sessione TypeScriptDotNetToscana - Sessione TypeScript
DotNetToscana - Sessione TypeScript
Sinergia Totale
 
Yagwto
YagwtoYagwto
Yagwto
maraexception
 
#dd12 Applicazioni a tre voci (Android e Domino)
#dd12 Applicazioni a tre voci (Android e Domino)#dd12 Applicazioni a tre voci (Android e Domino)
#dd12 Applicazioni a tre voci (Android e Domino)
Dominopoint - Italian Lotus User Group
 
Una PA agile, funzionale e serverless: si può fare! by Federico Feroldi and D...
Una PA agile, funzionale e serverless: si può fare! by Federico Feroldi and D...Una PA agile, funzionale e serverless: si può fare! by Federico Feroldi and D...
Una PA agile, funzionale e serverless: si può fare! by Federico Feroldi and D...
Codemotion
 
Una PA agile, funzionale e serverless: si può fare! - Danilo Spinelli - Codem...
Una PA agile, funzionale e serverless: si può fare! - Danilo Spinelli - Codem...Una PA agile, funzionale e serverless: si può fare! - Danilo Spinelli - Codem...
Una PA agile, funzionale e serverless: si può fare! - Danilo Spinelli - Codem...
Codemotion
 
Una Pubblica Amministrazione Agile, Funzionale e Serverless: si può fare! - C...
Una Pubblica Amministrazione Agile, Funzionale e Serverless: si può fare! - C...Una Pubblica Amministrazione Agile, Funzionale e Serverless: si può fare! - C...
Una Pubblica Amministrazione Agile, Funzionale e Serverless: si può fare! - C...
Federico Feroldi
 
Presentazione: uno studio sull'efficacia di checker automatici per la moderni...
Presentazione: uno studio sull'efficacia di checker automatici per la moderni...Presentazione: uno studio sull'efficacia di checker automatici per la moderni...
Presentazione: uno studio sull'efficacia di checker automatici per la moderni...
Idriss Riouak
 
Marco Arena - Perché nel 2015 parliamo ancora di C++? | Codemotion Milan 2015
Marco Arena - Perché nel 2015 parliamo ancora di C++? | Codemotion Milan 2015Marco Arena - Perché nel 2015 parliamo ancora di C++? | Codemotion Milan 2015
Marco Arena - Perché nel 2015 parliamo ancora di C++? | Codemotion Milan 2015
Codemotion
 
.Net 4.0 Preview @ UGIdotNet
.Net 4.0 Preview @ UGIdotNet.Net 4.0 Preview @ UGIdotNet
.Net 4.0 Preview @ UGIdotNet
Mauro Servienti
 
A brief intro to TDD for a JUG-TAA event
A brief intro to TDD for a JUG-TAA eventA brief intro to TDD for a JUG-TAA event
A brief intro to TDD for a JUG-TAA event
Pietro Di Bello
 
AlgoMOOC 05.01. La complessità computazionale
AlgoMOOC 05.01. La complessità computazionaleAlgoMOOC 05.01. La complessità computazionale
AlgoMOOC 05.01. La complessità computazionale
Alessandro Bogliolo
 
How create a single page apps using html5 and javascript
How create a single page apps using html5 and javascript How create a single page apps using html5 and javascript
How create a single page apps using html5 and javascript
Stefano Marchisio
 
PyPaPi Qt Java Framework
PyPaPi Qt Java FrameworkPyPaPi Qt Java Framework
PyPaPi Qt Java Framework
Tiziano Lattisi
 
Mobile APPs con Objective-C (iOS 3.1+) - Day 01/02
Mobile APPs con Objective-C (iOS 3.1+) - Day 01/02Mobile APPs con Objective-C (iOS 3.1+) - Day 01/02
Mobile APPs con Objective-C (iOS 3.1+) - Day 01/02
Alberto Pasca
 
Introduzione a TypeScript
Introduzione a TypeScriptIntroduzione a TypeScript
Introduzione a TypeScript
Sinergia Totale
 
DotNetToscana - Sessione TypeScript
DotNetToscana - Sessione TypeScriptDotNetToscana - Sessione TypeScript
DotNetToscana - Sessione TypeScript
Sinergia Totale
 
Una PA agile, funzionale e serverless: si può fare! by Federico Feroldi and D...
Una PA agile, funzionale e serverless: si può fare! by Federico Feroldi and D...Una PA agile, funzionale e serverless: si può fare! by Federico Feroldi and D...
Una PA agile, funzionale e serverless: si può fare! by Federico Feroldi and D...
Codemotion
 
Una PA agile, funzionale e serverless: si può fare! - Danilo Spinelli - Codem...
Una PA agile, funzionale e serverless: si può fare! - Danilo Spinelli - Codem...Una PA agile, funzionale e serverless: si può fare! - Danilo Spinelli - Codem...
Una PA agile, funzionale e serverless: si può fare! - Danilo Spinelli - Codem...
Codemotion
 
Una Pubblica Amministrazione Agile, Funzionale e Serverless: si può fare! - C...
Una Pubblica Amministrazione Agile, Funzionale e Serverless: si può fare! - C...Una Pubblica Amministrazione Agile, Funzionale e Serverless: si può fare! - C...
Una Pubblica Amministrazione Agile, Funzionale e Serverless: si può fare! - C...
Federico Feroldi
 
Ad

Effective Code Transformations in C++