SlideShare una empresa de Scribd logo
1 de 44
Descargar para leer sin conexión
@MauriceNaftalin @JosePaumard
The Sincerest Form of
Flattery
Maurice Naftalin José Paumard
@MauriceNaftalin @JosePaumard
@MauriceNaftalin @JosePaumard
Maurice Naftalin
Java 5 Java 8
2013 2014 2015 2017
@MauriceNaftalin @JosePaumard
Maurice Naftalin
Developer and Technology
Evangelist, CDG Group
https://groupcdg.com
@MauriceNaftalin @JosePaumard
@JosePaumard
https://josepaumard.github.io https://github.com/JosePaumard
https://www.pluralsight.com/authors/jose-paumard
https://www.slideshare.net/jpaumard
https://www.youtube.com/user/JPaumard
@MauriceNaftalin @JosePaumard
JAlba
@JAlbaUnconf
https://jalba.scot/
@MauriceNaftalin @JosePaumard
Functional Programming: Elegant,
Mathematically Sound
Higher Order Functions
(Lisp, 1958)
Parametric Polymorphism
(ML, 1975)
Pattern Matching
(Caml, 1985)
But often not practicable
@MauriceNaftalin @JosePaumard
Object-Oriented Languages:
Successful but Envious
From the 1980s, OO languages
dominated
• Subtype Polymorphism,
Inheritance
• Strong Static Typing
• Automatic Memory Management
@MauriceNaftalin @JosePaumard
Object-Oriented Languages:
Successful but Envious
From the 1980s, OO languages
dominated
• Subtype Polymorphism,
Inheritance
• Strong Static Typing
• Automatic Memory Management
But they always suffered feature
envy
@MauriceNaftalin @JosePaumard
Object-Oriented Languages:
Successful but Envious
From the 1980s, OO languages
dominated
• Subtype Polymorphism,
Inheritance
• Strong Static Typing
• Automatic Memory Management
But they always suffered feature
envy
@MauriceNaftalin @JosePaumard@MauriceNaftalin @JosePaumard
So, Pizza!
Java
+
Generics + Higher Order Functions + Pattern-Matching
Pizza =
@MauriceNaftalin @JosePaumard
Pizza
(1997)
Generic Java
(1998)
Java 5
(2004)
Scala
(2003)
@MauriceNaftalin @JosePaumard@MauriceNaftalin @JosePaumard
Java Ate Pizza in Three Courses
- Parametric Polymorphism in 2004
- Higher Order Functions in 2014
- Pattern Matching 20x☺
@MauriceNaftalin @JosePaumard@MauriceNaftalin @JosePaumard
Scala Ate Pizza In One Bite
Scala used all of those in 2004
Much earlier than Java
– No need for backward compatibility!
@MauriceNaftalin @JosePaumard@MauriceNaftalin @JosePaumard
Part 1: Generics
@MauriceNaftalin @JosePaumard@MauriceNaftalin @JosePaumard
Generics – Stating the problems
Problem 1: Type information availability at runtime
What you want to write:
vs. what you have to write:
List<Integer> ints = ...;
Integer[] intArray = ints.toArray();
List<Integer> ints = ...;
Integer[] intArray = ints.toArray(Integer[]::new);
@MauriceNaftalin @JosePaumard@MauriceNaftalin @JosePaumard
Generics – Stating the problems
Problem 2: Array subtyping
This code was allowed from JDK1.0:
Covariance: Integer[] is a subtype of Number[]
Integer[] ints = ...;
Number[] numbers = ints;
@MauriceNaftalin @JosePaumard@MauriceNaftalin @JosePaumard
Generics – Stating the problems
Problem 2: Array subtyping
This code was allowed from JDK1.0:
Covariance: Integer[] is a subtype of Number[]
Adopted to make generic methods possible:
Integer[] ints = ...;
Number[] numbers = ints;
Arrays.sort(Object[] objects); // can be called with Integer[]
@MauriceNaftalin @JosePaumard@MauriceNaftalin @JosePaumard
Generics – Stating the problems
But then the problem is: you can write this code:
That throws an ArrayStoreException
Covariance is only good for getting things out from a
container, not putting them in
numbers[0] = 3.14;
@MauriceNaftalin @JosePaumard@MauriceNaftalin @JosePaumard
Type Erasure in Generic Java
Type erasure consists in replacing the parameter type with
its bound in the class file
Adopted for backwards compatibility with legacy
ungenerified libraries
@MauriceNaftalin @JosePaumard@MauriceNaftalin @JosePaumard
Type Erasure in Generic Java
There is no T in the class file
public class Holder<T> {
private T t;
public Holder(T t)
public void set(T t)
}
public class Holder {
private Object t;
public Holder(Object t)
public void set(Object t)
}
@MauriceNaftalin @JosePaumard@MauriceNaftalin @JosePaumard
Type Erasure: How does it Work?
So the compiler is doing the type checking
And it also adds casts when needed
Holder<String> holder = new Holder<String>();
holder.set(10); // Compiler error
String result = holder.get(); String result = (String)holder.get();
@MauriceNaftalin @JosePaumard@MauriceNaftalin @JosePaumard
Type Erasure vs. Inheritance
How is inheritance handled?
public class StringHolder extends
Holder<String> {
private String s;
public StringHolder(String s) {
...
}
public void set(String s) {
...
}
}
public set(String):void
public synthetic bridge set(Object):void
CHECKCAST String
INVOKEVIRTUAL set(String):void
@MauriceNaftalin @JosePaumard@MauriceNaftalin @JosePaumard
Type Erasure vs. Inheritance
How is inheritance handled?
public class Holder<T> {
private T t;
public Holder(T t) {
this.t = t;
}
public T get() {
return this.t;
}
}
public class StringHolder extends
Holder<String> {
private String s;
public StringHolder(String s) {
super(s);
}
public String get() {
return super.get();
}
}
@MauriceNaftalin @JosePaumard@MauriceNaftalin @JosePaumard
How about Arrays?
Suppose the array is an array of generics
It would be nice to have an ArrayStoreException
But the array is in fact an array of erased holders
So… arrays of generics can’t be created in Java
Holder<String>[] stringHolders = new Holder<String>[10];
Object[] objects = stringHolders;
objects[0] = new Holder<Integer>(10); // ArrayStoreException?
@MauriceNaftalin @JosePaumard@MauriceNaftalin @JosePaumard
How about List in Java?
Covariance is problematic, so what can we use for
collections?
List<Integer> cannot be a subtype of List<Number>
Because we know that this code cannot work
List<Integer> ints = ...;
List<Number> numbers = ints;
numbers.add(3.14d);
@MauriceNaftalin @JosePaumard@MauriceNaftalin @JosePaumard
How about List?
If List<Integer> is not a subtype of List<Number>…
Without generic methods, how many sort() overloads
will we need?
sort(List<Number> numbers)
sort(List<Integer> ints)
... 
@MauriceNaftalin @JosePaumard@MauriceNaftalin @JosePaumard
Wildcards to the rescue! (really?)
We need a list that accepts Number and any subtype of
Number
So now we can have one method
List<? extends Number> numbers
sort(List<Number> numbers)
sort(List<Integer> ints)
sort(List<? extends Number> numbers)
@MauriceNaftalin @JosePaumard@MauriceNaftalin @JosePaumard
Wildcards to the rescue! (really?)
We need a list that accepts Number and any subtype of
Number
So now we have one method
Covariance works here, because the method retrieves
values
List<? extends Number> numbers
sort(List<Number> numbers)
sort(List<Integer> ints)
sort(List<? extends Number> numbers)
@MauriceNaftalin @JosePaumard@MauriceNaftalin @JosePaumard
Generics in Scala
New language, free of constraints on Java:
• New collections library, defined according to their use:
• Immutable structures can be declared as covariant in their
component type
• Declaration-site variance simplifies client code
class Pair[+T](val fst: T, val snd: T)
def toStrng(p: Pair[AnyVal]){…}
toStrng(new Pair(1, 2))
toStrng(new Pair("one", "two"))
class Pair<T> {
Pair(T fst, T snd) {...}
}
void toStrng(Pair<?> p){...}
Java
@MauriceNaftalin @JosePaumard@MauriceNaftalin @JosePaumard
Part 2: Closures and Lambdas
@MauriceNaftalin @JosePaumard@MauriceNaftalin @JosePaumard
Closures: What Pizza Did
How to include in Java, which does not have explicit
function types?
Solution: for each function, create an abstract class with
an apply method.
Capturing non-final local variables? They sat on the fence!
@MauriceNaftalin @JosePaumard@MauriceNaftalin @JosePaumard
Closures in Pizza
Functions as first-class citizens: the essence of FP
Higher-order functions originally from l-calculus / LISP
max(List<S>, (S, S) => boolean) => S
max(List.of("one", "three"), (s0, s1) -> s0.length() > s1.length())
// returns "three"
@MauriceNaftalin @JosePaumard@MauriceNaftalin @JosePaumard
Closures Lambdas in Java
2006 debate over whether to introduce a function type.
Eventually resolved in favour of using a Single Abstract
Method Interface (Functional Interface)
No change in the type system: it preserves the nominal
typing and simplicity of language
Capture of non-final local variables prevented, to preserve
thread safety
@MauriceNaftalin @JosePaumard@MauriceNaftalin @JosePaumard
Closures in Scala
Function types (structural) fundamental element of the
type system.
Closures in Scala can capture vars
How does it work with concurrency?
Short answer: it doesn’t. You have to do the work!
@MauriceNaftalin @JosePaumard@MauriceNaftalin @JosePaumard
Partial Application in Scala
One fundamental operation in Functional Programming is
Partial Application, achieved by currying
def partialApplication(bi: (String, String) => Int, word: String) {
return s => bi(word, s)
}
val bi: = (word: String, s: String) => word.indexOf(s)
val f: String => Integer = partialApplication(_.indexOf(_), "Hello")
val bi: = (word: String)(s: String) => word.indexOf(s)
val f: String => Integer = bi("Hello")
@MauriceNaftalin @JosePaumard@MauriceNaftalin @JosePaumard
Partial Application in Java
The same thing is done in Java with bound method
references
Function<String, Integer> partialApplication(
BiFunction<String, String, Integer> biFunction, String word) {
return s -> bi.apply(word, s);
}
BiFunction<String, String, Integer> bi = (word, s) -> word.indexOf(s);
var f = partialApplication(String::indexOf, "Hello");
Function<String, Integer> f = "Hello"::indexOf;
@MauriceNaftalin @JosePaumard@MauriceNaftalin @JosePaumard
Part 3: Pattern Matching
@MauriceNaftalin @JosePaumard@MauriceNaftalin @JosePaumard
Pattern Matching in Pizza
Just a switch on types already with deconstruction
class Vehicle {
case Car(String color);
case Bus();
}
static int capacity(Vehicle vehicle) {
switch(vehicle) {
case Car(color):
return "red".equals(color)? 20: 4; // red cars are BIG!
case Bus:
return 12;
}
}
@MauriceNaftalin @JosePaumard@MauriceNaftalin @JosePaumard
Pattern Matching in Scala
Match expression on types with deconstruction,
no exhaustiveness check
sealed trait Vehicle;
case class Car(String color) extends Vehicle
case object Bus extends Vehicle
def capacity(vehicle: Vehicle) {
return vehicle match {
case Car(color) => "red".equals(color)? 20: 4
case Bus => 12
}
}
@MauriceNaftalin @JosePaumard@MauriceNaftalin @JosePaumard
Pattern Matching in Java
Switch expression on types with deconstruction and
exhaustiveness check
sealed interface Vehicle {
record Car(String color) implements Vehicle {}
static class Bus implements Vehicle {}
}
static int capacity(Vehicle vehicle) {
return switch(vehicle) {
case Car("red") -> 20;
case Car(var color) -> 4;
case Bus -> 12;
};
}
@MauriceNaftalin @JosePaumard@MauriceNaftalin @JosePaumard
Conclusion
Language design is really complicated!
Backwards compatibility makes it even more complicated
Java has to take it very seriously
Scala has chosen fast language evolution over backwards
compatibility
Both viewpoints have their advantage!
@MauriceNaftalin @JosePaumard@MauriceNaftalin @JosePaumard
Conclusion
« We don’t want to be the first to
include a feature, because every
feature we add will never be
removed »
Brian Goetz,
Java Language Architect
@MauriceNaftalin @JosePaumard
Thank you!
Maurice Naftalin José Paumard
@mauricenaftalin @JosePaumard
@MauriceNaftalin @JosePaumard

