Mondavia

Mondavia era un sitio web dirigido por Héctor Paredes, un ecuatoriano establecido en Taiwan, dedicado a difundir la cultura latina y enseñar el idioma español en la isla. Tras solicitar ayuda de un programador web en workaway.info contacté con él y nos pusimos de acuerdo para refundar la empresa con una nueva web durante mi estacia en Kaohsiung.

El nuevo sitio debería mostrar el nuevo negocio de Héctor: la importación de productos latinos a Taiwan. Debería tener un aspecto empresarial y atractivo visualmente, y debía ser responsive, lógicamente. Además la integración de los tres idiomas que debía mostrar debía ser perfecta.

responsive-mondavia

Tras hablar sobre el asunto decidí que la mejor opción era modificar a nuestro gusto el magnífico tema Enigma, como ya hice con el proyecto DaoEssence. Este tema posee una moderna página principal con slider incluido.

Para la implementación de idiomas usé una vez más el plugin Polylang, al que tuve que añadir strings customizadas para los enunciados del slider se visualizasen en español, inglés y chino. Espero hablar de ésto en un futuro post.

Hice una concienzuda modificación del CSS aportando un cambio de colores corpoativos y disposición total, con un nuevo menú y cambios en la página principal.

Para mostrar los productos utilicé el famoso y buenísimo WooCommerce, de momento usado sólo como catálogo a la espera de que algún día el dueño se decida a seguir con una tienda online.

El blog con articulos sobre cultura latina seguirá, y ahí sí que respeté el diseño original de Enigma.

En resumen, una web empresarial sencilla, de fácil modificación y expansión, que pudiése derivar a una tienda online, responsive y atractiva visualmente.

Modavia.co

Yuanlin Empire

Yuanlin Empire es un albergue situado en la ciudad de Yuanlin, en el centro de la isla de Taiwan. Estuve ahí durante 10 días gracias a la web workaway.info realizando su web a cambio de la estancia gratis. La verdad es que fue una gran experiencia y los dueños, Michael y Abby, fueron muy amables.
responsive-yuanlin
Michael quería una web muy sencilla. Él mismo había realizado webs con WordPress en el pasado y lo que me dio a entender era que quería algo lo más minimalista posible. También pensé que debía tener una muy buena adaptación a todas las pantallas, especialmente si tenemos en cuenta que hay bastantes viajeros que puedan hacer su reserva desde el móvil o cualquier dispositivo.
Para ello decidí que lo mejor sería sencillamente modificar el tema TwentySixteen, incluido en las últimas versiones de WordPress, para las necesidades del hostal.
Para la reserva de habitaciones estuve probando casi todos los plugins disponibles para hostales, hoteles, bed & breakfasts… Cual fue mi sorpresa al descubrir que no hay ninguno gratis. Son todos de pago y las versiones no pro no cumplían con lo que necesitaba.
Así que de acuerdo con Michael fuimos a por la opción gratis descartando la opción del plugin Hostel, el que más me gustó. Para ello instalé el plugin WP Simple Booking Calendar para mostrat las reservas y el Contact Form 7 para reservar de manera manual (los dueños querían aprobar cada reserva manualmente). También el Simple Lightbox para una presentación más atractiva de las imágenes.
Debido a que la web debía ser en chino tradicional e inglés instalé por primera vex el plugin Polylang, siendo este un gran decubrimiento del que me gustaría hablar más extensamente en otro post.
En resumen, una web muy sencilla pero efectiva que cumple con todo lo necesario para manejar las necesidades de un hostal modesto.

Yuanlinempire.com

Ejemplo de aplicación MVC muy simple

Tras unos cuantos días informándome del sistema MVC (Modelo – Vista – Controlador) he realizado mi primera aplicación completa basada en ese diseño.

Se trata de SimpleSurvey, una aplicación muy simple que permitiría a un encuestador a pie de calle tomar datos de los votantes a su salida del colegio electoral.

Puedes ver la demo AQUÍ y descargarla AQUÍ.

Consta de dos areas: principal y administración.

