miércoles, 13 de octubre de 2021

 Retrofit 2 con KOTLIN


Hace tiempo quería crear este mini tutorial, ya que en internet he visto demasiada información combinada, pero que  puede marear a cualquier developer que solo busca información concisa. Y para los no entendidos del tema, Retrofit es la librería más usada para hacer peticiones red(Consumir una Api) desde una aplicación Android. Estoy basándome en la información proporcionada del Android Developer Aris Guimerá en su curso de Open Webinars, dejo el link para que compren el curso que me parece excelente. https://openwebinars.net/academia/portada/api-retrofit2-kotlin/

 Ahora sí vamos al lio!


1.- Instalamos las librerías necesarias(Retrofit2, Gson,OkHttp3, loggin-interceptor, corrutinas)

  - Retrofit2: Librería para hacer las peticiones 

  -  Gson: Para transformar la información que nos llega de la api a una forma muy sencilla de trabajar. para "Parsear"

 - OkHttp3 : Librería que nos provee de funciones que nos ayudan al momento de trabajar con Retrofit

- logging-interceptor : Para llevar un tracking de la respuesta que nos llega, mediante logcat

- Corrutinas: Trabajar en segundo hilo.



2.- Habilitar permisos de internet en el Manifest


3.- Usamos un front básico para darle usabilidad.




4.- Nos olvidamos de activar el viewBinding true en el gradle, ya que usaremos esto para relacionar las vistas y no tener problemas nulidad al llamar ids. Pues lo ponemos!



5.- Nos vamos al Main Activity y creamos la variable binding y empezamos a relacionar vistas con variables 

6.- Creamos un fichero llamado API, lo hacemos con Singleton para crear una única instancia del objeto Retrofit




 7.- Crear una Interface que defina el contrato entre nuestra API y nosotros, para ver bien el json que nos trae podemos usar https://jsoneditoronline.org/.