Más contenido relacionado

La actualidad más candente

Java 8 Streams & Collectors : the Leuven edition
Java 8 Streams & Collectors : the Leuven editionJava 8 Streams & Collectors : the Leuven edition
Java 8 Streams & Collectors : the Leuven edition
José Paumard
 

La actualidad más candente (20)

Java 8 Stream API and RxJava Comparison
Java 8 Stream API and RxJava ComparisonJava 8 Stream API and RxJava Comparison
Java 8 Stream API and RxJava Comparison
 
Java 8 Streams and Rx Java Comparison
Java 8 Streams and Rx Java ComparisonJava 8 Streams and Rx Java Comparison
Java 8 Streams and Rx Java Comparison
 
Lambdas and Streams Master Class Part 2
Lambdas and Streams Master Class Part 2Lambdas and Streams Master Class Part 2
Lambdas and Streams Master Class Part 2
 
Java Full Throttle
Java Full ThrottleJava Full Throttle
Java Full Throttle
 
Java SE 8 for Java EE developers
Java SE 8 for Java EE developersJava SE 8 for Java EE developers
Java SE 8 for Java EE developers
 
Java 8 Streams & Collectors : the Leuven edition
Java 8 Streams & Collectors : the Leuven editionJava 8 Streams & Collectors : the Leuven edition
Java 8 Streams & Collectors : the Leuven edition
 
