Miércoles 12 de diciembre de 2018

Emiliano A. González Salgado

Emiliano A. González Salgado
El blog de Emi

Migración a LibreOffice Base Firebird.

Hace poco publiqué en el blog un artículo sobre la migración a LibreOffice 6.1 beta:
https://emilianoangel.wordpress.com/2018/06/05/migracion-a-libreoffice-6-1-base/

Tras hacer pruebas y demás tuve que dejar el cambio a la nueva versión de la base de datos, pues había algunos bug.

El problema mas importante que he encontrado ha sido por la conversión de campos numéricos y decimales de la versión de HSLQDB a Firebird.

Hay un bug que aún no ha sido resuelto.

Todo esto hacerlo con HSLQDB, antes de abrir la base a convertir con Firebird.

La solución es cambiar los campos “numéricos” o “decimales” a “DOUBLE PRECISION”.

Desde el editor de tablas, no se puede. Con instrucciones SQL, tampoco. Parece ser que en este tipo de campos no está permitida tal acción.

Solución, crear una nueva tabla, copiando la que se quiera modificar, pegar y en el proceso de pegado, cambiar los datos de los campos a DOUBLE PRECISION.

Siempre, en el pegado, aceptar la primera opción: “Definición y datos”.

Posteriormente hay que cambiar las posible vistas de tablas y las consultas, con los datos de la nueva tabla.

Una opción es en edición SQL, usando un editor de texto, con la opción de buscar y reemplazar.

Si hay formularios también habría que cambiar el origen de tablas de los mismos.

Si hay una columna tanto en tablas, como vistas o consultas con caracteres extraños, había de cambiarlas.

El problema se presentó con una que era “año”. La “Ñ” no la acepta, por ahora.

Si la base de datos no se compone de muchas tablas con datos problemáticos y muchas consultas que estén involucradas, pues es algo rápido, pero que hay que tener paciencia.

Asociación LiGNUx: El software de renderizado Blender alcanza su versión 2.80
BlogDRAKE: AVISO:Firefox 64 requiere lib(64)atomic1

OpenSnitch, mantén tu Linux seguro con un Firewall

