Artículos etiquetados con:desarrollo
Android loves Kotlin: todo sobre el nuevo lenguaje de programación oficial

El pasado mes de mayo se celebró la edición anual de Google I/O, el evento donde la multinacional presenta las primicias que estarán a disposición de los usuarios de la gran G a corto y medio plazo, y también las novedades para los desarrolladores de las diferentes tecnologías relacionadas con su ecosistema.

Para Android, se presentaron características de la futura versión del sistema operativo, Android O: la nueva versión de la librería support, instant apps, las nuevas librerías para dar soporte a las arquitecturas de aplicaciones. Sin embargo, para mí y para muchos desarrolladores más, el anuncio más llamativo de todos fue la apuesta oficial por Kotlin como lenguaje de desarrollo Android.

¿Qué significa esto? Pues que a partir de la próxima versión 3.0 de Android Studio, podremos desarrollar aplicaciones para Android usando este lenguaje de programación, totalmente integrado por el IDE. Pero entremos un poco en materia.

 

¿QUÉ ES KOTLIN?

Kotlin es un lenguaje de programación de tipado estático que corre sobre la JVM que ha sido desarrollado por JetBrains, responsables de IntelliJ, IDE en el que se basa Android Studio (¡menuda casualidad!).

Aunque lleva fraguándose desde el año 2011, en febrero de 2016 se lanzó su primera versión estable 1.0 y este pasado marzo ya se actualizó a 1.1. Nació con la idea de sustituir a Java pero siendo totalmente interoperable con él y todo su ecosistema (para facilitar así la migración).

 

¿QUÉ APORTA KOTLIN QUE NO NOS DA JAVA?

Para dar una muestra de las bondades de Kotlin frente a Java, me voy a apoyar en las cuatro características que se mencionan en el libro “Kotlin for Android Developers” de Antonio Leiva, uno de los mayores referentes dentro de la comunidad Android y uno de los máximos promulgadores del nuevo lenguaje oficial de desarrollo.

  1. Expresividad
  2. Seguridad frente a nulos
  3. Funciones de extensión
  4. Programación funcional

 

1. EXPRESIVIDAD

Si queremos declarar una clase completa en Java tenemos que definir los getter, setter, toString, hashCode y equals. Por ejemplo, si definimos la clase “Dog”, tendríamos la siguiente clase Java:

public class Dog {
    
    private Long id;
    private String name;
    private String owner;
    private String breed;
 
    public Dog(Long id, String name, String owner, String breed) {
        this.id = id;
        this.name = name;
        this.owner = owner;
        this.breed = breed;
    }
 
    public Long getId() {
        return id;
    }
 
    public void setId(Long id) {
        this.id = id;
    }
 
    public String getName() {
        return name;
    }
 
    public void setName(String name) {
        this.name = name;
    }
 
    public String getOwner() {
        return owner;
    }
 
    public void setOwner(String owner) {
        this.owner = owner;
    }
 
    public String getBreed() {
        return breed;
    }
 
    public void setBreed(String breed) {
        this.breed = breed;
    }
 
    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
 
        Dog dog = (Dog) o;
 
        if (id != null ? !id.equals(dog.id) : dog.id != null) return false;
        if (name != null ? !name.equals(dog.name) : dog.name != null) return false;
        if (owner != null ? !owner.equals(dog.owner) : dog.owner != null) return false;
        return breed != null ? breed.equals(dog.breed) : dog.breed == null;
 
    }
 
    @Override
    public int hashCode() {
        int result = id != null ? id.hashCode() : 0;
        result = 31 * result + (name != null ? name.hashCode() : 0);
        result = 31 * result + (owner != null ? owner.hashCode() : 0);
        result = 31 * result + (breed != null ? breed.hashCode() : 0);
        return result;
    }
 
    @Override
    public String toString() {
        return "Dog{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", owner='" + owner + '\'' +
                ", breed='" + breed + '\'' +
                '}';
    }
}

 