Introduction to Python - Part Two
Introduction to Python - Part TwoIntroduction to Python - Part Two
Introduction to Python - Part Two
 
Autumn collection JavaOne 2014
Autumn collection JavaOne 2014Autumn collection JavaOne 2014
Autumn collection JavaOne 2014
 
JFokus 50 new things with java 8
JFokus 50 new things with java 8JFokus 50 new things with java 8
JFokus 50 new things with java 8
 
Asynchronous API in Java8, how to use CompletableFuture
Asynchronous API in Java8, how to use CompletableFutureAsynchronous API in Java8, how to use CompletableFuture
Asynchronous API in Java8, how to use CompletableFuture
 
Python
PythonPython
Python
 
The Swift Compiler and Standard Library
The Swift Compiler and Standard LibraryThe Swift Compiler and Standard Library
The Swift Compiler and Standard Library
 
Collectors in the Wild
Collectors in the WildCollectors in the Wild
Collectors in the Wild
 
python.ppt
python.pptpython.ppt
python.ppt
 
Java Class Design
Java Class DesignJava Class Design
Java Class Design
 
Functional Thinking - Programming with Lambdas in Java 8
Functional Thinking - Programming with Lambdas in Java 8Functional Thinking - Programming with Lambdas in Java 8
Functional Thinking - Programming with Lambdas in Java 8
 