p.p1 {margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px 'Helvetica Neue'; color: #000000; -webkit-text-stroke: #000000} p.p2 {margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px 'Helvetica Neue'; color: #000000; -webkit-text-stroke: #000000; min-height: 12.0px} span.s1 {font-kerning: none} Cuando hablamos de seguridad informática, todos pensamos enseguida que estamos protegidos totalmente

Martes 11 de diciembre de 2018

Asociación LiGNUx: Mozilla Firefox ya esta disponible en su versión 64.0 con mejoras en el gestor de pestañas

Lunes 10 de diciembre de 2018

Asociación LiGNUx: El juego Star Ruler 2 ya esta disponible en Snap
Gaspar Fernández

Gaspar Fernández
Poesía Binaria

Cómo actualizar /etc/hosts con todos los contenedores docker que hay en ejecución

Si tenemos varios contenedores docker arrancados en nuestro ordenador. Muchas veces, nos interesará conectar con servicios corriendo dentro de cada uno de ellos. Algunos estarán lanzados simplemente con docker, otros con docker-compose, cada uno trabajando en un sistema distinto, y necesitamos una forma más o menos sencilla de acceder a cada uno de ellos.

Con un pequeño script podemos recorrer todos los contenedores, pedir la dirección IP de cada uno de ellos y añadirlas al nuestro archivo /etc/hosts de forma que este archivo se actualice automáticamente cada vez que lanzamos el comando.

El script

Yo lo suelo llamar docker_update_hosts.sh, y suele estar en /usr/local/bin. En realidad, es un enlace el que está ahí:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#!/bin/bash

function panic()
{
    echo "$@" >&2
    exit 1
}

if [ "`whoami`" != "root" ]
then
    panic "This program must be ran as root"
fi

# Clear /etc/hosts file
HEADER="# Added automatically by docker_update_hosts"
sed -i '/docker\.local$/d' /etc/hosts
sed -i "/$HEADER\$/d" /etc/hosts
# Remove empty lines at the end of file
sed -i  -e :a -e '/^\n*$/{$d;N;ba' -e '}' /etc/hosts

echo -e "\n$HEADER" >> /etc/hosts

IFS=$'\n' && ALLHOSTS=($( docker ps --format '{{.ID}} {{.Names}}'))

for line in ${ALLHOSTS[*]}; do
    IFS=" " read  -r ID NAME <<< "$line"
    IP="$(docker inspect --format '{{ .NetworkSettings.IPAddress }}' $ID)"
    if [ -n "$IP" ]; then
        echo -e "$IP\t$NAME.docker.local" >> /etc/hosts
    fi
done

El script debe ser ejecutado como root, porque tiene que tener permiso para escribir en /etc/hosts. Para ello, en muchas distribuciones lo podremos ejecutar así:

sudo docker_update_hosts

Hosts

El script creará varios hosts llamados [contenedor].docker.local donde contenedor es el nombre de cada uno de nuestros contenedores. Al final, nos podremos juntar con algo como:

172.17.0.8 myphp5.6-fpm.docker.local
172.17.0.7 mongodb-testing.docker.local
172.17.0.6 wp-plugin-test.docker.local
172.17.0.5 myphp7.2-fpm.docker.local
172.17.0.4 mariadb-proyectos.docker.local
172.17.0.3 mariadb-testing.docker.local
172.17.0.2 redis.docker.local

De esta forma, podremos utilizar el nombre que le hemos dado en docker junto con “.docker.local” para referirnos al contenedor y llamar a un servicio encerrado en el mismo. Por ejemplo, para conectar con la base de datos mariadb-proyectos.docker.local podemos, desde el mismo ordenador host:

mysql -u root -p -h mariadb-proyectos.docker.local

Precauciones

Ya que el script está editando el archivo /etc/hosts y ese mismo fichero puede ser editable por nosotros, el script escribe un comentario:

1
# Added automatically by docker_update_hosts

Y debajo se escriben todos los hosts e IPs de contenedores docker que encontremos. Automáticamente, nada más ejecutar el script se busca el comentario y se buscan todos los hosts que terminen en .docker.local, por lo que si tenemos otras cosas que terminen en .docker.local serán eliminadas cuando se ejecute el script.

No tenemos que tener especial cuidado cuando editemos el fichero /etc/hosts manualmente. Podremos meter hosts nuevos al final, o encima de los hosts introducidos por el script y se respetarán.

Ejecutar automáticamente

Dependiendo de nuestra forma de trabajar, podemos ejecutar el script a mano siempre que sea necesario, ejecutarlo dentro de un script para lanzar contenedores o podemos ejecutarlo en un cron cada 10 minutos, por ejemplo.

Foto principal: unsplash-logoSherzod Max

The post Cómo actualizar /etc/hosts con todos los contenedores docker que hay en ejecución appeared first on Poesía Binaria.

Sábado 08 de diciembre de 2018

TOP mejores buscadores de personas en la red

El mundo virtual de Internet es muy amplio. En el se puede buscar, consultar y conocer infinidad de cosas. En vista del gran tamaño que abarca y la diversidad de temas, han surgido herramientas que facilitan esta búsqueda. La búsqueda de personas en la red. Es muy complicado entrar una buena aplicación que haga esta […]

La entrada TOP mejores buscadores de personas en la red aparece primero en Blog de Informática ✏ Luisi.

Viernes 07 de diciembre de 2018

Advent of Code 2018: primera semana

Este año, como ya viene siendo habitual, tiene lugar la competición de programación Advent of Code. El objetivo es resolver un problema de programación al día, hasta el día de navidad, a modo de un particular calendario de adviento. Este año, como ya no viene siendo tan habitual, me he propuesto hacerlos todos y explicar mis soluciones. Esta semana todos han sido resueltos en Python.

Los programas que he usado, así como los enunciados y los datos de entrada que me han tocado (a cada uno le tocan datos diferentes) están en este repositorio de GitHub.

Día 1

El primer reto que nos proponen es muy sencillo. Se nos pasa un archivo con sumas y restas y tenemos que calcular el resultado final. Pongamos un ejemplo trivial:

+1, +1, -2 = 0

El procesdimiento es sencillo, leer cada operación, extraer el signo, convertir a número y aplicar la operación detectada por el signo.

def apply_freq(freq):
    with open("input.txt") as f:
        lines = f.readlines()
    for line in lines:
        signo = line[0:1]
        numero = int(line[1:])
        if signo == "+":
            freq += numero
        elif signo == "-":
            freq -= numero
    return freq

if __name__ == "__main__":
    freq = 0
    freq = apply_freq(freq)
    print("FREQ FINAL: %d" % freq)

La segunda parte es más interesante, ya que nos dice que tenemos que aplicar la misma cadena de operaciones de forma indefinida hasta encontrar una resultado repetido.

Aquí la clave es conocer el funcionamiento de un Set o conjunto. Se trata de una estructura de datos que no permite elementos repetidos. La idea está en ir almacenando los resultados que van saliendo hasta encontrar uno que ya esté dentro. Al encontrarlo salir e indicarlo.

FREQS = set()

def apply_freq(freq):
    with open("input.txt") as f:
        lines = f.readlines()
    for line in lines:
        signo = line[0:1]
        numero = int(line[1:])
        if signo == "+":
            freq += numero
        elif signo == "-":
            freq -= numero
        if freq in FREQS:
            return (True,freq)
        else:
            FREQS.add(freq)
    return (False,freq)

if __name__ == "__main__":
    freq = 0
    while True:
        end,freq = apply_freq(freq)
        if end:
            break
    print("FREQ FINAL: %d" % freq)

Aquí viene una anécdota interesante. Estoy haciendo estos retos con unos amigos en un grupo de Telegram y al poco de yo haberlo terminado empezaron a preguntar cuánto tardaba en ejecutarse la segunda parte. Al parecer les iba muy lento, yo sorprendido les dije que había sido instantáneo y que estaba usando Python. Ellos se preguntaban como podía ser, ya que lo habían hecho en C y les estaba tardando varios minutos.

Una representación de un set o conjunto. No puede haber elementos repetidos. No existe orden definido

La respuesta tiene que ver con el set. Yo sinceramente fui a él directamente pero otros compañeros no, y usaron listas y arrays. La búsqueda que realizaban para saber si el elemento estaba dentro era lineal. Comparada con la búsqueda en un set implementado con tabla hash que es constante, el rendimiento es muy inferior. He aquí un ejemplo de como lo más importante de cara a la eficiencia es el algoritmo y las estructuras de datos que usamos para resolver un problema.

Día 2

El segundo día se nos propone otro problema de dificultad similar. Sobre una lista de palabras tenemos que contar cuantas palabras tienen 2 letras repetidas y 3 letras repetidas, para finalmente multiplicar ambos números.

En este caso fui bastante pragmático y opté por usar la clase Counter de Python. Counter cuenta cuantas veces aparece una letra y lo deja en un diccionario. Podemos ignorar las claves, ya que lo único que tenemos que hacer es buscar en los valores si está el 3 y el 2, y si es así, sumar uno a nuestro contador.

from collections import Counter

twice = 0
triple = 0

with open("input.txt") as f:
    lines = f.readlines()
for line in lines:
    c = Counter(line)
    if 3 in c.values():
        triple += 1
    if 2 in c.values():
        twice += 1
total = twice*triple
print("CHECKSUM: %d" % total)

La segunda parte ya es más interesante. Se nos pide que la misma lista de palabras, encontremos las dos palabras que solo se diferencian en una letra (se tiene en cuenta el orden). Aquí el algoritmo es un poco más lento ya que para cada palabra la comparamos con el resto de palabras, hasta encontrar aquella que efectivamente tiene un cambio de únicamente una palabra.

Para ello hace falta una función que nos diga cuantas palabras hay de diferencia entre dos palabras, que es bastante sencillita.

def changes(base,word):
    changes = 0
    for i,letter in enumerate(base.strip()):
        if not letter == word[i]:
            changes += 1
    return changes

def find_similar(lines):
    for base in lines:
        for word in lines:
            if changes(base,word) == 1:
                return (base,word)

with open("input.txt") as f:
    lines = f.readlines()
base,word = find_similar(lines)
final = str()
for i,letter in enumerate(base.strip()):
    if letter == word[i]:
        final += letter
print("FINAL %s"%final)

Una vez tengamos las dos palabras que solo se diferencian en una letra, hacemos un bucle similar al usado para encontrarlas, solo que esta vez para formar la palabra con todas las letras que tienen en común, ignorando la diferente.

Día 3

En el día 3 nos proponen un problema muy interesante. Tenemos una lista de parcelas rectangulares, definidas por la posición de su esquina superior-izquierda y su ancho y alto, todo en metros. Para la primera parte tenemos que encontrar cuantos metros cuadrados del universo ficticio están en dos o más parcelas a la vez.

Lo primero que hay que hacer es leer la entrada, que esta vez ya no es tan trivial. Un simple RegEx nos permite obtener toda la información de forma sencilla.

from dataclasses import dataclass
import re

@dataclass
class Claim():
    id: int
    x: int
    y: int
    width: int
    height: int

def read_file():
    claims = []
    with open("input.txt") as f:
        lines = f.readlines()
    prog = re.compile(r"#([0-9]+) @ ([0-9]+),([0-9]+): ([0-9]+)x([0-9]+)");
    for line in lines:
        result = prog.match(line.strip())
        claim = Claim(
            id=int(result.group(1)),
            x=int(result.group(2)),
            y=int(result.group(3)),
            width=int(result.group(4)),
            height=int(result.group(5))
        )
        claims.append(claim)
    return claims

Para el algoritmo en sí, vamos a usar defaultdict. La idea es tener una tabla hash, cuya clave sean las coordenadas del mundo y su valor, el número de parcelas que estan sobre ella. Usamos defaultdict para que por defecto cualquier coordenada que no existiese con anterioridad tenga valor 0.

Así pues vamos a recorrer todas las parcelas y para cada parcela vamos a visitar todos los metros cuadrados que contiene en la tabla hash, sumando 1 para indicar que ese metro cuadrado pertenece a una parcela (más).

if __name__ == "__main__":
    claims = read_file()
    area = defaultdict(lambda: 0)
    for claim in claims:
        for i in range(claim.x,claim.x+claim.width):
            for j in range(claim.y,claim.y+claim.height):
                area[(i,j)] += 1
    overlaps = count_overlaps(area)
    print("Overlaps: %d" % overlaps)

La segunda parte nos indica que solo existe una parcela que no esté invadida por otra parcela. Hay que buscar cuál es e informar del ID que tiene. Para esto he simplemente vuelto a recorrer cada parcela comprobando si tienen algún metro cuadrado con uso por más de 1 parcela. Si para una parcela no se encuentran metros compartidos, automáticamente se devuelve su ID (ya que solo hay una parcela de estas características).

El código completo es el siguiente:

from dataclasses import dataclass
from collections import defaultdict
import re

@dataclass
class Claim():
    id: int
    x: int
    y: int
    width: int
    height: int

def read_file():
    claims = []
    with open("input.txt") as f:
        lines = f.readlines()
    prog = re.compile(r"#([0-9]+) @ ([0-9]+),([0-9]+): ([0-9]+)x([0-9]+)");
    for line in lines:
        result = prog.match(line.strip())
        claim = Claim(
            id=int(result.group(1)),
            x=int(result.group(2)),
            y=int(result.group(3)),
            width=int(result.group(4)),
            height=int(result.group(5))
        )
        claims.append(claim)
    return claims

def count_overlaps(area):
    overlaps = 0
    for overlap in area.values():
        if overlap > 1:
            overlaps += 1
    return overlaps

def find_nonoverlaping(claims,area):
    for claim in claims:
        overlaps = False
        for i in range(claim.x,claim.x+claim.width):
            for j in range(claim.y,claim.y+claim.height):
                if area[(i,j)] > 1:
                    overlaps = True
        if not overlaps:
            return claim.id 

if __name__ == "__main__":
    claims = read_file()
    area = defaultdict(lambda: 0)
    for claim in claims:
        for i in range(claim.x,claim.x+claim.width):
            for j in range(claim.y,claim.y+claim.height):
                area[(i,j)] += 1
    overlaps = count_overlaps(area)
    print("Overlaps: %d" % overlaps)
    non_overlaping = find_nonoverlaping(claims,area)
    print("ID: %d" % non_overlaping)

En esta segunda parte, tengo la intuición de que existe una manera más eficiente de hacerlo, pero todavía no he encontrado esa solución más eficiente.

Día 4

El problema del día 4, aunque aparentemente distinto al anterior, tiene muchas cosas en común y mi forma de resolverlo fue bastante parecida.

Se nos pide que sobre un registro de todas las noches identifiquemos el guardia que duerme más horas, y posteriormente su minuto preferido para quedarse dormido.

En primer lugar, la entrada de texto ya es bastante más compleja, pero con unos simples regex se puede analizar rápidamente, al menos para extraer la información que necesitamos. Aquí conviene prestar atención a que los registros de dormirse y despertarse ya que todos ocurren a la misma hora, luego lo único importante son los minutos. Otro detalle respecto a la entrada es que nos indican que está desordenada, sin embargo el formato de representación de la fecha que nos dan (parecido al ISO), se ordena cronológicamente simplemente con una ordenación alfabética.

La idea es muy similar a la del algoritmo anterior, primero tenemos una tabla hash con todos los guardias. Allí almacenamos otra tabla hash con los minutos de la hora y ponemos un cero si nunca se han dormido en ese minuto. Si usamos defaultdict, como en el código anterior, el código se simplifica bastante. En definitiva estamos usando dos tablas hash en vez de una y aplicar la misma idea de sumar 1, salvo que esta vez con el tiempo en vez del espacio (aunque Einstein vino a decir que eran cosas muy parecidas).

import re
from collections import defaultdict

def read_file():
    with open("input.txt") as f:
        lines = f.readlines()
    lines.sort()
    return lines


if __name__ == "__main__":
    lines = read_file()
    guard_prog = re.compile(r"[* ]+Guard #([0-9]+)")
    time_prog = re.compile(r"\[([0-9]+)-([0-9]+)-([0-9]+) ([0-9]+):([0-9]+)")
    current_guard = 0
    start_time = 0
    end_time = 0
    timetable = defaultdict(lambda: defaultdict(lambda: 0))
    for line in lines:
        # Hay tres tipos de líneas
        # Guardia, Sleep, Wake
        a = guard_prog.match(line.split("]")[1])
        if a != None:
            current_guard = a.group(1)
        elif "falls" in line:
            t = time_prog.match(line.split("]")[0])
            start_time = int(t.group(5))
        elif "wakes" in line:
            t = time_prog.match(line.split("]")[0])
            end_time = int(t.group(5))
            for i in range(start_time,end_time):
                timetable[current_guard][i] += 1

    # Calcular horas dormido
    max_guard = ""
    max_guard_sleeptime = 0
    for guard in timetable:
        s = sum(timetable[guard].values())
        if s > max_guard_sleeptime:
            max_guard_sleeptime = s
            max_guard = guard

    print("El guardia que más duerme es el %s con %d minutos" % (max_guard,max_guard_sleeptime))

    #Calcular minuto ideal
    max_minute = 0
    max_minute_times = 0
    for minute in timetable[max_guard]:
        if timetable[max_guard][minute] > max_minute_times:
            max_minute = minute
            max_minute_times = timetable[max_guard][minute]

    print("El guardia duerme más en el minuto %d (%d veces)" % (max_minute,max_minute_times))

    print("CHECKSUM %d" % (max_minute*int(max_guard)))

Posteriormente se recorren estas tablas hash para calcular lo pedido.

La segunda parte nos pide algo similar pero no idéntico, el guardia que se ha quedado dormido más veces en el mismo minuto (e indicar que minuto es).

La estructura de datos es exactamente la misma y solamente añadimos otro bucle para que busque este otro dato:

import re
from collections import defaultdict

def read_file():
    with open("input.txt") as f:
        lines = f.readlines()
    lines.sort()
    return lines


if __name__ == "__main__":
    lines = read_file()
    guard_prog = re.compile(r"[* ]+Guard #([0-9]+)")
    time_prog = re.compile(r"\[([0-9]+)-([0-9]+)-([0-9]+) ([0-9]+):([0-9]+)")
    current_guard = 0
    start_time = 0
    end_time = 0
    timetable = defaultdict(lambda: defaultdict(lambda: 0))
    for line in lines:
        # Hay tres tipos de líneas
        # Guardia, Sleep, Wake
        a = guard_prog.match(line.split("]")[1])
        if a != None:
            current_guard = a.group(1)
        elif "falls" in line:
            t = time_prog.match(line.split("]")[0])
            start_time = int(t.group(5))
        elif "wakes" in line:
            t = time_prog.match(line.split("]")[0])
            end_time = int(t.group(5))
            for i in range(start_time,end_time):
                timetable[current_guard][i] += 1

    # Calcular horas dormido
    max_guard = ""
    max_guard_sleeptime = 0
    for guard in timetable:
        s = sum(timetable[guard].values())
        if s > max_guard_sleeptime:
            max_guard_sleeptime = s
            max_guard = guard

    print("El guardia que más duerme es el %s con %d minutos" % (max_guard,max_guard_sleeptime))

    #Calcular minuto ideal
    max_minute = 0
    max_minute_times = 0
    for minute in timetable[max_guard]:
        if timetable[max_guard][minute] > max_minute_times:
            max_minute = minute
            max_minute_times = timetable[max_guard][minute]

    print("El guardia duerme más en el minuto %d (%d veces)" % (max_minute,max_minute_times))

    print("CHECKSUM %d" % (max_minute*int(max_guard)))

    # El guardia que ha estado un minuto concreto mas veces dormido
    max_guard = ""
    guard_minute = 0
    guard_minutes = 0
    for guard in timetable:
        for minute in timetable[guard]:
            if timetable[guard][minute] > guard_minutes:
                max_guard = guard
                guard_minute = minute
                guard_minutes = timetable[guard][minute]
    print("El guardia %s se ha dormido en el minuto %d (%d veces)" % (max_guard,guard_minute,guard_minutes))
    print("CHECKSUM %d" % (guard_minute*int(max_guard)))

En este caso, la segunda parte apenas ha implicado modificaciones, siendo la estructura de datos subyacente intacta.

Día 5

Este día se nos propone un reto aparentemente sencillo, pero cuya resolución puede ser muy lenta o rápida dependiendo de como lo hagamos. He de decir, que mi solución era muy lenta, extremadamente y tuve que mirar como lo habían hecho otras personas para entender como se podía optimizar.

La primera tarea consiste en reducir unas cadenas de reactivos. La norma es que si hay una letra minúscula y una mayúscula al lado, se pueden quitar. Se nos pide la longitud de la cadena de reactivos después de reducirlo al máximo.

if __name__ == "__main__":

    with open("input.txt") as f:
        line = f.readline()
    
    line = list(line.strip())
    end = False
    while not end:
        end = True
        for i in range(1,len(line)):
            if line[i-1] != line[i] and line[i-1].lower() == line[i].lower():
                end = False
                del line[i-1]
                del line[i-1]
                break
    print("Units: %d" % (len(line)))

La versión original consistía en ir realizando elimaciones sobre la propia lista. Todo ello en un bucle que para cuando en una iteración no se modifica la cadena. Esto es extremadamente ineficiente. Tomando el código de Peter Tseng, existe una opción mejor. Se puede ir haciendo un string nuevo poco a poco comprobando si la nueva letra reacciona con la última del string nuevo. Esto tiene la ventaja de que solo hace falta una iteración para cubrir todas las reacciones. La versión mejorada es la siguiente:

def react(line):
    new = list()
    for c in line.strip():
        if len(new) > 0 and c != new[-1] and c.lower() == new[-1].lower():
            del new[-1]
        else:
            new += c
    return new

if __name__ == "__main__":

    with open("input.txt") as f:
        line = f.readline()
    line = react(line)
    print("Units: %d" % (len(line)))

Para la segunda parte se nos pida que encontremos la letra, que si eliminamos del compuesto antes de empezar la reacción, genera la cadena más pequeña. Hay que probar con todas las letras, mención especial a string.ascii_lowercase que tiene un iterador con todas las letras minúsculas del alfabeto inglés. Y posteriormente, encontrar la que de resultado inferior. Como no nos pide la letra, solamente la longitud que tendría esa cadena, no tenemos que pasar información extra.

import string

def react(line):
    new = list()
    for c in line:
        if len(new) > 0 and c != new[-1] and c.lower() == new[-1].lower():
            del new[-1]
        else:
            new += c
    return new

def min_react(line,letter):
    line = [c for c in line if c.lower() != letter]
    return len(react(line))

if __name__ == "__main__":

    with open("input.txt") as f:
        line = f.readline()
    l = react(line)

    print("Units: %d" % (len(l)))
    
    m = min([min_react(line,char) for char in string.ascii_lowercase])
    print("Minimum length: %d" % (m))

Día 6

Esto se empieza a complicar. El día 6 nos pide que sobre una cuadrícula encontremos qué punto de control está más cercano a esa posición. De los puntos de control que un número de cuadrículas cercanas finitas, encontrar cuántas cuadrículas tiene el punto de control con más cuadrículas asociadas. Para saber la distancia de una cuadrícula al punto de control se usa la distancia de Manhattan.

Lo primero es reconocer que puntos de control tienen áreas infinitas, para no tenerlos en cuenta.

Para ello, voy a calcular dos puntos extremos (esquina superior izquierda y esquina inferior derecha), dentro del rectángulo que forman estos puntos están contenidos todos los puntos de control. El objetivo es calcular las distancias de las cuadrículas justo por fuera de este rectángulo. Las cuadrículas que estén más lejos de eso no van a cambiar de punto de control, ya que el más cercano en el borde seguirá siendo el más cercano en el borde + N, ya que no hay más puntos de control fuera.

Posteriormente, empezamos a calcular las distancias de todos los puntos de la cuadrícula. Para almacenar los datos vuelvo a usar una tabla hash (defaultdict de Python), donde la clave es la coordenada X,Y y el valor es el punto de control más cercano a esa cuadrícula. Si dos puntos de control están a la misma distancia o no se ha calculado, se usa -1.

Cuando se ha calculado el punto de control más cercano, se revisa si ese punto estaba fuera del rectángulo que contiene a los puntos de control. Si está fuera, el punto de control pasa a un conjunto de puntos con infinitas cuadrículas cercanas.

Para el conteo de cuántas cuadrículas tiene un punto de control que sabemos que es finito, uso otra tabla hash, inicializada por defecto a 0, cuya clave es el identificador de punto de control y su valor, el número de cuadrículas. Después, de los valores almacenados se calcula el máximo.

from dataclasses import dataclass
from collections import defaultdict
import math

@dataclass
class Punto:
    x: int
    y: int
    owner: int

def distancia(p1,p2):
    return abs(p1.x-p2.x)+abs(p1.y-p2.y)

if __name__ == "__main__":
    with open("input.txt") as f:
        lines = f.readlines()
    puntosControl = list()
    xlist = list()
    ylist = list()
    for i,line in enumerate(lines):
        l = line.split(",")
        xlist.append(int(l[0]))
        ylist.append(int(l[1]))
        puntosControl.append(Punto(x=int(l[0]),y=int(l[1]),owner=i))
    esquinaSuperiorIzquierda = Punto(x=min(xlist),y=min(ylist),owner=-1)
    esquinaInferiorDerecha = Punto(x=max(xlist),y=max(ylist),owner=-1)

    # Los que están fuera del rango esquinaSuperiorIzquierdaxesquinaInferiorDerecha se excluyen automáticamente
    excluidos = set()
    world = defaultdict(lambda: -1)
    for i in range(esquinaSuperiorIzquierda.x-1,esquinaInferiorDerecha.x+2):
        for j in range(esquinaSuperiorIzquierda.y-1,esquinaInferiorDerecha.y+2):
            punto = Punto(x=i,y=j,owner=-1)
            distanciaMin = math.inf
            total = 0
            for p in puntosControl:
                if distancia(punto,p) == distanciaMin:
                    punto.owner = -1
                if distancia(punto,p) < distanciaMin:
                    distanciaMin = distancia(punto,p)
                    punto.owner = p.owner
                
            if i == esquinaSuperiorIzquierda.x-1 or i == esquinaInferiorDerecha.x+1 or j == esquinaSuperiorIzquierda.y-1 or j == esquinaInferiorDerecha.y+1:
                excluidos.add(punto.owner)
            if punto.owner > -1:
                world[(i,j)] = punto.owner
    conteo = defaultdict(lambda: 0)
    for p in world:
        if not world[p] in excluidos:
            conteo[world[p]] += 1
    print("Maximum finite area: %d" % max(conteo.values()))

En la segunda parte nos dicen que hay una región de puntos cuya suma de distancias a todos los puntos de control es menor a 10000. ¿Cuántos puntos forman esta región? Aquí creo que el enunciado no fue demasiado claro, ya que en un principio pensé que podría haber varias áreas, o que podría haber puntos sueltos, no conectados a la región. Sin embargo eso no pasa. Yo diseñé un algoritmo que iba visitando las celdas adyacentes, pero en realidad no hacía falta, simplemente se puede contar cuantos puntos cumplen la condición. Y se puede hacer en el mismo bucle que la primera parte.

from dataclasses import dataclass
from collections import defaultdict
import math

@dataclass
class Punto:
    x: int
    y: int
    owner: int

def distancia(p1,p2):
    return abs(p1.x-p2.x)+abs(p1.y-p2.y)

if __name__ == "__main__":
    with open("input.txt") as f:
        lines = f.readlines()
    puntosControl = list()
    xlist = list()
    ylist = list()
    for i,line in enumerate(lines):
        l = line.split(",")
        xlist.append(int(l[0]))
        ylist.append(int(l[1]))
        puntosControl.append(Punto(x=int(l[0]),y=int(l[1]),owner=i))
    esquinaSuperiorIzquierda = Punto(x=min(xlist),y=min(ylist),owner=-1)
    esquinaInferiorDerecha = Punto(x=max(xlist),y=max(ylist),owner=-1)

    # Los que están fuera del rango esquinaSuperiorIzquierdaxesquinaInferiorDerecha se excluyen automáticamente
    excluidos = set()
    world = defaultdict(lambda: -1)
    world_total = 0
    for i in range(esquinaSuperiorIzquierda.x-1,esquinaInferiorDerecha.x+2):
        for j in range(esquinaSuperiorIzquierda.y-1,esquinaInferiorDerecha.y+2):
            punto = Punto(x=i,y=j,owner=-1)
            distanciaMin = math.inf
            total = 0
            for p in puntosControl:
                if distancia(punto,p) == distanciaMin:
                    punto.owner = -1
                if distancia(punto,p) < distanciaMin:
                    distanciaMin = distancia(punto,p)
                    punto.owner = p.owner
                total += distancia(punto,p)
            if total < 10000:
                world_total += 1
                
            if i == esquinaSuperiorIzquierda.x-1 or i == esquinaInferiorDerecha.x+1 or j == esquinaSuperiorIzquierda.y-1 or j == esquinaInferiorDerecha.y+1:
                excluidos.add(punto.owner)
            if punto.owner > -1:
                world[(i,j)] = punto.owner
    conteo = defaultdict(lambda: 0)
    for p in world:
        if not world[p] in excluidos:
            conteo[world[p]] += 1
    print("Maximum finite area: %d" % max(conteo.values()))
    print("Region size: %d" % world_total)

Día 7

El día 7 se nos propone un reto muy interesante. En primer lugar, tenemos una lista de tareas que hacer en orden. Cada tarea depende de que otras hayan finalizado. Se nos pide el orden en el que se deberán hacer. Para resolver esto vamos a usar una estructura de datos nueva, el grafo dirigido. No voy a implementarlo yo, sino que voy a usar la magnífica librería networkx.

La idea es construir un grafo dirigido, con las tareas. Un nodo dirigido de C a A significa que antes de hacer la tarea A, C tiene que estar completado. Por supuesto puede darse el caso de que antes de hacer A haya que hacer C y otras tareas.

Vamos a realizar una búsqueda primero en anchura (DFS en inglés). Para ello mantenemos una lista con las tareas completadas y otra lista con las tareas que podríamos empezar a hacer. Cuando completamos una tarea vemos si las tareas a las que llevan necesitan todavía más tareas por realizar o en cambio ya pueden ser añadidas a la lista de “listas para empezar”. El enunciado nos indica que ante la situación de dos tareas listas para empezar, se usa el orden alfabético para determinar cuál va antes.

Hace falta además una lista de tareas iniciales, que pueden empezar sin esperar. Esto se hace con dos conjuntos según leemos el archivo. Se hace la diferencia entre ellos y esas tareas no tienen prerrequisitos.

import networkx as nx
import re

def read_file():
    first = set()
    second = set()
    G = nx.DiGraph()
    prog = re.compile("Step ([A-Z]) must be finished before step ([A-Z]) can begin.")
    with open("input.txt") as f:
        lines = f.readlines()
    for line in lines:
        r = prog.match(line.strip())
        if not r.group(1) in G:
            G.add_node(r.group(1))
        if not r.group(2) in G:
            G.add_node(r.group(2))
        if not G.has_edge(r.group(1),r.group(2)):
            G.add_edge(r.group(1),r.group(2))
        first.add(r.group(1))
        second.add(r.group(2))
    return (G,first- second)

if __name__ == "__main__":
    G,starter = read_file()
    path = list()
    to_visit = sorted(starter,reverse=True)

    while len(to_visit) > 0:
        node = to_visit.pop()
        path.append(node)
        neighbours = G[node]
        for n in neighbours:
            if not n in to_visit and not n in path:
                allCompleted = True
                for u,v in G.in_edges(nbunch=n):
                    if not u in path:
                        allCompleted = False
                if allCompleted:
                    to_visit.append(n)
        to_visit = sorted(to_visit,reverse=True)
    print("".join(path))

La segunda parte también es muy interesante. Se nos indica que las tareas tienen una duración de N segundos, dependiendo del valor alfabético de la letra. Además, ahora existen 5 trabajadores que pueden ir haciendo tareas en paralelo. ¿En cuánto tiempo podemos acabar todas las tareas?

import networkx as nx
import re

def read_file():
    first = set()
    second = set()
    G = nx.DiGraph()
    prog = re.compile("Step ([A-Z]) must be finished before step ([A-Z]) can begin.")
    with open("input.txt") as f:
        lines = f.readlines()
    for line in lines:
        r = prog.match(line.strip())
        if not r.group(1) in G:
            G.add_node(r.group(1))
        if not r.group(2) in G:
            G.add_node(r.group(2))
        if not G.has_edge(r.group(1),r.group(2)):
            G.add_edge(r.group(1),r.group(2))
        first.add(r.group(1))
        second.add(r.group(2))
    return (G,first- second)

def duration(step):
    return 60+ord(step)-64

if __name__ == "__main__":
    G,starter = read_file()
    path = list()
    to_visit = sorted(starter,reverse=True)

    while len(to_visit) > 0:
        node = to_visit.pop()
        path.append(node)
        neighbours = G[node]
        for n in neighbours:
            if not n in to_visit and not n in path:
                allCompleted = True
                for u,v in G.in_edges(nbunch=n):
                    if not u in path:
                        allCompleted = False
                if allCompleted:
                    to_visit.append(n)
        to_visit = sorted(to_visit,reverse=True)
    print("".join(path))

    end_letter = path[-1]
    path = list()
    to_visit = sorted(starter,reverse=True)
    
    second = 0
    workers = list()
    # Trabajo Actual, segundo que termina
    workers.append(['.',0])
    workers.append(['.',0])
    workers.append(['.',0])
    workers.append(['.',0])
    workers.append(['.',0])
    def full_workers(workers):
        full = True
        for w in workers:
            if w[0] == ".":
                full = False
        return full
    end = False
    while not end:
        if len(to_visit) == 0 or full_workers(workers):
            second += 1
        for i in range(0,len(workers)):
            if workers[i][1] <= second:
                if workers[i][0] != ".":
                    path.append(workers[i][0])
                    neighbours = G[workers[i][0]]
                    for n in neighbours:
                        if not n in to_visit and not n in path:
                            allCompleted = True
                            for u,v in G.in_edges(nbunch=n):
                                if not u in path:
                                    allCompleted = False
                            if allCompleted:
                                to_visit.append(n)
                    to_visit = sorted(to_visit,reverse=True)
                if workers[i][0] == end_letter:
                    print("Finish point")
                    print("Seconds: %d" % second)
                    end = True
                if len(to_visit) > 0:
                    node = to_visit.pop()
                    workers[i][1] = second+duration(node)
                    workers[i][0] = node
                else:
                    workers[i][0] = "."

Bien, partiendo del mismo grafo dirigido ahora vamos a hacer otro tipo de recorrido, también DFS, pero no vamos a añadir nuevos elementos a la lista de forma inmediata, sino cuando hayan sido acabados de procesar. Almacenamos los trabajadores como listas dentro de una lista de trabajadores. Cada trabajador guarda la tarea que estaba haciendo y el segundo en el que acabará. Defino una función para saber si los trabajadores están todos ocupados.

Lo primero a tener en cuenta es que el tiempo no avanza hasta que la lista de tareas que se puede realizar está vacía o los trabajadores están llenos. Luego en cada iteración del bucle, analizamos a los trabajadores. Si no han acabado, no se hace nada. Si ya han acabado y estaban con una tarea, se añade la tarea a la lista de tareas finalizadas, y se analiza si se han desbloqueado nuevas tareas disponibles para realizar. Si la tarea que ha realizado es la última tarea, se acaba el programa.

Por último si hay una tareas disponible para hacer, se la añadimos al trabajador y si no, pues le indicamos que no haga nada (así no añadimos por duplicado la tarea en el futuro).

Salida de debug que saqué en el día 7

Conclusión

Esta ha sido la primera semana del Advent of Code 2018. Como vemos, el nivel de los problemas ha ido aumentado de forma progresiva. La próxima semana comentaré las soluciones correspondientes. Tenéis todo el código hasta ahora aquí.

 

La entrada Advent of Code 2018: primera semana se publicó primero en Adrianistán.

Martes 04 de diciembre de 2018

Conclusiones de la visita de Richard Stallman a Valladolid

Richard Stallman, el padre del software libre, vino a visitarnos a la ciudad de Valladolid. La oportunidad de conocer a tal personaje en primera persona era única, así que no dudé en asistir, con la suerte que tuve de poder estar en primera fila durante la conferencia.

La conferencia no contaba nada nuevo, nada que no supiese cualquier persona que haya leído un poco sobre la idea del software libre, pero se hizo amena. Stallman explica muy bien y las diapositivas están muy bien hechas. Tiene bastantes chistes precocinados pero que causan buen impacto en la audiencia.

Pero Stallman es un personaje. Hablando con la gente que cenó con él el día anterior, algunos me contaban que había sido bastante irrespetuoso, sacando el portátil durante la cena para hacer sus cosas y gritar de vez en cuando que no escuchaba bien.

Durante la charla ha estado bebiendo de su té, descalzo y hasta el momento de empezar ha seguido mandando correos. Le noté bastante envejecido, caminaba medio cojo y se le notaba la marca de la operación en el brazo. Para empezar a puesto su famosa versión de Guantanamera.

La presentación ha seguido explicando las cuatro libertades del software libre, de forma bastante extensa, explicando para todos los públicos por qué son importantes.

Durante la charla también ha hablado del software malévolo, no confundir con privativo. Según él, son dos cosas distintas, pero relacionado. Puede haber software honesto privativo y software malévolo libre, pero son minorías en la práctica. También ha hablado del software privado, que es perfectamente ético, y que hasta él programa software privado. La diferencia es que el software privado nunca se distribuye fuera del propio autor u organización. Bastante parte de la charla se ha centrado en esta parte, tocando el tema de la privacidad a fondo. Para Stallman la recolección de datos personales debería estar prohibida.

Para ilustrar este punto, ha puesto como ejemplo algo que le ha horrorizado, el sistema de parquímetros de Valladolid. Según él son horribles, no porque haya que pagar, que es algo a lo que está dispuesto, sino porque hay que poner la matrícula del vehículo. Poner la matrícula en el parquímetro lo que sirve es para rastrear a la gente. Este tipo de acciones nos acercan cada vez más a la dictadura y a la destrucción de los derechos humanos.

Personalmente el ejemplo me parece bastante exagerado y aunque veo su punto, creo que la recolección de datos personales puede ser necesario en ciertas situaciones, siempre que se traten de forma adecuada.

También ha habido tiempo para hablar de historia. Habló de la historia de GNU, como Linux al principio tenía una licencia no libre (se impedía su redistribución comercial), pero que al poco cambió a GPL 2, siendo el candidato perfecto para el proyecto GNU. Ha comentado que Hurd tiene un diseño muy elegante, moderno pero quizá fue demasiado complicado y que en perspectiva fue un error diseñarlo de esa forma. Ha dicho que Hurd no es usable para nada práctico ahora mismo.

Ha insistido mucho en que el sistema operativo se llama GNU con Linux.

También ha hablado del open source. Y cuando le proclaman padre del open source afirma: “si soy el padre es porque han hecho la reproducción invitro con semen mío robado”. Afirma que la gente del open source tiene otra ideología, mucho más pragmática, pero incompleta, ya que no preserva las libertades.

Ha hablado de licencias libres: débiles y la GPL. De entre las débiles recomienda la Apache, aunque por supuesto la mejor es la GPL, en sus distintas versiones. Ha confirmado que nadie está trabajando en la GPL4. Aquí ha aprovechado para criticar a GitHub que ha seguido una muy mala costumbre de no prestar atención a las licencias del software que aleja. Además indica que es necesario poner un comentario en cada archivo con la licencia que sigue. Eso de poner un archivo con la licencia en la carpeta raíz no es suficiente según Stallman.

Esto lo ha enlazado con LibreJS, el complemento que detecta si el código JavaScript de una página es libre o no y lo bloquea o no según esto. Stallman no ha criticado en ningún momento JavaScript, simplemente que tiene que respetar los mismos criterios de los programas nativos para ser software libre.

También ha hablado de distros libres, metiéndose con Ubuntu bastante. Reconoce que estos usuarios están más cerca de la libertad que si usasen Windows o macOS pero que todavía les falta un poco. Y lo peor para Stallman es que mucha gente cree que sistemas como Ubuntu son libres y la gente se queda en ellos.

Por último ha hablado del software libre en la educación, también ha recomendado a la universidad tener una asignatura de ingeniería inversa (o retroingeniería como él lo llama).

Después de esto ha proseguido con el momento más cómico de la charla, se puso su túnica y su aureola y empezó a hablar de la religión de Emacs.

Nos bendijo nuestros ordenadores, y habló de como formar parte de la Iglesia del tan importante Emacs. No es necesario guardar celibato para ser santo pero hay varias cosas, como el peregrinaje de Emacs (saberse todas las combinaciones de teclado de memoria) o los cismas actuales (¿cuál es la tecla más importante en Emacs?). También ha dedicado palabras a los Vimeros como yo. Usar Vi no es pecado, es una penitencia. Y eso a pesar de que VIVIVI es el número de la bestia. También contó como en China le intentaron atacar unos seguidores de Vi, pero tenía sentido porque la violencia empieza por vi.

Después ha subastado un ñu, poniendo caras para que no dejásemos al ñu solo. Además de incidir en que no puede haber pingüinos solos, tiene que haber ñus acompañándolos.

Por último la ronda de preguntas. Mi pregunta ha sido ¿Las redes neuronales pueden ser software libre? Su respuesta ha sido que existen herramientas para alterar los valores numéricos de estas redes, mucho más fácil que la ingeniería inversa. Por tanto no sería técnicamente lo mismo. Creo que lo ha puesto al nivel de una fotografía o un vídeo, donde la edición es más sencilla y no tiene sentido hablar de fotografía libre.

También se ha preguntado por Microsoft y su deriva open source. Stallman celebra que publique cosas con licencias de software libre, pero eso no quita que siga teniendo software privativo que espía como Windows.

Le han preguntado por un teléfono que respete la privacidad. Según él es imposible, aunque se está intentando con un interruptor que permita desconectar la conexión móvil de forma física. El problema es de la tecnología móvil (no importa que sean smartphones o no), que para enrutar los paquetes guarda la ubicación de los dispositivos. El propósito era muy inocente pero se puede usar para espiar. Eso sí, él ha usado teléfonos móviles, siempre cuando necesita llamar pregunata a alguien que haya alrededor si le pueden dejar el teléfono.

Por último, sobre el hardware libre ha dicho que el concepto es erróneo. No puede existir hardware libre. El software libre existe, porque se puede copiar de forma exacta, en el mundo físico eso no pasa. Habría que hablar de hardware con diseños libres, pero ningún objeto podrá ser hardware libre o hardware privativo.

La entrada Conclusiones de la visita de Richard Stallman a Valladolid se publicó primero en Adrianistán.

Ubuntizando.com

Ubuntizando.com
Ubuntizando.com

CoolBox Wireless AudioLink, el dispositivo para devolver a la vida tu viejo equipo de música

Soy un nostálgico de la época en la que pasaba las tardes de Sábado en el salón de mi casa poniendo vinilos en el equipo de alta fidelidad que había heredado de mi abuelo que por entonces había comprado un sistema modular de aúpa. Os hablo de cuando era un chavalín que usaba la doble pletina para cortar y pegar cintas de casete en mis mezclas personales que luego usaba en un programa de radio libre que tenía allá por 1997. De hecho todavía tengo una minicadena que cada vez enciendo menos porque sinceramente, ahora con el móvil es muy fácil engancharse al Spotify o SoundCloud y disfrutar de cientos de miles de horas de música.

CoolBox Wireless AudioLink

Mis CDs y Vinilos descansan tranquilos pero siempre he querido devolver a la vida mi equipo Hi-Fi sin tener que depender de más cables. Por eso este CoolBox Wireless AudioLink me ha resultado muy útil. Básicamente el aparato consiste en un emisor/receptor Bluetooth que podemos conectar para que haga de enlace con nuestro Smartphone, Tablet o auricular inalámbrico.  Y es que está es otra de las ventajas. La mayoría de los receptores Bluetooth no tienen la capacidad de cambiar de modo para emitir una señal y éste dispositivo de CoolBox lo tiene.

CoolBox hace posible la retrocompatibilidad Bluetooth con el audio con cable

El dispositivo es muy compacto (33 x 10 x 45 mm) y cuenta con una batería recargable que ofrece una autonomía de 8 horas pero que yo he probado a mantenerlo conectado y podemos usarlo sin problemas mientras carga.  Para hacerlo funcionar basta con conectar la toma jack y pulsamos el botón de encendido durante unos segundos para hacer la sincronicación. En menos de 10 segundos todo está funcionando. En la caja podemos encontrar todos los cables aunque yo veo en falta un adaptador jack a RCA o para conectar el jack de 35mm a 25mm debido a que no son pocos equipos que usan estos conectores pero no es nada que no podamos resolver acercándonos a la tienda de electrónica más cercana.

El alcance y recepción de señal es bueno. En las especificaciones se indica que el alcance máximo es de unos 15 metros. Yo hice mis pruebas y es cierto que llega a algo más de 10 metros e incluso la señal es aceptable si vamos un poco más lejos pero depende mucho de los obstáculos que encuentre la señal. Así que salvo que vivas en un palacio la cobertura que CoolBox ofrece será más que suficiente.

CoolBox Wireless AudioLink

CoolBox Wireless AudioLink

Ya por último comentar el precio. 29.90 euros puede parecer un precio excesivo, sobretodo con otras opciones de marcas asiáticas disponibles pero vale la pena. En este mismo blog probé en su momento un equipo de Sylable pero no era lo mismo en comparación con el CoolBox Wireless AudioLink. No podía usarse mientras cargaba, la autonomía era inferior y solo disponía de un modo de emisión. Muy básico en comparación con este AudioLink.

¿Comprar o comprar? Depende. Personalmente me ha resultado muy útil y aunque no es una opción profesional permite darle múltiples usos que sumado a sus ocho horas de batería me dejaron sin excusas para no darle una oportunidad. 🙂

Lunes 03 de diciembre de 2018

Liher Sanchez

Liher Sanchez
El blog de Liher

Como saber o listar los Kernels que tengo en Ubuntu y cual estoy usando

Una de las cosas que mas me preocupa cuando estoy usando mi ordenador es tener el sistema bien limpio, tanto por fuera como por dentro. No me gusta tener la papelera llena de archivos, es una costumbre que tengo desde hace años, siempre vacío la papelera cuando voy a apagar el ordenador ya que así ahorro espacio en el disco duro. También me gusta eliminar los instalables de los programas ya que una vez instalado el programa el archivo instalador no me sirve para nada, aunque tengo algunos guardados que considero importantes, pero son muy pocos. Otra de las cosas que me gusta hacer es eliminar los Kernels que ya no uso por la sencilla razón de que no me sirven, con guardar el que esta en uso y el anterior pienso que es suficiente. Antes, para eliminar los Kernels que no usaba utilizaba una herramienta de un programa llamado Ubuntu Tweak, pero por desgracia es un proyecto descontinuado y ya no se puede instalar en mi Linux Mint 19. Ahora, para eliminar los Kernels en Ubuntu o Linux Mint sin uso lo hago de otra forma que ya os mostraré en otro artículo. En este lo que os voy a mostrar es como saber y listar los Kernels que tenéis en vuestro Ubuntu o derivadas y cual es el que estáis usando actualmente.

Quizás para las capacidades de almacenamiento que tienen hoy en día los discos duros este ahorro de espacio no sea muy grande pero el quitar cosas que ya no uso del ordenador es una costumbre que adquirí con mi primer ordenador ya que tenia unas prestaciones muy limitadas, en concreto tenia 43 MB de disco duro. Llegué incluso a comprimir todo el disco duro y eso lo convertía en un HD de 73 MB, que seguía sin ser suficiente pero ya era algo mas. Bueno vamos al lío. Si queremos saber y listar todos los Kernels que tenéis en vuestro ordenador lo que tenéis que hacer es abrir una Terminal y escribir el siguiente comando:

dpkg -l | grep linux-image

Al teclear este comando podréis ver algo similar a esto:

 

listar o saber los kernels de ubuntu

 

Como podéis ver en la imagen tengo 4 versiones del Kernel instalados en mi ordenador. Normalmente no suelo tener tantas pero no he borrado todavía los Kernels sin uso para tenerlos y mostrar como eliminarlos en otro artículo. En condiciones normales el Kernel que está en uso es el mas reciente como nos indican los números de versión, cuanto mas alto sea el numero, mas reciente será.

Ahora vamos con lo siguiente, como saber cual es el Kernel que estamos usando ahora mismo. Esto lo podemos saber de varias formas, yo os voy a mostrar dos bastante sencillas y que os darán la información que necesitáis. Para ello, en la Terminal, escribís este comando:

uname -a

O bien:

uname -r

Lo que veréis en la Terminal al introducir estos dos comandos es lo siguiente:

 

kernel en uso en Ubuntu

 

En la imagen podéis ver la información que obtenemos con cada uno de los comandos. Con el segundo comando la información es mas escueta, como podéis ver, aunque es suficiente. Y si queréis una información mas completa tenéis el primer comando.

Y ya está, eso es todo, con lo que os he mostrado ya poder saber y listar los Kernels que tenéis en vuestro Ubuntu o derivadas y también cual es la versión del Kernel que tenéis en uso. Un saludo a todos.

Liher Sanchez

Liher Sanchez
El blog de Liher

5 maneras fáciles y confiables de ganar dinero en línea

Gracias a Internet, ahora hay una gran variedad de formas de hacer dinero en línea. Ya sea que estés buscando maneras de ganar un poco de dinero extra, o crear un flujo de ingresos de tiempo completo, hay muchas oportunidades para hacerlo, todo en línea y desde la comodidad de tu hogar.

Aquí os dejo 5 de las mejores maneras de ganar dinero en línea que pueden definitivamente hacer que crees tu trabajo ideal, seas tu propio jefe y trabajes de manera independiente en tu propio horario y desde tu propio espacio.

1 – Podcasting

Una de las formas más creativas de ganar dinero en línea es alojar un podcast en línea. La clave para avanzar con el podcasting es encontrar tu nicho, hacer crecer una audiencia y luego encontrar formas de monetizar y conectarte con los patrocinadores. Esta no es, quizás, la forma más fácil de ganar dinero en línea, ya que requiere una gran cantidad de logística que debes escribir, grabar y editar para lograr un podcast de calidad, pero vale la pena considerarlo, especialmente si posees eres un comunicador nato.

2 – Venta de libros

Si bien la industria editorial solía tener una gran cantidad de documentos impresos, puedes completar todo el proceso de escribir, publicar y comercializar un libro en línea en estos días sin muchas complicaciones. Los sitios web como “Create Space” te permitirán cargar y llevar tu libro a impresión sin involucrar a un editor formal, e incluso puedes incluir tu libro en Amazon.com que, como sabes, es la plataforma ideal para vender un libro. Si crees que tienes las habilidades para escribir y que podrías escribir un libro que la gente quiera comprar, esta es una estrategia inteligente a considerar, ya que los costos iniciales pueden ser mínimos y probablemente ya tengas una computadora y un software de procesamiento de textos.

3 – Publicaciones patrocinadas

Si tienes un sitio web o un gran número de redes sociales, también puedes ganar dinero buscando publicaciones y anuncios patrocinados. ¿Pero, cómo funciona esto? Básicamente, las empresas están dispuestas a pagar a los bloggers y personas influyentes en las redes sociales por promover sus productos y servicios. Si tienes una plataforma, ya sea un blog o una gran cuenta de Instagram, puedes cobrar. Hay bloggers con reputación que obtienen hasta $ 20,000 dólares por una publicación patrocinada. Aunque creas que es exagerado, no lo es, y esto sirve para mostrar lo que es posible lograr con las publicaciones patrocinadas. Sin embargo, ten en cuenta que no necesitas un sitio web para hacer contenido patrocinado, ya que también puedes recibir un pago si tienes muchos seguidores en las redes sociales. Si tienes una gran cantidad de seguidores en Instagram, puedes obtener todo tipo de patrocinios. No solo puedes lograr pagos en efectivo, sino que también puedes recibir muchas cosas gratis.

4 – Seminarios web

¿Necesitas más ideas sobre cómo hacer dinero en línea? Otra estrategia es utilizar seminarios web para comercializar tu producto, servicio o curso. Con un seminario web, básicamente estás ofreciendo muchos consejos y sugerencias de forma gratuita, generalmente en un formato en vivo. Sin embargo, al final, estas lanzando tu producto o servicio pagado con el objetivo de asegurar algunas ofertas. El orador profesional Grant Baldwin, por ejemplo, utiliza seminarios web para promocionar sus cursos sobre oratoria pública. Si bien Baldwin ofrece muchos consejos gratuitos durante su seminario web, ofrece su curso al final para que las personas que quieran pagar obtengan más información. Y, definitivamente, este argumento de venta, funciona.

5 – YouTube

YouTube es otra plataforma que ha hecho posible que las personas ganen dinero en línea. Hay un montón de canales de YouTube por ahí sobre cualquier tema, y la mayoría de las personas con muchos seguidores están ganando algo de dinero a cambio de sus videos y tiempo. El año pasado, Forbes presentó a algunos de los youtubers más grandes en la escena de YouTube. Según el estudio, las diez estrellas de YouTube con mayor recaudación recolectaron $ 127 millones desde junio de 2016 hasta junio de 2017. El más popular, es un jugador llamado DanTDM, que ganó $ 16.5 millones en un año como youtuber. ¿Ganarás tanto? Probablemente no. Sin embargo, puede comenzar a ganar dinero a través de YouTube utilizando la propia red de anuncios de la plataforma u obteniendo publicaciones patrocinadas. Si te gusta hacer videos, comenzar un canal de YouTube puede ser una forma divertida de ganar algo de dinero de manera adicional.

Como ves, hay una gran cantidad de formas de hacer dinero en línea y las que te expongo aquí son solo la punta del iceberg. Si tienes tiempo, pasión por casi cualquier cosa, y al menos alguna habilidad creativa, puedes crear un flujo de ingresos en línea, o varios, si tienes suficiente tiempo. Pero, no solo tomes mi palabra, si miras en línea, encontrarás miles de historias exitosas que pueden inspirarte de gente que se atrevió a enfocarse en trabajar en línea y lograr la estabilidad económica soñada, además del trabajo ideal.

Hosting GRATIS (de por vida) y sin anuncios

¡¿Pero cómo puede ser esto posible?! Sí. Es normal que te hagas esa pregunta. El hosting es una de las partes más caras de mantener al tener una página web. Encontrar uno en España de calidad es más complicado de lo que parece. Por eso el equipo técnico de WebUp Hosting y yo hemos estado preparando este […]

La entrada Hosting GRATIS (de por vida) y sin anuncios aparece primero en Blog de Informática ✏ Luisi.

Gaspar Fernández

Gaspar Fernández
Poesía Binaria

Crear redirecciones en Apache en función de una cookie

Servidor de pruebas

En estos días que asusta leer la palabra cookie en cualquier sitio. Si nos remontamos al siglo pasado, los navegadores solían preguntarnos cada vez que iban a a definir una cookie para ver si aceptábamos o no. Cosa que se terminó volviendo insostenible ya que los sitios web definían varias cookies y empotraban contenido de otros sitios que querían definir cookies y terminábamos con unas diez ventanas emergentes cada vez que entrábamos en una web. Así que, bloqueabas todas, pero las webs no funcionaban bien, y terminabas resignándote y aceptando todo.

Aunque hoy vamos a tratar un tema diferente, vamos a darles a las cookies una utilidad extra. Aunque bien podemos conseguir el mismo efecto con un lenguaje de aplicación (Java, PHP, Python, etc), vamos a hacer que sea el mismo servidor web, en este caso Apache el que aplique una redirección en función del valor que tenga una cookie que nos manda el usuario y, un paso más, que sea transparente para él.

¿Para qué queremos esto?

Podemos utilizar esta técnica para tests A/B, para probar dos versiones de la web. Aunque vamonos a un caso extremo, pero real. Imaginemos que tenemos una versión antigua de la web, programada con versiones antiguas de un lenguaje de programación y también una versión nueva programada con versiones nuevas, bibliotecas nuevas, etc, de modo que esas dos versiones no pueden estar en la misma máquina (física o virtual), de modo que tendríamos que acceder a un punto de entrada nuevo y diferente.

También podemos hacer un acceso a un entorno de pruebas de la web, de modo que los desarrolladores puedan entrar a él, o incluso el cliente final, mientras no impedimos el acceso a los usuarios a la plataforma, haciendo que, el código sea diferente, las bases de datos sean diferentes, incluso las posibilidades de cargarnos algo también. Muchos desarrollos pueden estar pensadas para realizar pruebas, pero pensemos en plataformas como WordPress, que por unas cosas o por otras, en las que no voy a entrar, si cambiamos el host, con muchos plugins o temas podemos tener problemas.

Y, ¿qué tal el dar una seguridad extra a nuestras aplicaciones? De forma que solo alguien que tenga la cookie pueda entrar en un área privada en donde podrá trastear con muchas cosas peligrosas de su servidor adicionalmente a tener usuario y contraseña.

En muchos casos seguro que nos puede ser útil hacer una redirección en función de la dirección IP desde la que viene la petición, aunque en otros casos, tanto por el número de equipos que tienen que tener acceso como por el hecho de tener IPs dinámicas, no es posible.

Vamos a ver Apache

Para lograr esto, entramos en el VirtualHost de Apache y escribimos lo siguiente:

1
2
3
4
5
6
        ProxyPreserveHost On
        RewriteEngine On

        RewriteCond %{HTTP_COOKIE}     nombre_de_cookie=([^;]+)
        RewriteCond %1                 ^valor_de_cookie$
        RewriteRule         ^/(.*) http://otro_host/$1 [P,L]

En este caso, con la directiva P para conectar vía proxy y L para que no se procesen más reglas de reescritura tras esta. Es necesario también tener los módulos rewrite y mod_proxy_http instalados por lo que antes de nada no está de más ejecutar:

sudo a2enmod rewrite
sudo a2enmod proxy_http
sudo service apache2 restart

Veamos un ejemplo completo, podemos ver este archivo de VirtualHost (lo he puesto todo en HTTP, en el mundo real deberíamos utilizar todos HTTPs):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<VirtualHost *:80>
        ServerName miweb.com
        ServerAlias www.miweb.com

        ServerAdmin security@miweb.com
        DocumentRoot /var/www/miweb.com/www
        ProxyPreserveHost On
        RewriteEngine On

        RewriteCond %{HTTP_COOKIE}     magicCookie=([^;]+)
        RewriteCond %1                 ^123456$
        RewriteRule         ^/(.*) http://10.0.1.198/$1 [P,L]

       <Directory /var/www/miweb.com/www/ >
                Options -Indexes +FollowSymLinks +MultiViews
                AllowOverride All
                Require all granted
        </Directory>

        ErrorLog ${APACHE_LOG_DIR}/error.log

        LogLevel warn

        CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

En este caso, cuando entra un visitante normal, entrará directamente a la web alojada en este servidor. Web que está en /var/www/miweb.com/www, pero si viene un visitante que tenga la cookie magicCookie establecida y cuyo valor sea 123456, internamente la petición se redirigirá al 10.0.1.198, que es una IP privada que está en la misma red que el servidor y a la que normalmente los usuarios no tendrían acceso. Esta nueva dirección puede pertenecer a una máquina de la misma red, una máquina conectada a Internet, máquinas virtuales o incluso contenedores docker.

Vamos a probarlo

Para realizar pruebas, podemos crear un pequeño programa que defina la cookie en cuestión, por ejemplo, en PHP podríamos hacer algo así:

1
2
3
<?php

setcookie('magicCookie', '123456');

Solo tenemos que llamar a este archivo php desde el navegador y cuando volvamos a nuestro dominio se realizará la redirección interna.

También podemos utilizar una extensión de Chrome o Chromium llamada Cookie Inspector. Solo tenemos que activar las herramientas para desarrolladores y nos dejará establecer y modificar cookies.

Foto principal: unsplash-logoLouis Reed

The post Crear redirecciones en Apache en función de una cookie appeared first on Poesía Binaria.

Domingo 02 de diciembre de 2018

OrbitalApps, ejecutar aplicaciones en Linux sin instalarlas

p.p1 {margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px 'Helvetica Neue'; color: #000000; -webkit-text-stroke: #000000} p.p2 {margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px 'Helvetica Neue'; color: #000000; -webkit-text-stroke: #000000; min-height: 12.0px} span.s1 {font-kerning: none} span.s2 {text-decoration: underline ; font-kerning: none} Son muchas las ocaciones en las que
Ubuntizando.com

Ubuntizando.com
Ubuntizando.com

BitPay, una cartera segura para gestionar tus Bitcoins

Cada día que pasa las criptomonedas tienen mayor presencia en nuestra sociedad. La más popular es sin duda Bitcoin usada a diario por millones de personas en todo el mundo para sus transacciones y pagos. Para administrar nuestras finanzas existe una aplicación de código abierto que nos permite tener todo centralizado y con la seguridad necesaria para poder estar tranquilos. BitPay Wallet nos permite entre otras cosas, almacenar nuestros Bitcoin, enviar fondos a cualquier lugar o comprar o vender moneda sin movernos de nuestro escritorio. Además nos permite hacer una conversión de Bitcoin a dólares con la tarjeta BitPay de Visa.

Entre sus características descatacan las siguientes:

– Soporte Bitcoin y Bitcoin Cash
– Creación y administración de múltiples billeteras de Bitcoin en la aplicación
– Integración para cargar, administrar y hacer cargos con la tarjeta Visa BitPay.
– Integración para la compra y venta de Bitcoin.
– Integración para la compra de tarjetas de regalo de Amazon.com.
– Seguridad intuitiva de múltiples firmas para carteras personales o compartidas.
– Seguridad basada en dispositivos: todas las claves privadas se almacenan localmente, no en la nube
– Generación de direcciones jerárquica determinista (HD) y copias de seguridad de cartera
– Soporte del protocolo de pago (BIP70-BIP73): solicitudes de pago fácilmente identificables y pagos de bitcoin seguros y verificables.
– Soporte para más de 150 opciones de precios de moneda y denominación de unidad en BTC o bits
– Email y notificaciones push para pagos y transferencias.
– Fácil flujo de propuestas de gastos para carteras compartidas y pagos grupales.
– Soporte para billeteras bitcoin testnet.
– Nombre de la cartera personalizable al que podemos añadir también colores de fondo.
– Múltiples idiomas compatibles, incluyendo francés, alemán, chino (simplificado) y español

Para instalarlo en Ubuntu 16.04 o superiores podemos hacer uso de los paquetes snap disponibles. Solo necesitamos escribir lo siguiente en nuestro terminal: sudo snap install bitpay

Más información: https://github.com/bitpay/copay

Sábado 01 de diciembre de 2018

Imágenes sin fondo

Una imagen vale más que mil palabras. Este proverbio no se equivoca. Puedes resumir todo un artículo en una imagen. Es algo que cualquiera necesita para conectar más con su lector o cliente. Hay que tener en cuenta dos cosas. El formato de la imagen. Todas las imágenes tienen un formato. Es la extensión de […]

La entrada Imágenes sin fondo aparece primero en Blog de Informática ✏ Luisi.

Miércoles 28 de noviembre de 2018

Ubuntizando.com

Ubuntizando.com
Ubuntizando.com

Día Internacional de la Seguridad Informática: la asignatura pendiente de los españoles

El día 30 de noviembre se celebra el Día Internacional de la Seguridad Informática; una cita que nació en 1998 de la mano de la Association for Computing Machinery con el objetivo de enseñar a los usuarios prácticas que garanticen su seguridad online. Sin embargo, y según las últimas cifras del análisis del comparador de seguros Acierto.com, esta continúa siendo la asignatura pendiente de los ciudadanos y empresas españoles.

Sí, porque 9 de cada 10 usuarios no saben cómo crear una contraseña segura, y no solo eso, sino que la mayoría tiene la misma para todas sus cuentas y no la actualiza nunca. Solo el 20% lo hace cada seis meses y hasta 2 de cada 5 ignoran de forma consciente las actualizaciones de su equipo, un punto clave para evitar virus y otras malas prácticas. No es de extrañar pues que más de la mitad de los españoles se haya visto afectado por un problema de este tipo. El gran protagonista es el malware, causante de 1 de cada 5 infecciones. El phishing -suplantaciones de identidad- ocupa el último puesto de la lista, con un 2% de los casos.

No obstante el asunto cambia si hablamos de las empresas, cuyos incidentes más graves suelen estar relacionados con el ransomware y el robo de información en general. En este primero, el ciberdelincuente “secuestra” los equipos de la compañía y exige un pago para devolverlos a su normalidad.

La ciberseguridad en la empresa

El caso más acuciante es el de aquellas empresas que gestionan grandes dosis de información -hospitales, operadores con ingentes cantidades de datos de sus clientes, etcétera-. Sin embargo, los ataques a empresas se han incrementado en hasta un 60% durante el último año, especialmente aquellos que tienen que ver con la filtración de datos y con las PYMES. Los delitos dirigidos a estas últimas han crecido hasta un 130% en el periodo referido.

Razón de más para contratar un seguro contra hackers o ciberseguro. Se trata de un tipo de póliza emergente que cubre al asegurado frente a ataques de este tipo con el objetivo de protegerles tanto online como offline, y suelen incluir coberturas por ciberataques pero también por robo y pérdida de archivos, incumplimiento de la LOPD, filtraciones de datos, y similares. Otras coberturas habituales -aunque depende de la entidad- son la de pérdida de beneficios, gastos de defensa por multas, asistencia informática y acceso a un equipo de gestión de crisis.

En Estados Unidos, de hecho, el 85% de las empresas medianas cuenta con un ciberseguro de esta clase. Aquellas que carecen de uno alegan que se trata de un producto demasiado caro. En nuestro país, las principales compañías que los contratan, de hecho, cuentan con una facturación superior a los 100 millones de euros anuales. No obstante y tras la implantación de la nueva LOPD, el número de adeptos a estos seguros está creciendo y son cada vez más las aseguradoras que ofrecen planes a medida de sus clientes.

Respecto a esos riesgos y más concretamente; los más frecuentes son el robo de identidad, los fraudes “amistosos” -el cliente se queda el producto a coste cero después de decirle al banco que la compra no se ha autorizado-, el reshipping -el delincuente compra con una tarjeta robada y usa una “mula”-, account takeover -se roban los datos del cliente -, etcétera. La triangulación nociva también es habitual. Aquí lo que ocurre es que el cliente adquiere el producto a través de una tienda pirata y esta lo re-encarga a una tienda legal pero paga con una tarjeta robada.

Dicho lo cual, un ciberseguro no debería sustituir en ningún caso, la implantación de medidas de seguridad y educación de los empleados en la materia que nos ocupa. Sí, porque no basta con mitigar y atajar los efectos de un ciberataque, sino que resulta imprescindible prevenirlos mediante el establecimiento de protocolos de seguridad que deberían incluir, más allá de la tecnología adecuada, planes formativos concretos. Y es que, finalmente, son esos usuarios que ignoran cómo crear una contraseña segura, los que forman parte del entramado empresarial.

Martes 27 de noviembre de 2018

Ramón Miranda

Ramón Miranda
Ramón Miranda

A new dawn, alegory . The Making off


Hi all, today I am going to show you my latest painting done in Krita 4.0 while i was collaborating to provide resources like brushes, brushtips, and patterns.
I think Krita deserves a good promotional images (at least finished images) and this was also a good testing canvas for that. My 2 cents ;)
This image reflects the emotional state that makes me feel this new release. So here you have...
"A new dawn, alegory" i hope you like it.



The process. (click on the images to see big-res images)

Step 01. First i start with the background, the mood itself of the image. I focus my attention on color and overall emotion. You can see there is no texture but i define where the figure must be placed.

Step 02. Then i continue working with brushes and wet paint.Here i am testing how to get the Oil or at least the painterly effect on some brushtrokes and i remove some coldness on the background. I start to add a bit of glow, this is an easy way to get more corlors to play with. Also you can see some primitive structures on the BG.

Step 03. I feel i need more color, why not! and i start to define better the path of viewers eye. I use very often the contrast to catch the attention. You can see a lot of brushtrokes , some are from 3.3 brushes and others are testing brushes for 4.0. Not too much detail here but i feel i like the red color and movement on clothes

Step 04. After some crazyness, lot of fun and exploration, is time to define a bit the image, the message and planes. You can see now arcs, rocks and a more defined pose for the woman. But at the moment i have only big spots of color.

Step 05. Time for block stage defining more and more.  

Step 06. I sketch a better figure in paper with pen, I love strong characters and strong women so i decide to give her a powerful pose, dominant but a bit humble holding her clothes with bare hands.


Step 07. I change the scale of figure to emphasize the environment and movement on the folds. Now you can see the folds and better idea o what the final image is going to be.

Step 08. Is time to detail a bit more all the scene. Structures on background, the ruins in midplane, the ground, adding a bit of texture and the main arc in the foreground with the woman in focal point. The folds are well stablished and is time to see if everything works. I am not sure with the arm pose so i delete it for the moment.

Step 09. I redefine a bit the mood, to be not so pictoric but more actual looking. I focus my attention on bg and add glow to the gate, wich is the symbol of "how krita is seeing a new light and how reborns from the ruins. (you know the history) I block the main shapes of arm and detail lot of parts.

Step 10. So... what i miss oh yes! more details ;) . I left this image posted because you can see how i use temporary swatches (in this case for the folds) you can see also this for the hair and how the strands starts to appear more realistic.

