Address already in use: AH00072: make_sock: could not bind to address 0.0.0.0:443. Apache.

De pronto apareció este mensaje en mi sitio web seguro que había estado funcionando sin problemas. El puerto seguro 443 no estaba siendo usado por ninguna aplicación sin embargo al intentar iniciar el servicio httpd éste no arrancaba y me daba el error descrito en el título de este entrada. ¿Me lo hackearon? No. Resulta que se instaló una actualización de Apache y reemplazo algunos archivos de configuración.

Cuando Apache detecta que en dos o más archivos de configuración existe la directiva Listen 443 arroja este error. Así que eliminando dichas lineas y dejando sólo una en todos los archivos de configuración se soluciona el problema.

¡Hasta pronto!

Como instalar python 3 en Centos 7

Por defecto Centos 7 viene con la versión 2 de Python, por lo tanto hay que instalar algunos repositorios para poder instalar Python 3. Ejecute las siguientes instrucciones con el usuario root:

# yum install epel-release
# yum install https://centos7.iuscommunity.org/ius-release.rpm

Una vez instalados los repositorios, procedemos a instalar python 3:

# yum install python36u python36u-devel python36u-pip
# pip3.6 install -U pip
# pip install -U virtualenv

Hasta aquí, podemos llamar python 3 ejecutando el comando python3.6. Si queremos llamarlo del modo tradicional, ejecutar pyhton3, podemos crear un soft link de la siguiente manera:

# ln -s /usr/bin/python3.6 /usr/bin/python3

Comprobamos que python 3 quedó bien instalado:

# python3 –version

Si todo es correcto, el comando anterior debería darnos la versión de pyhton 3 instalada.

¡Hasta luego!

Error pip3

Error al ejecutar pip3 en Ubuntu 18.04: ImportError: cannot import name ‘main’.

Al intentar conocer la versión de mi pip3 instalado, Ubuntu 18.04 me arrojaba el siguiente error:

$ pip3 –version
Traceback (most recent call last):
File “/usr/local/bin/pip3”, line 7, in
from pip import main
ImportError: cannot import name ‘main’

Al parecer es un bug que salta al actualizar a la versión 10 de pip3. Para solucionarlo ejecuté las siguientes instrucciones que encontré aquí (también explica la causa) en una terminal:

sudo python3 -m pip uninstall pip && sudo apt install python3-pip –reinstall

Una vez ejecutada debe funcionar bien este comando y no arrojar ningún error.

¡Saludos!

¿Vendes aplicaciones programadas con Java Oracle SE 8? Esto te interesa.

A partir del 2019, el uso no personal de desarrollos en Java SE 8 cambia de licencia comercial:

“Las actualizaciones públicas de la versión 8 de Oracle Java SE seguirán disponibles para uso personal e individual al menos hasta finales de 2020.

Las actualizaciones públicas de la versión 8 de Oracle Java SE que se lancen a partir de enero de 2019 no estarán disponibles para uso empresarial, comercial o de producción sin licencia comercial.”

Para más información y detalles visita: https://www.java.com/es/download/release_notice.jsp

La opción ¿ OpenJDK?

Cómo hacer inners joins (concatenaciones internas) con la ORM de Django

Bueno, estamos ahora aquí en un proyecto que utiliza Django como su marco de trabajo.  Y aprendiendo su ORM (mapeo objeto-relacional) me tope con la necesidad de hacer las famosas concatenaciones (joins) entre dos o más entidades.

Anteriormente he trabajado con las ORM de java (Hibernate, EclipseLink) y de .Net (Entity Framework) así que la de ORM  de Django y su QuerySet debería ser capaz de hacer concatenaciones (joins).

Para hacer concatenaciones internas en Django, utilizamos la función select_related(). Según la documentación, esta función sólo sigue relaciones de llaves foráneas (foreign-key), es decir, de tablas hijas a tablas padre o relaciones de uno a uno.

