SlideShare ist ein Scribd-Unternehmen logo
1 von 53
Downloaden Sie, um offline zu lesen
Experience report 2009 - 2013
Scala en proyectos de
vinculación ANCAP-UR
Germán Ferrari
Marzo 2013
@gerferra
uy.linkedin.com/in/gerferra/
Proyectos
2009 - 2010
"Modelo estocástico
múltiple-etapa para apoyo
a la toma de decisiones
en la planificación de la
producción"
2012 - 2013
Extensión al proyecto
original. En curso
Equipo
Ing. Quim. Bernardo Zimberg - ANCAP
M.Sc. Carlos Testuri - FIng, UR
Ing. Comp. Germán Ferrari - FIng, UR
Componentes
Modelo matemático
Escrito en Mathprog
Resuelto con herramientas de GLPK
Aplicación de escritorio
Inicialmente: Entrada de datos
Con el tiempo
Ejecución y monitoreo del solver
Reporte de resultados
Scala
Por qué Scala?
Único programando, fascinado con el lenguaje
Java era una alternativa viable
Scala es "sólo una biblioteca"
Por qué Scala?
Tipado estático
Favorece
inmutabilidad
Código legible y corto
Inferencia de tipos
Sin boilerplate
DSL friendly
Biblioteca estándar
Colecciones
Procesos
Parsers
REPL
Comunidad
Fácil! para programadores Java ;)
Herramientas y bibliotecas usadas
Scala-Swing
spray-json
Scala IO
ScalaTest
scala.sys.process
PackratParsers
sbt, sbt-assembly, sbteclipse
Scala IDE for Eclipse
Scala-Swing
Wrapper sobre Swing
Se integra naturalmente en Scala
Feel declarativo
API más simple
Usando MVP inspirado en el propuesto en
GWT
No muy Scala-like pero funciona
Scala-Swing - ejemplos
object HelloWorld extends SimpleSwingApplication {
def top = new MainFrame {
title = "Hello, World!"
contents = new Button {
text = "Click Me!"
}
}
}
Scala-Swing - ejemplos
val b = new Button {
text = "OK"
font = f
preferredSize = (20, 20)
}
listenTo(b)
reactions += {
case ButtonClicked(`b`) => //reaction here
}
Scala-Swing - ejemplos
new FlowPanel {
contents ++= new Button("a") :: new Button("b") :: Nil
}
new BoxPanel(Horizontal) {
contents ++= new Label("text") :: HStrut(2) ::
new Button("a") :: HGlue :: new Button("b") :: Nil
}
new BorderPanel {
layout(new Button("North")) = Position.North
layout(new Button("Center")) = Position.Center
}
Scala-Swing - a tener en cuenta
No es wrapper 100% completo
No está mantenido activamente
Relativamente fácil de extender
ScalaSwingContrib
Bastante fácil de usar pero falta documentación
(Java)Swing usa reflection para algunas cosas
ScalaFX
(De)Serialización de JSON basado en Type-
classes
trait JsonReader[T] { def read(json: JsValue): T }
trait JsonWriter[T] { def write(obj: T): JsValue }
trait JsonFormat[T] extends
JsonReader[T] with JsonWriter[T]
Usado para persistir configuración y archivos
de proyectos
spray-json
spray-json - ejemplos
case class Color(name: String, red: Int, green: Int,
blue: Int)
object MyJsonProtocol extends DefaultJsonProtocol {
implicit val colorFormat: JsonFormat[Color] =
jsonFormat4(Color)
}
import MyJsonProtocol.colorFormat
val json = Color("CadetBlue", 95, 158, 160).toJson
val color = json.convertTo[Color]
spray-json - ejemplos
object JSON extends DefaultJsonProtocol {
implicit object PathJsonFormat extends RootJsonFormat[Path] {
def write(c: Path): JsValue = c.path.toJson
def read(value: JsValue): Path = value.convertTo[String] // string2path
}
implicit val AppCfgFormat = jsonFormat(AppCfg, "paths", "selPath")
}
case class AppCfg(paths: Set[Path], selPath: Option[Path])
spray-json - ejemplos
type RetRels = Seq[(Ship, Ship)]
implicit val RetRelsWriter = new RootJsonWriter[RetRels] {
def write(rels: RetRels) =
rels.map { case (s1, s2) => s1.name -> s2.name }.toJson
}
implicit val RetRelsReader = new RootJsonReader[Seq[Ship] => RetRels] {
def read(value: JsValue) = { imps =>
val ship = imps.map { s => s.name -> s }.toMap
value.convertTo[Seq[(String, String)]] map {
case (n1, n2) => ship(n1) -> ship(n2)
}
}
}
val retRels = json.convertTo[Seq[Ship] => RetRels].apply(imps)
spray-json - resumen
Lógica de conversión desacoplada
Gran control sobre la conversión
Múltiples implementaciones
Distintos niveles de refinamiento
Conversiones asimétricas
Escalable
Agregar nuevas conversiones es barato
Las conversiones se pueden combinar
Scala IO
Entrada / salida en Scala
Manejo simple, portable, correcto y eficiente de
archivos y otros recursos de E/S
Componentes
IO Básico
Archivos
Acceso asincrónico
Processor
Scala IO - ejemplos
import scalax.file.Path
val path = Path("file")
path.byteArray // lee todos los bytes en memoria
// `bytes` es lazy y no lee los bytes hasta que son
// requeridos o forzados
path.bytes.drop(5).take(5).force
// lee todos los bytes en un String. El Codec puede ser
// implícito
path.string(Codec.UTF8)
Scala IO - ejemplos
def save[T: JsonFormat](t: T, path: Path) {
path.write(t.toJson.prettyPrint)(Codec.UTF8)
}
def load[T: JsonFormat](path: Path): T = {
path.string(Codec.UTF8).asJson.convertTo[T]
}
Scala IO - ejemplos
def command: (String, URL) = {
val name = if (isWin) "cmd.exe" else "cmd"
name -> this.getClass.getResource(name)
}
val basePath: Path = ...
val (cmdName, cmdResource) = command
val cmdPath = basePath / "cmd" / cmdName
Resource.fromURL(cmdResource).copyDataTo(cmdPath)
cmdPath.attributes = Seq(ExecuteAccessAttribute(true))
Scala IO - ejemplos
import scalax.io._
val output:Output = Resource.fromOutputStream(
new java.io.FileOutputStream("daily-scala.out"))
val in:Input = Resource.fromFile("daily-scala.out")
for{
processor <- output.outputProcessor
out = processor.asOutput
}{
// todas las escrituras van a ir al mismo output stream/channel abierto
out.write("first writen")
out.write("second write")
}
// muestra las líneas escritas
in.string
ScalaTest
Framework de testing
Multiples estilos de test
TDD - FunSuite
BDD - FunSpec
FeatureSpec
ScalaTest - ejemplos
import org.junit.runner.RunWith
import org.scalatest.junit.JUnitRunner
@RunWith(classOf[JUnitRunner])
class DummyTest extends FlatSpec with ShouldMatchers {
"A Stack" should "pop values in last-in-first-out order" in {
val stack = new Stack[Int]
stack.push(1)
stack.push(2)
stack.pop() should equal (2)
stack.pop() should equal (1)
}
it should "throw NoSuchElementException if an empty stack is popped" in {
val emptyStack = new Stack[String]
evaluating { emptyStack.pop() } should produce [NoSuchElementException]
}}
scala.sys.process
API para ejecutar y controlar procesos
Indicar qué correr y cómo
Manejar E/S
Correr proceso
Utilizado para ejecución y monitoreo del solver
scala.sys.process - ejemplos
import scala.sys.process._
// Ejecuta "ls" y envía la salida a stdout
"ls".!
// Ejecuta "ls" y devuelve `Stream[String]` con la salida.
val contents = Process("ls").lines
// Ejecuta "ls" y devuelve un String con la salida.
def contentsOf(dir: String): String = Seq("ls", dir).!!
scala.sys.process - ejemplos
new URL("http://databinder.net/dispatch/About") #>
"grep JSON" #>>
new File("About_JSON") !
scala.sys.process - ejemplos
val builder = Process(glpsol.cmd,
Seq(
"--model", modelPath.path,
"--data", dataPath.path,
"--check"))
val logger = ProcessLogger { line =>
onEDT { view.append(line) }
}
val proc = builder.run(logger)
PackratParsers
Construcción de parsers dentro del lenguaje
Admiten gramaticas recursivas por la izquierda
Los parsers comunes entran en loop
Experimentos muy básicos de parsear
entidades Mathprog
PackratParsers - ejemplos
expr ::= term { "+" term | "-" term }
term ::= factor { "*" factor | "/" factor }
factor ::= floatingPointNumber | "(" expr ")".
import scala.util.parsing.combinator._
class Arith extends JavaTokenParsers with PackratParsers {
lazy val expr: PackratParser[Any] = term ~ rep("+" ~ term | "-" ~ term)
lazy val term: PackratParser[Any] = factor ~ rep("*" ~ factor | "/" ~ factor)
lazy val factor: PackratParser[Any] = floatingPointNumber | "(" ~ expr ~ ")"
}
PackratParsers - ejemplos
sealed trait Expr
case class Add(t1: Expr, t2: Expr) extends Expr
case class Sub(t1: Expr, t2: Expr) extends Expr
sealed trait Term extends Expr
case class Mul(f1: Expr, f2: Expr) extends Term
case class Div(f1: Expr, f2: Expr) extends Term
sealed trait Factor extends Term
case class Num(n: Float) extends Factor
PackratParsers - ejemplos
class Arith extends JavaTokenParsers with PackratParsers {
lazy val expr: PackratParser[Expr] =
term ~ rep("+" ~ term | "-" ~ term) ^^ {
case term ~ list => ???
}
lazy val term: PackratParser[Expr] =
factor ~ rep("*" ~ factor | "/" ~ factor) ^^ {
case factor ~ list => ???
}
lazy val factor: PackratParser[Expr] = (
floatingPointNumber ^^ { ??? }
| "(" ~ expr ~ ")" ^^ { ??? } )
}
PackratParsers - ejemplos
lazy val factor: PackratParser[Expr] = (
floatingPointNumber ^^ { str => Num(str.toFloat) }
| "(" ~> expr <~ ")")
PackratParsers - ejemplos
lazy val term: PackratParser[Expr] =
factor ~ rep("*" ~ factor | "/" ~ factor) ^^ {
case factor ~ list =>
@tailrec
def parseFactor(e1: Expr, rest: List[String ~ Expr]): Expr = rest match {
case Nil => e1
case "*" ~ e2 :: rest1 => parseFactor(Mul(e1, e2), rest1)
case "/" ~ e2 :: rest1 => parseFactor(Div(e1, e2), rest1)
}
parseFactor(factor, list)
}
PackratParsers - ejemplos
def parse(str: String): Expr = {
val parser = new Arith
import parser._
parser.parse(phrase(expr), str) match {
case Success(result, _) => result
case failure: NoSuccess => sys.error(failure.toString)
}
}
parse("2 + 2 * 3 / (5 + 8)")
// Add(Num(2.0),Div(Mul(Num(2.0),Num(3.0)),Add(Num(5.0),Num(8.0))))
parse("2 + 2 * 3 / 5 + 8")
// Add(Add(Num(2.0),Div(Mul(Num(2.0),Num(3.0)),Num(5.0))),Num(8.0))
parse("2") // Num(2.0)
Otros - importar proyectos
type Loader = Path => Option[Project]
object Sega1_0_0Loader extends Loader { ... }
object Sega2_0_0Loader extends Loader { ... }
val loaders =
Sega2_0_0Loader :: Sega1_0_0Loader :: Nil
Otros - importar proyectos
def fromPath(path: Path): Option[Project] =
loaders.flatMap { load => load(path) }.headOption
Otros - importar proyectos
def fromPath(path: Path): Option[Project] =
loaders.view.flatMap { load => load(path) }.headOption
Otros - importar proyectos
def fromPath(path: Path): Future[Option[Project]] =
future {
loaders.view.flatMap { load => load(path) }.headOption
}
Otros - importar proyectos
def fromPath(path: Path): Future[Option[Project]] =
future {
loaders.view.flatMap { load => load(path) }.headOption
}
for {
optP <- fromPath(path)
p <- optP
} {
eventBus.publish(StatusMessage(s"Proj. ${p.name}"))
}
sbt
name := "sega"
version := "2.0.0-SNAPSHOT"
scalaVersion := "2.10.1"
libraryDependencies <+= scalaVersion( "org.scala-lang" % "scala-swing" % _ )
libraryDependencies ++= Seq(
"io.spray" %% "spray-json" % "1.2.3",
"com.github.scala-incubator.io" %% "scala-io-file" % "0.4.2",
"org.scalatest" %% "scalatest" % "1.9.1" % "test")
sbt - plugins
addSbtPlugin("com.typesafe.sbteclipse" % "sbteclipse-
plugin" % "2.1.2")
addSbtPlugin("com.eed3si9n" % "sbt-assembly" % "0.8.7")
sbteclipse
EclipseKeys.executionEnvironment := Some
(EclipseExecutionEnvironment.JavaSE16)
EclipseKeys.withSource := true
EclipseKeys.createSrc := EclipseCreateSrc.Default +
EclipseCreateSrc.Resource
sbt-assembly
import AssemblyKeys._
assemblySettings
// ... buil.sbt mostrado antes ...
mainClass in assembly := Some("uy.edu.fing.inco.invop.ancap.sega.ui.Sega")
packageOptions in assembly +=
Package.ManifestAttributes("SplashScreen-Image" ->
"uy/edu/fing/inco/invop/ancap/sega/splash.png")
Scala IDE for Eclipse
Plugin para desarrollo con Scala en Eclipse
Update site Eclipse Indigo y Scala 2.10
http://download.scala-ide.org/sdk/e37/scala210/stable/site
Lo peor
El compilador es lento
Las herramientas de desarrollo consumen
mucha memoria
Lo mejor
Se puede empezar "pequeño" y crecer a
demanda
Scala es escalable => nuestras aplicaciones
son escalables
Se puede tener tipado estático y escribir poco
al mismo tiempo :)
Referencias
Scala general
http://docs.scala-lang.org/overviews/
Scala-Swing
http://www.scala-lang.org/sid/8
http://ingomaier.blogspot.com/2010/11/scalaswing-package-in-28-and-beyond.
html
https://github.com/scala/scala/tree/master/docs/examples/swing
https://github.com/benhutchison/ScalaSwingContrib
http://www.interactivemesh.org/testspace/j3dmeetsscala.html
MVP
https://developers.google.com/web-
toolkit/doc/latest/DevGuideMvpActivitiesAndPlaces
Referencias
Reactive programming
https://github.com/ingoem/scala-react
https://github.com/nafg/reactive/tree/master/reactive-core
http://infoscience.epfl.ch/record/176887/files/DeprecatingObservers2012.pdf
http://etorreborre.blogspot.com/2011/10/counting-words-part-2.html
ScalaFX
https://code.google.com/p/scalafx/
https://github.com/rafonso/ProScalaFX
spray-json
https://github.com/spray/spray-json
Referencias
Scala IO
http://jesseeichar.github.com/scala-io-doc/
http://daily-scala.blogspot.com/2012/07/scala-io-getting-started.html (y
subsecuentes posts)
ScalaTest
http://www.scalatest.org/
http://www.scalatest.org/user_guide/using_scalatest_with_eclipse
Specs²
http://etorreborre.github.com/specs2/
Referencias
scala.sys.process
http://www.scala-lang.
org/archives/downloads/distrib/files/nightly/docs/library/index.html#scala.sys.
process.package
http://www.scala-lang.
org/archives/downloads/distrib/files/nightly/docs/library/index.html#scala.sys.
process.ProcessBuilder
PackratParsers
http://www.artima.com/pins1ed/combinator-parsing.html
http://www.scala-lang.
org/archives/downloads/distrib/files/nightly/docs/library/index.html#scala.util.
parsing.combinator.Parsers
http://www.scala-lang.
org/archives/downloads/distrib/files/nightly/docs/library/index.html#scala.util.
parsing.combinator.PackratParsers
Referencias
sbt
http://www.scala-sbt.org/
https://github.com/paulp/sbt-extras
https://github.com/sbt/sbt-assembly
https://github.com/typesafehub/sbteclipse
Scala IDE for Eclipse
http://scala-ide.org/
:)
Muchas gracias