Como vemos, tenemos muchísimo código repetitivo (como casi todo en Java) para definir una clase. Sin embargo, todo eso lo podemos hacer en Kotlin de una forma muchísimo más sencilla.

data class Dog(var id: Long, var name: String, var owner: String, var breed: String)

 

Esto es sólo un ejemplo de que con mucho menos código podemos hacer muchas más cosas en Kotlin que en Java, y de una forma muy clara y legible.

 

2. SEGURIDAD FRENTE A NULOS

Cuando desarrollamos en Java, muchísimo código es defensivo. Esto supone que tenemos que comprobar continuamente cuándo algún objeto es nulo si no queremos encontrarnos con el típico error en tiempo de ejecución NPI. Sólo los tipos nativos no son nulos.

Dog dog = null;
Log.println(Log.INFO, "TEST", dog.getName());
#Este código se puede compilar, pero produce un NPI en tiempo de ejecución

 

Kotlin, sin embargo, como muchos otros lenguajes modernos, es seguro frente a nulos. Es decir, tenemos que especificar explícitamente cuándo un objeto puede ser nulo.

val dog1: Dog = Dog(lL, “Toby”, “Javi”, “Galgo”)
var dog2: Dog? = null
 
#Me permite compilar
dog1.print()
 
#No me permite compilar al no comprobar que es nulo
dog2.print()
 
#Con el operador ? si me deja hacerlo
dog2?.print()
 
#O como en Java
 
if(dog2 != null){
	dog2.print() 
}
#Ahora si compila, al estar dentro de un bloque donde se ha comprobado que no es nulo.
 
#Podemos usar el operador Elvis para dar un valor cuando la variable es nula
var name = dog2.name ?: “Desconocido”

 

3. FUNCIONES DE EXTENSIÓN

Con Kotlin podemos añadir nuevas funciones a cualquier clase de Java o Android con las funciones de extensión, que se entienden y son mucho más intuitivas que las típicas clases de utilidades que todo programador ha usado alguna vez.

Podemos, por ejemplo, añadir un método a un fragment para que muestre un toast de la siguiente forma:

fun Fragment.toast(message: CharSequence, duration: Int = Toast.LENGHT_SHORT){
	Toast.makeText(activity, message, duration).show
}
 
#Y lo podemos usar dentro de un fragment directamente:
toast.dog1.name

 

4. PROGRAMACIÓN FUNCIONAL

Realmente, con Java 8 podemos usar programación funcional con lambdas, pero éstas están bastante limitadas con respecto a todo el potencial que nos aporta Kotlin.

Dentro de un fragment con un TextView podemos implementar el típico onClickListener con una lambda de la siguiente forma:

textView.setOnClickListener {toast.dog2?.name}

 

EL FUTURO DE Y CON KOTLIN

Esto es sólo una pequeña muestra de todo el potencial que tiene este joven pero maduro lenguaje de programación. Podría contar más de las funciones sobre colecciones, properties, delegados, corrutinas, smartcast, etc., pero aún es un mundo por descubrir.

Actualmente, el equipo de desarrollo de Jetbrains está trabajando en Kotlin/Native, lo que significa que, en un futuro próximo, Kotlin podrá ser lenguaje para el desarrollo de aplicaciones iOS. Tendremos así la posibilidad de reutilizar código fuente con Android (¡qué bien suena!), sistemas embebidos o IoT (Arduino, por ejemplo), BigData, servicios, desarrollo de videojuegos, etc. En fin, el futuro.


Gestiona el versionado de los scripts de base de datos con Liquibase

Una de las asignaturas pendientes dentro del ciclo de vida de los proyectos es la gestión del versionado de los scripts de base de datos. En nuestra trayectoria, nos hemos encontrado con clientes que exigen una gestión compleja de cualquier tipo de cambio, pero siempre de forma manual, bajo documentos de procedimientos que no ayudan a una gestión ágil.

