Introducción a Scala y configuración del entorno de desarrollo

1

Introducción al curso y presentación de los objetivos

2

Programación Funcional en Scala: Conceptos Clave y Aplicaciones

3

Instalación de JDK y SBT para desarrollo en Scala

4

Programación en Scala: Instalación de Herramientas Esenciales

5

Programación Funcional en Scala: Introducción Práctica

Fundamentos de Programación Funcional

6

Scala: Tipos de Datos Básicos y su Jerarquía

7

Inmutabilidad en Scala: Variables, Valores y Definiciones

8

Expresiones en Scala: Uso de Llaves y Paréntesis

9

Funciones de Orden Superior en Scala

10

Manejo de Colecciones en Lenguajes Funcionales

11

Comparación de Tuplas y Objetos en Scala

12

Funciones Copy en Case Class y Manejo de Inmutabilidad

Conceptos básicos de Programación Funcional

13

Patrones de Emparejamiento en Programación Funcional

14

Optimización de Algoritmos con Tail Recursion

15

Acumuladores en Programación Funcional: Uso de Fold Left y Fold Right

Fundamentos teoricos

16

Funciones Totales y Parciales en Scala: Usos y Precauciones

17

Programación Recursiva con Razonamiento Inductivo

18

Razonamiento con Tipos en Scala: Documentación y Mantenibilidad

19

Traits y Herencia Múltiple en Scala

20

Uso de Tipos Genéricos en Scala

21

Tipos de Datos Algebraicos: Suma y Producto en Programación

22

Evaluación Perezosa en Scala: Variables y Colecciones

23

Manejo de nulos con Option en programación funcional

24

Try y Either en la Programación Funcional con Scala

Proyecto de Backend

25

Proyecto backend con PlayFramework y Scala

26

Concurrente y Distribuido: Erlang y Modelo por Actores

27

Integración de Slick ORM con Play Framework

28

Manejo de Databases en Scala con Play y SQLite

29

Consultas Asíncronas con Slick en Scala

30

Inserción y actualización de datos en bases de datos con MugiQuery

31

Computación Paralela y Asíncrona en Scala: Fundamentos y Aplicaciones

32

Serialización de datos Scala a JSON en Play Framework

33

Serialización JSON a Objetos Scala: Validación y Creación de Endpoints

34

Manejo de Errores y Logging en Scala: Herramientas y Prácticas

35

Exportación de aplicaciones con SBT Native Packager

Conclusiones

36

Funciones y Tipos de Datos en Programación Funcional

Curso de Scala básico

Curso de Scala básico

Carlos Daniel Sanchez

Carlos Daniel Sanchez

Manejo de Databases en Scala con Play y SQLite

28/36

Lectura

Antes de empezar, deberías descargar el template Play Scala Seed desde esta página: https://developer.lightbend.com/start/?group=play&project=play-scala-seed

...

Regístrate o inicia sesión para leer el resto del contenido.

Aportes 17

Preguntas 2

Ordenar por:

¿Quieres ver más aportes, preguntas y respuestas de la comunidad?

No me gusto este articulo, pudo haber sido explicado un poco mejor con videos porque algunos pasos se prestan a confusion y por lo menos en el articulo en vez de dejar imagenes, hubiera estado mejor dejar snippets para copiar y pegar porque muchas de estas cosas son demasiado boilerplate y esta muy facil equivocarse por un par de caracteres

Me parece pésima esta clase, qué pasó íbamos bien, muy diferente ver codificar y entender cada elemento que leer un documento.

Hay una serie de errores en el codigo mostrado, puede ser por la nueva versión de play, recomiendo se realicen las correcciones necesarias, dado que se invierte mucho tiempo en tratar de ejecutar el ejercicio, me tomo el atrevimiento de compartir este repositorio de Jonathan Valencia que me ayudo con la configuración de la base de datos con slick https://github.com/jonathanvalenciav/platzi-video.

Ay que bien se siente jajaja al fin, después de la infinidad de errores

Funciono! Después de tantos errores

Creo que también es importante lo siguiente:

  • mencionar la versión de sbt, porque me salían errores con ello. Al final usé el sbt que me sugería IntelliJ y reinicié el IDE y ahí funcionó.
  • También es importante que si nos saltamos aprender Play Framework al menos nos expliquen que con código, no tanto con imágenes. Bueno, o al menos indicar que el IDE coloca cierto texto encima. Soy nuevo en IntelliJ y copié todo el texto manualmente como se muestra :
    entonces, perdí mucho tiempo colocando texto que coloca el IDE mismo. Creo que sería bueno que editaran ésta clase con un taller o video explicativo de cómo resolver los montón errores que nos salieron.

