SlideShare uma empresa Scribd logo
1 de 127
Baixar para ler offline
Walmyr Carvalho
#KotlinCommunitySummit
Kotlin no Android:
Desbravando as oportunidades de ponta a ponta!
+
Walmyr Carvalho
@walmyrcarvalho
Contexto
Um fato: Kotlin veio pra ficar! ❤
2ª linguagem mais amada - StackOverflow Developer Survey 2018
bit.ly/2Mc6HMa
Kotlin
- Criada pela JetBrains e anunciada publicamente em 2012
- Open Source (Apache 2.0)
- Suporta compilação pra JVM, JS e nativo
- Null-safety por design
E como a gente pode usar Kotlin nas nossas aplicações?
Será que podemos ir mais longe com Kotlin no Android?
Oportunidades
Podemos utilizar Kotlin em diversas
camadas da nossa aplicação Android:
Geral
UI
Async
Testes
Build
Kotlin + Android KTX
Anko + Kotlin Android
Extensions (kotlinx)
Coroutines
Spek + MockK
Geral
UI
Async
Testes
Build
Gradle Kotlin DSL +
Detekt
Android KTX
O Android KTX é um conjunto de extension functions criadas pelo Google
para otimizar o desenvolvimento de tarefas comuns do Android.
Android KTX - GitHub
github.com/android/android-ktx
Módulo (artefato) Versão Pacotes
androidx.core:core-ktx 1.0.0-alpha1 Todos os pacotes core abaixo
androidx.fragment:fragment-ktx 1.0.0-alpha1 androidx.fragment.app
androidx.palette:palette-ktx 1.0.0-alpha1 androidx.palette.graphics
androidx.sqlite:sqlite-ktx 1.0.0-alpha1 androidx.sqlite.db
androidx.collection:collection-ktx 1.0.0-alpha1 androidx.collection
androidx.lifecycle:lifecycle-viewmodel-ktx 2.0.0-alpha1 androidx.lifecycle
androidx.lifecycle:lifecycle-reactivestreams-ktx 2.0.0-alpha1 androidx.lifecycle
android.arch.navigation:navigation-common-ktx 1.0.0-alpha01 androidx.navigation
android.arch.navigation:navigation-fragment-ktx 1.0.0-alpha01 androidx.navigation.fragment
android.arch.navigation:navigation-runtime-ktx 1.0.0-alpha01 androidx.navigation
android.arch.navigation:navigation-testing-ktx 1.0.0-alpha01 androidx.navigation.testing
android.arch.navigation:navigation-ui-ktx 1.0.0-alpha01 androidx.navigation.ui
android.arch.work:work-runtime-ktx 1.0.0-alpha01 androidx.work.ktx
Fonte: developer.android.com/kotlin/ktx
repositories {
google()
}
build.gradle
dependencies {
implementation ‘androidx.core:core-ktx:$ktx_version’
}
app/build.gradle
// Kotlin
db.beginTransaction()
try {
// insira os dados
db.setTransactionSuccessful()
} finally {
db.endTransaction()
}
// Kotlin + Android KTX
db.transaction {
// insira os dados
}
Mas… como é a implementação disso?
inline fun <T> SQLiteDatabase.transaction(
exclusive: Boolean = true,
body: SQLiteDatabase.() -> T
): T {
if (exclusive) {
beginTransaction()
} else {
beginTransactionNonExclusive()
}
try {
val result = body()
setTransactionSuccessful()
return result
} finally {
endTransaction()
}
}
SQLiteDatabase.kt
// Kotlin
sharedPreferences.edit()
.putBoolean("key", value)
.apply()
// Kotlin + Android KTX
sharedPreferences.edit {
putBoolean("key", value)
}
// Kotlin
view.viewTreeObserver.addOnPreDrawListener(
object : ViewTreeObserver.OnPreDrawListener {
override fun onPreDraw(): Boolean {
viewTreeObserver.removeOnPreDrawListener(this)
actionToBeTriggered()
return true
}
}
)
// Kotlin + Android KTX
view.doOnPreDraw {
actionToBeTriggered()
}
context.withStyledAttributes(set = someAttributeSet,
attrs = attributes,
defStyleAttr = ...,
defStyleRes = ...) {
// do your rolê
}
context.withStyledAttributes(set = someAttributeSet, attrs =
attributes) {
// do your rolê
}
Gradle Kotlin DSL
Sim, é isso mesmo que cê tá pensando:
scripts .gradle escritos em Kotlin! ❤
Gradle Kotlin DSL - GitHub
github.com/gradle/kotlin-dsl
Atenção: Para utilizar o Gradle Kotlin DSL,
precisamos utilizar a versão 4.10 (ou superior) do Gradle.
Para começar:
rootProject.buildFileName = "build.gradle.kts"
include(":app")
settings.gradle.kts
buildscript {
repositories {
google()
jcenter()
}
dependencies {
classpath("com.android.tools.build:gradle:3.1.4")
classpath(kotlin("gradle-plugin", version = "1.2.61"))
}
}
allprojects {
repositories {
google()
jcenter()
}
}
tasks.register("clean", Delete::class) {
delete(rootProject.buildDir)
}
build.gradle.kts
import org.jetbrains.kotlin.config.KotlinCompilerVersion
plugins {
id("com.android.application")
id("kotlin-android")
id("kotlin-android-extensions")
}
app/build.gradle.kts
android {
compileSdkVersion(27)
defaultConfig {
applicationId = "me.walmyrcarvalho.hellosummit"
minSdkVersion(15)
targetSdkVersion(27)
versionCode = 1
versionName = "1.0"
testInstrumentationRunner = "android.support.test.runner.AndroidJUnitRunner"
}
buildTypes {
getByName("release") {
isMinifyEnabled = false
proguardFiles(getDefaultProguardFile("proguard-android.txt"), "proguard-rules.pro")
}
}
}
app/build.gradle.kts
dependencies {
implementation(fileTree(mapOf("dir" to "libs", "include" to listOf("*.jar"))))
implementation(kotlin("stdlib-jdk7", KotlinCompilerVersion.VERSION))
implementation("com.android.support:appcompat-v7:27.1.1")
implementation(“com.android.support.constraint:constraint-layout:1.1.3")
testImplementation("junit:junit:4.12")
androidTestImplementation("com.android.support.test:runner:1.0.2")
androidTestImplementation("com.android.support.test.espresso:espresso-core:3.0.2")
}
app/build.gradle.kts
Gradle Goes Kotlin - Hans Dockter (CEO, Gradle)
youtu.be/4gmanjWNZ8E
Detekt
O Detekt é uma ferramenta de análise estática de código para Kotlin,
bem completa e customizável, ideal para pipelines de CI/CD e PRs em geral.
Detekt - GitHub
github.com/arturbosch/detekt
buildscript {
repositories {
jcenter()
}
}
plugins {
id("io.gitlab.arturbosch.detekt").version("[version]")
}
detekt {
toolVersion = "[version]"
input = files("src/main/kotlin")
filters = ".*/resources/.*,.*/build/.*"
}
build.gradle
Os arquivos de configuração do Detekt utilizam yaml:
autoCorrect: true
failFast: false
test-pattern: # Configure exclusions for test sources
active: true
patterns: # Test file regexes
- '.*/test/.*'
- '.*Test.kt'
- '.*Spec.kt'
exclude-rule-sets:
- 'comments'
exclude-rules:
- 'NamingRules'
- 'WildcardImport'
- 'MagicNumber'
- 'MaxLineLength'
- 'LateinitUsage'
- 'StringLiteralDuplication'
- 'SpreadOperator'
- 'TooManyFunctions'
- 'ForEachOnRange'
default-detekt-config.yml
build:
maxIssues: 10
weights:
# complexity: 2
# LongParameterList: 1
# style: 1
# comments: 1
processors:
active: true
exclude:
# - 'FunctionCountProcessor'
# - 'PropertyCountProcessor'
# - 'ClassCountProcessor'
# - 'PackageCountProcessor'
# - 'KtFileCountProcessor'
default-detekt-config.yml
console-reports:
active: true
exclude:
# - 'ProjectStatisticsReport'
# - 'ComplexityReport'
# - 'NotificationReport'
# - 'FindingsReport'
# - 'BuildFailureReport'
comments:
active: true
CommentOverPrivateFunction:
active: false
CommentOverPrivateProperty:
active: false
EndOfSentenceFormat:
active: false
endOfSentenceFormat: ([.?!][ tnrf<])|([.?!]$)
UndocumentedPublicClass:
active: false
searchInNestedClass: true
searchInInnerClass: true
searchInInnerObject: true
searchInInnerInterface: true
UndocumentedPublicFunction:
active: false
default-detekt-config.yml
Alguns conjuntos de regras incluem análises como:
- Code smell
- Complexidade/legibilidade
- Disparo de exceções
- Formatação
- Nomenclaturas
- Code style
- Linhas/blocos vazios de código
- Padrões de testes
Anko
O Anko é uma biblioteca que facilita o desenvolvimento de interfaces no
Android utilizando Kotlin, sem a necessidade de se escrever XMLs

(além de outras coisinhas a mais).
Anko - GitHub
github.com/kotlin/anko/
dependencies {
implementation "org.jetbrains.anko:anko:$anko_version"
}
build.gradle
O Anko é divido em quatro macro-repositórios:
- anko-commons: Métodos comuns a todos ao Anko em geral
- anko-layouts: Bindings gerais de layouts gerais do Anko
- anko-coroutines: Callbacks para Anko layouts com Coroutines
- anko-sqlite: Helpers do Anko para SQLite
Além desses, existem repositórios para Views, ViewGroups
e Layouts variados, como CardView, RecyclerView e mais.
dependencies {
// Anko Commons
implementation "org.jetbrains.anko:anko-commons:$anko_version"
// Anko Layouts
// sdk15, sdk19, sdk21, sdk23 are also available
implementation "org.jetbrains.anko:anko-sdk25:$anko_version"
implementation "org.jetbrains.anko:anko-appcompat-v7:$anko_version"
// Coroutine listeners for Anko Layouts
implementation "org.jetbrains.anko:anko-sdk25-coroutines:$anko_version"
implementation "org.jetbrains.anko:anko-appcompat-v7-coroutines:$anko_version"
// Anko SQLite
implementation "org.jetbrains.anko:anko-sqlite:$anko_version"
}
build.gradle
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
verticalLayout {
padding = dip(30)
editText {
hint = "Name"
textSize = 24f
}
editText {
hint = "Password"
textSize = 24f
}
button("Login") {
textSize = 26f
}
}
}
MainActivity.kt
linearLayout {
button("Login") {
textSize = 26f
}.lparams(width = wrapContent) {
horizontalMargin = dip(5)
topMargin = dip(10)
}
}
MainActivity.kt
verticalLayout {
editText {
hint = "Name"
}
editText {
hint = "Password"
}
}.applyRecursively { view -> when(view) {
is EditText -> view.textSize = 20f
}}
MainActivity.kt
Com o Anko também temos uma série de funções para a exibição de
componentes (como Dialogs, ProgressBars e Toasts),
uso de logging, uso de resources/dimensions e outros.
// Toasts
toast("Hey, I'm a toast!")
toast(R.string.message)
longToast("Wow, this is a nice summit!")
// Snackbars
snackbar(view, "Hey, I'm a snackbar!")
snackbar(view, R.string.message)
snackbar(view, "Action!", "Click me!") { doYourStuff() }
longSnackbar(view, "Wow, this is a nice summit!")
MainActivity.kt
Kotlin Android Extensions (kotlinx)
O Kotlin Android Extensions (ou kotlinx) ajuda a evitar a necessidade de se
utilizar o findViewById(…) na hora de se instanciar Views no Android
(além de outras coisinhas a mais):
Kotlin Android Extensions - Documentação Oficial
kotlinlang.org/docs/tutorials/android-plugin.html
apply plugin: "kotlin-android-extensions"
app/build.gradle
// Using R.layout.activity_main from the 'main' source set
import kotlinx.android.synthetic.main.activity_main.*
class MainActivity : Activity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
// Instead of findViewById<TextView>(R.id.textView)
textView.setText("Hello, Kotlin Community Summit!”)
}
}
MainActivity.kt
Também é possível utilizar o annotation
@Parcelize para a criação de Parcelables:
import kotlinx.android.parcel.Parcelize
@Parcelize
class User(val firstName: String,
val lastName: String,
val age: Int): Parcelable
User.kt
O kotlinx tem mais opções como Parcelers custom,
cache de view (com políticas de cache) e outras coisas legais!
Coroutines
Coroutines no Kotlin são threads "mais leves”, com uma sintaxe de código
assíncrono tão direta quanto a de um código síncrono, com o objetivo
de prover APIs simples para descomplicar operações assíncronas em geral.
dependencies {
implementation “org.jetbrains.kotlin:kotlin-stdlib-jre7:$kotlin_version”
implementation “org.jetbrains.kotlinx:kotlinx-coroutines-core:$coroutines_version"
implementation “org.jetbrains.kotlinx:kotlinx-coroutines-android:$coroutines_version"
}
build.gradle
kotlin {
experimental {
coroutines "enable"
}
}
app/build.gradle
Elas são tipos de funções chamadas suspending functions, e tem seus métodos
marcados com a palavra chave suspend:
// run the code on a background thread pool
fun asyncOverlay() = async(CommonPool) {
// start two async operations
val original = asyncLoadImage("original")
val overlay = asyncLoadImage(“overlay")
// apply the overlay with both callbacks
applyOverlay(original.await(), overlay.await())
}
// execute the coroutine on UI context
launch(UI) {
val image = asyncOverlay().await()
showImage(image)
}
O launch é a maneira mais simples de se criar uma coroutine numa thread em
background, tendo um Job (uma task, basicamente) como sua referência para si.
public actual fun launch(
context: CoroutineContext = DefaultDispatcher,
start: CoroutineStart = CoroutineStart.DEFAULT,
parent: Job? = null,
block: suspend CoroutineScope.() -> Unit
): Job
Conceitualmente, o async é similar ao launch,
mas a diferença deles é que o async retorna um Deferred,
que é basicamente uma future (ou promise).
public actual fun <T> async(
context: CoroutineContext = DefaultDispatcher,
start: CoroutineStart = CoroutineStart.DEFAULT,
parent: Job? = null,
block: suspend CoroutineScope.() -> T
): Deferred<T>
O CoroutineContext diz respeito a qual thread ela irá rodar: background
(CommonPool) ou UI.
Tecnicamente, um Deferred é um Job, só que com uma future com uma
promessa de entregar um valor em breve.
Ou seja: No async você tem a mesma funcionalidade do launch, mas com
a diferença que ele retorna um valor no .await():
fun getUser(userId: String): User = async {
// return User
}
launch(UI) {
val user = getUser(id).await()
navigateToUserDetail(user)
}
Também é possível rodar alguma operação bloqueando
completamente a thread, utilizando o runBlocking:
runBlocking {
delay(2000)
}
Também é possível cancelar um Job (ou um Deferred<T>)
e checar o estado dele, se eu quiser:
val job = launch {
// do your stuff
}
job.cancel()
val job = launch {
while (isActive){
//do your stuff
} }
Resumindo:
Se eu não preciso de um callback explícito -> launch
Se eu preciso esperar uma future (Deferred) -> async
Se eu preciso bloquear minha thread -> runBlocking
Retrofit 2 Coroutine Adapter (Experimental) - Jake Wharton (GitHub)
github.com/JakeWharton/retrofit2-kotlin-coroutines-adapter
val retrofit = Retrofit.Builder()
.baseUrl("https://example.com/")
.addCallAdapterFactory(CoroutineCallAdapterFactory())
.build()
...
interface MyService {
@GET("/user")
fun getUser(): Deferred<User>
// or
@GET("/user")
fun getUser(): Deferred<Response<User>>
}
Spek
O Spek é um framework para especificação de testes para TDD
(Test Driven Development) ou BDD (Behavior Driven Development).
Spek - GitHub
github.com/spekframework/spek
apply plugin: "de.mannodermaus.android-junit5"
app/build.gradle
dependencies {
testImplementation “org.spekframework.spek2:spek-dsl-jvm:$spek_version”
testImplementation “org.spekframework.spek2:spek-runner-junit5:$spek_version”
testImplementation “org.jetbrains.kotlin:kotlin-reflect:$spek_version”
}
app/build.gradle
object MyTest: Spek({
group("a group") {
test("a test") {
// your assertions here
}
group("a nested group") {
test("another test") {
// your assertions here
}
}
}
})
MyTest.kt
object MyTest: Spek({
print("this is the root”)
group("some group") {
print("some group”)
it("some test") {
print("some test")
}
}
group("another group") {
print("another group”)
it("another test") {
print("another test")
}
}
})
MyTest.kt
// this the root
// - some group
// - - another group
// - some test
// - - another test
object MyTest: Spek({
beforeGroup {
print("before root")
}
group("some group") {
beforeEachTest {
print("before each test")
}
it("some test") {
print("some test")
}
afterEachTest {
print("before each test")
}
}
afterGroup {
print("after root")
}
})
MyTest.kt
// Instead of this:
lateinit var calculator: Calculator
beforeEachTest {
calculator = Calculator()
}
// You can do:
val calculator by memoized { Calculator() }
object CalculatorSpec: Spek({
describe("A calculator") {
val calculator by memoized { Calculator() }
describe("addition") {
it("returns the sum of its arguments") {
assertThat(3, calculator.add(1, 2))
}
}
}
})
CalculatorSpec.kt
MockK
O MockK é um biblioteca de mock otimizada para Kotlin e com diversas
features interessantes como DSLs, suporte a annotations,
argument capturing e outras.
MockK - GitHub
github.com/mockk/mockk
dependencies {
testImplementation “io.mockk:mockk:$mockk_version”
}
build.gradle.kts
val car = mockk<Car>()
every { car.drive(Direction.NORTH) } returns Outcome.OK
car.drive(Direction.NORTH) // returns OK
verify { car.drive(Direction.NORTH) }
@ExtendWith(MockKExtension::class)
class CarTest {
@MockK
lateinit var car1: Car
@RelaxedMockK
lateinit var car2: Car
@MockK(relaxUnitFun = true)
lateinit var car3: Car
@SpyK
var car4 = Car()
@Test
fun calculateAddsValues1() {
// ... use car1, car2, car3 and car4
}
}
Resumindo…
Você precisa usar tudo isso no seu projeto? Definitivamente não!
Mais importante do que sair utilizando todas essas bibliotecas
é realmente entender como elas funcionam, como são construídas
e tentar levar as boas ideias para sua rotina. "
Dúvidas?
Links úteis
Android KTX - GitHub
github.com/android/android-ktx
Detekt - GitHub
github.com/arturbosch/detekt
Gradle Kotlin DSL - GitHub
github.com/gradle/kotlin-dsl
Anko - GitHub
github.com/kotlin/anko/
Kotlin Android Extensions - Documentação Oficial
kotlinlang.org/docs/tutorials/android-plugin.html
Kotlin Coroutines - Documentação Oficial
kotlinlang.org/docs/reference/coroutines.html
Spek - GitHub
github.com/spekframework/spek
MockK - GitHub
github.com/mockk/mockk
Kotlin Meetup São Paulo
meetup.com/kotlin-meetup-sp
Android Dev BR - Slack
slack.androiddevbr.org
Muito obrigado! ♥
Créditos de imagens:
Fleur Treurniet (Unsplash) - bit.ly/2M5G4g6

Google
JetBrains
GitHub

Mais conteúdo relacionado

Semelhante a Kotlin no Android: desbravando as oportunidades de ponta a ponta!

Desenvolvimento Ágil com Grails.
Desenvolvimento Ágil com Grails.Desenvolvimento Ágil com Grails.
Desenvolvimento Ágil com Grails.Alex Guido
 
Introdução à Programação Web com Angular
Introdução à Programação Web com AngularIntrodução à Programação Web com Angular
Introdução à Programação Web com AngularElmano Cavalcanti
 
Aula02 android hands_on
Aula02 android hands_onAula02 android hands_on
Aula02 android hands_onRoberson Alves
 
Práticas de Agilidade e QA na Comunidade KDE
Práticas de Agilidade e QA na Comunidade KDEPráticas de Agilidade e QA na Comunidade KDE
Práticas de Agilidade e QA na Comunidade KDESandro Andrade
 
ASP.NET vNext no .NET Architects Days 2014
ASP.NET vNext no .NET Architects Days 2014ASP.NET vNext no .NET Architects Days 2014
ASP.NET vNext no .NET Architects Days 2014Giovanni Bassi
 
Introdução à plataforma Android
Introdução à plataforma AndroidIntrodução à plataforma Android
Introdução à plataforma AndroidNatanael Fonseca
 
Simplificando a montagem de ambientes de Dev+Testes com Docker | DEVDAY 2020
Simplificando a montagem de ambientes de Dev+Testes com Docker | DEVDAY 2020Simplificando a montagem de ambientes de Dev+Testes com Docker | DEVDAY 2020
Simplificando a montagem de ambientes de Dev+Testes com Docker | DEVDAY 2020Renato Groff
 
Desenvolvendo Aplicações Android com Qt
Desenvolvendo Aplicações Android com QtDesenvolvendo Aplicações Android com Qt
Desenvolvendo Aplicações Android com QtSandro Andrade
 
Docker de ponta a ponta - do Desenvolvimento à Nuvem - .NET SP - Outubro-2018
Docker de ponta a ponta - do Desenvolvimento à Nuvem - .NET SP - Outubro-2018Docker de ponta a ponta - do Desenvolvimento à Nuvem - .NET SP - Outubro-2018
Docker de ponta a ponta - do Desenvolvimento à Nuvem - .NET SP - Outubro-2018Renato Groff
 
Docker de ponta a ponta: do Desenvolvimento à Nuvem - Azure Talks - Agosto-2018
Docker de ponta a ponta: do Desenvolvimento à Nuvem - Azure Talks - Agosto-2018Docker de ponta a ponta: do Desenvolvimento à Nuvem - Azure Talks - Agosto-2018
Docker de ponta a ponta: do Desenvolvimento à Nuvem - Azure Talks - Agosto-2018Renato Groff
 
Estudo comparativo das linguagens kotlin e java no desenvolvimento de aplicac...
Estudo comparativo das linguagens kotlin e java no desenvolvimento de aplicac...Estudo comparativo das linguagens kotlin e java no desenvolvimento de aplicac...
Estudo comparativo das linguagens kotlin e java no desenvolvimento de aplicac...Édipo Souza
 
GDG ABC Meetup #5 - Tendências 2015
GDG ABC Meetup #5 - Tendências 2015GDG ABC Meetup #5 - Tendências 2015
GDG ABC Meetup #5 - Tendências 2015Daniel Costa Gimenes
 
Programação Android - Básico
Programação Android - BásicoProgramação Android - Básico
Programação Android - BásicoHugoDalevedove
 
Beers & Bytes - O Futuro da virtualização
Beers & Bytes - O Futuro da virtualizaçãoBeers & Bytes - O Futuro da virtualização
Beers & Bytes - O Futuro da virtualizaçãoCarlos Smaniotto
 
Docker para Desenvolvedores - Developers-BR - Julho-2018
Docker para Desenvolvedores - Developers-BR - Julho-2018Docker para Desenvolvedores - Developers-BR - Julho-2018
Docker para Desenvolvedores - Developers-BR - Julho-2018Renato Groff
 

Semelhante a Kotlin no Android: desbravando as oportunidades de ponta a ponta! (20)

Grails
GrailsGrails
Grails
 
Desenvolvimento Ágil com Grails.
Desenvolvimento Ágil com Grails.Desenvolvimento Ágil com Grails.
Desenvolvimento Ágil com Grails.
 
Introdução à Programação Web com Angular
Introdução à Programação Web com AngularIntrodução à Programação Web com Angular
Introdução à Programação Web com Angular
 
Aula02 android hands_on
Aula02 android hands_onAula02 android hands_on
Aula02 android hands_on
 
Precisamos falar sobre Gradle
Precisamos falar sobre GradlePrecisamos falar sobre Gradle
Precisamos falar sobre Gradle
 
Práticas de Agilidade e QA na Comunidade KDE
Práticas de Agilidade e QA na Comunidade KDEPráticas de Agilidade e QA na Comunidade KDE
Práticas de Agilidade e QA na Comunidade KDE
 
ASP.NET vNext no .NET Architects Days 2014
ASP.NET vNext no .NET Architects Days 2014ASP.NET vNext no .NET Architects Days 2014
ASP.NET vNext no .NET Architects Days 2014
 
Introdução à plataforma Android
Introdução à plataforma AndroidIntrodução à plataforma Android
Introdução à plataforma Android
 
Setup.docx
Setup.docxSetup.docx
Setup.docx
 
Simplificando a montagem de ambientes de Dev+Testes com Docker | DEVDAY 2020
Simplificando a montagem de ambientes de Dev+Testes com Docker | DEVDAY 2020Simplificando a montagem de ambientes de Dev+Testes com Docker | DEVDAY 2020
Simplificando a montagem de ambientes de Dev+Testes com Docker | DEVDAY 2020
 
Androi studio
Androi studioAndroi studio
Androi studio
 
Desenvolvendo Aplicações Android com Qt
Desenvolvendo Aplicações Android com QtDesenvolvendo Aplicações Android com Qt
Desenvolvendo Aplicações Android com Qt
 
Introdução Play framework
Introdução Play frameworkIntrodução Play framework
Introdução Play framework
 
Docker de ponta a ponta - do Desenvolvimento à Nuvem - .NET SP - Outubro-2018
Docker de ponta a ponta - do Desenvolvimento à Nuvem - .NET SP - Outubro-2018Docker de ponta a ponta - do Desenvolvimento à Nuvem - .NET SP - Outubro-2018
Docker de ponta a ponta - do Desenvolvimento à Nuvem - .NET SP - Outubro-2018
 
Docker de ponta a ponta: do Desenvolvimento à Nuvem - Azure Talks - Agosto-2018
Docker de ponta a ponta: do Desenvolvimento à Nuvem - Azure Talks - Agosto-2018Docker de ponta a ponta: do Desenvolvimento à Nuvem - Azure Talks - Agosto-2018
Docker de ponta a ponta: do Desenvolvimento à Nuvem - Azure Talks - Agosto-2018
 
Estudo comparativo das linguagens kotlin e java no desenvolvimento de aplicac...
Estudo comparativo das linguagens kotlin e java no desenvolvimento de aplicac...Estudo comparativo das linguagens kotlin e java no desenvolvimento de aplicac...
Estudo comparativo das linguagens kotlin e java no desenvolvimento de aplicac...
 
GDG ABC Meetup #5 - Tendências 2015
GDG ABC Meetup #5 - Tendências 2015GDG ABC Meetup #5 - Tendências 2015
GDG ABC Meetup #5 - Tendências 2015
 
Programação Android - Básico
Programação Android - BásicoProgramação Android - Básico
Programação Android - Básico
 
Beers & Bytes - O Futuro da virtualização
Beers & Bytes - O Futuro da virtualizaçãoBeers & Bytes - O Futuro da virtualização
Beers & Bytes - O Futuro da virtualização
 
Docker para Desenvolvedores - Developers-BR - Julho-2018
Docker para Desenvolvedores - Developers-BR - Julho-2018Docker para Desenvolvedores - Developers-BR - Julho-2018
Docker para Desenvolvedores - Developers-BR - Julho-2018
 

Mais de iMasters

O que você precisa saber para modelar bancos de dados NoSQL - Dani Monteiro
O que você precisa saber para modelar bancos de dados NoSQL - Dani MonteiroO que você precisa saber para modelar bancos de dados NoSQL - Dani Monteiro
O que você precisa saber para modelar bancos de dados NoSQL - Dani MonteiroiMasters
 
Postgres: wanted, beloved or dreaded? - Fabio Telles
Postgres: wanted, beloved or dreaded? - Fabio TellesPostgres: wanted, beloved or dreaded? - Fabio Telles
Postgres: wanted, beloved or dreaded? - Fabio TellesiMasters
 
Por que minha query esta lenta? - Suellen Moraes
Por que minha query esta lenta? - Suellen MoraesPor que minha query esta lenta? - Suellen Moraes
Por que minha query esta lenta? - Suellen MoraesiMasters
 
Relato das trincheiras: o dia a dia de uma consultoria de banco de dados - Ig...
Relato das trincheiras: o dia a dia de uma consultoria de banco de dados - Ig...Relato das trincheiras: o dia a dia de uma consultoria de banco de dados - Ig...
Relato das trincheiras: o dia a dia de uma consultoria de banco de dados - Ig...iMasters
 
ORMs heróis ou vilões dentro da arquitetura de dados? - Otávio gonçalves
ORMs heróis ou vilões dentro da arquitetura de dados? - Otávio gonçalvesORMs heróis ou vilões dentro da arquitetura de dados? - Otávio gonçalves
ORMs heróis ou vilões dentro da arquitetura de dados? - Otávio gonçalvesiMasters
 
SQL e NoSQL trabalhando juntos: uma comparação para obter o melhor de ambos -...
SQL e NoSQL trabalhando juntos: uma comparação para obter o melhor de ambos -...SQL e NoSQL trabalhando juntos: uma comparação para obter o melhor de ambos -...
SQL e NoSQL trabalhando juntos: uma comparação para obter o melhor de ambos -...iMasters
 
Arquitetando seus dados na prática para a LGPD - Alessandra Martins
Arquitetando seus dados na prática para a LGPD - Alessandra MartinsArquitetando seus dados na prática para a LGPD - Alessandra Martins
Arquitetando seus dados na prática para a LGPD - Alessandra MartinsiMasters
 
O papel do DBA no mundo de ciência de dados e machine learning - Mauro Pichil...
O papel do DBA no mundo de ciência de dados e machine learning - Mauro Pichil...O papel do DBA no mundo de ciência de dados e machine learning - Mauro Pichil...
O papel do DBA no mundo de ciência de dados e machine learning - Mauro Pichil...iMasters
 
Desenvolvimento Mobile Híbrido, Nativo ou Web: Quando usá-los - Juliana Chahoud
Desenvolvimento Mobile Híbrido, Nativo ou Web: Quando usá-los - Juliana ChahoudDesenvolvimento Mobile Híbrido, Nativo ou Web: Quando usá-los - Juliana Chahoud
Desenvolvimento Mobile Híbrido, Nativo ou Web: Quando usá-los - Juliana ChahoudiMasters
 
Use MDD e faça as máquinas trabalharem para você - Andreza Leite
 Use MDD e faça as máquinas trabalharem para você - Andreza Leite Use MDD e faça as máquinas trabalharem para você - Andreza Leite
Use MDD e faça as máquinas trabalharem para você - Andreza LeiteiMasters
 
Entendendo os porquês do seu servidor - Talita Bernardes
Entendendo os porquês do seu servidor - Talita BernardesEntendendo os porquês do seu servidor - Talita Bernardes
Entendendo os porquês do seu servidor - Talita BernardesiMasters
 
Backend performático além do "coloca mais máquina lá" - Diana Arnos
Backend performático além do "coloca mais máquina lá" - Diana ArnosBackend performático além do "coloca mais máquina lá" - Diana Arnos
Backend performático além do "coloca mais máquina lá" - Diana ArnosiMasters
 
Dicas para uma maior performance em APIs REST - Renato Groffe
Dicas para uma maior performance em APIs REST - Renato GroffeDicas para uma maior performance em APIs REST - Renato Groffe
Dicas para uma maior performance em APIs REST - Renato GroffeiMasters
 
7 dicas de desempenho que equivalem por 21 - Danielle Monteiro
7 dicas de desempenho que equivalem por 21 - Danielle Monteiro7 dicas de desempenho que equivalem por 21 - Danielle Monteiro
7 dicas de desempenho que equivalem por 21 - Danielle MonteiroiMasters
 
Quem se importa com acessibilidade Web? - Mauricio Maujor
Quem se importa com acessibilidade Web? - Mauricio MaujorQuem se importa com acessibilidade Web? - Mauricio Maujor
Quem se importa com acessibilidade Web? - Mauricio MaujoriMasters
 
Service Mesh com Istio e Kubernetes - Wellington Figueira da Silva
Service Mesh com Istio e Kubernetes - Wellington Figueira da SilvaService Mesh com Istio e Kubernetes - Wellington Figueira da Silva
Service Mesh com Istio e Kubernetes - Wellington Figueira da SilvaiMasters
 
Erros: Como eles vivem, se alimentam e se reproduzem? - Augusto Pascutti
Erros: Como eles vivem, se alimentam e se reproduzem? - Augusto PascuttiErros: Como eles vivem, se alimentam e se reproduzem? - Augusto Pascutti
Erros: Como eles vivem, se alimentam e se reproduzem? - Augusto PascuttiiMasters
 
Elasticidade e engenharia de banco de dados para alta performance - Rubens G...
Elasticidade e engenharia de banco de dados para alta performance  - Rubens G...Elasticidade e engenharia de banco de dados para alta performance  - Rubens G...
Elasticidade e engenharia de banco de dados para alta performance - Rubens G...iMasters
 
Construindo aplicações mais confiantes - Carolina Karklis
Construindo aplicações mais confiantes - Carolina KarklisConstruindo aplicações mais confiantes - Carolina Karklis
Construindo aplicações mais confiantes - Carolina KarklisiMasters
 
Monitoramento de Aplicações - Felipe Regalgo
Monitoramento de Aplicações - Felipe RegalgoMonitoramento de Aplicações - Felipe Regalgo
Monitoramento de Aplicações - Felipe RegalgoiMasters
 

Mais de iMasters (20)

O que você precisa saber para modelar bancos de dados NoSQL - Dani Monteiro
O que você precisa saber para modelar bancos de dados NoSQL - Dani MonteiroO que você precisa saber para modelar bancos de dados NoSQL - Dani Monteiro
O que você precisa saber para modelar bancos de dados NoSQL - Dani Monteiro
 
Postgres: wanted, beloved or dreaded? - Fabio Telles
Postgres: wanted, beloved or dreaded? - Fabio TellesPostgres: wanted, beloved or dreaded? - Fabio Telles
Postgres: wanted, beloved or dreaded? - Fabio Telles
 
Por que minha query esta lenta? - Suellen Moraes
Por que minha query esta lenta? - Suellen MoraesPor que minha query esta lenta? - Suellen Moraes
Por que minha query esta lenta? - Suellen Moraes
 
Relato das trincheiras: o dia a dia de uma consultoria de banco de dados - Ig...
Relato das trincheiras: o dia a dia de uma consultoria de banco de dados - Ig...Relato das trincheiras: o dia a dia de uma consultoria de banco de dados - Ig...
Relato das trincheiras: o dia a dia de uma consultoria de banco de dados - Ig...
 
ORMs heróis ou vilões dentro da arquitetura de dados? - Otávio gonçalves
ORMs heróis ou vilões dentro da arquitetura de dados? - Otávio gonçalvesORMs heróis ou vilões dentro da arquitetura de dados? - Otávio gonçalves
ORMs heróis ou vilões dentro da arquitetura de dados? - Otávio gonçalves
 
SQL e NoSQL trabalhando juntos: uma comparação para obter o melhor de ambos -...
SQL e NoSQL trabalhando juntos: uma comparação para obter o melhor de ambos -...SQL e NoSQL trabalhando juntos: uma comparação para obter o melhor de ambos -...
SQL e NoSQL trabalhando juntos: uma comparação para obter o melhor de ambos -...
 
Arquitetando seus dados na prática para a LGPD - Alessandra Martins
Arquitetando seus dados na prática para a LGPD - Alessandra MartinsArquitetando seus dados na prática para a LGPD - Alessandra Martins
Arquitetando seus dados na prática para a LGPD - Alessandra Martins
 
O papel do DBA no mundo de ciência de dados e machine learning - Mauro Pichil...
O papel do DBA no mundo de ciência de dados e machine learning - Mauro Pichil...O papel do DBA no mundo de ciência de dados e machine learning - Mauro Pichil...
O papel do DBA no mundo de ciência de dados e machine learning - Mauro Pichil...
 
Desenvolvimento Mobile Híbrido, Nativo ou Web: Quando usá-los - Juliana Chahoud
Desenvolvimento Mobile Híbrido, Nativo ou Web: Quando usá-los - Juliana ChahoudDesenvolvimento Mobile Híbrido, Nativo ou Web: Quando usá-los - Juliana Chahoud
Desenvolvimento Mobile Híbrido, Nativo ou Web: Quando usá-los - Juliana Chahoud
 
Use MDD e faça as máquinas trabalharem para você - Andreza Leite
 Use MDD e faça as máquinas trabalharem para você - Andreza Leite Use MDD e faça as máquinas trabalharem para você - Andreza Leite
Use MDD e faça as máquinas trabalharem para você - Andreza Leite
 
Entendendo os porquês do seu servidor - Talita Bernardes
Entendendo os porquês do seu servidor - Talita BernardesEntendendo os porquês do seu servidor - Talita Bernardes
Entendendo os porquês do seu servidor - Talita Bernardes
 
Backend performático além do "coloca mais máquina lá" - Diana Arnos
Backend performático além do "coloca mais máquina lá" - Diana ArnosBackend performático além do "coloca mais máquina lá" - Diana Arnos
Backend performático além do "coloca mais máquina lá" - Diana Arnos
 
Dicas para uma maior performance em APIs REST - Renato Groffe
Dicas para uma maior performance em APIs REST - Renato GroffeDicas para uma maior performance em APIs REST - Renato Groffe
Dicas para uma maior performance em APIs REST - Renato Groffe
 
7 dicas de desempenho que equivalem por 21 - Danielle Monteiro
7 dicas de desempenho que equivalem por 21 - Danielle Monteiro7 dicas de desempenho que equivalem por 21 - Danielle Monteiro
7 dicas de desempenho que equivalem por 21 - Danielle Monteiro
 
Quem se importa com acessibilidade Web? - Mauricio Maujor
Quem se importa com acessibilidade Web? - Mauricio MaujorQuem se importa com acessibilidade Web? - Mauricio Maujor
Quem se importa com acessibilidade Web? - Mauricio Maujor
 
Service Mesh com Istio e Kubernetes - Wellington Figueira da Silva
Service Mesh com Istio e Kubernetes - Wellington Figueira da SilvaService Mesh com Istio e Kubernetes - Wellington Figueira da Silva
Service Mesh com Istio e Kubernetes - Wellington Figueira da Silva
 
Erros: Como eles vivem, se alimentam e se reproduzem? - Augusto Pascutti
Erros: Como eles vivem, se alimentam e se reproduzem? - Augusto PascuttiErros: Como eles vivem, se alimentam e se reproduzem? - Augusto Pascutti
Erros: Como eles vivem, se alimentam e se reproduzem? - Augusto Pascutti
 
Elasticidade e engenharia de banco de dados para alta performance - Rubens G...
Elasticidade e engenharia de banco de dados para alta performance  - Rubens G...Elasticidade e engenharia de banco de dados para alta performance  - Rubens G...
Elasticidade e engenharia de banco de dados para alta performance - Rubens G...
 
Construindo aplicações mais confiantes - Carolina Karklis
Construindo aplicações mais confiantes - Carolina KarklisConstruindo aplicações mais confiantes - Carolina Karklis
Construindo aplicações mais confiantes - Carolina Karklis
 
Monitoramento de Aplicações - Felipe Regalgo
Monitoramento de Aplicações - Felipe RegalgoMonitoramento de Aplicações - Felipe Regalgo
Monitoramento de Aplicações - Felipe Regalgo
 

Kotlin no Android: desbravando as oportunidades de ponta a ponta!