Introduction to Python - Part Three
Introduction to Python - Part ThreeIntroduction to Python - Part Three
Introduction to Python - Part Three
 
Java 8 Stream API (Valdas Zigas)
Java 8 Stream API (Valdas Zigas)Java 8 Stream API (Valdas Zigas)
Java 8 Stream API (Valdas Zigas)
 
Functional Programming In Java
Functional Programming In JavaFunctional Programming In Java
Functional Programming In Java
 
Functional programming in java
Functional programming in javaFunctional programming in java
Functional programming in java
 

Similar a The Sincerest Form of Flattery

Scala Language Intro - Inspired by the Love Game
Scala Language Intro - Inspired by the Love GameScala Language Intro - Inspired by the Love Game
Scala Language Intro - Inspired by the Love Game
Antony Stubbs
 
Washington Practitioners Significant Changes To Rpc 1.5
Washington Practitioners Significant Changes To Rpc 1.5Washington Practitioners Significant Changes To Rpc 1.5
Washington Practitioners Significant Changes To Rpc 1.5
Oregon Law Practice Management
 
Paulo Freire Pedagpogia 1
Paulo Freire Pedagpogia 1Paulo Freire Pedagpogia 1
Paulo Freire Pedagpogia 1
Alejandra Perez
 
Jerry Shea Resume And Addendum 5 2 09
Jerry  Shea Resume And Addendum 5 2 09Jerry  Shea Resume And Addendum 5 2 09
Jerry Shea Resume And Addendum 5 2 09
gshea11
 