Gracias Jonathan Valencia y Martín Albarracín.

Para los que tienen problemas corriendo el proyecto les dejo mi repositorio, para guía , hay algunas cositas que no están explicitas en el articulo y hay que leer un poco más sobre todo de el framework para que funcione para los que tengan experiencia en spring les sera un poco mas sencillo entender.

Mi principal problema fue identificar correctamente los imports que hay que hacer así como implementar el controller lo necesario para la compilación.

https://github.com/djaquels/PlayMovies

Obtengo errores en todo 😑

Imágenes:


El error en navegador:

IO error while decoding C:\Users\sistemasfimtt\iCloudDrive\Platzi\Carreras\Fundamentos de Programación\ProgramacionFuncionalConScala\play-scala-seed\target\scala-2.13\routes\main\controllers\ReverseRoutes.scala with UTF-8: MALFORMED[1]
Please try specifying another one using the -encoding option

Mis archivos:
build.sbt

name := """platzi-video"""
organization := "com.platzi"

version := "1.0-SNAPSHOT"

lazy val root = (project in file(".")).enablePlugins(PlayScala)

scalaVersion := "2.13.1"

libraryDependencies += guice
libraryDependencies += "org.scalatestplus.play" %% "scalatestplus-play" % "5.0.0" % Test
libraryDependencies += "com.typesafe.play" %% "play-slick" % "4.0.2"
libraryDependencies += "org.xerial" % "sqlite-jdbc" % "3.28.0"

application.conf

# https://www.playframework.com/documentation/latest/Configuration

slick.dbs.default.profile="slick.jdbc.SQLiteProfiles$"
slick.dbs.default.db.driver="org.sqlite.JDBC"
slick.dbs.default.db.url="jdbc:sqlite:MyDataBase.db"
slick.dbs.default.db.user=""
slick.dbs.default.db.password=""

slick.default="model.*"

Movie.scala

package models
import java.util.UUID

/*
  Objeto Movie.
 */
case class Movie(
  id: Option[String] = Option(UUID.randomUUID.toString),
  title: String,
  year: Int,
  cover: String,
  description: String,
  duration: Int,
  contentRating: String,
  source: String,
  tags: Option[String]
)

MovieTable.scala

package models
import slick.jdbc.SQLiteProfile.api_
/*
  Clase que mapea el objeto a la tabla movie.

  https://scala-slick.org/doc/3.3.1/schemas.html
 */
class MovieTable(tag: Tag) extends Table[Movie](tag, _tableName = "movie"){
  def id: Rep[String] = column[String]("id", 0.PrimaryKey)
  def title: Rep[String] = column[String]("title")
  def year: Rep[Int] = column[Int]("year")
  def cover: Rep[String] = column[String]("cover")
  def description: Rep[String] = column[String]("description")
  def duration: Rep[Int] = column[Int]("duration")
  def contentRating: Rep[String] = column[String]("content_rating")
  def source: Rep[String] = column[String]("source")
  def tags: Rep[Option[String]] = column[Option[String]]("tags", 0.Lenght(2000, varying = true))

  def *: ProvenShape[Movie] = (id.?, title, year, cover, duration, contentRating, source, tags) <> (Movie.tupled, Movie.unapply)
}

MovieRepository.scala

package models
import javax.inject.Inject
import play.api.db.slick.{DatabaseConfigProvider, HasDatabaseConfigProvider}
import play.api.mvc.{AbstractController, ControllerComponents}
import scala.concurrent.{ExecutionContext, Future}
/*
  Clase repository, donde irán las consultas.
 */
class MovieRepository @Inject()(
  protected val dbConfigProvider: DatabaseConfigProvider, cc: ControllerComponents
)(implicit ec: ExecutionContext)
  extends AbstractController(cc)
  with HasDatabaseConfigProvider[JdbcProfile]{
  private lazy val movieQuery = TableQuery[MovieTable]
}
/*
  * Función de ayuda para crear la tabla si esta
  * aún no existe en la base de datos.
  * @return
 */