Para intentar dinamizar y controlar de forma sencilla estas modificaciones, hemos incluido en nuestro ecosistema de desarrollo la herramienta Liquibase. Aquí os dejamos un breve tutorial.

 

¿PARA QUÉ SIRVE?

Nos permite mantener el control de todos los cambios ejecutados sobre la base de datos, almacenando toda la información de los mismos (autor, fecha, cambio, etc.), asociando dichos cambios a los desarrollos realizados sobre la aplicación e integrándolos con el propio control de versiones del código fuente.

Por ejemplo: una rama de desarrollo tiene asociados sus correspondientes cambios de base de datos, lo cuales se integrarán con los demás cambios de otras ramas para permitir la unificación y generación de un solo script de base de datos sin que ello implique conflictos en el modelo de datos.

 

¿CÓMO FUNCIONA?

Su funcionamiento es sencillo y, sobre todo, compatible con múltiples arquitecturas de proyectos, siempre dependiendo de cómo se encuentre montado el proyecto. Básicamente actúa de la siguiente forma:

  1. Ejecución. Ya sea de forma manual (lanzando tú mismo la ejecución por comando Maven, Ant o por linea de comandos) o automática (Spring, Servlet, Hibernate, otros).
  2. Lectura de ficheros. Todos los cambios en base de datos los guardas en ficheros que Liquibase llama Changelogs, los cuales veremos más adelante. Estos ficheros son leídos durante la ejecución para determinar que cambios se deben aplicar en tu base de datos.
  3. Comparación con tu base de datos. Una vez Liquibase sepa qué cambios existen en tus changelogs, los cruza con su tabla interna llamada DATABASECHANGELOG, la principal tabla principal de versiones/cambios que se crea durante la primera ejecución. Así determina qué cambios debe aplicar y en qué versión se encuentra tu base de datos.
  4. Aplicación de cambios. Cuando tengas claros los cambios a aplicar, ejecútalos y actualiza la tabla de versiones/cambios. Si se produce algún error SQL durante la ejecución, mostrará el correspondiente mensaje y no actualizará la tabla de versiones/cambios.

 

¿QUÉ ES UN CHANGELOG?

Como ya hemos comentado, un changelog es un fichero que contiene todos los cambios que quieres aplicar en tu base de datos. Estos ficheros pueden ser XML (el más común), YAML, JSON o SQL. Aquí algunos ejemplos:

XML

<databaseChangeLog
    xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:ext="http://www.liquibase.org/xml/ns/dbchangelog-ext"
    xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.1.xsd
    http://www.liquibase.org/xml/ns/dbchangelog-ext http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-ext.xsd">
	<changeSet author="liquibase-docs" id="createTable-example">
    <createTable catalogName="cat"
            remarks="A String"
            schemaName="public"
            tableName="person"
            tablespace="A String">
        <column name="address" type="varchar(255)"/>
    </createTable>
</changeSet>
</databaseChangeLog>

 

YAML

databaseChangeLog:
changeSet:
  id: createTable-example
  author: liquibase-docs
  changes:
  - createTable:
      catalogName: cat
      columns:
      - column:
          name: address
          type: varchar(255)
      remarks: A String
      schemaName: public
      tableName: person
      tablespace: A String

 

JSON