La principal muestra el formulario de entrada de datos. Nos pide el sexo, la edad y el partido votado. El area de administración nos muestra los datos registrados en nuestra base de datos y ofrece la posibilidad de borrar el registro.

Arrancamos nuestro programa desde index.php. Se trata de un archivo fundamentalmente html en el que su head cargaremos los archivos css y javascripts necesarios para el diseño además de cargar el archivo controlador.php necesario para el funcionamiento.

Distinguiremos gracias a if (@$_GET[‘action’] == ‘opción_elegida’) en que apartado estamos y en consecuencia llamaremos a la función que nos muestre el contenido en cada caso.

<!DOCTYPE html>
<?php
require 'controlador/controlador.php';
?>
<html>
    <head>
        <meta name="viewport" content="width=device-width, minimum-scale=1.0, maximum-scale=1.0" />
 
        <meta charset="UTF-8">
        <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css" integrity="sha384-1q8mTJOASx8j1Au+a5WDVnPi2lkFfwwEAa8hDDdjZlpLegxhjVME1fgjWPGmkzs7" crossorigin="anonymous">
        <link rel="stylesheet" type="text/css" href="css/style.css">
        <script Language=Javascript SRC="js/script.js"></script>
        <title>Encuesta Electoral</title>
    </head>
    <body>
        <div class="creditos">SimpleSurvey v1.0.
            <a class="texto" href="javascript:MostrarOcultar('creditos');"> 
                Créditos</a></div> 
 
        <div class="cp_oculta" id="creditos">  
            <p>Simple Survey es un sencillo programa basado en el sistema modelo-vista-controlador.</p>
            <p>Su función es la de facilitar el trabajo a un encuestador a pie de calle.</p>
            <p>Realizado por Pau Rodellino de <a href="http://nexus127.esy.es">Nexus127</a> en Junio de 2016.</p>
        </div> 
        <?php
        //Mostramos la barra de opciones según donde estemos
        $con = new controlador();
 
        if (@$_GET['action'] == 'admin') {
            ?> <div class="mio"><a class="btn btn-default" href="index.php?action=principal">Principal</a></div> <?php
        } else {
            ?> <div class="mio"><a class="btn btn-default" href="index.php?action=admin">Admin</a></div> <?php
        }
        ?>
    </div>
    <div id="padre">
        <div id="hijo">
            <?php
            //Mostramos el contenido aegún donde estemos
            $con = new controlador();
 
            if (@$_GET['action'] == 'admin') {
                $con->admin();
            } else {
                $con->principal();
            }
            ?>
        </div>
    </div>
</body>
</html>

En el modelo (modelo/db.php) tendremos todas las operaciones que necesitaremos de la base de datos.
Y en el controlador llamaremos a las funciones del modelo y les pasaremos los datos que permitirán el manejo de la web.

<?php
 
//Extraido de http://www.desarrolloweb.com/wiki/ejemplo-sql-con-mysqlconnect.html
 
class db {
 
//    function conectar() {
//        // Conectando, seleccionando la base de datos
//        mysql_connect('localhost', 'root', '')
//                or die('No se pudo conectar: ' . mysql_error());
//        //echo 'Connected successfully';
//        mysql_select_db('encuesta') or die('No se pudo seleccionar la base de datos');
//    }
 
    function conectar() {
        // Conectando, seleccionando la base de datos
        mysql_connect('sql7.freemysqlhosting.net', 'sql7125596', 'i7LkvpETHX')
                or die('No se pudo conectar: ' . mysql_error());
        //echo 'Connected successfully';
        mysql_select_db('sql7125596') or die('No se pudo seleccionar la base de datos');
    }
 
    function consulta($tabla) {
        // Realizar una consulta MySQL
        $query = 'SELECT * FROM ' . $tabla . ' ';
        $result = mysql_query($query) or die('Consulta fallida: ' . mysql_error());
        return $result;
    }
 
    function insertar($sexo, $edad, $partido, $tabla) {
        // Realizar una inserción MySQL
        $query = 'INSERT INTO ' . $tabla . ' (id, sexo, edad, partido) VALUES ("", "' . $sexo . '","' . $edad . '","' . $partido . '" ); ';
        $result = mysql_query($query) or die('Inserción fallida: ' . mysql_error());
        return $result;
    }
 