Similar a The Sincerest Form of Flattery (20)

Scala Language Intro - Inspired by the Love Game
Scala Language Intro - Inspired by the Love GameScala Language Intro - Inspired by the Love Game
Scala Language Intro - Inspired by the Love Game
 
The things we don't see – stories of Software, Scala and Akka
The things we don't see – stories of Software, Scala and AkkaThe things we don't see – stories of Software, Scala and Akka
The things we don't see – stories of Software, Scala and Akka
 
Scalding for Hadoop
Scalding for HadoopScalding for Hadoop
Scalding for Hadoop
 
7-clean-code
7-clean-code7-clean-code
7-clean-code
 
Introduction To Scala
Introduction To ScalaIntroduction To Scala
Introduction To Scala
 
Javaslang Talk @ Javaland 2017
Javaslang Talk @ Javaland 2017Javaslang Talk @ Javaland 2017
Javaslang Talk @ Javaland 2017
 
JAVA Tutorial- Do's and Don'ts of Java programming
JAVA Tutorial- Do's and Don'ts of Java programmingJAVA Tutorial- Do's and Don'ts of Java programming
JAVA Tutorial- Do's and Don'ts of Java programming
 
JAVA Tutorial- Do's and Don'ts of Java programming
JAVA Tutorial- Do's and Don'ts of Java programmingJAVA Tutorial- Do's and Don'ts of Java programming
JAVA Tutorial- Do's and Don'ts of Java programming
 
A Gentle Introduction to Coding ... with Python
A Gentle Introduction to Coding ... with PythonA Gentle Introduction to Coding ... with Python
A Gentle Introduction to Coding ... with Python
 
concurrency with GPars
concurrency with GParsconcurrency with GPars
concurrency with GPars
 
Trying to learn C# (NDC Oslo 2019)
Trying to learn C# (NDC Oslo 2019)Trying to learn C# (NDC Oslo 2019)
Trying to learn C# (NDC Oslo 2019)
 
MMBJ Shanzhai Culture
MMBJ Shanzhai CultureMMBJ Shanzhai Culture
MMBJ Shanzhai Culture
 
Washington Practitioners Significant Changes To Rpc 1.5
Washington Practitioners Significant Changes To Rpc 1.5Washington Practitioners Significant Changes To Rpc 1.5
Washington Practitioners Significant Changes To Rpc 1.5
 
Paulo Freire Pedagpogia 1
Paulo Freire Pedagpogia 1Paulo Freire Pedagpogia 1
Paulo Freire Pedagpogia 1
 
Jerry Shea Resume And Addendum 5 2 09
Jerry  Shea Resume And Addendum 5 2 09Jerry  Shea Resume And Addendum 5 2 09
Jerry Shea Resume And Addendum 5 2 09
 
Majlis Persaraan Pn.Hjh.Normah bersama guru-guru Sesi Petang
Majlis Persaraan Pn.Hjh.Normah bersama guru-guru Sesi PetangMajlis Persaraan Pn.Hjh.Normah bersama guru-guru Sesi Petang
Majlis Persaraan Pn.Hjh.Normah bersama guru-guru Sesi Petang
 
Agapornis Mansos - www.criadourosudica.blogspot.com
Agapornis Mansos - www.criadourosudica.blogspot.comAgapornis Mansos - www.criadourosudica.blogspot.com
Agapornis Mansos - www.criadourosudica.blogspot.com
 
LoteríA Correcta
LoteríA CorrectaLoteríA Correcta
LoteríA Correcta
 
Open Problems in Automatically Refactoring Legacy Java Software to use New Fe...
Open Problems in Automatically Refactoring Legacy Java Software to use New Fe...Open Problems in Automatically Refactoring Legacy Java Software to use New Fe...
Open Problems in Automatically Refactoring Legacy Java Software to use New Fe...
 