Imagina los registros en una tabla que representa los artículos vendidos de una factura. Llamaremos a la table linea_factura. Esta tabla tendrá como llaves foráneas el identificador de la factura de la tabla factura y el identificador del artículo de la tabla articulo.

Con select_related() sólo podríamos seguir las relaciones de llaves foráneas, es decir sólo podríamos relacional las lineas de la factura con la factura y/o con los artículos pero no en el sentido contrario, es decir, de la factura hacia las lineas de la factura, o de artículos  la linea de artículo. Para esto existe otra función que aún no he probado y espero tratar más adelante.

El código siguiente, que omite la definición de los modelos,  para obtener el QuerySet quedaría así:

lineas_factura = linea_factura.objects.select_related(‘factura’)
.select_relate(‘articulo’).filter(factura__no = 89)

Una vez que el programa haga referencia a la variable lineas_factura, este QuerySet lanzará la consulta sql con dos joins y cargará con los registros de linea_factura y la información relacionada de la tabla factura y de la tabla artículo, donde el número de  factura sea igual a 89. Es decir, la factura número 89 y su detalle.

Espero les sea claro. Si no, comenta el post.

¡Hasta la próxima!

 

Cómo llenar un control comboBox de Windows Forms con una colección en c# .Net

Existen muchas formas de llenar un control comboBox en Windows Forms obteniendo los datos de varias fuentes. En este artículo veremos como llenarlo a través de un objeto de tipo colección (List) conteniendo objetos  tuplas (Tuple), obteniendo los datos con el que llenaremos los tuplas de los resultados de una consulta a una base de datos. El código asume que ya se abrió una conexión a la base de datos y se ejecutó una consulta y se están leyendo los datos que arrojó la misma.

 

El código está comentado para su mejor entendimiento.

/* Lista de items para el combobox, los items son representado 
   por tuplas de 2 valores: un entero y otro de tipo cadena */
List<Tuple<Int32, String>> listaItems = new List<Tuple<int, string>>();
                
// Leemos los registros 
while (lector.Read())
{
/* Añade ala lista los items a mostrar en el combobox, creando objetos tupla con valores
   obtenidos de la base de datos*/
  listaItems.Add(Tuple.Create<Int32, String>(lector.GetInt32(0), lector.GetString(1)));
}
// Cierra el lector de datos
lector.Close();

// Asigna items a el combobox
comboBox1.DataSource = listaItems;

/* Asigna la propiedad a desplegar en el combobox
   En un objeto tupla la propiedad que contiene
   el primer elemento es llamada Item1, el segundo Item2
   y asi sucesivamente */
comboBox1.DisplayMember = "Item2";

// Asigna la propiedad como valores de los items del combobox
comboBox1.ValueMember = "Item1";

Espero les sea útil.

¡Hasta la próxima!

 

Errores al instalar SQL Server Express 2017 en Windows 10, problemas con el idioma español (México).

Los instaladores de SQL Server traen un problema añejo con el idioma cuando está configurado como español mexicano que al parecer no se ha corregido aún.