Weitere ähnliche Inhalte

Was ist angesagt? (14)

Apache spark meetup
Apache spark meetupApache spark meetup
Apache spark meetup
 
Groovy
GroovyGroovy
Groovy
 
Presentacion6
Presentacion6Presentacion6
Presentacion6
 
Procesamiento de datos a gran escala con Apache Spark
Procesamiento de datos a gran escala con Apache SparkProcesamiento de datos a gran escala con Apache Spark
Procesamiento de datos a gran escala con Apache Spark
 
Python 4
Python 4Python 4
Python 4
 
Seguridad en PDF: Adobe ¬¬
Seguridad en PDF: Adobe ¬¬Seguridad en PDF: Adobe ¬¬
Seguridad en PDF: Adobe ¬¬
 
Lab archivos
Lab archivosLab archivos
Lab archivos
 
Introduccion a python 3
Introduccion a python 3Introduccion a python 3
Introduccion a python 3
 
ED 03 2_listas especiales
ED 03 2_listas especialesED 03 2_listas especiales
ED 03 2_listas especiales
 
Spark Hands-on
Spark Hands-onSpark Hands-on
Spark Hands-on
 
Sobrecarga de operadores
Sobrecarga de operadoresSobrecarga de operadores
Sobrecarga de operadores
 