    function borrar($tabla, $id) {
        // Borramos de la tabla
        $query = 'DELETE FROM ' . $tabla . ' WHERE id = ' . $id . '';
        $result = mysql_query($query) or die('Inserción fallida: ' . mysql_error());
        return $result;
    }
 
    function imprimir($tabla) {
        // Imprimir los resultados de manera simple
        $result = $this->consulta($tabla);
        while ($line = mysql_fetch_array($result, MYSQL_ASSOC)) {
            foreach ($line as $col_value) {
                echo "$col_value";
            }
        }
    }
 
    function imprimir_form($tabla) {
        // Imprimir los resultados en una tabla HTML
        $result = $this->consulta($tabla);
        while ($line = mysql_fetch_array($result, MYSQL_ASSOC)) {
            echo "	<option>";
            foreach ($line as $col_value) {
                echo "$col_value";
            }
            echo "	</option>";
        }
    }
 
    function imprimir_tabla($tabla) {
        // Imprimir los resultados en una tabla HTML
        $result = $this->consulta($tabla);
        ?> <table class="table table-hover tabla"> <?php
        while ($line = mysql_fetch_array($result, MYSQL_ASSOC)) {
            ?> <tr>
                    <?php
                    foreach ($line as $col_value) {
                        echo "<td>$col_value</td>";
                    }
                    ?><td><form name='borrar' method='post'><button class='btn btn-default' type='Submit' name='id' value='<?php echo $line['id']; ?>'>Borrar</button></form></td>
 
                </tr>
                <?php
            }
            ?> </table> <?php
    }
 
    function cerrar() {
        // Cerrar la conexión
        mysql_close();
    }
 
    function refrescar_admin() {
        require 'vista/admin.php';
    }
 
}

Y en el controlador llamaremos a las funciones del modelo y les pasaremos los datos que permitirán el manejo de la web.

<?php
 
require 'modelo/db.php';
 
class controlador {
 
    function principal() {
        require 'vista/form.php';
    }
 
    function admin() {
        require 'vista/admin.php';
    }
 
    function partidos_formulario() {
        $mod = new db();
        $mod->conectar();
        $mod->imprimir_form('partidos');
        $mod->cerrar();
    }
 
    function inserta_formulario($sexo, $edad, $partido) {
        $mod = new db();
        $mod->conectar();
        $mod->insertar($sexo, $edad, $partido, 'encuesta');
        $mod->cerrar();
    }
 
    function tabla_admin() {
        $mod = new db();
        $mod->conectar();
        $mod->imprimir_tabla('encuesta');
        $mod->cerrar();
    }
 
    function borra_admin($id) {
 
        $mod = new db();
        $mod->conectar();
        $mod->borrar('encuesta', $id);
        $mod->cerrar();
        //Por algún motivo no se refresca la página correctamente al borrar un registro
        //Añadiremo esta función que refresca la página
        header("Refresh:0");
    }
 
}

He de admitir que aún me faltan pulir detalle pero en general estoy contento de la realización de este programa. Ya estoy pensando en usarlo como base para futuras ampliaciones que comprendan una función “editar” en administración así como la necesidad de loguearse para entrar en ella.

Comandos básicos en MySQL (III)

En esta tercera entrega veremos un ejemplo de creación de tablas en MySQL.

Se nos pide añadir a nuestra base de datos “sanidad” dos nuevas tablas: una referente a los Cursos de Especialización para el personal de los hospitales, donde se reflejarán los datos de cada curso ofrecido.

Y otra sobre la realización de estos cursos. En qué hospital se dan, que doctor imparte la clase y cuándo se realizan.

Se nos dan unos valores que tendremos que respetar y que definimos en la declaración de valores.

CURSOS_ESPECIALITZACIO

CodCurs: codigo del curs de formación

Valores de tipo0 entero i positivo. Clave primaria

NomCurs: nombre del curso de formación

Cadena de caracteres, màxim 60, valor obligatorio

descripcioCurs: descripción del curso

Cadena de caracteres, máxim 60