Lazy Java
Lazy JavaLazy Java
Lazy Java
 

Más de José Paumard

Más de José Paumard (17)

Loom Virtual Threads in the JDK 19
Loom Virtual Threads in the JDK 19Loom Virtual Threads in the JDK 19
Loom Virtual Threads in the JDK 19
 
From Java 11 to 17 and beyond.pdf
From Java 11 to 17 and beyond.pdfFrom Java 11 to 17 and beyond.pdf
From Java 11 to 17 and beyond.pdf
 
The Future of Java: Records, Sealed Classes and Pattern Matching
The Future of Java: Records, Sealed Classes and Pattern MatchingThe Future of Java: Records, Sealed Classes and Pattern Matching
The Future of Java: Records, Sealed Classes and Pattern Matching
 
Deep Dive Java 17 Devoxx UK
Deep Dive Java 17 Devoxx UKDeep Dive Java 17 Devoxx UK
Deep Dive Java 17 Devoxx UK
 
Designing functional and fluent API: application to some GoF patterns
Designing functional and fluent API: application to some GoF patternsDesigning functional and fluent API: application to some GoF patterns
Designing functional and fluent API: application to some GoF patterns
 
Designing functional and fluent API: example of the Visitor Pattern
Designing functional and fluent API: example of the Visitor PatternDesigning functional and fluent API: example of the Visitor Pattern
Designing functional and fluent API: example of the Visitor Pattern
 
Construire son JDK en 10 étapes
Construire son JDK en 10 étapesConstruire son JDK en 10 étapes
Construire son JDK en 10 étapes
 
Java Keeps Throttling Up!
Java Keeps Throttling Up!Java Keeps Throttling Up!
Java Keeps Throttling Up!
 
Asynchronous Systems with Fn Flow
Asynchronous Systems with Fn FlowAsynchronous Systems with Fn Flow
Asynchronous Systems with Fn Flow
 
JAX-RS and CDI Bike the (Reactive) Bridge
JAX-RS and CDI Bike the (Reactive) BridgeJAX-RS and CDI Bike the (Reactive) Bridge
JAX-RS and CDI Bike the (Reactive) Bridge
 
Streams in the wild
Streams in the wildStreams in the wild
Streams in the wild
 
JAX RS and CDI bike the reactive bridge
JAX RS and CDI bike the reactive bridgeJAX RS and CDI bike the reactive bridge
JAX RS and CDI bike the reactive bridge
 
L'API Collector dans tous ses états
L'API Collector dans tous ses étatsL'API Collector dans tous ses états
L'API Collector dans tous ses états
 
ArrayList et LinkedList sont dans un bateau
ArrayList et LinkedList sont dans un bateauArrayList et LinkedList sont dans un bateau
ArrayList et LinkedList sont dans un bateau
 
Java SE 8 for Java EE developers
Java SE 8 for Java EE developersJava SE 8 for Java EE developers
Java SE 8 for Java EE developers
 
API Asynchrones en Java 8
API Asynchrones en Java 8API Asynchrones en Java 8
API Asynchrones en Java 8
 
Les Streams sont parmi nous
Les Streams sont parmi nousLes Streams sont parmi nous
Les Streams sont parmi nous
 

Último

Seal of Good Local Governance (SGLG) 2024Final.pptx
Seal of Good Local Governance (SGLG) 2024Final.pptxSeal of Good Local Governance (SGLG) 2024Final.pptx
Seal of Good Local Governance (SGLG) 2024Final.pptx
negromaestrong
 

Último (20)

Third Battle of Panipat detailed notes.pptx
Third Battle of Panipat detailed notes.pptxThird Battle of Panipat detailed notes.pptx
Third Battle of Panipat detailed notes.pptx
 
Micro-Scholarship, What it is, How can it help me.pdf
Micro-Scholarship, What it is, How can it help me.pdfMicro-Scholarship, What it is, How can it help me.pdf
Micro-Scholarship, What it is, How can it help me.pdf
 
Python Notes for mca i year students osmania university.docx
Python Notes for mca i year students osmania university.docxPython Notes for mca i year students osmania university.docx
Python Notes for mca i year students osmania university.docx
 