.NET UY Meetup 6 - Integrando con C/C++ por medio de P/Invoke by Juan Ramirez
.NET UY Meetup 6 - Integrando con C/C++ por medio de P/Invoke by Juan Ramirez.NET UY Meetup 6 - Integrando con C/C++ por medio de P/Invoke by Juan Ramirez
.NET UY Meetup 6 - Integrando con C/C++ por medio de P/Invoke by Juan Ramirez
 
Introduccion A Groovy
Introduccion A GroovyIntroduccion A Groovy
Introduccion A Groovy
 
Clase1_Python-CTIC
Clase1_Python-CTICClase1_Python-CTIC
Clase1_Python-CTIC
 

Ähnlich wie Scala en proyectos de vinculación Ancap-UR - 2013-03

Desarrollo web en Nodejs con Pillars por Chelo Quilón
Desarrollo web en Nodejs con Pillars por Chelo QuilónDesarrollo web en Nodejs con Pillars por Chelo Quilón
Desarrollo web en Nodejs con Pillars por Chelo Quilónbetabeers
 
Tutorial en Apache Spark - Clasificando tweets en realtime
Tutorial en Apache Spark - Clasificando tweets en realtimeTutorial en Apache Spark - Clasificando tweets en realtime
Tutorial en Apache Spark - Clasificando tweets en realtimeSocialmetrix
 