8.- Creando una data class para hacer el modelo de datos que necesitamos. La llamaremos Language y crearemos el data class con los tipo de valores que nos devuelve.Además como empiza con [ es un array, y si es un array tenemos que crear un listado.







 Ya tenemos el modelo de datos listo.


9.- Conectamos el Api Service con el Api


10.- Implementando la corrutinas para no hacerlo en el hilo principal.



Y en el Api Service usar la palabra reservada suspend 


Petición correcta

11.- Ahora que ya sabemos que hace la petición correcta, hacemos la petición real. 
Haremos la llamada Post . Se tiene que modelar el objeto correctamente si queremos que funcione.
Añadimos el Header, el post y FormUrlEncoded

@Headers("Authorization: Bearer 657271e907c55609174816fb78716aa8")
@FormUrlEncoded
@POST ("0.2/detect")
suspend fun getTxtLanguage(@Field("q")text:String )
Quedaría así: 



Luego vemos el modelo en nuestro JsonEditorOnline y observamos como esta el json para hacer una modelación correcta .
Observamos que hay un objeto que dentro hay otro objeto llamado data, que dentro tiene un array o listado y dentro hay 3 elementos . Pues hay que modelarlo así .
Entonces, primero creamos una data class y la llamamos DetectionResponse.



Este data class va a contener un objeto llamado data , entonces creamos otro data class y la llamamos Data, y esta clase data va contener un listado de detection y


 Y ahora creamos otra data class y la llamamos Detection que va contener el contenido del listado

                                       




, y ahora no dirigimos a la  data class Data y la modificamos el nombre del la clase Detection


Ahora vamos al ApiService y agregamos que el tipo de respuesta sera:

: Response<DetectionResponse>




Ya tenemos creada la petición post!

@POST    


12.- Ahora tenemos que conectar todo al activity para tener un flujo completo .
Primero iniciamos el listener necesario.




Creamos la función getTextLanguage
private fun getTextLanguage(text: String) {
CoroutineScope(Dispatchers.IO).launch {
var result = retrofitService.getTxtLanguage(text)

if (result.isSuccessful) {
checkResult(result.body())
} else {
showError()

}
}
}
creamos la función checkResult
Lo analizamos asi : Si detectionResponse es distinto de null y si este listado no es nulo ni vacío, pues haz algo
private fun checkResult(detectionResponse: DetectionResponse?) {
if (detectionResponse != null && !detectionResponse.data.detections.isNullOrEmpty()) {
val correctLanguages= detectionResponse.data.detections.filter { it.isReliable }
if (correctLanguages.isNotEmpty()) {


runOnUiThread {
Toast.makeText(
this,
"El idioma es ${correctLanguages.first().language}", Toast.LENGTH_SHORT
).show()
}
}

}
}

Y el resultado por ahora queda asi :




Modificación de la función checkResult




Probamos



Ahora añadiremos un progress Bar



13.-  Añadiendo extras :

Ahora  pasamos al Main Activity y añadimos este progressBar

private lateinit var progressBar: ProgressBar

private fun initView() {
btnDetectLanguage = binding.btnDetectLanguage
etDescription = binding.etDescription
progressBar = binding.progressBar
}

private fun initListener() {
btnDetectLanguage.setOnClickListener {
val text = etDescription.text.toString()
if (text.isNotEmpty()) {
showLoading()
getTextLanguage(text)

}
}
}

Ahora le decimos que la función showLoading sea Visible cuando den click en el botón

private fun showLoading() {
progressBar.visibility= View.VISIBLE
}


Y ahora creamos la funcion hideLoading cuando funcione o no funcione se esconda el progressBar

private fun showLoading() {
progressBar.visibility= View.VISIBLE
}

private fun hideLoading() {
progressBar.visibility= View.GONE
}


Añadimos el cleanText, para que cuando finalice se limpie el campo.



private fun cleanText() {
etDescription.setText("")
}


14.- Usaremos logging interceptor , creamos la variable logging en la clase API



object API {
private const val BASE_URL = "https://ws.detectlanguage.com/"

val retrofitService: ApiService by lazy {
getRetrofit().create(ApiService::class.java)
}

private fun getRetrofit(): Retrofit {
val logging = HttpLoggingInterceptor()
logging.setLevel(HttpLoggingInterceptor.Level.BODY)
val httpClient=OkHttpClient.Builder()

httpClient.addInterceptor(logging)

return Retrofit.Builder()
.baseUrl(BASE_URL)
.addConverterFactory(GsonConverterFactory.create())
.client(httpClient.build())
.build()
}

}



private fun showLoading() {
progressBar.visibility = View.VISIBLE
}

private fun hideLoading() {
runOnUiThread {
progressBar.visibility = View.GONE
}

}


private fun getTextLanguage(text: String) {
CoroutineScope(Dispatchers.IO).launch {
var result = retrofitService.getTxtLanguage(text)
if (result.isSuccessful) {
checkResult(result.body())
} else {
showError()
}
cleanText()
hideLoading()
}
}

viernes, 30 de septiembre de 2016

Estructuras Selectivas - UPC - Ruby

Ejercicio 1

Una empresa desea calcular las importaciones de trigo del 2015. Para ello han adquirido la estadística del aumento previsto del año. Lo que se requiere es que se pueda calcular el momento correcto para comprar según los aumentos y disminuciones mensuales. El precio varía de mes en mes dependiendo de estos aumentos o disminuciones.

Se sabe que en enero, abril, julio y octubre el precio sufre un aumento del 15% mientras que en febrero, marzo, mayo y junio disminuye un 3% y en agosto, setiembre, noviembre y diciembre el precio disminuye un 2%.

El otro costo a tomar en cuenta es el de los costos de transporte que se sabe tiene la siguiente fluctuación enero, febrero, abril, julio, setiembre y octubre cuesta US1200 por contenedor. Marzo, mayo, junio, agosto, noviembre y diciembre el costo es de US1800 por  contenedor. El mes será el mismo que el de la compra.

Se le pide desarrollar

-Un programa que calcule el costo del trigo a un mes determinado considerando los aumentos y disminuciones.
-Un programa que calcule el costo del transporte en un mes determinado.

-Un programa que determine el mes más conveniente para traer el embarque tomando en cuenta la cantidad de contenedores.


Imagen 2 Completa


Parte 3

Parte final


=begin
Una empresa desea calcular las importaciones de trigo del 2015. Para ello han 
adquirido las estadística del aumento previsto del año. Lo que se requiere es que
se pueda calcular el momento correcto para comprar según los aumentos
y decrementos mensuales.

Se sabe que en enero, abril, julio y octubre el precio sufre un aumento del 
15% mientras que en febrero, marzo, mayo y junio baja un 3% y en agosto, setiembre, 
noviembre y diciembre el precio baja 2%. 

El otro costo a tomar en cuenta es el de los costos de transporte que se sabe
tiene la siguiente fluctuación

enero, febrero, abril, julio, setiembre y octubre cuesta US1200 por contenedor.
marzo, mayo, junio, agosto, noviembre y diciembre el costo es de US1800 por 
contenedor. El mes será el mismo que el de la compra. 

Se le pide desarrollar

Un programa que calcule el costo del trigo en un mes determinado.
Un programa que calcule el costo del transporte en un mes determinado. 
Un programa que determine el mes más conveniente para traer el embarque
tomando en cuenta la cantidad . 

=end

def costo(mes, precio_actual)

end

def transporte(mes, cantidad_contenedores)

end

def mes_conveniente(mes_maximo, precio_actual, cantidad_contenedores)

end

#--- zona del programa principal ----

#--- zona de test ----
def test_costo
    print validate(147.23, costo(12, 100.0)) 
    print validate(144.84, costo(5, 120.0)) 
    print validate(151.48, costo(3, 140.0)) 
end

def test_transporte
    print validate(1800.0, transporte(12, 1)) 
    print validate(3600.0, transporte(5, 2)) 
    print validate(12000.0, transporte(4, 10)) 
end

def test_mas_conveniente
    print validate(2,  mes_conveniente(5, 100.0, 10))
end

def validate (expected, value)
 expected == value ? "." : "F"
end

def test
   
  puts "Test de prueba del programa"
  puts "---------------------------"
  test_costo
  puts ""
  test_transporte
  puts " "
  test_mas_conveniente
end
test
--------------------------------------------
------------------------------------------

Ejercicio 2 

Un grupo de amigos ha juntado un fondo de inversión y quiere tomar la decisión de cómo invertir su dinero, para esto tiene dos propuestas una es invertir en un proyecto de negocios (startup) con alto riesgo pero con un alto retorno en los últimos meses del proyecto. Donde la otra alternativa es invertir en un fondo mutuo con una tasa de interés baja pero segura.

El tiempo propuesto para el retorno de la inversión es el mismo en ambos casos.

Para el caso del proyecto, los socios han planteado un retorno de la inversión de la siguiente forma: durante los 3 primeros meses (no rendirá nada nada porque será un tiempo de gracia), luego el proyecto generará una ganancia de un 15% del monto prestado por mes. La ganancia sumada al monto de la inversión se considera el retorno de la inversión.

Para el fondo mutuo, la inversión genera un interés acumulado (capitalizable) de 7% mensual.

Desarrollar los siguientes subprogramas:

- Calcular el monto a recuperar una vez terminado el proyecto
- Calcular el monto a recuperar una vez terminado los meses de ahorro en el banco
- Determinar cuál es la mejor oportunidad. Si fuera proyecto, debe indicar “proyecto”, si fuera fondo mutuo, debe indicar “fondo mutuo”.

Inicio.


def ganancias_proyectos(monto,mes)

end

def ganancias_plazo_fijo(monto,mes)

end

def conveniente(monto,mes)

end

#--- zona del programa principal ----

#--- zona de test ----
def test_ganancias_proyectos
    print validate(1600.0, ganancias_proyectos(1000,7)) 
    print validate(30750.0, ganancias_proyectos(15000,10)) 
    print validate(14200.0, ganancias_proyectos(4000,20)) 
end

def test_ganancias_plazo_fijo
    print validate(1605.78, ganancias_plazo_fijo(1000,7)) 
    print validate(29507.27, ganancias_plazo_fijo(15000,10)) 
    print validate(15478.74, ganancias_plazo_fijo(4000,20)) 
end

def test_mas_conveniente
    print validate("fondo mutuo",conveniente(1000,7))
    print validate("proyecto",conveniente(15000,10))
    print validate("fondo mutuo",conveniente(4000,20))
end

def validate (expected, value)
 expected == value ? "." : "F"
end

def test
   
  puts "Test de prueba del programa"
  puts "---------------------------"
  test_ganancias_proyectos
  puts ""
  test_ganancias_plazo_fijo
  puts " "
  test_mas_conveniente
  puts " "
end

test

Ejercicios desarrollados por Edinson Marvin Egoavil Samaniego, estudiante de Ingeniería de la UPC.
cualquier duda o consulta a Marvinegoavil@gmail.com



Edinson Marvin Egoavil Samaniego
Universidad Peruana de Ciencias Aplicadas (UPC)
Facultad de Ingeniería
Carrera : Ingeniería Industrial 
Curso : Fundamentos de Programación




Estructuras Selectivas - UPC RUBY

Pregunta 4

Debido al fenómeno del niño el gobierno requiere llevar un cuidadoso registro de la temperatura del mar en los meses del año. Se sabe que en
-     enero, abril, julio y octubre la temperatura sube un 15%. En los meses de
 - Febrero, marzo, noviembre y junio la temperatura baja un 13%
y en
-     agosto, setiembre, mayo y diciembre sube un 12%.
Estas temperaturas van variando cada mes.

Se pide desarrolle un subprograma que permita calcular la temperatura proyectada considerando el mes actual, la temperatura actual y el mes a calcular.

Por ejemplo si se tiene como mes actual enero y se quiere medir hasta diciembre el cambio de temperatura de 25 grados se enviará como datos

nueva_temperatura(1, 12, 25.0)

La respuesta será la nueva temperatura

De igual manera se quiere calcular el mes de mayor temperatura desde un mes inicial hasta un mes final. De forma tal que si quiero calcular el mes de mayor temperatura entre marzo y julio comenzando en marzo con una temperatura de 25 grados se enviará como datos

mes_alarma(3, 7, 25.0)


La respuesta será el número del mes con mayor temperatura entre el mes 3 y 7
-------------------------------------------------------------------------------------------------------

Desarrollo

. Parte 1 


. Parte 2

(Este programa falta terminar, subiré el test)

def nueva_temperatura(mes_inicial, mes_final, temperatura_actual)
  for i in mes_inicial..mes_final
    case i
    when 1,4,7,10
      temperatura_actual= 1.15*temperatura_actual
    when 2,3,11,6
      temperatura_actual = 0.87*temperatura_actual
    when 8,9,5,12
     temperatura_actual =1.12*temperatura_actual
   end
 end
   return temperatura_actual.round(2)
end

def mes_alarma(mes_inicial, mes_maximo, temperatura_actual) #mes_alarma(3, 7, 25.0)
   porcentaje=nueva_temperatura(mes_inicial,mes_maximo,temperatura_actual)
  for i in mes_inicial..mes_maximo
       alarma= alarma + porcentaje



end

#--- zona del programa principal ----

#--- zona de test ----
def test_nueva_temperatura
    print validate(39.42, nueva_temperatura(1, 12, 25.0)) 
    print validate(32.5, nueva_temperatura(3, 5, 29.0)) 
    print validate(32.77, nueva_temperatura(2, 8, 30.0)) 
    print validate(25.69, nueva_temperatura(2, 9, 21.0)) 
end


def test_mes_alarma
    print validate(7,  mes_alarma(3, 7, 25.0))
    print validate(10,  mes_alarma(1, 12, 27.0))   
    print validate(10,  mes_alarma(2, 10, 21.0))   
    print validate(5,  mes_alarma(4, 6, 22.0))   
end

def validate (expected, value)
 expected == value ? "." : "F"
end

def test
   
  puts "Test de prueba del programa"
  puts "---------------------------"
  test_nueva_temperatura
  puts " "
  test_mes_alarma
end
test

La Perestroika y El Glasnot ( перестройка and Гласность)


La Perestroika y el Glásnost


Fueron las dos políticas internas que Mijaíl Gorbachov (presidente de la ex Unión Soviética) implantó para reactivar la economía soviética y restaurar la  libertad de expresión.


En primer lugar, la Perestroika o “Reestructuración” fue una reforma económica, cuyo propósito fue que la URSS se convirtiera en una economía socialista de mercado y de esa forma preservar el  sistema.
En segundo lugar, El Glásnost o “Transparencia” significó una apertura a la libertad de expresión e información para todo el pueblo de la URSS. Durante este proceso, se liberaron presos y se permitió la crítica al gobierno.

Gorbachov implantó estas reformas porque entendía que la Unión Soviética se encontraba estancada y necesitaba que muchos sectores económicos sean impulsados. Aunque  la URSS no se encontraba en crisis, sí tenía una economía paternalista.  Así también, Gorbachov entendía que entregar una mayor libertad de expresión y disminuir la censura liberaría a su pueblo y de ese modo mejoraría el clima de debate político que cree críticas para el bienestar de su propio país.


                                            ( http://sobrehistoria.com/perestroika/ )

Edinson Marvin Egoavil Samaniego
Universidad Peruana de Ciencias Aplicadas (UPC)
Facultad de Ingeniería
Carrera : Ingeniería Industrial 
Curso : Historía Crítica del Perú y del Mundo

Estructuras Repetitivas - Ruby - Upc Parte II

Estructuras Repetitivas - Parte II

El Banco GLP quiere incentivar el ahorro, por ello está ofreciendo un producto especial para las personas que quieran colocar su dinero en el Banco. La oferta consiste en tener tasas de interés escalonadas por el tiempo que su dinero estará sin moverlo a una tasa flat (es decir, el interés se calcula por el monto * tasa /100). La tasa inicial ofrecida, se le aumenta un punto porcentual por cada tres meses de permanencia, con capitalización mensual (el interés se suma al capital cada mes).

Por ejemplo: con un capital de S/. 1,000, a una tasa de 10% mensual en 3 meses. Capitalización mensual ganará lo siguiente:

Mes
Capital
Tasa Interés
Intereses
Nuevo Capital
1
1000
10% (0.10)
100
1100
2
1100
10% (0.10)
110
1210
3
1210
11% (0.11)
133.10
1343.10


                       S/. 1,343.1 es lo que ganará la persona al cabo de 3 meses


Desarrollar un subprograma que determine lo que la persona ganará al final del tiempo elegido, para su dinero a la tasa pactada.


Edinson Marvin Egoavil Samaniego
Universidad Peruana de Ciencias Aplicadas (UPC)
Facultad de Ingeniería
Carrera : Ingeniería Industrial 
Curso : Programación