REALITZA_CURS

CodCurs: código del curso de formación

Valores de tipo entero y positivo. Clave primaria. Clave externa que referencia a la tabla CURSOS_ESPECIALITZACIÓ

HOSPITAL_COD: código del hospital

Valores de tipo entero y positivo. Clave externa que referencia a la tabla DOCTOR

DOCTOR_NO: código del doctor

Valores de tipo entero y positivo. Clave externa que referencia a la tabla DOCTOR

dataCurs: fecha inicio curso

Formato valor fecha, valor obligatorio.

 

CREATE TABLE IF NOT EXISTS CURSOS_ESPECIALITZACIO (
CODCURS            SMALLINT (4) UNSIGNED PRIMARY KEY,
NOMCURS            VARCHAR (60) NOT NULL,
DESCRIPCIO_CURS     VARCHAR (60)
);
 
CREATE TABLE IF NOT EXISTS REALITZA_CURS (
CODCURS        SMALLINT (4) unsigned,
HOSPITAL_COD    TINYINT(2),
DOCTOR_NO        SMALLINT(3),
DATA_CURS        date NOT NULL,
PRIMARY KEY (CODCURS, HOSPITAL_COD, DOCTOR_NO),
FOREIGN KEY (CODCURS) REFERENCES sanitat.CURSOS_ESPECIALITZACIO (CODCURS),
FOREIGN KEY (HOSPITAL_COD, DOCTOR_NO) REFERENCES sanitat.DOCTOR (HOSPITAL_COD, DOCTOR_NO)
);

La dificultad de este ejercicio, en mi opinión, radica en la inclusión de las claves foráneas.

Debemos referenciarlas usando FOREIGN KEY (valor1, valor2…) REFERENCES Tabla (valor1, valor2…) Hay que tener cuidado de que los valores entre ambos sean EXACTAMENTE del mismo tipo. Por ejemplo, para CODCURS deberemos asegurarnos que en todas las tablas en las que aparece CODCURS SMALLINT(4) UNSIGNED. Si no, nos dará el fatídico error 1215.

Comandos básicos en MySQL (II)

Continuamos con la segunda entrega de las órdenes básicas de MySql (podéis ver el primer capítulo aquí)

Mientras que en la primera parte mostrábamos lo más relevante respecto a las consultas, en esta segunda trataremos los comandos necesarios para modificar la base de datos.

En primer lugar voy a incluir algunos ejemplos DML (manipulación de datos) de inserción, modificación y eliminación.

Para inserir datos usaremos INSERT. Y para ello usaremos la siguiente sintaxis:

INSERT INTO tabla
VALUES (atributo1, atributo2...)

Si fuera necesario, podemos combinar con SELECT para sacar el valor que necesitemos de otras tablas:

INSERT  INTO
sanitat.doctor
VALUES (
(SELECT HOSPITAL_COD FROM hospital WHERE NOM LIKE "Provincial"),
666,"Perez","Pediatria"
);

Usamos UPDATE para modificar los registros. Siempre irá acompañado de SET.

En el siguiente ejemplo modificamos la tabla doctor para cambiar la especialidad del doctor Nico P.

UPDATE sanitat.doctor
SET  ESPECIALITAT = "Neurologia"
WHERE COGNOM LIKE "Nico  P.";

Usamos DELETE para borrar registros.

En el ejemplo borramos los registros de la tabla INGRESSOS del enfermo “Serrano”.

DELETE  FROM sanitat.ingressos
WHERE  INSCRIPCIO = (
SELECT INSCRIPCIO
FROM sanitat.malalt
WHERE  COGNOM = "Serrano V.");

En segundo lugar veremos ejemplos ejemplos de eliminación y modificación de estructura. También llamado DDL o instrucciones de definición de datos.

Usamos DROP para borrar una tabla.

DROP  TABLE sanitat.doctor;

ALTER TABLE para modificar la estructura de la tabla.

En el ejemplo vamos a ver como se añade una columna de nombre SOU que permite almacenar números realess positivos (para eso usamos el UNSIGNED) de hasta ocho dígitos contando dos decimales y que su valor por defecto sea 0 (para ello usamos el DEFAULT 0).