Java 8 introducción a expresiones lambdas y api stream
Java 8  introducción a expresiones lambdas y api streamJava 8  introducción a expresiones lambdas y api stream
Java 8 introducción a expresiones lambdas y api streamEudris Cabrera
 
Java 8: Expresiones Lambdas y API Stream BarCamp RD 2016
Java 8: Expresiones Lambdas y API Stream BarCamp RD 2016Java 8: Expresiones Lambdas y API Stream BarCamp RD 2016
Java 8: Expresiones Lambdas y API Stream BarCamp RD 2016Eudris Cabrera
 
Web services restful con JAX-RS
Web services restful con JAX-RSWeb services restful con JAX-RS
Web services restful con JAX-RSVortexbird
 
Kit de supervivencia para Java 8 : como prepararse para Java 9
Kit de supervivencia para Java 8 :  como prepararse para Java 9Kit de supervivencia para Java 8 :  como prepararse para Java 9
Kit de supervivencia para Java 8 : como prepararse para Java 9Eudris Cabrera
 
Java fundamentos -15 consejos prácticos - Encuentro Universitario Comunidad J...
Java fundamentos -15 consejos prácticos - Encuentro Universitario Comunidad J...Java fundamentos -15 consejos prácticos - Encuentro Universitario Comunidad J...
Java fundamentos -15 consejos prácticos - Encuentro Universitario Comunidad J...Eudris Cabrera
 
