Archive for the ‘Uncategorized’ Category

Covariance in Kotlin

septiembre 23, 2018

Implementation of https://www.linkedin.com/pulse/factory-method-pattern-kotlin-generics-v%C3%ADctor-mart%C3%ADn-molina/ using Covariance (now you can define functions like “someFunWithMagicRoom” thanks to “out T: Room”):

package org.myorg.generic

fun main(args: Array<String>) {
    val ordinaryGame = OrdinaryMazeGame()
    val magicGame = MagicMazeGame()
}

abstract class Room {
    fun connect(room: Room) {
    }
}

class MagicRoom : Room()

class OrdinaryRoom : Room()

class MagicMazeGame : MazeGame<MagicRoom>() {
    override fun makeRoom(): MagicRoom = MagicRoom()
}

class OrdinaryMazeGame : MazeGame<OrdinaryRoom>() {
    override fun makeRoom(): OrdinaryRoom = OrdinaryRoom()
}

fun someFunWithMagicRoom(m: MazeGame<MagicRoom>) {
    someFunWithRoom(m)
}

fun someFunWithRoom(m: MazeGame<Room>) {
}

abstract class MazeGame<out T: Room> {
    private val rooms = mutableListOf<T>()

    init {
        val room1 = makeRoom()
        val room2 = makeRoom()
        room1.connect(room2)
        rooms.add(room1)
        rooms.add(room2)
    }

    protected abstract fun makeRoom(): T
}

Anuncios

Factory method pattern in Kotlin (Generics)

septiembre 23, 2018

Implementation of https://www.linkedin.com/pulse/factory-method-pattern-kotlin-v%C3%ADctor-mart%C3%ADn-molina/ using Generics

fun main(args: Array<String>) {
    val ordinaryGame = OrdinaryMazeGame()
    val magicGame = MagicMazeGame()
}

abstract class Room {
    fun connect(room: Room) {
    }
}

class MagicRoom : Room()

class OrdinaryRoom : Room()

class MagicMazeGame : MazeGame<MagicRoom>() {
    override fun makeRoom(): MagicRoom = MagicRoom()
}

class OrdinaryMazeGame : MazeGame<OrdinaryRoom>() {
    override fun makeRoom(): OrdinaryRoom = OrdinaryRoom()
}

abstract class MazeGame<T: Room> {
    private val rooms = mutableListOf<T>()

    init {
        val room1 = makeRoom()
        val room2 = makeRoom()
        room1.connect(room2)
        rooms.add(room1)
        rooms.add(room2)
    }

    protected abstract fun makeRoom(): T
}

But these operations are dangerous because your class can be inherited, and a derived class is not yet initialized at this moment. Typical example:

package org.myorg

fun main(args: Array<String>) {
    testIt()
}

abstract class Base {
    val code = calculate()
    abstract fun calculate(): Int
}

class Derived(val x: Int) : Base() {
    override fun calculate(): Int {
        println("Derived.calculate: x is $x")

        return x
    }
}

fun testIt() {
    val d = Derived(42)
    println("testIt: d.code is ${d.code}") // Expected: 42, actual: 0
    println("testIt: d.x is ${d.x}")
}

Use-Site Variance: adding the following function to the main code:

fun <T: Room> someFun(r1: MutableList<T>, r2: MutableList<out T>) {
    r1[0].connect(r2[0])
}

you can now mix these subtypes:

fun mix() {
    val r1 = mutableListOf(MagicRoom()) as MutableList<Room>
    val r2 = mutableListOf(MagicRoom())

    someFun(r1, r2)
}

Factory method pattern in Kotlin

septiembre 22, 2018

Implementation of https://en.wikipedia.org/wiki/Factory_method_pattern#Java in Kotlin using companion object

package org.myorg

fun main(args: Array<String>) {
    val ordinaryGame = MazeGame.makeOrdinaryMazeGame()
    val magicGame = MazeGame.makeMagicMazeGame()
}

abstract class Room {
    fun connect(room: Room) {
    }
}

class MagicRoom : Room()

class OrdinaryRoom : Room()

class MazeGame private constructor(room1: Room, room2: Room) {
    private val rooms = mutableListOf<Room>()

    init {
        room1.connect(room2)
        rooms.add(room1)
        rooms.add(room2)
    }
    companion object {
        fun makeMagicMazeGame() = MazeGame(MagicRoom(), MagicRoom())
        fun makeOrdinaryMazeGame() = MazeGame(OrdinaryRoom(), OrdinaryRoom())
    }
}

Introducción a MongoDB Stitch

diciembre 6, 2017

Primero llegó “Infrastructure as a service (IaaS)” donde pudimos desplegar MongoDB en una infraestructura completa (AWS, GCP, Azure, …) y crear nuestro propio centro de datos. Es el tipo de cloud que permite mayor control, a costa de una mayor complejidad.

Luego llegó “Platform as a service (PaaS)” donde pudimos desplegar nuestro MongoDB en PODs de OPENSHIFT. Tenemos acceso a un entorno de ejecución para nuestras aplicaciones y servicios para el desarrollo, testing y hosting de aplicaciones.