ALTER  TABLE sanitat.doctor;
ADD COLUMN SOU DEC(8,2) UNSIGNED DEFAULT 0;

Si nos queremos cargar la columna antes creada usamos también un DROP siempre tras un ALTER TABLE.

ALTER  TABLE sanitat.doctor
DROP COLUMN sou;

Podemos modificar los valores aceptados en una columna con MODIFY COLUMN.

El siguiente ejemplo muestra como el atributo COGNOM no acepta valores repetidos (con NOT NULL) y es un campo obligatorio (con UNIQUE). Para que pille el valor hay que ponerle su tipo y número de caracteres (VARCHAR(13)).

ALTER  TABLE sanitat.doctor
MODIFY COLUMN COGNOM VARCHAR(13) NOT NULL  UNIQUE;

Para crear índices usamos CREATE INDEX.

CREATE  INDEX Codis
ON sala (HOSPITAL_COD, SALA_COD);

Para cargárnoslo usamos también DROP. Hay que recordar que hay que completar la sentencia con el nombre de la base datos a la que pertenece. Por ejemplo:

DROP  INDEX Codis ON sala;

Y eso es todo de momento! Próximamente… la creación de tablas.

Comandos y archivos básicos en Linux

El tema que presento hoy no tiene mucho que ver con programación… No obstante es una parte fundamental de la asignatura “Sistemas informáticos” del Módulo de Grado Superior de Porgramación de aplicaciones web (DAW) y por ello me parece interesante añadirlo.

Se trata de dos listas fundamentales en el funcionamiento de sistemas operativos basados en Linux: comandos y archivos/directorios.

COMANDOS BÁSICOS DE CONSOLA

Orden
Función
Opciones
ls Muestra una lista de archivos -a
cd Cambia el directorio especificado
mkdir Crea un directorio
passwd Cambia la contraseña del usuario -l -u
file Muestra el tipo de archivo
cat Escribe en pantalla el contenido del archivo
pwd Muestra el directorio de trabajo actual
which Busca el camino de una orden externa
man Muestra las páginas del manual
login Inicia sesión
exit Cierra sesión actual
w Lista de usuarios logueados
ac Tiempo total de la conexión de un usuario
last Lista de usuarios que han iniciado / acabado sesión
lastb Intentos fallidos de autentificación
pstree Árbol de procesos
echo Presenta textos y contenidos de variables
su Inicia sesión como otro usuario
sudo Ejecuta órdenes con permisos de administrador
aplt-get Herramienta de instalación de paquetes y gestión de repositorios install, remove, update, upgrade, dist-upgrade
aptitude Herramienta de instalación de paquetes install, remove, purge
useradd Alta y gestión de usuarios -d, -m, -D, -g
usermod Modificación de usuarios -g, -G, -L, -U
uderdel Baja de usuarios
groupadd Alta y gestión de grupos
groupmod Modificación de grupos
groupdel Baja de grupos
adduser Alternativa interactiva al useradd
ifconfig Configuración del protocolo TCP/IP -a
route Mostrar y modificar tablas de encaminamiento
hostname Configuración nombre del node/ordenador
ping Estado de la conexión -c
traceroute Visualiza saltos de paquetes TCP/IP
netstat Muestra el estado de la red -i, -e, -s
hdparm Controla los parámetros del disco duro. Más información. -S, -K, -B
mount Monta y visualiza sistema de ficheros
df Espacio ocupado por sistemas de ficheros
du Espacio ocupado por ficheros y directorios
fdisk Edita tabla de particiones
fsck Herramienta para recuperar sistema de ficheros

ARCHIVOS Y DIRECTORIOS BÁSICOS DE CONFIGURACIÓN Y REGISTRO