Javascript Básico
Javascript BásicoJavascript Básico
Javascript Básicocamposer
 
Java fundamentos -15 consejos practicos open saturday 2018
Java fundamentos -15 consejos practicos open saturday 2018Java fundamentos -15 consejos practicos open saturday 2018
Java fundamentos -15 consejos practicos open saturday 2018Eudris Cabrera
 
Presentación Java Evolution - GlobalLogic Club
Presentación Java Evolution - GlobalLogic ClubPresentación Java Evolution - GlobalLogic Club
Presentación Java Evolution - GlobalLogic ClubGlobalLogic Latinoamérica
 

Ähnlich wie Scala en proyectos de vinculación Ancap-UR - 2013-03 (20)

Desarrollo web en Nodejs con Pillars por Chelo Quilón
Desarrollo web en Nodejs con Pillars por Chelo QuilónDesarrollo web en Nodejs con Pillars por Chelo Quilón
Desarrollo web en Nodejs con Pillars por Chelo Quilón
 
Tutorial en Apache Spark - Clasificando tweets en realtime
Tutorial en Apache Spark - Clasificando tweets en realtimeTutorial en Apache Spark - Clasificando tweets en realtime
Tutorial en Apache Spark - Clasificando tweets en realtime
 
Java 8 introducción a expresiones lambdas y api stream
Java 8  introducción a expresiones lambdas y api streamJava 8  introducción a expresiones lambdas y api stream
Java 8 introducción a expresiones lambdas y api stream
 