def dbInit: Future[Unit] = {
  // Definición de la sentencia SQL de creación del schema
  val createSchema = movieQuery.schema.createIfNotExists
  // db.run ejecuta una secuencia SQL, devolviendo un Future
  db.run(createSchema)
}

def getAll = ???
def getOne = ???
def create = ???
def update = ???
def delete = ???

HomeController.scala

package controllers

import javax.inject._
import play.api._
import play.api.mvc._
// Importar el repository y el contexto de ejecución global
import models.MovieRepository
import scala.concurrent.ExecutionContext.Implicits.global

/**
 Hay quea gregar el repository para que sea inyectado
 */
@Singleton
class HomeController @Inject()(
  cc: ControllerComponents,
  movieRepository: MovieRepository
) extends AbstractController(cc){
  // ...
  /*
    Función de ayuda para crear la tabla si esta aún no existe
   */
  def dbInit() = Action.async{ request =>
    movieRepository.dbInit
      .map(_ => Created("Tabla creada"))
      .recover{ex =>
        play.Logger.of("dbInit").debug("Error en dbInit", ex)
        InternalServerError(s"Hubo un error")
      }
  }
}

routes

# Routes
# This file defines all application routes (Higher priority routes first)
# https://www.playframework.com/documentation/latest/ScalaRouting
# ~~~~

# An example controller showing a sample home page
GET     /                           controllers.HomeController.index

# Map static resources from the /public folder to the /assets URL path
GET     /assets/*file               controllers.Assets.versioned(path="/public", file: Asset)

GET     /dbInit                     controllers.HomeController.dbInit

¿Algún apoyo con el tema?

este es la estructura de archivos y como debe quedar.
tuve que importar muchas cosas por defecto según me indicaba IntelliJ porque en el post creo que hay muchos pasos que no se menciona. estar[e subiendo el código a Github

Código de las dependencias al momento de creación de este comentario: `libraryDependencies ``+= "com.typesafe.play" %% "play-slick" % "5.3.0"` `libraryDependencies ``+= "org.xerial" % "sqlite-jdbc" % "3.46.0.0"`

Che clase toda qlera, en fin
Para aquellos que no les instale las dependencias y estén usando Intellij. Cierren y abran de nuevo su proyecto.
Posterior a eso también tomen de guía a quienes ya les quedo el proyecto y lo comentaron como aporte en esta sección

Se pudo a la primera. Si usan VS Code les da ayudas sobre si algo no es correcto, habiendo instalado las extenciones que se recomiendan en una de las primeras clases del curso.

Por fin funciono de cientos de intentos

Dejo mi repo si necesitan alguna guia.

Esta clase te arruina el curso, al ser todo imagenes y no poder copiar es un desastre no te queda igual, no compila, lo hace engorroso, una lastima

Terrible artículo. Una explicación bastante insuficiente y pobre

para las personas que recién lleguen como yo y no quieran ponerse a transcribir imagen por imagen tengo este hackLife:
descarguen cada imagen recortenla y carguenla aquí, es un OCR para pasar de imagen a texto https://www.onlineocr.net/es/

Buenas, alguien por favor que me hace falta. Cuando lanzo el comando sbt update muestra el siguiente error:

download error: Caught javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building fail
ed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target (sun.security.validator.ValidatorExceptio
n: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target) while download
ing https://repo.typesafe.com

He buscado pero no se que me falta.
tengo jdk1.8.0_281 de 64 bits y javac 1.8.0_281
Mi build.sbt es

name := "mi-primer-scala"
organization := "com.scala"

version := "1.0-SNAPSHOT"

lazy val root = (project in file(".")).enablePlugins(PlayScala)

scalaVersion := "2.13.3"

libraryDependencies += guice
libraryDependencies += "org.scalatestplus.play" %% "scalatestplus-play" % "5.0.0" % Test
libraryDependencies += "com.typesafe.play" %% "play-slick" % "4.0.2"
libraryDependencies += "org.xerial" %% "sqlite-jdbc" % "3.28.0"

// Adds additional packages into Twirl
//TwirlKeys.templateImports += "com.example.controllers._"

// Adds additional packages into conf/routes
// play.sbt.routes.RoutesKeys.routesImport += "com.example.binders._"```

Nota: tengo el cacerts en la ruta: C:\Program Files (x86)\Java\jre1.8.0_281\lib\security pero entonces no entiendo que me hace falta. Gracias