This PowerPoint helps students to consider the concept of infinity.
This PowerPoint helps students to consider the concept of infinity.This PowerPoint helps students to consider the concept of infinity.
This PowerPoint helps students to consider the concept of infinity.
 
Seal of Good Local Governance (SGLG) 2024Final.pptx
Seal of Good Local Governance (SGLG) 2024Final.pptxSeal of Good Local Governance (SGLG) 2024Final.pptx
Seal of Good Local Governance (SGLG) 2024Final.pptx
 
General Principles of Intellectual Property: Concepts of Intellectual Proper...
General Principles of Intellectual Property: Concepts of Intellectual  Proper...General Principles of Intellectual Property: Concepts of Intellectual  Proper...
General Principles of Intellectual Property: Concepts of Intellectual Proper...
 
Understanding Accommodations and Modifications
Understanding  Accommodations and ModificationsUnderstanding  Accommodations and Modifications
Understanding Accommodations and Modifications
 
Mixin Classes in Odoo 17 How to Extend Models Using Mixin Classes
Mixin Classes in Odoo 17  How to Extend Models Using Mixin ClassesMixin Classes in Odoo 17  How to Extend Models Using Mixin Classes
Mixin Classes in Odoo 17 How to Extend Models Using Mixin Classes
 
How to Create and Manage Wizard in Odoo 17
How to Create and Manage Wizard in Odoo 17How to Create and Manage Wizard in Odoo 17
How to Create and Manage Wizard in Odoo 17
 
ComPTIA Overview | Comptia Security+ Book SY0-701
ComPTIA Overview | Comptia Security+ Book SY0-701ComPTIA Overview | Comptia Security+ Book SY0-701
ComPTIA Overview | Comptia Security+ Book SY0-701
 
Basic Civil Engineering first year Notes- Chapter 4 Building.pptx
Basic Civil Engineering first year Notes- Chapter 4 Building.pptxBasic Civil Engineering first year Notes- Chapter 4 Building.pptx
Basic Civil Engineering first year Notes- Chapter 4 Building.pptx
 
UGC NET Paper 1 Mathematical Reasoning & Aptitude.pdf
UGC NET Paper 1 Mathematical Reasoning & Aptitude.pdfUGC NET Paper 1 Mathematical Reasoning & Aptitude.pdf
UGC NET Paper 1 Mathematical Reasoning & Aptitude.pdf
 
Introduction to Nonprofit Accounting: The Basics
Introduction to Nonprofit Accounting: The BasicsIntroduction to Nonprofit Accounting: The Basics
Introduction to Nonprofit Accounting: The Basics
 
Mehran University Newsletter Vol-X, Issue-I, 2024
Mehran University Newsletter Vol-X, Issue-I, 2024Mehran University Newsletter Vol-X, Issue-I, 2024
Mehran University Newsletter Vol-X, Issue-I, 2024
 
How to Give a Domain for a Field in Odoo 17
How to Give a Domain for a Field in Odoo 17How to Give a Domain for a Field in Odoo 17
How to Give a Domain for a Field in Odoo 17
 
On National Teacher Day, meet the 2024-25 Kenan Fellows
On National Teacher Day, meet the 2024-25 Kenan FellowsOn National Teacher Day, meet the 2024-25 Kenan Fellows
On National Teacher Day, meet the 2024-25 Kenan Fellows
 
Spatium Project Simulation student brief
Spatium Project Simulation student briefSpatium Project Simulation student brief
Spatium Project Simulation student brief
 
ICT role in 21st century education and it's challenges.
ICT role in 21st century education and it's challenges.ICT role in 21st century education and it's challenges.
ICT role in 21st century education and it's challenges.
 
Making communications land - Are they received and understood as intended? we...
Making communications land - Are they received and understood as intended? we...Making communications land - Are they received and understood as intended? we...
Making communications land - Are they received and understood as intended? we...
 
PROCESS RECORDING FORMAT.docx
PROCESS      RECORDING        FORMAT.docxPROCESS      RECORDING        FORMAT.docx
PROCESS RECORDING FORMAT.docx
 

The Sincerest Form of Flattery