Java 8: Expresiones Lambdas y API Stream BarCamp RD 2016
Java 8: Expresiones Lambdas y API Stream BarCamp RD 2016Java 8: Expresiones Lambdas y API Stream BarCamp RD 2016
Java 8: Expresiones Lambdas y API Stream BarCamp RD 2016
 
04 j flex
04 j flex04 j flex
04 j flex
 
Apuntes de XSD
Apuntes de XSDApuntes de XSD
Apuntes de XSD
 
Introducción a Scala
Introducción a ScalaIntroducción a Scala
Introducción a Scala
 
Curso Bash 3
Curso Bash 3Curso Bash 3
Curso Bash 3
 
Web services restful con JAX-RS
Web services restful con JAX-RSWeb services restful con JAX-RS
Web services restful con JAX-RS
 
Kit de supervivencia para Java 8 : como prepararse para Java 9
Kit de supervivencia para Java 8 :  como prepararse para Java 9Kit de supervivencia para Java 8 :  como prepararse para Java 9
Kit de supervivencia para Java 8 : como prepararse para Java 9
 
Java fundamentos -15 consejos prácticos - Encuentro Universitario Comunidad J...
Java fundamentos -15 consejos prácticos - Encuentro Universitario Comunidad J...Java fundamentos -15 consejos prácticos - Encuentro Universitario Comunidad J...
Java fundamentos -15 consejos prácticos - Encuentro Universitario Comunidad J...
 
Computación distribuida usando Python
Computación distribuida usando PythonComputación distribuida usando Python
Computación distribuida usando Python
 
Javascript Básico
Javascript BásicoJavascript Básico
Javascript Básico
 
Java fundamentos -15 consejos practicos open saturday 2018
Java fundamentos -15 consejos practicos open saturday 2018Java fundamentos -15 consejos practicos open saturday 2018
Java fundamentos -15 consejos practicos open saturday 2018
 
Java 7- Java Day Guatemala
Java 7- Java Day GuatemalaJava 7- Java Day Guatemala
Java 7- Java Day Guatemala
 
Programación de código
Programación de códigoProgramación de código
Programación de código
 
ARCHIVOS
ARCHIVOS ARCHIVOS
ARCHIVOS
 
Curso prog sist
Curso prog sistCurso prog sist
Curso prog sist
 
Presentación Java Evolution - GlobalLogic Club
Presentación Java Evolution - GlobalLogic ClubPresentación Java Evolution - GlobalLogic Club
Presentación Java Evolution - GlobalLogic Club
 
23 sparql
23 sparql23 sparql
23 sparql
 

Kürzlich hochgeladen

Trabajo de Tecnología .pdfywhwhejsjsjsjsjsk
Trabajo de Tecnología .pdfywhwhejsjsjsjsjskTrabajo de Tecnología .pdfywhwhejsjsjsjsjsk
Trabajo de Tecnología .pdfywhwhejsjsjsjsjskbydaniela5
 
Trabajando con Formasy Smart art en power Point
Trabajando con Formasy Smart art en power PointTrabajando con Formasy Smart art en power Point
Trabajando con Formasy Smart art en power PointValerioIvanDePazLoja
 
Trabajo de tecnología excel avanzado.pdf
Trabajo de tecnología excel avanzado.pdfTrabajo de tecnología excel avanzado.pdf
Trabajo de tecnología excel avanzado.pdfedepmariaperez
 
La electricidad y la electronica.10-7.pdf
La electricidad y la electronica.10-7.pdfLa electricidad y la electronica.10-7.pdf
La electricidad y la electronica.10-7.pdfcristianrb0324
 
Guía de Registro slideshare paso a paso 1
Guía de Registro slideshare paso a paso 1Guía de Registro slideshare paso a paso 1
Guía de Registro slideshare paso a paso 1ivanapaterninar
 
TENDENCIAS DE IA Inteligencia artificial generativa.pdf
TENDENCIAS DE IA Inteligencia artificial generativa.pdfTENDENCIAS DE IA Inteligencia artificial generativa.pdf
TENDENCIAS DE IA Inteligencia artificial generativa.pdfJoseAlejandroPerezBa
 