Step 11. And now a dramatic light change because the lighting was not coherent. Final details in hair, texture, folds, folliage, and fx. All done with krita 4 brushes.

I  hope you enjoy this new release as I do. Remember Krita it can be amazing but you are the artist.
If you have qustions or want to know more about my work, check my social media.



Lunes 26 de noviembre de 2018

El nuevo chip T2 de Apple no te dejará instalar Linux en Mac

p.p1 {margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px 'Helvetica Neue'; color: #000000; -webkit-text-stroke: #000000} p.p2 {margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px 'Helvetica Neue'; color: #000000; -webkit-text-stroke: #000000; min-height: 12.0px} p.p3 {margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px 'Helvetica Neue'; color: #000000; -webkit-text-stroke: #000000; min-height: 13.0px}
Gaspar Fernández

Gaspar Fernández
Poesía Binaria

Cómo hacer carpetas IMAP compartidas con Cyrus

Un servicio de correo electrónico suele ser algo personal. Sin embargo hay ocasiones en las que nos interesa que varios usuarios sean capaces de gestionar conjuntamente un buzón de correo. Podemos pensar el caso de una empresa en la que varios empleados reciben los mensajes de una dirección de correo determinada, por ejemplo info@miembpresa.com, y que de vez en cuando el jefe viene a echar un vistazo a dichos correos. O que, por ejemplo tenemos que enviar decenas o cientos de mensajes a otro usuario dentro del mismo servidor, podemos pensar en que un empleado deja la empresa y otro compañero va a encargarse de las conversaciones que tenga actualmente con los clientes.

Es cierto que, en la práctica, muchas veces se opta por compartir las contraseñas del correo y configurar todo el mundo la misma cuenta en su programa de correo, y ahí hacer los cambios que creamos oportunos. Aunque, si queremos tener en cuenta la seguridad, una cuenta como info@miempresa.com no puede tener su contraseña volando por la oficina. En primer lugar, no sabemos si un empleado filtrará la clave o utilizará la cuenta para fines diferentes a los que pensamos. Y, si confiamos en nuestros empleados, no podemos confiar en sus ordenadores que en cualquier momento puede tener algún problema, ser víctimas de malware y pueden jugarnos una mala pasada. Si hay una filtración, no podríamos determinar con exactitud su procedencia. Por otro lado, no podríamos limitar el acceso a dicha cuenta si nos interesa que un usuario solo pueda leer los mensajes o no queremos que pueda marcar mensajes como leídos (muy útil cuando el jefe quiere supervisar mensajes sin entorpecer).

En mis servidores utilizo el software Cyrus para gestionar el correo entrante en el servidor. Con él manejo las cuentas IMAP de los usuarios y todos ellos se conectan a él para la lectura de su correo. Es aquí donde podemos hacer uso de las capacidades de buzones de correo compartidos para satisfacer nuestras necesidades.

Notas iniciales

Estas configuraciones son válidas tanto para Cyrus 2.2 como Cyrus 2.4 (lo he probado en las dos versiones). Además, yo estoy utilizando la directiva

1
unixhierarchysep: yes

en el archivo /etc/imapd.conf que habilita puntos (.) en los nombres de usuario, con lo que la separación de niveles en lugar de un punto utilizará una /. De todas formas comentaré esto donde sea necesario.

Otra cosa más, en los nombres de usuario y los buzones, a mí me gusta poner siempre el dominio al que pertenecen, aunque es incómodo de escribir siempre, me sirve como una medida de seguridad ante confusiones y me permite crear buzones en dominios diferentes, que cuando te piden un correo en un dominio temporalmente, o el dominio tiene alternativas en .es, .eu o .com es un engorro ponerlo todo bien con su dominio.

Dando de alta el buzón compartido

Para ello, tenemos que identificarnos en la administración de cyrus. En mi caso, el usuario es administrador y el host es localhost porque estoy en el mismo servidor de correo:

cyradm -u administrador localhost

Luego, tendremos que crear el buzón compartido, en mi caso (info@miempresa.com):

cm shared/info@miempresa.com

¡Cuidado! Si no tienes unixhierarchysep: yes, tendrás que utilizar un punto en lugar de una barra (compruébalo antes de hacer cambios):
cm shared.info@miempresa.com

Dando permisos al buzón

Tras ello, tenemos que dar permisos, imaginemos que tenemos dos empleados, ana@miempresa.com y bruno@miempresa.com , y por si fuera poco, tenemos a jefe@miempresa.com que quiere poder ver mensajes, pero que no se note su presencia. Cyrus establece las siguientes flags de permisos (y cuando las usas un par de veces, te las puedes aprender en este orden lrswipcda):

  • l: (lookup) Nos permite obtener este buzón en un listado.
  • r: (read) Da permiso de lectura a los contenidos del buzón.
  • s: (seen) Mantiene el estado de seen/recent entre varias sesiones IMAP. Los mensajes vistos y recibidos recientemente.
  • w: (write) Escritura de flags en los mensajes del buzón.
  • i: (insert) Permite copiar o mover mensajes aquí.
  • p: (post) Nos deja entregar un mensaje en este buzón.
  • c: (create) Crear un nuevo sub-buzón.
  • d: (delete) Nos deja borrar mensajes o el propio buzón.
  • a: (acl) Nos deja administrar el buzón, o cambiar estos permisos del ACL.

Así que, para dar permiso a los usuarios seleccionados, y adicionalmente dejar que cualquiera pueda entregar correos aquí:

sam shared/info@miempresa.com info@miempresa.com anyone p
sam shared/info@miempresa.com ana@miempresa.com lrswipcda
sam shared/info@miempresa.com bruno@miempresa.com lrswipcda
sam shared/info@miempresa.com jefe@miempresa.com lr

Podríamos utilizar setaclmailbox en lugar de sam. En este punto, ya podríamos utilizar el buzón desde los usuarios ana, bruno y jefe.

Recibir correo en el buzón compartido desde Postfix

Si queremos habilitar la entrega de correo a través de una dirección de e-mail, primero debemos establecer un usuario que se utilizará para hacer la entrega. Para ello, editamos /etc/imapd.conf de la siguiente forma (el nombre de usuario puede ser el que queramos, siempre y cuando no esté en el sistema):

1
postuser: sharedmanager

Podemos colocar dicha línea en cualquier punto del archivo, yo prefiero poner al final todas las modificaciones a ese archivo.

Ahora, debemos crear un alias de correo a un nombre de usuario del sistema. Para ello editamos /etc/postfix/valias introduciendo lo siguiente:

1
info@miempresa.com infomiempresacom

Así le decimos que info@miempresa.com corresponde con el alias infomiempresacom, que introduciremos en /etc/aliases así:

1
infomiempresacom: sharedmanager+shared/info@miempresa.com

Tras esto, dependiendo de la configuración que tengamos en postfix (el contenido debe venir precedido por “hash:” virtual_alias_maps y alias_maps en /etc/postfix/main.cf ; Nota, mis archivos se llaman /etc/aliases y /etc/postfix/valias, los tuyos tal vez sean distintos), tendremos que ejecutar lo siguiente:

sudo postalias /etc/aliases
sudo postmap /etc/postfix/valias

Con esto crearemos los archivos /etc/aliases.db y /etc/postfix/valias.db. Ya deberíamos poder recibir los e-mails enviados a info@miempresa.com en el buzón compartido por Ana y Bruno. Cada usuario utilizará su contraseña para entrar en el buzón y el jefe podrá leer todos los mails sin marcarlos como leídos, ni quitar el flag de recién recibido.

Foto principal: unsplash-logoAnnie Spratt

The post Cómo hacer carpetas IMAP compartidas con Cyrus appeared first on Poesía Binaria.

Miércoles 21 de noviembre de 2018

BlogDRAKE: clipgrab, mixxx, telegram y selene en el Repositorio BlogDrake

Lunes 19 de noviembre de 2018

Esta de moda odiar a PHP

A ver PHP no es el mejor invento de la humanidad, pero tampoco lo ha inventado Microsoft.

Pero esta de moda odiar a PHP. Y que os voy a decir si yo le tengo un poco de cariño, es como ese viejo amigo que tiene sus cosas pero que os lleváis bien.

Os voy a contar mi historia con PHP y porque le tengo cariño y no sigo la moda de odiarlo.

Os cuento corría los 2000, creo que los 2002, en aquellos tiempos ya tenía alguna página (mi vieja linuxtopower) personal hecha con html, iframes y demás aparataje de esas épocas…hay gente que siente vergüenza por sus pintas 15 o 20 años atrás, pero al igual que contados casos de “fashion influencers” no se nos iba a ocurrir hacer una web limpia y clara rollo google en su inicio (porque cada vez es más Yahoo) y menos aún pensar en diseño para smart phones si aún ni existían.

Pero claro os recuerdo que aquellas páginas personales, eran estáticas cuál foto fija en el tiempo (con gigs molona), la única manera de actualizarlas era por medio de ftp, en el mejor de los casos si tenía el webhosting gratuito…éramos jóvenes sin dinero y en el peor un panel web ftp cutre muy cutre…pero que eso si, facilitaba mucho la vida cuando querías cambiar algo en un pc de un instituto, Universidad o cyber que tuviera los puertos capados…porque era un lujo tener Internet en casa.

Las webs eran tan estáticas que la única forma de interactuar con los visitantes era tener el típico contador de visitas gratuito (de otro lado y que solía venir con su correspondientes scripts para soltar banners y popups). Y el otro medio era el típico también libro de visitas que te lo ofrecía o el webhosting o enganchabas con un iframe de otro lado…con si correspondientes anuncios.

¡Y llegó PHP! Pero eran otros tiempos, ahora te dan contenedores y máquinas virtuales de un cupón en las cajas de los cereales. Recuerdo el primer webhosting que daba soporte para PHP gratuito era un tal H2O o algo así.

Y con el PHP llegó la locura de PHPnuke o PostNuke barrocos CMS (¿Seguirán los proyectos vivos?) que todo dios instalaba, instalando todo para al final aprender que la tecnología no soluciona los problemas, porque ponías un PHPnuke de la comunidad heavy de tu pueblo y pasado los meses eso seguía siendo un desierto. Si, ahí descubres lo difícil que es mantener una comunidad.

En aquellos tiempos, si querías hacer una web “dinámica” tenías pocas opciones:

  • Perl, la web de barrapunto está hecha con Perl. Yo he trabajado con Perl y es un horror de lenguaje, con sus sigil que te vuelves loco para desreferenciar una variable dentro de una función. Creo que en aquellos tiempos no había webhostings gratuitos que dieran soporte a Perl.
  • Java, lo tuve que aprender por obligación en la universidad, otro crimen. Primero que el aquellos tiempos todavía Java no era libre (y ahora no lo se) que para hacer algo sencillo tenías que montar un pifostio bien gordo con los servlets y compilarlo. Y otro que no me oli si existió algún webhosting gratuito.
  • PHP, que pienso yo, creo que la killer feature de el fue lo de poder limitar el tiempo de ejecución, la memoria RAM y alguna cosa más, y es lo que hizo que centenares de webhostings gratuitos florecieran porque no era peligroso ofrecer PHP.

Después curre muchos años con PHP, disfrute mucho, y el mundo siguió dando vueltas.

Y en esas estamos ahora está de moda odiar PHP porque:

  • Ha habido mucho manazas que ha hecho guarradas dignas de pasar por juez de la Audiencia Nazional. Si alguna vez joven informático/a te ofrecen un currito fácil y mal pagado de una web en PHP hecha por muchas manos…¡¡Huyeeee!!…porque te encontrarás un servidor con código vomitado de una persona que comió mierda de otro que a su vez era de otro y otro y otro así hasta la versión 2 PHP.
  • Tampoco es que PHP lo haya hecho bien, famoso es el artículo PHP: a fractal of bad design . En eso Python lo hace bastante mejor con su desarrollo basado en el debate sobre los documentos PEP. Y es que, que le vamos a decir al otro hermano deforme, nuestro querido javascript.
  • Porque un desarrollador puro y que irradia luz y modernidad ahora pica el código en javascript o python o Go.
  • Porque un desarrollador consciente de su fatal destino en el matadero y vendido el kilo de carne barato…reiros pero hay pobres desgraciaditos que quieren vivir así de sometidos, pues estos como empresa sería e inútil llena de burrocracia pican código en Java o Microsoft .Net.

Pero PHP tiene mucha vida, hay proyectos muy gordos (y libres…que es lo importante) picados en el: Mediawiki, WordPress, Prestashop…y dicen que Facebook estaba picado en PHP (con inventos como compilador y tal).

Sábado 03 de noviembre de 2018

Xavier Genestos

Xavier Genestos
SYSADMIT

Linux: grep mostrar lineas sin comentarios

Como ya sabemos, en sistemas GNU/Linux, la configuración de muchos servicios se guarda en ficheros de texto dentro del directorio: /etc Estos ficheros de texto, suelen estar acompañados de comentarios, explicando que hace cada parámetro y su opción por defecto. En ocasiones, nos puede interesar mostrar los parámetros de configuración del fichero sin mostrar los comentarios. También el

Domingo 28 de octubre de 2018

Xavier Genestos

Xavier Genestos
SYSADMIT

Linux: Verificar caducidad certificados

Verificar la caducidad de los certificados digitales es una de las tareas que los administradores de sistemas deben realizar de forma periódica. Para realizar la verificación desde Linux, podemos utilizar la herramienta openssl.  El comando sería el siguiente: <!-- HTML generated using hilite.me --> #Inicio SYSADMIT echo | openssl s_client -servername www.sysadmit.com -connect

Jueves 25 de octubre de 2018

Bruno Exposito

Bruno Exposito
Puro Linux

Buscar texto en ficheros recursivamente

El comando grep busca/muestra las ocurrencias encontradas en uno o varios ficheros de texto.

Usando el comando grep puedes realizar una búsqueda de forma recursiva en un directorio y mostrar que ficheros tiene la ocurrencia que buscas.

Esto es bastante útil si eres programador, tienes varios proyectos y tienes que buscar algo que no recuerdas donde está.

Por ejemplo, imagina que tienes un directorio con varios ficheros y subdirectorios con mas ficheros, y quieres buscar el texto “vertical-align” de forma recursiva e ignorando mayúsculas:

grep -Ri "vertical-align"

Buscar texto en ficheros recursivamente

 

Si lo único que quieres ver es el nombre del fichero puedes usar una tubería (pipe) y cortar usando como delimitador “:” y obtener tan solo la primera columna.

grep -Ri 'class' | cut -d ":" -f1

Buscar texto en ficheros recursivamente obteniendo solo el nombre del fichero

 

Si además quieres que no salgan repetidos aquellos ficheros que tienen mas de una ocurrencia puedes usar “uniq” para eliminar duplicados o “sort -u” para ordenar y además eliminar duplicados.

grep -Ri 'include' | cut -d ":" -f1 | sort -u
grep -Ri 'include' | cut -d ":" -f1 |uniq

Buscar texto recursivamente sin repetidos

Sábado 20 de octubre de 2018

Pedro L. Lucas

Pedro L. Lucas
Cartas de Linux

AppImage

AppImage es una forma de empaquetar aplicaciones de forma que se pueden ejecutar encualquier distribución de Linux que tenga pocos años de antigüedad. En el sitio web de AppImage se puede encontrar más información.

Sólo hay que descargar la aplicación, darle permisos de ejecución y ejecutarla. El detalle es que toda la aplicación va empaquetada en un solo archivo. No hay que descomprimir o instalar nada.

Como el movimiento se demuestra andando, vamos a ver un ejemplo. Se puede ir al siguiente enlace para instalar el editor Brackets:

https://github.com/brackets-userland/brackets-electron/releases

Y descargar el fichero con la extensión “AppImage”. Una vez descargado, se le dan permisos de ejecución (botón derecho, propiedades y hay que activar los permisos de ejecución en la pestaña “Permisos”). Ahora simplemente se ejecuta.

permisos

La cuando lo ejecutéis preguntará si lo deseáis integrar en el sistema (que aparezcan sus iconos en los lanzadores).

Pero no es oro todo lo que reluce. Algún fallo he encontrado. Por ejemplo, en el siguiente enlace está Spivak (es una aplicación de Karaoke). Si la descargamos y le damos permisos de ejecución, la aplicación a mi me falla con el siguiente error:

fallo

En la página https://appimage.github.io/apps/ hay aplicaciones preparadas para descargar y ejecutar.

¿Cuál es la diferencia con un paquete Snap? La diferencia está en la seguridad. El paquete Snap está construido de forma que la aplicación está dentro de un contenedor del cual no puede salir. La AppImage es un archivo que contienen a toda la aplicación y el usuario puede ejecutar sin necesidad de ser root para instalar dicha aplicación.

A mi me sigue gustando la ventaja de los sistemas de paquetes de las distribuciones que al instalar la aplicación, instala sus dependencias y estas pueden ser reutilizadas por varias aplicaciones, ahorrando espacio en disco. Pero no es malo tener otras alternativas.

Viernes 19 de octubre de 2018

BlogDRAKE: AVISO a usuarios de afirma

Lunes 08 de octubre de 2018

Ramón Miranda

Ramón Miranda
Ramón Miranda

Digital Atelier Streaming Youtube


Edit: the link of the streaming :https://www.youtube.com/watch?v=vYHZ5kPZ4DU

Hi all!,
Next friday i will be making my first streaming in Youtube (it will be in english.) There we will see what the Digital Atelier New bundle pack can give to your art in Krita.
So if you like brushes, patterns and these kind of things this is going to be really interesting for you. 
Share with your friends because this Friday 20:00 CEST you have a date with me and krita. 

At the end of the streaming i have surprises and goodies. Stay with me and enjoy it! We can have a lot of fun.


Martes 25 de septiembre de 2018

Ramón Miranda

Ramón Miranda
Ramón Miranda

Sunset garden


"El otoño está ya aquí. Con sonido de verano, pero ya la luz va siendo menos. El verano se aleja como una figura distante a la que no podemos tocar. ¿Volveremos a vernos dentro de un tiempo? ¿Hasta la próxima vez quizás? Los últimos rayos de sol adornan tu figura y yo te miro esperando volverte a ver aquí donde las rosas no son rojas sino amarillas, donde las sombras crean recovecos y se puede charlar mejor"

Así de romanticón despido el verano 2018 con una imagen estilo impresionista. El "jardín de la puesta de sol" con la figura de un típico pintor bohemio y a su vez protagonista de una obra impresionista como se presentaban aquellas obras.

Hecho con Krita en una tarde, había reservado esta imagen para un momento especial y este lo es. Veremos que nos depara el Otoño.

Lunes 24 de septiembre de 2018

Alojando una web en IPFS

En el primer post vimos como interactuar con IPFS de forma sencilla. Ahora vamos a dar un paso más y vamos a alojar una web en IPFS, aprovechando todas las ventajas de escalabilidad y disponibilidad que nos ofrece la red. Para ello usaremos además otro protocolo llamado IPNS, que sería similar a DNS pero en la red IPFS.

Las páginas ideales para IPFS actualmente son las que siguen el JAMstack, es decir, uso extensivo de JavaScript en el cliente, que podrá conectarse a APIs para obtener/actualizar información. Las APIs no tienen por qué ser centralizadas, ya que JavaScript con WebRTC puede buscar peers, posibilitando APIs descentralizadas.

Generando el contenido estático

El primer paso será generar el contenido estático de la web. Para ello existen herramientas muy conocidas como Jekyll, Hugo o Pelican.

No nos vamos a alargar más en esto, ya que cada herramienta tiene sus pasos. El resultado final será una carpeta con ficheros HTML, CSS, fuentes, imágenes y JavaScript.

Subir a IPFS

Teniendo el nodo IPFS en funcionamiento, subimos la carpeta del modo habitual, en mi caso, voy a subir la página que está en http://adrianistan.eu .

ipfs add -r adrianistan.eu/

Y anotamos el último hash.

Comprobamos que la web es accesible, tanto desde la gateway del nodo, como una externa:

Tanto en el nodo local como en uno externo, la web carga perfectamente con el hash

IPFS tiene direccionamiento por contenido

En el post anterior mencionamos que IPFS direcciona por contenido gracias a los hashes. Esto tiene unas consecuencias interesantes. Por ejemplo, si se añade un archivo duplicado a IPFS, este tiene exactamente la misma dirección, ya que comparten hash. Por otro lado, los documentos no se pueden actualizar, porque entonces su hash cambia. Sin embargo en una web queremos cambiar contenido, ahí entra en acción IPNS.

IPNS, gestión de nombres para IPFS

IPNS es un protocolo parecido en intenciones a DNS que redirige un ID única al hash correspondiente en ese momento. Registramos el hash de la web actual en IPNS.

ipfs name publish HASH

Ahora sí, el hash IPNS puede publicarse por la red, ya que siempre apuntará a la última versión de la web.

Para acceder a recursos a través de IPNS tenemos que cambiar de protocolo, en vez de /ipfs/HASH, tenemos que poner /ipns/HASH. Vale tanto para comandos como para las gateways HTTP.

https://cloudflare-ipfs.com/ipns/QmYDVeoadAzk9ZW6zwJK3E3KHrA1LWLveEdqUv4XAcCjKa/

En cualquier momento podemos comprobar a que dirección IPFS apunta el hash IPNS:

ipfs name resolve QmYDVeoadAzk9ZW6zwJK3E3KHrA1LWLveEdqUv4XAcCjKa

Para actualizar el contenido simplemente se vuelve a repetir el paso de ipfs name publish. IPFS automáticamente modificará la redirección de IPNS.

Los contenidos antiguos no desaparecen, pero pueden no ser accesibles ya que ningún nodo tenga copia de ellos.

DNSLink

Aún así, ir dándole a la gente un hash IPNS es demasiado complicado. Afortunadamente, podemos usar el DNS tradicional para indicar una ruta IPNS y así, como veremos, facilitar bastante las cosas.

Para ello añadimos un campo TXT en los DNS de nuestro dominio. El contenido es el siguiente:

dnslink=/ipns/HASH

Con esto podremos usar /ipns/dominio.com en la red IPFS. Pero todavía hace falta un cliente IPFS.

Afortunadamente, podemos redirigir mediante CNAME a una gateway HTTP de confianza y ¡la web funcionará correctamente! Para ello hay que crear un campo TXT en el subdominio _dnslink con el mismo contenido que el anterior.

Todas las gateways de IPFS soportan DNSLink para que la transición a IPFS sea lo más transparente posible.

Así, finalmente la página carga con un dominio normal y corriente en un navegador normal y corriente.

Fijaos en la URL

De hecho, vosotros mismos podéis acceder:

http://adrianistan.yayeyo.ga

IPFS Companion

Si usamos mucho IPFS, puede que nos interese una extensión que maneje el protocolo ipfs:// . Tanto en Firefox como en Chrome existe IPFS Companion, una extensión que nos permite acceder a contenido IPFS de forma sencilla.

Servicio systemd

Por último, quiero dejar el servicio de systemd necesario para tener el nodo IPFS funcionando constantemente en nuestro ordenador. En este caso, IPFS lo instalé vía Snap.

[Unit]
Description=IPFS daemon

[Service]
ExecStart=/snap/bin/ipfs daemon
Restart=on-failure

[Install]
WantedBy=default.target

sudo cp ipfs.service /etc/systemd/user/

sudo systemctl --user start ipfs.service
sudo systemctl --user enable ipfs.service

Y con esto ya tendríamos suficiente como para jugar con IPFS un buen rato.

La entrada Alojando una web en IPFS se publicó primero en Adrianistán.

Domingo 23 de septiembre de 2018

Liher Sanchez

Liher Sanchez
El blog de Liher

Que es el dropshipping

Internet es genial y nos ofrece a todo el mundo un sinfín de posibilidades en muchos ámbitos. Internet contiene información sobre cualquier cosa, es una fuente de conocimiento tremendamente excepcional. Podemos encontrar páginas web sobre cualquier tema que podamos imaginar. Si te gusta la informática y tienes ganas podrás aprender a programar, hacer webs, crear y manejar bases de datos, gestionar sistemas operativos y un largo etcétera de posibilidades. También, sea cual sea vuestra profesión, podéis encontrar información y tutoriales tanto escritos como en vídeo sobre como hacer esto o lo otro y así poder conocer mejor vuestro oficio. Otra de las grandes cosas que tiene Internet es el mundo de los negocios, que es en lo que me quiero centrar en este artículo, mas concretamente en el dropshipping. Para aquellos que no sepáis lo que es os lo voy a explicar para que sepáis un poco de que va el tema y las posibilidades que ofrece.

Este blog no fue creado con la idea de ganar dinero, aunque reconozco que en algunas ocasiones se me ha presentado la oportunidad de ganar algunos euros y, no en todas, he aceptado. Aun a pesar de ser un “hobby” y de hacerlo muy a gusto tengo que reconocer que cuesta dinero mantenerlo online, tanto el VPS como los dominios y una ayuda nunca viene mal. En otras ocasiones os he hablado de como ganar algo de dinero en Internet y esta es una de ellas, el dropshipping. Es un modo de montar un negocio que tiene muchas y muy buenas ventajas y muy poco riesgo, lo cual os detallaré a continuación.

Creo que la mejor forma de explicar que es el dropshipping es con un ejemplo. Imaginad que queréis montar una tienda en Internet. Con el sistema tradicional habría que montar una web con una tienda online. Ademas habría que disponer de un almacén para los productos que queréis vender. También hay que preocuparse de ir renovando el stock de productos. Unos de los grandes riesgos de este sistema tradicional es el hecho de tener un producto que no lográis vender, lo cual supondría una pérdida económica. Hay mas factores a tener en cuenta con el sistema tradicional.

Ahora suponed que los productos que vendéis no los tenéis físicamente en un almacén. Para empezar supondría un ahorro el no tener que pagar un local para usarlo como almacén, es obvio, ¿no? Imaginad que cuando un cliente os compra un producto en vuestra tienda online, automáticamente, ese producto se pide a vuestro proveedor y es el mismo proveedor quien se encarga de mandar el producto al cliente que lo ha comprado en vuestra tienda. El precio de venta en vuestra tienda lo ponéis vosotros y la diferencia entre ese precio y el de vuestro proveedor es vuestra ganancia. En esto consiste a grandes rasgos el dropshipping, una nueva manera de tener una tienda online. Esto conlleva muchas ventajas, algunas ya las he comentado como el hecho de no necesitar un almacén y no tener que preocuparos por gestionar el envío de los productos.

Ademas de las ventajas ya mencionadas podemos tener muchas mas. Por poner un ejemplo, imaginaos hubiese una plataforma que nos ofreciese plantillas ya hechas para la tienda online, eso nos facilitaría el trabajo. Estaría muy bien que nos permitiese agregar productos de una manera sencilla e intuitiva, incluso que nos ofreciese productos según nuestras preferencias. Esto y muchas ventajas mas nos ofrece Oberlo, una página web en la cual tenéis todas las facilidades del mundo para convertiros en expertos del dropshipping y ganar un buen dinero. Incluso tienen un blog con artículos que os ayudaran mucho.

 

 

Oberlo

 

Así que ya sabéis, si queréis ganar algo de dinero en Internet tenéis muchas posibilidades, lo mas importante es tener realmente ganas y no pensar que todo os va a llover del cielo. Es algo que requiere mucho esfuerzo y dedicación y no podéis pensar que con abrir una tienda online os van a entrar los clientes en manada, cuesta llegar a tener un negocio prospero, precisamente por eso os comentaba lo de la web de Oberlo, con ellos es todo mucho mas fácil y podéis centraros mejor en promocionar los productos que vendáis, algo para lo que dispondréis de mas tiempo ya que no tendréis que preocuparos de cosas como el almacen o los envíos, entre otras cosas.

Un saludo a todos.

Xavier Genestos

Xavier Genestos
SYSADMIT

Linux: Como saber el gateway (puerta de enlace)

En este post veremos como saber el gateway (puerta de enlace) de un sistema Linux. Los administradores de sistemas Windows, ya saben que ejecutando el comando ipconfig, este nos mostrará la dirección ip, mascara de subred y gateway. En sistemas Linux, ejecutando el comando equivalente: ifconfig, no nos mostrará el gateway. Veamos a continuación las distintas formas de saber el gateway (

Miércoles 19 de septiembre de 2018

Bruno Exposito

Bruno Exposito
Puro Linux

ReactOS – Windows de código abierto

ReactOS es un sistema operativo de código abierto escrito en C/C++ y disponible para las arquitecturas x86, x86-64 y ARM.

El proyecto nació en el año 1995 como una clon de Windows 95 y está basado en el diseño de la arquitectura de Windows NT. Es compatible (lo intenta al menos) con las aplicaciones y controladores de Windows NT 5.X (Windows XP y posteriores).

Pese a estar construido basándose en Windows, ReactOS incluye ciertas mejoras que no están incluidas en el susodicho, como un gestor de paquetes, similar al que usa GNU/Linux.

reactos_desktop

 

Auditoría

Dado que Windows es un sistema operativo de código cerrado, los desarrolladores de ReactOS emplean ingeniería inversa para comprender el funcionamiento de Window.

En enero del 2016, uno de los desarrolladores encontró código desensamblado de Windows XP, algo completamente ilegal y que afectó a la credibilidad del proyecto, sin embargo en la actualidad ese código ha sido reescrito en C y el proyecto está auditado para que no existan dudas acerca del origen del código.

Este problema ocasionó la eliminación de los enlaces de descarga, una pérdida de credibilidad y la prohibición de colaborar con WINE.

 

Demostraciones a políticos rusos

ReactOS ha despertado cierto interés entre algunos políticos rusos, en 2007 Víktor Alksnis se reunió con Aleksey Bragin “coordinador” del proyecto, para realizar una demostración y en 2012 se realizó otra demostración a Vladimir Putin.

Estabilidad

En estos momentos, y pese a llevar tantos años en desarrollo, sigue en versión alpha, por lo que no se recomienda instalarlo en máquinas de producción.

 

Look and feel

En lo relativo a su aspecto visual, es muy similar a Windows 95/98/2000, con ligeras diferencias respecto al original.

El tema ha quedado tremendamente obsoleto y el menú de inicio es poco usable.

Personalmente considero que deberían modificar la interfaz para asemejarse a Windows 7 Basic (porque tiene pocas animaciones y transparencias) o Windows 10, porque es bastante “flat”.

 

Descarga

Puedes descargar la ISO de instalación como el live CD desde su página oficial: https://www.reactos.org/es/download

Viernes 17 de agosto de 2018

Bruno Exposito

Bruno Exposito
Puro Linux

Cambiar grupo de un fichero o directorio – Comando CHGRP

El comando chgrp sirve para modificar el grupo (group) de un fichero o directorio. Está instalado en todas las distribuciones GNU/Linux, dentro del paquete coreutils.

Puedes consultar los grupos usando el comando:

cat /etc/group | cut -d ‘:’ -f1/

Sintaxis de chgrp

sudo chgrp {{opciones}} {{grupo}} {{fichero_o_carpeta}}

La sintaxis de chgrp es sencilla, tras el comando chgrp se escriben los modificaciones (opcionales), a continuación el nombre del grupo y para finalizar el nombre del fichero o carpeta.

Opciones de chgrp

-c, –changes Igual que la opción “verbose” pero solo si hay cambios
-f, –silent, –quiet Omite la mayoría de los mensajes de error
-v, –verbose Muestra el resultado de cada fichero procesado
–dereference Afecta a la referencia del enlace simbólico, en lugar del enlace simbólico en si (opción por defecto).
-h, –no-dereference Afecta al enlace simbólico, en lugar de la referencia a la que apunta.
–no-preserve-root No trata “/” de manera espacil (por defecto)
–preserve-root Falla al intentar operar recursivamente sobre “/”
–reference=RFILE use RFILE’s group rather than specifying a GROUP value
-R, –recursive Se ejecuta sobre ficheros y directorios recursivamente
-H Si es un enlace simbólico a un directorio, entra en el
-L Atraviesa todos los enlaces simbólicos a directorios que encuentre
-P No atravesar enlaces simbólicos (por defecto)
–help Muestra la ayuda
–version Muestra la versión y licencia

Cambiar el grupo de un fichero

sudo chgrp {{grupo}} {{fichero}}

sudo chgrp comerciales ventas.odt

*El fichero ventas pertenece ahora el grupo comerciales

Cambiar el grupo recursivamente

sudo chgrp -R {{grupo}} {{carpeta}}

sudo chgrp -R soporte /mnt/shared/software

*Todo el contenido de la carpeta /mnt/shared/software pertece ahora al grupo soporte

Cambiar el grupo a un fichero

sudo chgrp sistemas foto.jpg

*Estando dentro de la carpeta donde se encuentra el fichero “foto.jpg“, cambia el grupo a sistemas.

sudo chgrp comerciales /home/paco/documento.odt

*Independientemente del directorio actual, cambia el dueño de “documento.odt” a comerciales.

sudo chgrp admins “/home/juan/Música/Barón Rojo – Tierra de nadie.ogg”

*Independientemente del directorio actual, cambia el dueño del audio (que contiene espacios en el nombre) a admins.

 

sudo chgrp consultores /home/juan/Documentos -Rv

 *Cambia el grupo de la carpeta y todo su contenido de forma recursiva (-R), mostrando los detalles de cada fichero procesado (-v)

sudo chgrp -RHc grupo carpeta/

 *Cambia el grupo recursivamente atravesando enlaces a carpetas y mostrando los cambios.

sudo find . -name “*.txt” -exec sh -c ‘chgrp -v aula3 “$0″‘ {} \;

*Busca todos los ficheros con extensión txt y les cambia el grupo a “aula3” mostrando los detalles de cada operación realizada

Jueves 09 de agosto de 2018

Gorka Urrutia

Gorka Urrutia
Nideaderedes

Actualización de seguridad Laravel 5.6.30

Ayer se publicó una actualización de seguridad para Laravel. Es una vulnerabilidad relacionada con la APP_KEY. Esta variable es un valor que se usa para encriptar algunos valores como las sesiones de usuarios.

¿Es grave? Sí, pero solo debes preocuparte si alguien se ha hecho con esta APP_KEY. Eso solo puede hacerlo alguien con acceso al servidor (por ejemplo algún antiguo proveedor o un empleado resentido).

Si crees que no es el caso no deberías preocuparte aunque siempre es preferible actualizar.

La APP_KEY se usa para cifrar las sesiones de usuario, no para las contraseñas. Así que si la cambias las contraseñas no se verán afectadas pero sí las sesiones de usuario (cosa que, bueno, no es tan grave).

Laravel - el framework de los artesanos

Laravel – el framework de los artesanos

Miércoles 18 de julio de 2018

Gorka Urrutia

Gorka Urrutia
Nideaderedes

Cómo indicarle al git la llave ssh que debe usar

Si tienes tantas llaves ssh como yo seguro que tarde o temprano tendrás problemas porque en algún sitio se quejará de “too many retries”. Si eso te pasa en git hay una forma de indicar cuál es la llave que quieres usar al conectarte vía ssh.

En mi caso yo tenía problemas al conectarme a BitBucket. Así que para solucionarlo hay que editar el fichero de configuración SSH de tu ordenador. En mi caso:

/home/gorka/.ssh/config

y añadir:

host bitbucket.org
    HostName bitbucket.org
    IdentityFile ~/.ssh/llave_publica_para_conectarme_a_bitbucket.pub
    User gorka

En tu caso deberás cambiar “gorka” por tu usuario en BitBucket y ~/.ssh/llave_publica_para_conectarme_a_bitbucket.pub por la ruta de tu llave pública (la que uses para conectarte a BitBucket).

Si el problema lo tuvieses con GitHub harías:

host github.com
    HostName github.com
    IdentityFile ~/.ssh/llave_publica_para_conectarme_a_github.pub
    User git

Domingo 15 de julio de 2018

Gorka Urrutia

Gorka Urrutia
Nideaderedes

Mi Libro de programación en C ahora es gratuito

A partir de hoy, 16 de Julio de 2018, mi libro de programación en C para principiantes estará disponible de manera gratuita. Hace ya tiempo que lo escribí y considero que ya he ganado lo suficiente con él. Así que he decidido regalarlo.

Por ahora estará disponible gratuitamente en Amazon. Como Amazon no me deja ponerlo a precio cero hasta septiembre lo voy a deshabilitar y crearé uno nuevo esta vez gratuito y sin drm (esa cosa que no te deja copiarlo ni nada).

Ahora voy a maquetarlo de nuevo en formato PDF y, posiblemente en epub o algo así. Cuando termine lo pondré disponible gratuitamente para descarga en el Rincón del C.

Si quieres me puedes echar una mano maquetando el libro. Voy a ir poniendo el código fuente del libro disponible en GitHub para que todo el mundo pueda colaborar.

Si lo ves a la venta en algún sitio avísame, que se trata de un timo.

Jueves 05 de julio de 2018

Mayúsculas iniciales en WordPress

Ciertamente si tenemos un sitio propio, con dominio propio y acceso como administrador a sus «entrañas» podremos crear nuestros propios estilos CSS y con ellos construir cualquier formato que queramos en nuestras páginas. Pero eso solo si «tenemos el poder» (y queremos utilizarlo). Ahora bien, esto no quiere decir que no podamos hacer «cosas extrañas» … Sigue leyendo Mayúsculas iniciales en WordPress

Jueves 28 de junio de 2018

“El paciente” a descompilar es un exe de msdos en formato MZ

Posts in this series
  1. Compilar C en m$dos en nuestros tiempos
  2. "El paciente" a descompilar es un exe de msdos en formato MZ

Aunque voy despacio, voy a ir poniendo mis avances, que supongo que es poquito, pero bueno por seguir la Método de depuración del patito de goma o el refrán oriental que dice “El que enseña aprende dos veces.” .

La verdad es que en los primeros palos de ciego y análisis creí que “el paciente” era un ejecutable de tipo COM o algo así, pero ahora volviendo a analizarlo he encontrado el famoso:

MZ

0x4D 0x5A

Eso ayuda un montón porque si queridos mios, los ejecutables también tienen formato y no es estándar, hay muchos muchos estándares (en m$-dos hablamos…en otros sistemas operativos…pues habrá los suyos).

Como dice en el foro de ubuntu: Learning how to disassemble dos binaries

If actual DOS executables disassembly is the thing you are searching for, then search for disassemblers, that can handle the MZ magic [$4D 5A] (the default DOS 16bit header) or elf, coff, xcoff, ecoff, mach and such …

Bueno pues ahora entender la estructura de fichero de el formato DOS MZ .

Si alguno tiene alguna pista, estaré agradecido.

KDE-Plasma: Agregar una plantilla al menú «Crear nuevo»

Cuando hacemos clic derecho en Dolphin, tenemos la opción «Crear nuevo» lo que nos permite crear una carpeta, un archivo de texto, enlace a aplicación, etcétera. Hoy veremos cómo agregar una nueva entrada a ese menú. Usaré como ejemplo el crear un documento Writer con una plantilla definida por nosotros. Primero, claramente, tenemos que crear … Sigue leyendo KDE-Plasma: Agregar una plantilla al menú «Crear nuevo»

Videojuegos libres que se han ido de github después de ser fagocitada por Microsoft

Después de la mala noticia (gracias capitalismo) de el canibalismo salvaje de Micro$oft comiendose a github. Ya hablamos por los tomates de eso en Github ha muerto…bueno lo han asesinado.

Muchos proyectos de software libre han migrado a otras forjas/repositorios de software, y de entre estos tenemos los videojuegos libres…junto con respirar, una de las cosas que mas me ocupa la cabeza…me gustaría algún día intentar conseguir vivir de hacer videojuegos libres…pero bueno…

Bueno pues conocidos por mi, he encontrado los siguientes videojuego libres que se han ido de github:

Solarus, un clon libre del Zelda de SNES/GBA/GB con editor de mapas y todo en plan RPGmaker. Solarus has moved to Gitlab

Y OpenMW que es un clon libre del videojuego de rol en 3D Morrowin. OpenMW code, bug tracker, and wiki are now on GitLab!

Y seguro que hay mas. Amable lector…¿Conoces algún otro videojuego libre que se haya pirado de github?

Jueves 21 de junio de 2018

DAE-18: El texto ya está en su lugar (mayormente)

Bueno, parece que después de todo es posible que la edición 2018 de «domando al escritor» no se convierta en la edición 2019… El texto está, mayormente, «en su lugar». De hecho el índice ya ha llegado a las siete páginas. No hay aún diagramas ni capturas de pantalla, solo texto y dos tablas. Hay … Sigue leyendo DAE-18: El texto ya está en su lugar (mayormente)

Martes 05 de junio de 2018

Emiliano A. González Salgado

Emiliano A. González Salgado
El blog de Emi

Migración a LibreOffice 6.1 Base

Hace unos días se ha publicado la beta1 de LibreOffice 6.1.
He descargado el paquete y lo he instalado en Fedora 28.
Al ser una versión de desarrollo, al ejecutarse, crea sus propios directorios de usuario, distintos de los de la versión estable.

El motor de base de datos que viene implementado por defecto es Firebird, aunque HSQLDB sigue funcionando normalmente.

Al abrir una base de datos realizada con HSQLDB, que puede ser cualquier base realizada con una versión menor (salvo que se hubiera activado Firebird anteriormente) siempre solicita convertirla a Firebird.

Esto se puede obviar presionando el botón “latest” en vez de “yes”.

Para convertirla a la versión de Firebird hay que tener presente varias cuestiones, pues el sistema de conversión aún tiene fallos:

Realizar un copia de seguridad de la base de datos que queremos abrir y trabajar con la copia.

Comprobar si tenemos alguna vista de tabla. Es decir en el menú “tablas” están las tablas propiamente dichas y la vistas, que no son mas que una consulta, que puede ser de tablas combinadas.

En caso de que existan vistas de tablas hay que abrirlas y comprobar que no haya campos calculados o campos concatenados que no estén realizados de manera que puedan ser correctamente interpretados por la nueva versión, pues en caso contrario la vista se elimina en la conversión.

Si hay campos calculados o campos concatenados en la vista lo mejor es crear una nueva consulta en modo SQL, copiar la instrucción SQL que nos muestra la vista y guardar la nueva consulta que hemos realizado con esta instrucción SQL copiada.

El error mostrado venía dado por un campo concatenado, que no se ajustaba a Firebird. En la consulta cambié la instrucción y conseguí que funcionara.
Usaba: “Prenom” + SPACE( 1 ) + “Nom”
Rectifiqué: “Prenom” || ‘ ‘ || .”Nom”

A continuación tendríamos que comprobar todos las consulta que tenemos. En la que figure la vista de tabla habría que cambiar todos los datos por los de la consulta.

Un método puede ser con un editor de texto y la edición SQL de consultas.

En mi caso la vista de tabla de llamaba vMovimientos y la consuta creada con la misma instrucción c_vMovimientos. Copiaba el resultado de la salida de la consulta en un editor de texto (kate) y con buscar y remplazar ya tenía la nueva sintaxis. Volvía a copiar y pegar. Guardaba la consulta y la base. Resuelto parcialmente.


La consultas con parámetros, si en criterio se hace referencia a un campo de una tabla, poniendo <= [tabla].[campo] muestra error.

Los campos numéricos y con decimales dan problemas.
Tengo en una tabla “Movimientos” que tiene, entre otros, tres campos “DECIMAL” con dos decimales.
Al importar los campos INTEGER, DATE, VARCHAR Y BOOLEAN no han dado problemas, pero los DECIMAL sí.

Había cantidades que no daban problemas, pero en otras el resultado era desastroso.
Números positivos los convertía en negativos que no tenía relación alguna, las cantidades con decimales terminados en 00 las dividía por 100. 9000,00 pasaba a ser 90,00, un 9xx,xx lo pasaba a -16xx,xx.

Para solucionarlo copio desde la base guardada y, abierta con una versión antigua, la tabla en Calc:
Crear tres nuevas columnas,
Multiplicar el resultado por 100.
Cambiar a formato numérico y sin decimales.
Transponer a sus antiguas columnas.

Con esto ya puedo realizar la exportación de datos a la tabla Movimientos de la nueva base convertida.

Parece un proceso muy engorroso, pero si se hace con tranquilidad, en poco tiempo se ha finalizado.

Por ahora, en la comprobación que he realizado, tanto los datos de fecha como los numéricos están correctos, sin que haya diferencia entre una y otra tabla.

NOTA.- En una comprobración posterior, y en un campo calculado, el resultado del mismo es el que he importado de la hoja de cálculo, no de lo que figura en la tabla.

Es decir, está multiplicado por 100 con respecto a lo que figura en la tabla.

El bug ha sido reportado por Xisco Fauli @x1sc0    https://bugs.documentfoundation.org/show_bug.cgi?id=118043 .

 

Jueves 31 de mayo de 2018

José María Morales Vázquez

José María Morales Vázquez
tecnología – Un lugar en el mundo…

WordPress. El misterioso caso del cuelgue diario a las 9 de la mañana

icono de wordpress Los blogs están muertos. Por fin. Bueno, no todos. Hay alguno que resiste hoy y siempre a la invasión de las redes sociales. A ratos me gusta pensar que este es uno de ellos… pero si soy sincero conmigo mismo ciertamente está un poco desnutrido. No le presto mucha antención, no… Hace meses, por ejemplo, que se cuelga durante aproximadamente media hora todas las mañanas y ni siquiera me he preocupado de ver que le pasa. Bueno, ya no. Ya está arreglado. Los malos hados subestiman el poder de esas tareas tediosas y desagradables que hacen que hasta te den ganas de ponerte a planchar o a limpiar los baños. Bueno, yo me he conformado con arreglar por fin este problemilla. Los baños otro día. 🙂

¿Síntomas mi querido Watson? Apenas nada: la indisponibilidad se producía por un elevado consumo de CPU y mirando con htop resulta que la responsable es mariadb (aunque en el pantallazo aparezca mysql ya sabéis que son compatibles a nivel binario).

htop - mysql se come todo el tiempo de proceso de ambos cores

Alguna pista mas: conéctandome a mariadb observo que lo que se están ejecutando son consultas aparentemente bastante simples sobre la tabla wp_options:

MariaDB [unlugar]> show processlist;
+-------+---------+-----------+---------+---------+------+--------------+------------------------------------------------------------------------------------------------------+----------+
| Id    | User    | Host      | db      | Command | Time | State        | Info                                                                                                 | Progress |
+-------+---------+-----------+---------+---------+------+--------------+------------------------------------------------------------------------------------------------------+----------+
| 29462 | unlugar | localhost | unlugar | Query   | 1043 | Sending data | DELETE a, b FROM wp_options a, wp_options b
			WHERE a.option_name LIKE '\\_transient\\_%'
			AND a. |    0.000 |
| 29552 | root    | localhost | unlugar | Query   |    0 | init         | show processlist                                                                                     |    0.000 |
| 29559 | unlugar | localhost | unlugar | Query   |   40 | update       | INSERT INTO `wp_options` (`option_name`, `option_value`, `autoload`) VALUES ('jetpack_nonce_15275779 |    0.000 |
| 29560 | unlugar | localhost | unlugar | Query   |   22 | updating     | UPDATE `wp_options` SET `option_value` = '1527578481.1030609607696533203125' WHERE `option_name` = ' |    0.000 |
| 29561 | unlugar | localhost | unlugar | Query   |    7 | updating     | UPDATE `wp_options` SET `option_value` = '1527578505', `autoload` = 'yes' WHERE `option_name` = 'jet |    0.000 |
| 29562 | unlugar | localhost | unlugar | Query   |    0 | updating     | UPDATE `wp_options` SET `option_value` = '1527578503.1177010536193847656250' WHERE `option_name` = ' |    0.000 |
+-------+---------+-----------+---------+---------+------+--------------+------------------------------------------------------------------------------------------------------+----------+

Así que le echamos un vistazo a esa tabla y resulta que tiene la friolera de más de 40.000 registros y consume cerca de 38 Megas de espacio ¿Qué tiene dentro?¿Los casos de corrupción del PP? Porque la estructura de la tabla también es bastante simplona:

MariaDB [unlugar]> describe wp_options;
+--------------+---------------------+------+-----+---------+----------------+
| Field        | Type                | Null | Key | Default | Extra          |
+--------------+---------------------+------+-----+---------+----------------+
| option_id    | bigint(20) unsigned | NO   | PRI | NULL    | auto_increment |
| option_name  | varchar(191)        | NO   |     | NULL    |                |
| option_value | longtext            | NO   |     | NULL    |                |
| autoload     | varchar(20)         | NO   |     | yes     |                |
+--------------+---------------------+------+-----+---------+----------------+
4 rows in set (0.01 sec)

Un último dato: la exactitud en la periodicidad me escamaba también. Incluso uno de esos días de puentes con un tiempo maravilloso donde no queda ni el friki más irredento paseándose por algo donde no despachan cerveza el blog también se caía. Y a la misma hora, así que le eché un vistazo al cron del sistema y no había nada que se lanzara a esa hora. ¿Y? De repente recordé que wordpress viene con su propio planificador de tareas y que estas se pueden inspeccionar fácilmente. Por ejemplo a través del plugin WP Cron Cleaner. Bingo. Ahí la tengo: Justo a las 9.04 y todos los días hay una tarea que se llama delete_expired_transients. Y eso de “transient” ya era algo que habíamos visto por ahí arriba en la consulta que se estaba realizando en mariadb.

El proceso que se lanza diariamente alrededor de las 9 realiza una limpieza de transients

Tocaba googlear a ver que es eso de los transients pero ya teníamos datos suficientes para reunir en la biblioteca a todos los implicados y desvelar quien es el asesino.

Los transients, al parecer, son registros con información temporal que proviene de los plugins que tenemos instalados. ¿Sirven para algo? Pues una vez que caducan no, para nada. De hecho precisamente por eso está ahí esa tarea que elimina los caducados. ¿Qué es lo que ocurre entoces? Pues que es evidente que muy bien no funciona porque la mayoría de esos 40.000 registros son transients. Más de 35.000, de hecho. Y la búsqueda se realiza a través del campo wp_options que como vemos no está indexado. Fatal. La primera aproximación al problema pasa, pues, por crear un índice sobre esa columna:

MariaDB [unlugar]> alter table wp_options add index (option_name);
Query OK, 0 rows affected (3 min 47.86 sec)         
Records: 0  Duplicates: 0  Warnings: 0

Mano de santo, oigan. Al día siguiente a las 9.04 por primera vez en meses el blog no se colgó. ¿Lo dejo así?¿Con una tabla diez veces mas grande que el contenido de todo lo escrito en el blog?¿Hasta donde la dejo crecer entonces? Toca hacer otra búsqueda y por ahí me encuentro con mucha mas gente que ha tenido problemas similares y que asegura que se puede hacer tábula rasa y borrarlos todos. Así que hago un backup rápido, los elimino… y parece que todo va bien. Fantástico 🙂

¿Cómo eliminarlos? Pues a través de línea de comando es fácil:

MariaDB [unlugar]> DELETE FROM `wp_options` WHERE `option_name` LIKE ('%\_transient\_%')

Puestos a buscar una solución más cómoda y permanente para no llegar de nuevo aquí dentro de 10 años encontré otro plugin (Transient Cleaner) que te permite borrarlos puntualmente y/o programar una tarea para hacer una limpieza mas efectiva que la de wordpress de forma periódica.

Y listo. O eso parece. Mañana los baños. Sin falta 🙂

Artículo Original: .

Este artículo pertenece a Un lugar en el mundo... Si quieres ver actualizaciones y comentarios interesantes visita el texto original en: WordPress. El misterioso caso del cuelgue diario a las 9 de la mañana || Hospedado en un Cloud VPS de Gigas.

Martes 22 de mayo de 2018

Pedro L. Lucas

Pedro L. Lucas
Cartas de Linux

Cuenta oficial en Twitter de LXQt y LXQt 0.13.0

Con el nuevo lanzamiento de LXQt, ya van por la versión 0.13.0, el proyecto lanza su cuenta oficial en Twitter: https://twitter.com/LXQtOfficial Y luce así de bien:

¿Qué trae de nuevo LXQt? Pues según sus notas, muchas correcciones a errores: https://blog.lxqt.org/2018/05/release-lxqt-0-13-0/

Combinaciones de teclas útiles

Un par de combinaciones de teclas útiles que trae por defecto son:

  • Ctr + Alt + i  Abre el navegador web por defecto (¡utilísima!)
  • Ctr + Atl + e  Abre el explorador de ficheros
  • Ctr + Atl + t  Abre el terminal

Control de brillo y contraste

De entre la aplicaciones disponibles de LXQt, voy a hablaros de una que me ha hecho gracia, la posibilidad de controlar el brillo de pantalla.

¿Qué es lo que me gusta de esta aplicación? Permite cambiar el brillo de pantalla tanto por hardware como por software. En un portátil puedes cambiar el brillo de la pantalla modificando la intensidad luminosa de los LED que hay detrás de la pantalla. En un ordenador de sobremesa esto no se puede hacer, pero te permite cambiar el brillo de la pantalla por software y es algo muy agradable a la vista. ¡Sobre todo con pantallas excesivamente brillantes!

Aprovechando el espacio de la pantalla eliminando las barras de título

Otra curiosidad, si pulsáis sobre una barra de menús con el clic derecho del ratón y seleccionáis “Decorar”, se eliminan las barras de título. Muy útil para aprovechar todo el espacio disponible de la pantalla. Por ejemplo:

Es esta captura de pantalla, he puesto el panel a la izquierda y he eliminado la barra de título del terminal. Como se puede ver la pantalla se aprovecha mejor.

Para volver a decorar las ventanas, pulsamos Atl + espacio. Aunque, yo las gestiono pulsando con el botón derecho del ratón sobre su icono en el panel.

Y Wayland… ¿Para cuándo?

Los desarrolladores están teniendo ardientes debates sobre el tema: https://github.com/lxqt/lxqt/issues/1011

La postura que están adoptando es mantenerse independientes del gestor Wayland usado, de forma que se puedan usar las herramientas LXQt en cualquier gestor de composición Wayland. Parece que tienen claro que no van a reescribir otro compositor Wayland más habiendo opciones disponibles. Aunque hay voces que apuntan a que finalmente, por la estructura de Wayland, no va quedar más remedio.

Viernes 23 de marzo de 2018

José María Morales Vázquez

José María Morales Vázquez
tecnología – Un lugar en el mundo…

Bootstrap 4. Primeros pasos

icono de php Bootstrap es una colección de elementos, plantillas y componentes HTML, CSS y Javascript para crear rápidamente páginas web con un aspecto moderno y “responsivo” (¡menudo palabro!) al tamaño de pantalla de cualquier dispositivo. Su versión 4 se liberó hace un par de meses y aporta algunos cambios significativos como, por ejemplo, la inclusión de Popper como librería javascript para “tooltips” y otros elementos emergentes y la eliminación de las tipografías Glyphicons para introducir símbolos y pictogramas.

Podemos trabajar con Bootstrap bien descargandonosla en nuestro propio servidor web, o bien usando sus librerías directamente desde los CDN que nos ofrecen. Aquí usaremos este segundo método por sus evidentes ventajas de cara a montar una primera plantilla para pruebas. Necesitamos incluir simplemente el siguiente tag en :

<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css" />

Si vamos a usar los elementos javascript necesitamos incluir también las librerías correspondientes y, ademas, las de jquery y popper en nuestro proyecto las cuales también tienen disponible la posibilidad de enlazarlas directamente sin necesidad de descargarlas en local:

<script src="https://code.jquery.com/jquery-3.3.1.slim.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.1/umd/popper.min.js"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/js/bootstrap.min.js"></script>

IMPORTANTE: los enlaces anteriores corresponden a las versiones estables más recientes en el momento de escribir esto. No suelen eliminar las versiones anteriores, pero conviene que te cerciores si llegas a este texto en un futuro lejano.

Con todo esto, la plantilla mínima de HTML para empezar a trabajar (incluyendo los enlaces correspondientes a las librerías javascript comentados) sería esta:

<!DOCTYPE html>
<html lang="es">
    <head>
    	<meta charset="utf-8" />
    	<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no" />
    	<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css" />
    	<title>Plantilla Bootstrap</title>
  	</head>
  	<body>
		<h1>Plantilla Bootstrap</h1>

    
		<!-- Javascript opcional -->
		<!-- <script src="https://code.jquery.com/jquery-3.3.1.slim.min.js"></script>
    	     <script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.1/umd/popper.min.js"></script>
    	     <script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/js/bootstrap.min.js"></script> -->
  	</body>
</html>

Sosa, verdad? Claro, aún no hemos empezado a trabajar… Si quieres ver algo más impactante, bootstrap dispone de plantillas con algo mas de chicha para tus diseños. Las tienes disponibles en este enlace. Si prefieres empezar desde cero, tienes disponible un montón de La documentación bastante fácil de seguir que incluye multitud de ejemplos prácticos para empezar a trabajar desde el primer minuto.

Artículo Original: .

Este artículo pertenece a Un lugar en el mundo... Si quieres ver actualizaciones y comentarios interesantes visita el texto original en: Bootstrap 4. Primeros pasos || Hospedado en un Cloud VPS de Gigas.

Lunes 19 de marzo de 2018

Baltasar Ortega

Baltasar Ortega
KDE Blog

Presenta tu charla para Akademy-es 2018 de Valencia

Hace tiempo que se anunció la sede y desde ese momento el blog va dando los detalles necesarios para ir abriendo boca.. Y es que en poco más de mes y medio se celebrará en Valencia la reunión anual en España de usuarios y desarrolladores de KDE, Akademy-es 2018. Concretamente se celebrará del 11 al 13 de mayo y es el momento de seguir preparando el programa. Como el evento es una celebración comunitaria se abrió en el momento del anuncio de la sede la posibilidad de que todo el mundo, además de acudir,  participara de forma activa. Así que presenta tu charla para Akademy-es 2018 de Valencia y muestra a toda el mundo tu proyecto personal o comunitario.

Presenta tu charla para Akademy-es 2018 de Valencia

Recordemos que en Akademy-es se realizarán las típicas charlas que presentan las novedades tanto de las aplicaciones como de las herramientas de programación, sin olvidar de los proyectos activos o de aquellos de los que se quieren lanzar en un futuro cercano.

En anteriores ediciones en estas charlas (extraído del programa de Akademy-es 2017 de Almería) descubrimos KDE,  nos pusimos a colaborar con KDE, conocimos la asociación KDE España, aprendimos más de Plasma 5, vimos pinceladas de un posible futuro de KDE, aprendimos como colaborar con KDE sin ser programador, conocimos mejor la relación de Slimbook co KDE, aprendimos a hacer aplicaciones para el móvil y recibimos las primeras leccions de Qt.

¿Y qué encontraremos en esta edición? Pues depende de ti, ya que si tienes algún tema que crees que interesará a la Comunidad KDE y sus simpatizantes, no lo dudes a y presenta tu charla para Akademy-es 2018. Estaremos encantados en escuchar tu propuesta.

Si quieres más información, basta con que leas el siguiente texto oficial o que visites la web oficial de Akademy-es 2018, no obstante aquí te lo puedo contar yo:
Para proponer actividades se deberá enviar un correo a akademy-es-org@kde-espana.es antes del 31 de marzo con un resumen breve de la presentación.

Presenta tu charla para Akademy-es 2018Es importante tener en cuenta las siguientes consideraciones:

  • Se puede elegir entre dos formatos de charlas:
    • Charlas de 30 minutos.
    • Lightning talk de 10 minutos.
  • Si la duración de las charlas propuestas no se ajusta a ninguno de estos dos esquemas (por ejemplo, si se necesita más tiempo), esto debe indicarse claramente en la comunicación.
  • Se permitirá a KDE España la distribución bajo una licencia libre de todo el material utilizado para la realización de la actividad, así como de la grabación de la misma.
  • La charla puede ser tanto a nivel de usuario como de nivel técnico.

Se trata de una gran oportunidad de darte a conocer en el mundo KDE y en el mundo del Software Libre en general.

Más información: Akademy-es 2018

¿Qué es Akademy-es?

Akademy-es (#akademyes, que es la etiqueta para las redes sociales) es evento más importante para los desarrolladores y simpatizantes de KDE, que se ha ido celebrando desde el 2006 con éxito creciente.

En general, las Akademy-es son el lugar adecuado para conocer a los desarrolladores, diseñadores, traductores, usuarios y empresas  que mueven este gran proyecto.

En ellas se realizan ponencias, se presentan programas, se hace un poco de caja para los proyectos libres (camisetas, chapas, etc) pero sobre todo se conoce a gente muy interesante y se cargan baterías para el futuro.

Podéis repasar las anteriores ediciones en estas entradas del blog:

Domingo 18 de marzo de 2018

Baltasar Ortega

Baltasar Ortega
KDE Blog

Noticias linux 02, tercer domingo de marzo de 2018

Esta semana sigue la sección que inicié de forma no oficial ya hace más de un mes y que se dedica a mostrar las novedades del mundo GNU/Linux que no aparecen en el blog por falta de tiempo y que deberían aparecer. Así que os doy la bienvenida a Noticias linux 02, correspondiente tercer domingo de marzo de 2018 con Firefox, Kubuntu, Plasma 5.12.3 y editores multimedia GNU/Linux

Noticias linux 02, tercer domingo de marzo de 2018

La semana de las mil actividades ha llegado a su fin, dejándome a las puertas de otra un poco más relajada en cuanto a obligaciones laborales, pero llena de tareas que hacer para poder sobrevivir a este tercer trimestre que llega.

Así que aprovecho la tranquilidad de este domingo para seguir con la nueva sección de Noticias Linux, que llega a su segunda edición, compartiendo noticias que han aparecido en otros blogs o webs y que hubiera estado genial que aparecieran en éste.

Firefox lanza su versión 59

Mientras esperamos que madure Falkon, los usuarios de la Comunidad KDE podemos seguir utilizando Firefox, el gran explorador web, que sigue mejorando y evolucionando.

Según podemos leer en Genbeta, el pasado 13 de marzo fue lanzado Firefox 59, una nueva versión del excelente explorador (disponible ya en las principales distribuciones GNU/Linux) que nos ofrece las siguientes novedades:

  • Tiempos de carga de página más rápidos.
  • Posibilidad de arrastrar y soltar nuestros “sitios favoritos en Firefox Home (la pantalla que aparece si creamos una nueva pestaña)
  • Posibilidad de desactivar la notificación que indica que una web está intentando acceder a la cámara.

Más información: Firefox

Plasma 5.12.3 ya disponible para Kubuntu 17.10

Noticias linux 02Los usuario de Kubuntu 17.10 están de enhorabuena. Según leemos en Ubunlog, ya está disponible la versión de Plasma 5.12.3 para sus escritorios.

Para hacerlo debéis activar los repositorios backports, abriendo una konsola y escribiendo los siguientes comandos:

sudo add-apt-repository ppa:kubuntu-ppa/backports -y
sudo apt update && sudo apt full-upgrade
Pero alerta, como dicen en el Ubunlog “Si tenemos una versión anterior a Kubuntu 17.10, no solo se actualizará el escritorio sino también la distribución
Más información: Kubuntu

Los 10 mejores editores Multimedia

Y finalizo esta entrada de Noticias Linux 02, con otra mención a un blog que se ha convertido en imprescindible para cualquier simpatizante del Software Libre: Maslinux.

En esta ocasión nos ha obsequiado con un recopilatorio de los 10 mejores editores multimedia GNU/Linux:  A modo de resumen, los mejores editores en orden de aparición son: Shotcut, VidCutter, FlowBlade, Kdenlive, Blender, Openshot, Cinelerra, Pitivi, Ardour y Rosegarden.
Y como siempre digo, son todos los que están, pero no están todos los que son. ¿Qué noticia os ha llamado la atención esta semana? Ponedlo en los comentarios y mejores esta entrada.

 

 

 

 

Sábado 17 de marzo de 2018

Baltasar Ortega

Baltasar Ortega
KDE Blog

Helium 8, un nuevo tema para Plasma

Volvemos a tema de diseño al blog con Helium 8, un nuevo tema para Plasma de tono grisáceo y ligero. Una gran creación de David Linares, conocido como @mcder3 que sigue ofreciéndonos diseños muy cuidados.

Helium 8, nuevo tema para Plasma

Los temas para el escritorio Plasma de la Comunidad KDE son sutiles pero importantes. La verdad es que todos se parecen mucho inicialmente, pero una vez instalados y tras un poco tiempo de uso ves las diferencias y decides si te gusta o no.

Y esto es así porque aunque los cambios son sutiles, abarcan a todo el sistema: iconos de la bandeja del sistema, pantalla de apagado, reinicio o cambio de usuario, animaciones al ejecutar aplicaciones, decoraciones de plasmoide, etc.

Es por ello, que me complace presentaros la nueva creación de David Linares (aka @mcder3) con la que tendremos un Plasma, como con todos sus diseños, elegante y ligero, con transparencias adecuadas y con un tono grisáceo.

Helium 8

 

También es de detacar su pantalla de salida y las animaciones con toques azulados cuando se ejecutan aplicaciones y se colocan en la barra de tareas. Todo muy sencillo pero visualmente muy atractivo.

 

Y como siempre digo, si os gusta el tema Helium 8 para Plasma podéis “pagarlo” de muchas formas, desde donaciones a mcder pasando por todo tipo de acciones en la página de KDE Store, que estoy seguro que el desarrollador lo agradecerá: puntúale positivamente, hazle un comentario en la página o realiza una donación. Ayudar al desarrollo del Software Libre también se hace simplemente dando las gracias, ayuda mucho más de lo que os podéis imaginar, recordad la campaña I love Free Software Day 2017 de la Free Software Foundation donde se nos recordaba esta forma tan secilla de colaborar con el gran proyecto del Software Libre y que en el blog dedicamos un artículo.

Más información: KDE Store

Martes 13 de marzo de 2018

TutorialesLinux.com: Herramientas de análisis de tráfico

Domingo 11 de marzo de 2018

José María Morales Vázquez

José María Morales Vázquez
tecnología – Un lugar en el mundo…

Laravel 5.6. Estructura y primeros pasos: Autenticación de usuarios

icono de php Ya yenemos Laravel 5.6 instalado en alguno de los dos entornos que hemos visto antes. ¿Qué sigue? Lo primero, entender un poquito la estructura de directorios que nos ha creado composer. Sólo lo imprescindible. El resto lo iremos viendo a medida que avanzamos.

josemaria@valeria /var/www/html/prueba $ ls -la
total 236
drwxr-xr-x 12 root www-data   4096 mar  9 19:31 .
drwxr-xr-x  3 root www-data   4096 mar  9 18:29 ..
drwxr-xrwx  6 root www-data   4096 ene  3 17:52 app
-rwxr-xrwx  1 root www-data   1686 ene  3 17:52 artisan
drwxr-xrwx  3 root www-data   4096 ene  3 17:52 bootstrap
-rw-r--rw-  1 root www-data   1413 ene  3 17:52 composer.json
-rw-r--rw-  1 root www-data 143565 mar  8 07:37 composer.lock
drwxr-xrwx  2 root www-data   4096 ene  3 17:52 config
drwxr-xrwx  5 root www-data   4096 ene  3 17:52 database
-rw-r--r--  1 root www-data    612 mar  9 19:31 .env
-rw-r--r--  1 root www-data    565 ene  3 17:52 .env.example
-rw-r--r--  1 root www-data    111 ene  3 17:52 .gitattributes
-rw-r--r--  1 root www-data    146 ene  3 17:52 .gitignore
-rw-r--rw-  1 root www-data   1125 ene  3 17:52 package.json
-rw-r--rw-  1 root www-data   1040 ene  3 17:52 phpunit.xml
drwxr-xrwx  4 root www-data   4096 ene  3 17:52 public
-rw-r--rw-  1 root www-data   3550 ene  3 17:52 readme.md
drwxr-xrwx  5 root www-data   4096 ene  3 17:52 resources
drwxr-xrwx  2 root www-data   4096 ene  3 17:52 routes
-rw-r--rw-  1 root www-data    563 ene  3 17:52 server.php
drwxrwxrwx  5 root www-data   4096 ene  3 17:52 storage
drwxr-xrwx  4 root www-data   4096 ene  3 17:52 tests
drwxr-xrwx 36 root www-data   4096 mar  8 07:38 vendor
-rw-r--rw-  1 root www-data    549 ene  3 17:52 webpack.mix.js

El directorio public ejerce de DocumentRoot. Allí encontraremos el index.php que da entrada a nuestra aplicación web así como las hojas de estilos, etc. El fichero .env que vemos aquí arriba en el directorio raiz de nuestra aplicación es el fichero de configuración principal. De hecho, puesto que vamos a empezar a trabajar con bases de datos en este momento podemos aprovechar para editar las siguientes directivas:

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=laravel
DB_USERNAME=laravel
DB_PASSWORD=secreto

Importante: aunque usemos mariadb la directiva DB_CONNECTION debe de ser mysql porque Laravel no entiende otra y, a fin de cuentas, ambas son compatibles a nivel binario. Para que Laravel sea capaz de hacer uso de esa base de datos debemos de crearla. A ella y al usuario que le hemos dicho que va a usar para manejarla. Entramos en nuestro gestor (mysql o mariadb) y ejecutamos lo siguiente:

CREATE DATABASE laravel;
CREATE USER laravel@localhost IDENTIFIED BY 'secreto';
GRANT ALL ON laravel.* TO laravel@localhost;

Vamos ahora a crear nuestro sistema de autenticación. Laravel viene ya con un módulo llamado User.php que reside en el directorio app. Para generar el resto de lo que necesitamos ejecutamos lo siguiente:

php artisan make:auth
php artisan migrate

La primera línea crea el código y rutas necesario para la gestión de usuarios. En particular, creará o modificará los siguientes ficheros:

routes/web.php
resources/views/auth/login.blade.php
resources/views/auth/register.blade.php
resources/views/auth/passwords/email.blade.php
resources/views/auth/passwords/reset.blade.php

La segunda instrucción crea la estructura de tablas necesaria en la base de datos que hemos configurado previamente. Si ahora volvemos a cargar la web de nuestro aplicación veremos que en la esquina superior derecha tenemos dos nuevos enlaces correspondientes a las funcionalidades de Login y Registro:

Laravel 5.6 con la funcionalidad de login y registro

Las pantallas de registro y login por defecto son estas:

Pantalla de registro en Laravel 5.6
Pantalla de login en Laravel 5.6

Y una vez hecho login vemos que en la barra de menú se nos identifica con nuestro nombre de usuario y tenemos la posibilidad de cerrar sesión:

Logout en Laravel 5.6

Si le echamos un vistazo a “las tripas” vemos que nos ha creado dos tablas una de las cuales, la de usuarios, es la que guardará la información relativa a los registros de usuarios.
Tablas creadas por Laravel 5.6 para la autenticación de usuarios

Además, tal y como está mandado, vemos que no almacena las contraseñas en claro sino un hash de las mismas:

hash de las passwords en Laravel 5.6

La castellanización de los recursos es tan sencilla como editar alguno de los ficheros php que hemos indicado anteriormente. Por ejemplo, el fichero login.blade.php es el que contiene la ventana de login y register.blade.php la de registro. Con muy poco esfuerzo tendremos las ventanas anteriores en perfecto castellano. Pero eso ya os lo dejo a vosotros 😉

Artículo Original: .

Este artículo pertenece a Un lugar en el mundo... Si quieres ver actualizaciones y comentarios interesantes visita el texto original en: Laravel 5.6. Estructura y primeros pasos: Autenticación de usuarios || Hospedado en un Cloud VPS de Gigas.

Jueves 01 de marzo de 2018

TutorialesLinux.com: Vulnerabilidad en Memcached (DDoS), cómo solucionarla.

Sábado 24 de febrero de 2018

Pedro L. Lucas

Pedro L. Lucas
Cartas de Linux

Viendo la degradación de la batería de un portátil

Las baterías de los portátiles, móviles y otros dispositivos van perdiendo capacidad con el tiempo. Esta pérdida de capacidad la podemos comprobar con diversas herramientas.

Por ejemplo, con la aplicación de gestión de la batería de LXQt se puede ver la siguiente captura:

En esta captura se puede comprobar que en el diseño original tenía una capacidad de 51.50Wh. Actualmente tiene 45.44Wh, por lo que su capacidad total se ha reducido, está al 88% de su capacidad inicial, es decir ha perdido un 12% en los 4 años que lleva en uso. Realmente si la batería estuviera totalmente vacía o totalmente llena se degradaría más rápido, por lo que la electrónica no debería dejar que la batería se llene o vacíe totalmente.

En siguiente parámetro es “Energy rate”. Muestra la energía que está entrando o saliendo de la batería en el momento actual. Según se ve, el portátil está consumiendo 10.22W en el momento de hacer la captura. Cuando el portátil está cargando, muestra la energía que está entrando en la batería y es fácil ver valores de 30W, aunque esta potencia que entra en la batería va bajando según se va llenando.

En la siguiente captura se puede ver que el “Energy rate” vale 0W:

En esta situación la batería está cargada y el portátil conectado a corriente eléctrica, por lo que no entra ni sale energía de la batería.

Consultar la degradación vía terminal

Usando el terminal del Linux es posible consultar la degradación de la batería y otras características visitando la carpeta /sys/class/power_supply/. Dentro de esta carpeta hay archivos que se pueden consultar para ver la capacidad, el voltaje o la intensidad eléctrica que está entrando o saliendo la batería.

Evolución de la degradación y tratando de evitarla

En teoría las baterías nuevas se degradan un poco, luego bajan linealmente para, finalmente, morir rápidamente. Más información se puede encontrar en el siguiente enlace:

http://batteryuniversity.com/learn/article/how_to_prolong_lithium_based_batteries

La primera conclusión que se obtiene del artículo anterior es: no se puede evitar la degradación de la batería. Lo que sí se puede hacer es que esta degradación vaya más despacio.

Dentro de la batería se producen multitud de reacciones químicas. La mayoría de ellas interesan, pero hay otras que no. Se suele recomendar no cargar la batería más allá del 80% y no dejar que su nivel baje del 20%. Si se llena o vacía la batería completamente, comienzan estas reacciones químicas que no interesan. Es mejor pequeñas cargas y descargas que llenarla y vaciarla completamente. Si el fabricante ha sido responsable, habrá dejado un margen de la batería que no podréis usar, este margen es para evitar la degradación.

La temperatura es también un factor importante. Las temperaturas muy altas, degradan las baterías a mayor velocidad. Por esta y otras causas, siempre vais a leer que no hay que dejar los dispositivos electrónicos al Sol o bajo otras fuentes de calor.

Cuando la temperatura de la batería es baja, su desempeño empeora. Pero esta situación en un portátil va a ser difícil que se dé.

Curiosidades

En Internet se puede encontrar información de portátiles o teléfonos que han explotado. Esto ha sido investigado y se debe a que se forman dendritas dentro de la batería que acaban formando cortocircuitos y provocando que se incendien:

https://computerhoy.com/noticias/hardware/esto-es-que-provoca-que-exploten-baterias-metal-litio-52834

Otra curiosidad son las baterías de Ni-Fe que no sufren ningún tipo de degradación. Pueden llegar a durar más de 20 años y no sufrir ni el 2% de degradación. Y como extra su reciclaje es muy simple:

https://en.wikipedia.org/wiki/Nickel%E2%80%93iron_battery

Su punto débil, su peso y volumen. Pero se pueden usar para otros usos como instalaciones solares en los que los paneles recargan las baterías cuando hay Sol y se obtiene la electricidad cuando es de noche:

http://www.zappworks.com/battery_prices.htm

Como veis en el anterior enlace los precios son prohibitivos.

Ya se comienzan a escuchar otras tecnologías novedosas como las baterías de ánodo de grafeno, de electrolito sólido, Litio-azufre,…

Habrá que esperar para ver cuál de ellas acaba desarrollándose de forma definitiva.

Martes 20 de febrero de 2018

Lenin Hernandez

Lenin Hernandez
Leninmhs

Como enviar correos desde Perl usando Gmail

En esta entrada tendremos realizaremos el envió de correo desde el SMTP de Gmail usando el lenguaje de programación Perl para realizar esta tarea, específicamente usando el modulo Email::Sender. Perl es un lenguaje muy común para escribir scripts, por lo cual, es muy útil poder enviar de correos electrónico desde el. En Perl existen varias … Sigue leyendo Como enviar correos desde Perl usando Gmail

Lunes 19 de febrero de 2018

Emiliano A. González Salgado

Emiliano A. González Salgado
El blog de Emi

BITDEFENDER ANTIVIRUS SCANNER EN FEDORA 27

BitDefender Antivirus Scanner for Unices, un antivirus de BitDefender y que se puede utilizar gratuitamente.

La página de descarga es:

https://www.bitdefender.es/business/antivirus-for-unices.html

Después deberemos solicitar una licencia gratuita por un año, esta parte si que está visible desde el enlace Solicite licencia gratuita, que nos mandará una clave a nuestro email.

Una vez descargado, simplemente ejecutamos (sin olvidarnos de hacerlo ejecutable), como root:

sh BitDefender-Antivirus-Scanner-7.7-1-linux-amd64.rpm.run

Seguimos las instrucciones de la terminal, incluyendo escribir la palabra accept e indicando que queremos instalar también la interfaz gráfica.

El software ha sido discontinuado desde principios de 2016. Esta versión 7.7.1, data de noviembre de 2014, que en software antivirus es un mundo, las firmas siguen actualizándose diariamente, esencialmente son las mismas que usan otros productos de BitDefender, así que ningún problema.

Como habéis podido ver, además tiene versión nativa de 64 bits, que es de las cosas que más me gustan en BitDefender.

Si te has registrado con anterioridad y tienes licencia, puedes descargarlo directamente de:
https://download.bitdefender.com/SMB/Workstation_Security_and_Management/BitDefender_Antivirus_Scanner_for_Unices/Unix/Current/EN_FR_BR_RO/Linux/

Para evitar errores y que se carguen los motores antivirus, una vez instalado hay que ejecutar estos dos comandos, como root:

ln –force –symbolic /opt/BitDefender-scanner/var/lib/scan/Plugins /opt/BitDefender-scanner/var/lib/scan/Plugins/plugins
(todo lo anterior en la misma linea, pues es un único comando)

ll /opt/BitDefender-scanner/var/lib/scan/Plugins/plugins

Con ello ya se puede arrancar el programa, proceder al cambio de licencia (la consta es la de evaluación), actualizar las firmas y comenzar el escaneo.

Jueves 01 de febrero de 2018

Curso: Gestión de proyectos Software con Git y GitHub

Independiente si te mueves por el mundo del desarrollo, la administración de servidores o simplemente eres una mente inquieta en...

La entrada Curso: Gestión de proyectos Software con Git y GitHub aparece primero en Nosinmiubuntu | Ubuntu en concreto, GNU/Linux en general.

Miércoles 31 de enero de 2018

Curso: Desarrollo en HTML5, CSS y Javascript de Apps Web, Android e IOS (8ª edición)

Retomamos las publicaciones en la web para hablaros de la próxima edición del curso gratuito Desarrollo en HTML5, CSS y...

La entrada Curso: Desarrollo en HTML5, CSS y Javascript de Apps Web, Android e IOS (8ª edición) aparece primero en Nosinmiubuntu | Ubuntu en concreto, GNU/Linux en general.

Lunes 22 de enero de 2018

TutorialesLinux.com: Borrar un volumegroup y extender el principal