Al ejecutar el instalador de SQL Server Express 2017 en español, descargado desde su sitio web,  arroja el error que inicia con “This SQL Server setup media does not suppor the lenguaje of the OS …” (ver mensaje completo en la imagen siguiente:

O si lo hacemos directamente ejecutando el archivo SETUP.EXE nos arroja el mensaje “No se encuentra el contrato de licencia de SQL Server para la edición seleccionada, EXPRESS. …”:

Y no permite continuar con la instalación. El instalador en español sólo reconoce el idioma español de España así que para proceder con la instalación en una máquina con lenguaje español de México, es necesario cambiar el idioma en nuestra computadora.

Para solucionar el problema hay que cambiar el idioma y región. Vamos a Inicio->Configuración para abrir el panel de Configuración:

Una vez ahí seleccionamos Hora e idioma:

Enseguida seleccionamos Región e idioma:

Cambiamos el país a España y en la sección Idiomas damos clic en Agregar un idioma:

En el panel Agregar un idioma buscamos Español y de la lista de idiomas mostrados seleccionamos el Español Español:

Nos mostrara una lista de regiones con idioma español, seleccionamos el que dice Español (España):

Una vez seleccionado nos regresa al panel anterior. ahí en Idiomas, en el idioma Español (España) seleccionamos el botón Opciones:

Damos al botón Descargar que se encuentra bajo el texto “Descargar paquete de idioma”:

Esperamos que termine la descarga del paquete de idioma y enseguida nos llevara al panel Región e idioma. En la sección Idiomas nos aparecerá Español (España) con el mensaje “Será el idioma para mostrar la próxima vez que inicies sesión”.

Procedemos a cerrar e iniciar sesión o a reiniciar nuestra computadora y una vez hecho esto podemos hacer la instalación de SQL Server 2017 Express sin problemas. Una vez instalado, podemos regresar el idioma de nuestra computadora nuevamente a nuestro idioma favorito.

Regístrate en el blog para recibir notificaciones de nuevas entradas. Cualquier comentario es bienvenido. No olvides visitar los anunciantes.

¡Hasta pronto!

 

Vagrant was unable to mount VirtualBox shared folders.

A iniciar el box de icinga2 me mandaba el mensaje siguiente:

Vagrant was unable to mount VirtualBox shared folders. This is usually because the filesystem "vboxsf" is not available. This filesystem is made available via the VirtualBox Guest Additions and kernel module. Please verify that these guest additions are properly installed in the guest. This is not a bug in Vagrant and is usually caused by a faulty Vagrant box. For context, the command attempted was:

mount -t vboxsf -o uid=1000,gid=1000 vagrant /vagrant

The error output from the command was:

: No such file or directory

En mi caso se debía a un bug en la versión de VirtualBox Guest Additions (vbguest) instalada en el box (la 5.1.21). Así que procedí a instalar la última versión (5.1.22) ejecutando las siguientes instrucciones:

%vagrant plugin install vagrant-vbguest
%vagrant up
%vagrant vbguest
%vagrant halt
%vagrant up

Instalar el más reciente plugin de vbguest, iniciar el box, instalar la última versión de vbguest, parar el box y volverlo a arrancar.

El mensaje de error desapareció. Espero les ayude.

¡Saludos!

There is a process already using the admin port 4848. Glassfish 4/CentOS 6.

El servidor de aplicaciones Glassfish 4.1 de un cliente no quería arrancar y mandaba el mensaje de error especificado en la siguiente imagen:

El servidor corre el sistema operativo CentOS 6 y al inspeccionar los puertos para ver que proceso estaba utilizando el puerto indicado en el mensaje, el 4848, indicaba que ningún proceso estaba ocupando dicho puerto. Así que quedó descartado que fuera otra instancia de Glassfish ejecutándose en la misma máquina.

El problema era que la máquina del cliente no tenía en su archivo /etc/hosts el hostname de su servidor. Para obtener el nombre del hostname.

Así que bastó con editar el archivo /etc/hosts y añadir al final de la IP 127.0.0.1 el hostname del servidor.

Con el comando hostname obtenemos el nombre del servidor. El archivo /etc/hosts debería más o menos quedar así:

127.0.0.1   localhost localhost.localdomain localhost4 HOSTNAME
::1         localhost localhost.localdomain localhost6

Donde HOSTNAME es el nombre del servidor obtenido con el comando hostname.

¡Hasta la próxima!

 

 

Tutorial en inglés: Como construir una aplicación Android con autenticación segura.

Turorial de Java Code Geeks que enseña cómo construir una aplicación Android con aunteticación segura de usuario:

Tutorial: Build an Android Application with Secure User Authentication

Posted by Java Code Geeks on Monday, December 5, 2016