Con “Software as a service (SaaS)” tenemos acceso web a software finalizado, donde la complejidad de la infraestructura queda oculta al usuario y tenemos integración mediante APIs.

MongoDB Atlas pertenece al subtipo “Database as a service (DaaS)” y nos da una cómoda abstracción sobre la que poder desarrollar.

Y por último nos ha llegado MongoDB Stitch dentro del subtipo “Backend as a service (BaaS)”, pensado para desarrollar en JS (en Navegador o en Node), Java (Android) o Swift (iOS). Veamos este ejemplo: https://www.kenwalger.com/stitch/glucose.html?

Tras realizar unos simples pasos (https://www.mongodb.com/cloud/stitch):

ya estamos listos para picar el código:

const client = new stitch.StitchClient('glucose-cqkgh');
const db = client.service('mongodb', 'mongodb-atlas').db('glucose');

function displayCommentsOnLoad() {
	client.login().then(displayComments);
}

function displayComments() {
	db.collection('results').find({}).then(docs => {
		var html = docs.map(c => "
" + c.comment + "
"
).join(""); document.getElementById("comments").innerHTML = html; }); } function addComment() { var foo = document.getElementById("new_comment"); db.collection("results").insert({owner_id : client.authedId(), comment: foo.value}).then(displayComments); foo.value = ""; }

									

The Baboon Show – I Will Go On – lyrics

octubre 22, 2017
You keep saying I’m too old.
You keep on saying that.
And you tell me to go now. But I won’t go now!I love the way I’m living now. I’m happy now.
And you tell me to grow up. I am grown up!

I will go on! I will go on!
I will go on for the rest of my life!
I will go on! I will go on! I will go on!

I am in the club, you say it’s better in the pub.
But I won’t go now! I won’t go now!
You say there is a remedy.
That remedy’s my enemy!
I won’t go now! No, I won’t go now!

I will go on! I will go on!
I will go on for the rest of my life!
I will go on! I will go on! I will go on!

You say one day I’ll be old and bald and grey but I,
I will go on! I will go on!
You say I’ll soon have nothing to say but I,
I will go on! I will go on!
You say I will have a walker and be blind and deaf,
but I will go on! I will go on!
The red star on the flag is my BFF.
I will go on! I will go on!

I will go on! I will go on!
I will go on for the rest of my life!
I will go on! I will go on! I will go on!

zer bizio? Mi Cosetxa (letra)

mayo 14, 2015

Borracho en mis recuerdos, aferrado a mis ideas, sembrando mi propia cosetxa, sabiendo que nadie me espera. Nadie tiene nada que enseñar. Quedamos pocos, seguimos corriendo. No confundas correr y escapar. Las zancadillas nos siguen jodiendo. Nadie sabe qué ocurrirá.

1996

diciembre 30, 2014
  • Espárrago Rock
    • La Banda Trapera del Río
    • Los Enemigos
    • Negu Gorriak
  • Trainspotting
  • Barricada: Insolencia
  • Boikot: Tu condena
  • DCD: Ultramemia
  • Extremoduro: Agila
  • La Polla: Carne pa la picadora
  • Los Enemigos: Gas
  • Manic Street Preachers: Everything must go
  • NG: Salam, Agur
  • Piperrak: Los muertos de siempre.
  • Platero y tú: A pelo.
  • Rosendo: Listos para la reconversión
  • SA: Diversiones?

enlaces de búsquedas en twitter

febrero 16, 2014

Si queremos pasar a alguien la búsqueda #España, el enlace sería:

https://twitter.com/search?q=%23Espa%C3%B1a&src=typd&f=realtime

que sale del resultado de buscar #España en la caja de texto de búsqueda. Sin embargo si pinchamos sobre el hashtag, nos genera un enlace como:

https://twitter.com/search?q=%23Espana&src=hash&f=realtime

este enlace no funciona según desde donde lo uses, si pegas la URI en el navegador sí funciona, pero si pinchas en ella desde un e-mail o facebook, te lleva a la página

https://twitter.com/search-home#Espana&src=hash&f=realtime

Crear distribución Freepto GNU/Linux en memoria USB

diciembre 11, 2013

En mi caso, instalé una distribución Debian Wheezy (debian-7.2.0-i386-netinst.iso) a través de VirtualBox y para crear la imagen seguí estos pasos:

$ sudo apt-get install live-build
$ sudo apt-get install git
$ git clone https://github.com/AvANa-BBS/freepto-lb.git
$ cd freepto-lb
$ lb config
$ sudo lb build

el resto lo puedes seguir viendo en https://github.com/AvANa-BBS/freepto-lb/blob/master/README.md

Crear sistemas de ficheros en pinchos USB desde Mac OS

diciembre 5, 2013

MS-DOS (FAT32): en GNU/Linux puedes escribir, pero este filesystem está limitado (tamaño archivo …)

Mac OS Plus (con registro): en GNU/Linux NO puedes escribir

ExFAT: en GNU/Linux NO puedes leer

Mac OS Plus (mayús. / minús., con registro): en Windows XP NO puedes leer de forma nativa, tienes que hacer uso de programas externos.