{
    "databaseChangeLog": [
"changeSet": {
    "id": "createTable-example",
    "author": "liquibase-docs",
    "changes": [
      {
        "createTable": {
          "catalogName": "cat",
          "columns": [
            {
              "column": {
                "name": "address",
                "type": "varchar(255)"
            }]
          },
          "remarks": "A String",
          "schemaName": "public",
          "tableName": "person",
          "tablespace": "A String"
      }]
  }
    ]
}

 

SQL

--liquibase formatted sql

--changeset nvoxland:1
create table test1 (
    id int primary key,
    name varchar(255)
);
--rollback drop table test1;

--changeset nvoxland:2
insert into test1 (id, name) values (1, ‘name 1′);
insert into test1 (id, name) values (2, ‘name 2′);

--changeset nvoxland:3 dbms:oracle
create sequence seq_test;

 

¿QUÉ PUEDO INCLUIR DENTRO DE UN CHANGELOG?

Liquibase interpreta que cada cambio en la base de datos se encuentra determinado por los changeset’s. Éstos no son más que las etiquetas (distinguidas en los ejemplos anteriores) que utiliza la herramienta para determinar un cambio asociado a un autor.

Un changelog puede tener uno o varios changesets, todo depende de la forma en la que se quieran organizar los cambios.

Dentro de una etiqueta changeset puedes incluir prácticamente cualquier cambio en base de datos, para ello utiliza las etiquetas que proporciona. También puedes importar ficheros SQL dentro de tus propios changelogs, mediante la etiqueta <include>.

 

¿CÓMO PUEDO CONFIGURAR MI PROYECTO MAVEN?

Lo primero que se debes hacer es incluir el plugin en el fichero pom.xml que permitirá ejecutar Liquibase en el proyecto:

<plugin>
      <groupId>org.liquibase</groupId>
      <artifactId>liquibase-maven-plugin</artifactId>
      <version>3.0.5</version>
      <configuration>
        <changeLogFile>src/main/resources/org/liquibase/db.changelog-master.xml</changeLogFile>
          <driver>oracle.jdbc.driver.OracleDriver</driver>
          <url>jdbc:oracle:thin:@tf-appserv-linux:1521:xe</url>
          <username>liquibaseTest</username>
          <password>pass</password>
        </configuration>
      <executions>
        <execution>
          <phase>process-resources</phase>
          <goals>
            <goal>update</goal>
          </goals>
        </execution>
      </executions></plugin>

 

Deberás tener en cuenta que desde el proyecto debes incluir la correspondiente librería JDBC que permita la conexión con la base de datos: mysql-connector-java, ojdbc14, etc.

Liquibase permite la conexión a tu base de datos por medio de un datasource definido en el entorno de Spring, pero ello obliga a que la ejecución se realice de forma automática en el arranque de la aplicación. Puedes encontrar más información en este enlace.

Lo siguiente será definir tu estructura de ficheros changelogs. Mientras dispongas de un fichero “máster” definido como fichero de inicio, Liquibase te da libertad completa a la hora de gestionar la organización de los ficheros. Sin embargo, y siguiendo la filosofía de control de versiones, existen buenas prácticas en este tema.

 

ESTRUCTURA DEL DIRECTORIO DE FUENTES JAVA

com
  example
    db
      changelog
        db.changelog-master.xml
        db.changelog-1.0.xml
        db.changelog-1.1.xml
        db.changelog-2.0.xml
      DatabasePool.java
      AbstractDAO.java

 

FICHERO DB.CHANGELOG-MASTER.XML

<?xml version="1.0" encoding="UTF-8"?> 
<databaseChangeLog
  xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog
                      http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.1.xsd">

  <include file="com/example/db/changelog/db.changelog-1.0.xml"/> 
  <include file="com/example/db/changelog/db.changelog-1.1.xml"/> 
  <include file="com/example/db/changelog/db.changelog-2.0.xml"/> 
</databaseChangeLog>

 

FICHEROS DB.CHANGELOG-…

<?xml version="1.0" encoding="UTF-8"?> 
<databaseChangeLog 
  xmlns="http://www.liquibase.org/xml/ns/dbchangelog/1.9" 
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
  xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog/1.9
                      http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-1.9.xsd"> 
  <changeSet author="authorName" id="changelog-1.0">
    <createTable tableName="TablesAndTables">
      <column name="COLUMN1" type="TEXT">
        <constraints nullable="true" primaryKey="false" unique="false"/>
      </column>
    </createTable>
  </changeSet>
</databaseChangeLog>

 

Una vez definidos tus ficheros, ya puedes lanzar la ejecución mediante el correspondiente comando maven:

mvn liquibase:update

 

¿Y SI YA TENGO UNA BASE DE DATOS EXISTENTE?

Liquibase permite la generación automática de todos los changelogs necesarios basándose en una base de datos ya existente. Para ello, debes descargar los ejecutables (línea de comandos) y lanzarlos mediante el siguiente comando:

liquibase --driver=oracle.jdbc.OracleDriver \
      --classpath=\path\to\classes:jdbcdriver.jar \
      --changeLogFile=com/example/db.changelog.xml \
      --url="jdbc:oracle:thin:@localhost:1521:XE" \
      --username=scott \
      --password=tiger \
      generateChangeLog

 

Una vez haya finalizado el proceso, deberás haber generado en la ruta indicada todos los ficheros changelogs asociados al modelo completo de tu base de datos: tablas, indices, claves ajenas, etc.

Actualmente el comando generateChangeLog tiene la limitación de no exportar los siguientes tipos de objetos concretos: stored procedures, functions, packages, triggers.

 

¿DISPONGO DE OTRAS OPCIONES DE CONFIGURACIÓN?

Como dijimos anteriormente, además de Maven, puedes configurar la ejecución de Liquibase tanto manual como automáticamente dependiendo de la estructura/tecnologías del proyecto. Si necesitas más información, consulta este enlace.

 

 ¿ALGUNA OTRA CARACTERÍSTICA DESTACABLE?

Podemos destacar la posibilidad de configuración mediante entornos (producción, test, etc.), el hecho de que es independiente de la base de datos (una vez definidos los ficheros se pueden ejecutar sobre todos los motores de base de datos soportados) y su repositorio de plugins que permiten completar su funcionalidad.

 

¿ALTERNATIVAS A LIQUIBASE?

En nuestro caso, nos hemos decantado por Liquibase principalmente por dos motivos: porque abarca prácticamente todo el ciclo de vida de la gestión de la configuración, y por la versatilidad que ofrece para cualquier arquitectura. No obstante, si estos argumentos no te convencen, te recomendamos que sondees estas alternativas:

  • Rails Migrations (Ruby on Rails)
  • DBVersion
  • dbvcs
  • BSourceTools
  • Teamwork (Oracle y SQL Server)
  • Optim Database Administrator (DB2)

 


Fidelización de PYMES, un reto para la tecnología

Es un hecho contrastado la búsqueda constante de las Pymes para encontrar soluciones eficientes que les permitan la gestión y fidelización de sus clientes ante la amenaza competitiva de las grandes cadenas de distribución, redes de franquiciados y otras empresas de mayor dimensión.

Para dar respuesta a esta demanda, SDOS toma parte junto a Madisa y la Universidad de Girona en un consorcio para el proyecto Fidelización Cooperativa, un nuevo concepto de plataforma colaborativa para creación de sinergias que faciliten la captación e intercambio de clientes entre diferentes Pymes complementarias y no competitivas.

La principal innovación tecnológica reside en el matchmaking o recomendador de alianzas. Mediante el análisis Big Data de los hábitos de consumo de los usuarios, se podrán detectar correlaciones, preferencias y tendencias que permitirán a las Pymes conocer con quién establecer alianzas para aumentar el volumen de sus negocios.

La solución también incluye: gestión de perfiles de negocio, mecanismos de fidelización de usuarios, reglas de compensación entre empresas, Business Intelligence y estadísticas, aplicaciones móviles nativas, notificaciones push, etc.

Desde SDOS nos encargaremos del desarrollo de la plataforma de clientes. Ésta estará compuesta por un centro de control, un sistema de notificaciones push y las app móviles nativas.

El proyecto (RTC-2016-4836-7) está cofinanciado por el Ministerio de Economía y Competitividad y por el Fondo Europeo de Desarrollo Regional (FEDER).

ministerio economía, industria y competitividad

 

 


Lideramos Em-Phasys, plataforma para el empoderamiento en salud

SDOS lidera el consorcio para el proyecto Em-Phasys, una plataforma que tiene como objetivo el empoderamiento de los usuarios o pacientes sobre su propia salud, así como la comunicación ágil con los profesionales médicos para su tutela y seguimiento.

La consultora Drimay, la Fundación Pública Andaluza Progreso y Salud y la Universidad de Cádiz son las otras participantes en la creación de este sistema individualizado y personalizado de atención sanitaria, orientado a la prevención, la pre-asistencia y la autogestión de la salud.

Em-Phasys permitirá a los usuarios el acceso a información médica cualificada y a comunidades de interés común. Este componente central se apoyará en un sistema de gestión del conocimiento basado en tecnologías semánticas y que garantizan la adecuada estructuración y cualificación de la información contenida en la plataforma.

Se incluyen además:

  • Aplicaciones de gestión de salud y bienestar para el acompañamiento de los usuarios en la estructuración de hábitos de vida saludables.
  • Comunicación con los sistemas de salud que proporcionan al usuario los habituales servicios de asistencia sanitaria.
  • Instrumentos de creación, análisis y tratamiento de BigData que resultarán fundamentales para futuros estudios epidemiológicos en el ámbito sanitario.

El proyecto (RTC-2016-5095-1) está cofinanciado por el Ministerio de Economía y Competitividad y por el Fondo Europeo de Desarrollo Regional (FEDER).

ministerio economía, industria y competitividad

 

 


CIVISmart: ciudadanos, información e innovación

En SDOS siempre hemos apostado por la innovación, por implicarnos en proyectos novedosos que mejoren los procesos o servicios gracias a la tecnología. Esta apuesta se acentúa aún más en ámbitos como la Smart city, donde los resultados inciden en la mejora de la prestación de servicios, en el impacto medioambiental o en la calidad de vida de las personas.

Este es el marco en el que se encuentra el desarrollo de CIVISmart, plataforma multicanal de servicios al ciudadano y análisis de su comportamiento para la toma de decisiones, un proyecto que trata de aprovechar el potencial de nuevas tecnologías como el Big Data, Crowdsourcing o Data analytics para la provisión de información de movilidad urbana en tiempo real, confiable y visual. Se trata de un sistema con capacidad de procesamiento y análisis que, mediante la captación de datos de movilidad peatonal, proporcione a las ciudades valor añadido a los datos obtenidos.

Los objetivos del proyecto son:

  • Planificación y dimensionamiento de infraestructuras urbanas y de muchos de los parámetros que éstas requieren para anticipar un conocimiento preciso de su uso futuro.
  • Planificación en términos de trazado, líneas y frecuencias de nuevos servicios de transporte público.
  • Identificación de áreas o zonas de atractivo turístico para su puesta en valor a nivel municipal e institucional.
  • Definición y evaluación de los Planes de Movilidad Urbana Sostenible, herramienta de gestión con la que los ayuntamiento estructuran sus políticas de movilidad en función a objetivos generales de mejora.

Mediante los resultados obtenidos a través de la plataforma, se facilitará la toma de decisiones relativas a reducción de costes operaciones, se posibilitará la anticipación a posibles problemas y/o tendencias futuras, y se agilizará la provisión de información a los ciudadanos por parte del ayuntamiento y los gestores de servicios de movilidad o transporte.

El proyecto (TSI-100107-2016-14) está cofinanciado por el Ministerio de Industria, Energía y Turismo, dentro del Plan Nacional de Investigación Científica, desarrollo e Innovación Tecnológica 2013-2016 y por el Fondo Europeo de Desarrollo Regional (FEDER).

 

 


DIAPA. Innovación en el ámbito de la salud

SDOS se ha unido a Bahía Software y Sixtema para el desarrollo de DIAPA, un proyecto de innovación que dará como resultado una mejora sustancial en la actividad de los biobancos: la digitalización de la imagen de la anatomía patológica. Se facilita así la gestión de estos centros al implementar procesos de digitalización, almacenamiento y visualización de las imágenes miscroscópicas de las muestras.

Los objetivos del proyecto son:

  • Normalizar los procesos de digitalización, almacenamiento y visualización según los estándares DICOM y HL7.
  • Mejorar la eficiencia en el almacenamieto y gestión de muestras de anatomía patológica.
  • Proporcionar un sistema de visualización adaptado que asegure una experiencia de usuario óptima.
  • Homogeneizar el proceso de registro de muestras.
  • Ofrecer un mecanismo eficiente para la cesión de muestras desde los biobancos.
  • Permitir la búsqueda de muestras en los diferentes biobancos en base a imágenes y datos clínicos asociados.
  • Incorporación de una plataforma de interoperabilidad para su uso desde sistemas externos a la red de biobancos.

Nuestro equipo se encargará del desarrollo de un componente software que permita gestionar los flujos ejecutados en los biobancos, facilitando el manejo de las muestras digitalizadas y la información asociada (datos clínicos y/o la propia muestra física).

Además de por los miembros del consorcio, el proyecto está subvencionado por el Ministerio de Economía y Competitividad, a través del Centro para el Desarrollo Tecnológico Industrial (CDTI), y el fondo FEDER de la Unión Europea.

 

 


La Francerie, más que un café

Esta semana se ha publicado la presencia digital de una nueva enseña del Grupo de Restauración Beer&food, al que pertenecen otras marcas como Gambrinus, La Chelinda, La Clueca, Cruz Blanca, Official Irish Pub, Indalo Tapas o Dublin House. Se trata de La Francerie, una cadena de cafés de estilo francés en los que poder disfrutar de productos de calidad a cualquier hora del día: desayuno, almuerzo, merienda y cena.

En esta ocasión creamos una propuesta adaptada a la línea estética y la identidad corporativa de la enseña, un diseño modular responsive que permite su perfecta visualización desde cualquier dispositivo. Para crear dinamismo se han incluido animaciones, integración con redes sociales y geolocalización. El resultado es una imagen fresca y elegante totalmente alineada con los valores que quiere transmitir la marca.

Desarrollado en tecnología Drupal, el sitio permite agilidad en la gestión y flexibilidad ante la ampliación de contenidos y locales, algo que, estamos convencidos, no tardará en suceder.

¿Quieres ver más de este proyecto? Aquí te lo enseñamos.


SDOS diseñará y programará las webs del Ajuntament de Barcelona

SDOS ha sido la empresa adjudicataria de la licitación abierta por el Ajuntament de Barcelona para el servicio de diseño y programación de las webs y aplicaciones del consistorio.

Las competencias creativas y técnicas acreditadas por SDOS en materia de diseño, experiencia de usuario y desarrollo tecnológico tanto web como móvil, han sido decisivas para la selección de SDOS como precursora de una presencia digital que será referente tanto a nivel nacional como internacional.

Con una duración de 2 años y un equipo de 15 personas trabajando en exclusiva para el Ajuntament, el proyecto supondrá un antes y un después en la consolidada trayectoria de SDOS, permitiéndole cerrar el año con una previsión de facturación de más de 5 millones de euros, lo que supone un incremento del 35% con respecto al ejercicio anterior.

Esta adjudicación viene a afianzar la presencia de SDOS en Cataluña, un mercado que ya supone un 25% de la facturación total de la compañía y donde cuenta con clientes tan representativos como la Generalitat de Catalunya, MediaMarkt o Roca.


Uso de cookies

Este sitio web utiliza cookies para que tengas la mejor experiencia de usuario. Si continúas navegando estas dando tu consentimiento para la aceptación de las mencionadas cookies y la aceptación de nuestra política de cookies, pincha el enlace para obtener más información.

ACEPTAR