Trabajo de tecnología liceo departamental
Trabajo de tecnología liceo departamentalTrabajo de tecnología liceo departamental
Trabajo de tecnología liceo departamentalEmanuelCastro64
 
TALLER DE ANALISIS SOLUCION PART 2 (1)-1.docx
TALLER DE ANALISIS SOLUCION  PART 2 (1)-1.docxTALLER DE ANALISIS SOLUCION  PART 2 (1)-1.docx
TALLER DE ANALISIS SOLUCION PART 2 (1)-1.docxobandopaula444
 
CommitConf 2024 - Spring Boot <3 Testcontainers
CommitConf 2024 - Spring Boot <3 TestcontainersCommitConf 2024 - Spring Boot <3 Testcontainers
CommitConf 2024 - Spring Boot <3 TestcontainersIván López Martín
 
Actividades de computación para alumnos de preescolar
Actividades de computación para alumnos de preescolarActividades de computación para alumnos de preescolar
Actividades de computación para alumnos de preescolar24roberto21
 
#Tare10ProgramacionWeb2024aaaaaaaaaaaa.pptx
#Tare10ProgramacionWeb2024aaaaaaaaaaaa.pptx#Tare10ProgramacionWeb2024aaaaaaaaaaaa.pptx
#Tare10ProgramacionWeb2024aaaaaaaaaaaa.pptxHugoGutierrez99
 
TinkerCAD y figuras en 3D. Uso del programa TinkerCAD para crear fuguras.
TinkerCAD y figuras en 3D. Uso del programa TinkerCAD para crear fuguras.TinkerCAD y figuras en 3D. Uso del programa TinkerCAD para crear fuguras.
TinkerCAD y figuras en 3D. Uso del programa TinkerCAD para crear fuguras.radatoro1
 
certificado de oracle academy cetrificado.pdf
certificado de oracle academy cetrificado.pdfcertificado de oracle academy cetrificado.pdf
certificado de oracle academy cetrificado.pdfFernandoOblitasVivan
 
Análisis de los artefactos (nintendo NES)
Análisis de los artefactos (nintendo NES)Análisis de los artefactos (nintendo NES)
Análisis de los artefactos (nintendo NES)JuanStevenTrujilloCh
 
Clasificación de Conjuntos de Datos Desequilibrados.pptx
Clasificación de Conjuntos de Datos Desequilibrados.pptxClasificación de Conjuntos de Datos Desequilibrados.pptx
Clasificación de Conjuntos de Datos Desequilibrados.pptxCarolina Bujaico
 
Slideshare y Scribd - Noli Cubillan Gerencia
Slideshare y Scribd - Noli Cubillan GerenciaSlideshare y Scribd - Noli Cubillan Gerencia
Slideshare y Scribd - Noli Cubillan Gerenciacubillannoly
 
Herramientas que posibilitan la información y la investigación.pdf
Herramientas que posibilitan la información y la investigación.pdfHerramientas que posibilitan la información y la investigación.pdf
Herramientas que posibilitan la información y la investigación.pdfKarinaCambero3
 
Tecnología Educativa- presentación maestría
Tecnología Educativa- presentación maestríaTecnología Educativa- presentación maestría
Tecnología Educativa- presentación maestríaElizabethLpezSoto
 
tecnologiaactividad11-240323205859-a9b9b9bc.pdf
tecnologiaactividad11-240323205859-a9b9b9bc.pdftecnologiaactividad11-240323205859-a9b9b9bc.pdf
tecnologiaactividad11-240323205859-a9b9b9bc.pdflauralizcano0319
 
Trabajo de tecnología primer periodo 2024
Trabajo de tecnología primer periodo 2024Trabajo de tecnología primer periodo 2024
Trabajo de tecnología primer periodo 2024anasofiarodriguezcru
 

Kürzlich hochgeladen (20)

Trabajo de Tecnología .pdfywhwhejsjsjsjsjsk
Trabajo de Tecnología .pdfywhwhejsjsjsjsjskTrabajo de Tecnología .pdfywhwhejsjsjsjsjsk
Trabajo de Tecnología .pdfywhwhejsjsjsjsjsk
 
Trabajando con Formasy Smart art en power Point
Trabajando con Formasy Smart art en power PointTrabajando con Formasy Smart art en power Point
Trabajando con Formasy Smart art en power Point
 