Archivo o Directorio
Función
. Directorio actual
.. Directorio padre
~ Directorio personal del usuario
/ Directorio raiz
/root Directorio personales del administrador
/home Directorio que contiene los directorios personal de los usuarios
/etc Directorio que contiene archivos de configuración de linux
/etc/passwd Archivo de configuración de usuarios del sistema
/etc/shadow Archivo de configuración de las contraseñas de los usuarios
/etc/group Archivo de la configuración de grupos del sistema
/etc/gshadow Archivo de configuración de contraseñas de los grupos
/etc/default/useradd Archivo de configuración por defecto del comando useradd
/etc/adduser.conf Archivo de configuración por defecto del comando adduser
/etc/skel Directorio personal plantilla base para nuevos usuarios
/etc/profile Configuración del perfil global de todos los usuarios
~/.profile Configuración del perfil local de un usuario concreto
/var/log Directorio que contiene los archivos de registro (logs)
/var/log/acct Guarda las instrucciones ejecutadas por cada usuario
/var/log/wtmp Registro de las conexiones/desconexiones de los usuarios
/var/log/lastlog Guarda la fecha de la última conexión satisfactoria
/var/log/authlog Guarda las autorizaciones
/etc/resolv.conf Fichero de configuración de nombres (DNS)
/etc/hosts Fichero de configuración de nodes de red
/etc/services Fichero de configuración de servicios de red
/etc/hosts.conf Define la orden o secuéncia de búsqueda para la resolución de nombres de hosts
/etc/network/interfaces Archivo de configuración de red en Debian/Ubuntu
/proc/cpuinfo Archivo con información sobre la CPU

 

Comandos básicos en MySQL (I)

Me encuentro actualmente estudiando para los exámenes finales del primer semestre del módulo de grado superior de Programación de Aplicaciones Web. He pensado en hacer un resumen de las órdenes básicas fundamentales y su sintaxis en MySQL con sus correspondientes ejemplos. En esta primera parte, los ejemplos que utilizo están sacados de los ejercicios del examen de la unidad 3 y están usando una tabla de un sistema sanitario.

SELECT nos muestra los registros de una tabla. Este ejemplo nos muestra toda la tabla “doctor”.

SELECT *
FROM doctor

Podemos usar AS para definir el nombre de la columna en que se incluyen los datos.
Podemos usar WHERE y AND para filtrar resultados hacia donde nos interese.

SELECT hospital.hospital_cod AS "Codi" , nom AS "Nom"
FROM hospital, doctor
WHERE  hospital.hospital_cod LIKE doctor.hospital_cod
AND especialitat = 'Cardiologia';

Podemos ordenar los resultados. En el ejemplo, en orden alfabético ascendente.
(NOTA: el ASC no es necesario ponerlo, se presupone por defecte. En orden descendente sería DESC)

SELECT * FROM malalt
WHERE sexe LIKE "D"
ORDER BY cognom ASC;

Podemos sumar valores con sum() y agrupar con GROUP BY.

SELECT funcio, sum(salari)
FROM plantilla
WHERE funcio LIKE "Infermer" OR funcio = "Infermera"
AND hospital_cod LIKE 22
GROUP BY funcio;

Si queremos mostrar todos los valores que empiezan por 28, podemos usar el símbolo “%“.
Es uno de los muchos operadores que tiene MySQL.

SELECT * FROM malalt
WHERE NSS LIKE "28%";

Podemos usar multiples SELECTS para sacar valores de otras tablas.

SELECT * FROM doctor
WHERE especialitat LIKE 
(SELECT especialitat 
FROM doctor 
WHERE cognom LIKE "Nico P.")

Y para acabar una muestra de una operación SELECT usando JOIN. En este caso me permite hacer una consulta que incluye tres tablas.
Para saber un poco más de sus tipos, este enlace.

SELECT cognom, hospital.nom
FROM malalt
INNER JOIN ingressos
ON malalt.inscripcio LIKE ingressos.inscripcio
INNER JOIN hospital
ON ingressos.hospital_cod LIKE hospital.hospital_cod
WHERE hospital.nom LIKE "Provincial";

Obtener valores de un array multidimensional en Java

En este post vamos a ver como podemos obtener unos valores determinados de un array multidimensional en lenguaje Java.
En este caso tenemos un array con los diez participantes de una carrera popular: su dorsal en la posición 0, el sexo en la posición 1 (1 para mujeres y 0 para hombres), la edad en la posición 2 y el tiempo en la posición 3.Este seria el caso de un participante: {3457, 1, 51, 52}