Trabajo de tecnología excel avanzado.pdf
Trabajo de tecnología excel avanzado.pdfTrabajo de tecnología excel avanzado.pdf
Trabajo de tecnología excel avanzado.pdf
 
La electricidad y la electronica.10-7.pdf
La electricidad y la electronica.10-7.pdfLa electricidad y la electronica.10-7.pdf
La electricidad y la electronica.10-7.pdf
 
Guía de Registro slideshare paso a paso 1
Guía de Registro slideshare paso a paso 1Guía de Registro slideshare paso a paso 1
Guía de Registro slideshare paso a paso 1
 
TENDENCIAS DE IA Inteligencia artificial generativa.pdf
TENDENCIAS DE IA Inteligencia artificial generativa.pdfTENDENCIAS DE IA Inteligencia artificial generativa.pdf
TENDENCIAS DE IA Inteligencia artificial generativa.pdf
 
Trabajo de tecnología liceo departamental
Trabajo de tecnología liceo departamentalTrabajo de tecnología liceo departamental
Trabajo de tecnología liceo departamental
 
TALLER DE ANALISIS SOLUCION PART 2 (1)-1.docx
TALLER DE ANALISIS SOLUCION  PART 2 (1)-1.docxTALLER DE ANALISIS SOLUCION  PART 2 (1)-1.docx
TALLER DE ANALISIS SOLUCION PART 2 (1)-1.docx
 
CommitConf 2024 - Spring Boot <3 Testcontainers
CommitConf 2024 - Spring Boot <3 TestcontainersCommitConf 2024 - Spring Boot <3 Testcontainers
CommitConf 2024 - Spring Boot <3 Testcontainers
 
Actividades de computación para alumnos de preescolar
Actividades de computación para alumnos de preescolarActividades de computación para alumnos de preescolar
Actividades de computación para alumnos de preescolar
 
#Tare10ProgramacionWeb2024aaaaaaaaaaaa.pptx
#Tare10ProgramacionWeb2024aaaaaaaaaaaa.pptx#Tare10ProgramacionWeb2024aaaaaaaaaaaa.pptx
#Tare10ProgramacionWeb2024aaaaaaaaaaaa.pptx
 
TinkerCAD y figuras en 3D. Uso del programa TinkerCAD para crear fuguras.
TinkerCAD y figuras en 3D. Uso del programa TinkerCAD para crear fuguras.TinkerCAD y figuras en 3D. Uso del programa TinkerCAD para crear fuguras.
TinkerCAD y figuras en 3D. Uso del programa TinkerCAD para crear fuguras.
 
certificado de oracle academy cetrificado.pdf
certificado de oracle academy cetrificado.pdfcertificado de oracle academy cetrificado.pdf
certificado de oracle academy cetrificado.pdf
 
Análisis de los artefactos (nintendo NES)
Análisis de los artefactos (nintendo NES)Análisis de los artefactos (nintendo NES)
Análisis de los artefactos (nintendo NES)
 
Clasificación de Conjuntos de Datos Desequilibrados.pptx
Clasificación de Conjuntos de Datos Desequilibrados.pptxClasificación de Conjuntos de Datos Desequilibrados.pptx
Clasificación de Conjuntos de Datos Desequilibrados.pptx
 
Slideshare y Scribd - Noli Cubillan Gerencia
Slideshare y Scribd - Noli Cubillan GerenciaSlideshare y Scribd - Noli Cubillan Gerencia
Slideshare y Scribd - Noli Cubillan Gerencia
 
Herramientas que posibilitan la información y la investigación.pdf
Herramientas que posibilitan la información y la investigación.pdfHerramientas que posibilitan la información y la investigación.pdf
Herramientas que posibilitan la información y la investigación.pdf
 
Tecnología Educativa- presentación maestría
Tecnología Educativa- presentación maestríaTecnología Educativa- presentación maestría
Tecnología Educativa- presentación maestría
 
tecnologiaactividad11-240323205859-a9b9b9bc.pdf
tecnologiaactividad11-240323205859-a9b9b9bc.pdftecnologiaactividad11-240323205859-a9b9b9bc.pdf
tecnologiaactividad11-240323205859-a9b9b9bc.pdf
 
Trabajo de tecnología primer periodo 2024
Trabajo de tecnología primer periodo 2024Trabajo de tecnología primer periodo 2024
Trabajo de tecnología primer periodo 2024
 

Scala en proyectos de vinculación Ancap-UR - 2013-03