Queremos mostrar el listado de participantes y obtener el ganador de la categoría masculina y la femenina.

package nexus127;
 
 
public class valorArray {
 
    public static final int NUM_CAMPS = 4; //4 camps: dorsal, sexe, edat i temps
    public static final int HOME = 0;
    public static final int DONA = 1;
 
    public static void main(String[] args) {
 
//Definim tipus de dades
        int minTempsHome = 0;
        int minTempsDona = 0;
        int posGuanyador = 0, posGuanyadora = 0;
        int[][] corredors = {
            {3457, 1, 51, 52},
            {3467, 1, 32, 41},
            {3568, 0, 14, 57},
            {3570, 0, 12, 63},
            {3571, 1, 45, 63},
            {3572, 0, 17, 46},
            {3573, 0, 12, 44},
            {3574, 0, 30, 42},
            {3575, 1, 24, 77},
            {3576, 0, 57, 48}
        };//Conté dorsal, sexe, edat i temps fet)
 
//Mostrem llistat
        System.out.println("Llistat de tots els corredors entrats:");
        for (int i = 0; i &lt; corredors.length; i++) {
            for (int j = 0; j &lt; NUM_CAMPS; j++) {
                System.out.print(corredors[i][j] + " ");
            }
            System.out.println("...");
        }
 
//Buscar el guanyador per sexe
        for (int i = 0; i &lt; corredors.length; i++) {
            if (corredors[i][1] == HOME) {
                if (minTempsHome == 0) { //per la primera vegada, assignem el primer
//valor de temps d'home
                    minTempsHome = corredors[i][3];
                    posGuanyador = i;
                } else if (corredors[i][3] &lt; minTempsHome) {
                    minTempsHome = corredors[i][3];
                    posGuanyador = i;
                }
            } else //Per a corredores dones
            if (minTempsDona == 0) { //per la primera vegada,
//assignem el primer valor de temps d'home
                minTempsDona = corredors[i][3];
                posGuanyadora = i;
            } else if (corredors[i][3] &lt; minTempsDona) {
                minTempsDona = corredors[i][3];
                posGuanyadora = i;
            }
        }
        System.out.println("Guanyador: " + corredors[posGuanyador][0] + " " + corredors[posGuanyador][1] + " " + corredors[posGuanyador][2] + " " + corredors[posGuanyador][3]);
        System.out.println("Guanyadora: " + corredors[posGuanyadora][0] + " " + corredors[posGuanyadora][1] + " " + corredors[posGuanyadora][2] + " " + corredors[posGuanyadora][3]);
    }
}

NOTA: Éste es un ejercicio de primer curso de programación del módulo de grado superior de programación.

Mi experiencia laboral en Canadá

Tras haber vivido un año en Canadá y haber recorrido la costa parte de Estados Unidos vuelvo a la carga con mis estudios.

Mañana empiezo a cursar el grado superior de programación de aplicaciones web en el IOC (institut Obert de Catalunya). Es todo un reto para mi que pretendo ir documentando en este blog. De momento cursaré tres asignaturas: Sistemas informáticos, bases de datos y el primer bloque de programación.

Me gustaría también reflexionar en este espacio sobre mi experiencia profesional canadiense.

Vancouver, Canadá

Tuve la oportunidad de trabajar durante casi seis meses en una empresa en el centro de Vancouver, algo peculiar a mi modo de ver. Sus clientes eran únicamente asesores fiscales de Estados Unidos y Canadá, y sus webs, ciertamente “limitadas”. Pongo limitadas entre comillas porque realmente los clientes no pedían más. En realidad, no sabían siquiera que pedir. Era más bien la empresa lo que les sugería que hacer. Pero vamos por partes…

La susodicha empresa tiene los siguientes departamentos:

  • Departamento comercial
  • Departamento de desarrollo
  • Departamento de diseño
  • Departamento de atención al cliente
  • Administración/dirección

Lo primero que me fascinó fue ver como el departamento comercial formaba el 50% de la empresa. 12 personas se dedicaban a llamar/contactar a posibles clientes dentro del mundo fiscal americano y proponerles crear una web. Al parecer, pocos profesionales de este mundo se preocupan de su imagen en la red y los que lo hacen suelen tener sitios abandonados y pasados de moda. Una vez captados los clientes se dedican a darles ideas y a ofrecerles sus productos.

Una vez decidido el diseño, los apartados y su contenido transmiten toda la información al departamento de diseño. La líder del equipo distribuía los trabajos entre los cuatro diseñadores que éramos quedando ella para los clientes más importantes y para la dirección de la sección.

El departamento de desarrollo se dedicaba a mantener la plataforma al día (modificando Drupal), resolver incidencias técnicas y mantener el hosting, contratar los dominios, etc. Las webs estaban alojadas en una empresa subcontrada.

Todos los jueves había una reunión considerada indispensable. También había reuniones por departamentos, algunas profesionales y otras dedicadas al ocio. Las paredes estaban decoradas con lemas para “motivar al personal” y habían competiciones entre los comerciales para ver quien vende más. Podían seguirse en monitores instaladas en la empresa. El viernes a última hora podías echarte una cerveza y había un futbolín a disposición de los trabajadores. Ganaron un premio a la “mejor empresa para trabajar en British Columbia”.

Me parecieron muy altos los precios que cobraban por hacer una simple web en Drupal. Las únicas webs, para mi gusto, excelentes eran las que el cliente pagaba 6.000 dólares. Cualquier diseñador web de Barcelona haría el mismo trabajo por bastante menos dinero, me parece. Hay que decir que el servicio de atención al cliente era excelente. Los plazos eran sagrados y la gente trabajaba a destajo y manejaban muy bien la presión. También cobraban bastante mejor que en España, claro. That is Canada.

Ahí aprendí cosas que me sirvieron mucho: lo primero y más evidente LESS como simplificación de CSS. La verdad es que simplifica el trabajo una barbaridad. Daba gusto leer esas stylesheets. Y lo segundo a organizarme con Trello y a comunicarme con Slack. Utilísimo.

Cuesta de creer en España que se pueda vivir sólo de CSS, pero en Canadá es una profesión bien extendida: el diseñador web. Mientras que aquí estos profesionale suelen venir del diseño papel ahí enseguida se especializan en digital. Es lo que tiene que haya una demanda laboral brutal.

En general fue una gran experiencia que me sirvió para crecer como diseñador, especiamente en el manejo de CSS y para conocer los entresijos de una empresa de comuncicación digital americana. Desde aquí le doy las gracias!

Bio-Despertar

Biodespertar es un Webiste realizado en WordPress para Joan Vilanova. Pretende ser una herramienta de divulgación de todo tipo de información relacionada con los nuevos conceptos de biología y salud. Fue vehículo para la publicación del Diccionario Bio-Emocional 2016 y la aplicación para Android DiccioBio.

Ha sido, con mucho, la web de más éxito que he realizado hasta la fecha. Gracias a la ya presencia activa de Joan en las redes sociales, la primera semana computó 36.000 visitas, más de 20.000 descargas del diccionario y más de 3.000 de la aplicación.

biodespertar
Para este proyecto se me pidió que:

  • Fuera posible recibir donaciones económicas.
  • Fuera posible leer documentos online y descargarlos.
  • Y yo, por mi parte, añadí que fuera segura y pudiera llevar control de las visitas.

También pensé en un diseño que transmitiera suavidad y calma. De ahí el blanco y las nubes… Para ello me basé en el TwentySixteen que viene de base en la nueva versión de WordPress.

Tuve que informarme debidamente sobre los mejores plugins a instalar optando por los siguientes:

Para el apartado de las donaciones acabé por quitar el plugin Give que previamente había instalado para poner un simple y llano botón de “Donar” de PayPal.

Como curiosidad, añadiré que me sorprendió sobremanera el creciente acoso por parte de los “hackers”. A las pocas horas de estrenbar online detectamos los primeros ataques. Es exasperante comprobar que haya gente intentando sabotear una herramienta útil como WordPress y a sus usuarios.