Unknown's avatar

About hvivani

Systems Engineer, Developer, Technical Leader, IT Manager

Algoritmo para Palindromas o Capicuas en C#


Primera aproximación: Recorriendo toda la cadena.

            Boolean palindroma = true;
            string str = new string(Console.ReadLine().ToCharArray());
            for (int i=0; i < str.Length; i++)
            {
                if (str[i] != str[str.Length-i-1])
                    palindroma = false;
            }
            Console.WriteLine(palindroma.ToString());

Segunda aproximación: Solo evaluamos la mitad de la cadena

            Boolean palindroma = true;
            string str = new string(Console.ReadLine().ToCharArray());
            for (int i=0; i < str.Length; i++)
            {
                if (str[i] != str[str.Length-i-1])
                    palindroma = false;
            }
            Console.WriteLine(palindroma.ToString());

Tercera aproximación: el bucle corta por falso de palindroma.

            string str = new string(Console.ReadLine().ToCharArray());
            for (int i = 0; i < str.Length / 2; i++)
            {
                if (str[i] != str[str.Length - i - 1])
                    return false;
            }
            return true;

Conectando a instancia de Maquina Virtual de Amazon AWS EC2


Hace un tiempo hice unas pruebas con las máquinas virtuales que ofrece Amazon AWS. Hay una opción interesante de servicio gratuito durante un año para pruebas o para ingresar al producto, y por eso me puse a explorar sus alternativas.

Lo que hay que tener muy en cuenta es que, inclusive para probar, hay que ingresar los datos de una tarjeta de crédito (Microsoft Azure hace lo mismo), y luego del año de prueba se comienza a facturar en función de la demanda (ojo con eso).

En el proceso de creación de la instancia de la maquina virtual, debemos crear una clave .pem que luego nos servirá para ingresar al servidor.

Una vez creada la instancia, en el panel de control, debemos localizar la IP o el nombre DNS de dicha instancia.

Pantallazo-15Luego, utilizaremos el certificado .pem descargado al crear la máquina virtual y conectaremos del siguiente modo:

[usuario@host ~]$ ssh -i usuario_aws.pem ec2-user@ec2-54-242-160-64.compute-1.amazonaws.com

Para estas pruebas yo di de alta un Linux RHEL 6.4

Acceder a servidor SQL Server en Servidor Virtual Azure / Connect to SQL Server on Azure Server


Si necesitamos acceder desde un equipo cualquiera a un servidor de base de datos SQL Server hosteado en una máquina virtual Azure, debemos hacer dos cosas en el servidor virtual:

1) Mapear el puerto 1433 para tener acceso al motor de la base de datos.

Esto lo hacemos en el gestor de máquinas virtuales, seleccionando nuestra máquina virtual, luego EndPoints y agregando una nueva regla.

windowsAzure_endpoints

2) Permitir conexiones entrantes al puerto 1433 en el firewall de Windows.

Esto asumo que ya saben como hacerlo, pero basicamente es agregar una regla en Panel de Control –> Firewall, permitiendo la entrada de los paquetes entrantes por TCP al puerto 1433.

Conectar a Servidor SQL Server por puerto no standard / sql server connect to a different port


Este dato es importante (al menos para mí) porque es distinto del criterio utilizado en la mayoría de las aplicaciones.

Si necesitamos conectar a un servidor MS Sql Server a través de un puerto distinto del standard (1433), debemos hacerlo de la siguiente manera:

NOMBRE_SERVIDOR\SQLEXPRESS,14333

Es decir, nombre de servidor, nombre de instancia, coma, numero de puerto.

La intuición me decía hacer NOMBRE_SERVIDOR:1433\SQLEXPRESS. Pero NO.

Esto es aplicable para conexiones desde el SQL Management Studio y también para las cadenas de conexión o connection strings.

C# comportamiento de ComboBox enlazado a datos


Algo de lo que siempre me olvido cada vez que me pongo a tocar código en C# con VS2008.

Cuando creamos un orígen de datos desde un objeto, para luego arrastrar un ComboBox desde Data Sources hacia el formulario, deberemos setear algunas propiedades de datos enlazados a fin de evitar comportamientos extraños en el combo (por ejemplo: no libera el foco al hacer click o inmediatamente luego de cambiar el valor del combo vuelve al valor anterior).

En propiedades–>DataBindings–>Text dejamos en blanco la propiedad.

En propiedades–>DataBindings–>SelectedItem dejamos en blanco la propiedad.

En propiedades–>DataBindings–>SelectedValue establecemos la propiedad al campo del objeto a enlazar.

 

Running y Software Privativo


Desde hace un par de años utilizo Endomondo para llevar el registro de mi ejercicio, en particular correr. Esta aplicación tiene mucha funcionalidad útil tanto en su versión gratuita como en la versión paga. El tema es que desde hace un tiempo, varias funciones que eran gratuitas, pasaron a estar disponibles solamente en la versión paga.

No tengo problemas en pagar algunos pesos por un producto que realmente vale la pena, pero dado el tipo de políticas que comenzaron a aplicar, empecé a preocuparme por los datos.
Resulta que no existe una opción para exportar todos los datos que uno carga en el perfil. Mas aún, no existe una opción para exportar todos los registros de ejercitación de una sola vez (bulk export). Solo permiten descargar de a uno por vez, ingresando en cada registro de ejercitación. Con lo cual, a mayor cantidad de registros, mayor dependencia de la aplicación.

endomondo-exportar

Por lo que pude ver, tampoco es intención de Endomondo ofrecer dicha funcionalidad.

Imaginense descargar 300 registros de running ingresando uno por uno y seleccionando una opcion exportar en el menu contextual… Para mi esto tiene un sabor muy intenso a Esclavitud Virtual.

Así es que hoy, me encuentro probando otra aplicación que ha mejorado mucho desde que la vi por primera vez y que, en principio, me permite descargar toda la información que he ingresado en la base de datos. Al fin y al cabo: son mis datos !.

Gracias por permitirme esta catarsis casi off topic.

Bloqueo de Gnome Panel


Muchas veces, en equipos que cumplen tareas especiales, es necesario bloquear el panel de gnome a fin de que los usuarios no agreguen o eliminen applets.

Ejecutamos:

$ gconf-editor

y allí, modificamos la siguiente opción:

apps -> panel -> global -> locked_down

Si está tildada esta opción, el panel quedará bloqueado.

Qmail Server: Actualización de Antivirus Clamav por RPM


Para los que tengan un servidor de mail qmail con escaneo de correo por clamav via qmail-scanner, acá va un pequeño ayuda memoria para aquellas ocasiones en que debemos actualizar la versión del antivirus. Esto es algo que debemos revisar cada cierto tiempo, dado que el antivirus puede quedar obsoleto por falta de actualización.

Primero descargamos los RPM de nuestra versión de sistema operativo. Puede ser desde acá:

http://pkgs.repoforge.org/clamav/

Para una instalación eh RHEL 4 de 32 bits, necesitaremos los siguientes paquetes:

clamav-0.97.7-1.el4.rf.i386.rpm

clamav-db-0.97.7-1.el4.rf.i386.rpm

clamav-devel-0.97.7-1.el4.rf.i386.rpm

clamd-0.97.7-1.el4.rf.i386.rpm

Una vez que los tenemos descargados, procedemos:

1) Detenemos qmail y clamd:

# qmailctl stop
# service clamd stop

2) Desinstalamos la version de clamav que tengamos instalada:

2.1) Verificamos las versiones instaladas:

# rpm -qa |grep clam
clamav-devel-0.96.2-2.el4.rf
clamd-0.96.2-2.el4.rf
clamav-db-0.96.2-2.el4.rf
clamav-0.96.2-2.el4.rf

2.2) Desinstalamos:

# rpm -e --nodeps clamd-0.96.2-2.el4.rf 
# rpm -e --nodeps clamav-devel-0.96.2-2.el4.rf
# rpm -e --nodeps clamav-db-0.96.2-2.el4.rf
# rpm -e --nodeps clamav-0.96.2-2.el4.rf

3) Instalamos la nueva versión

# rpm -ivh clamd-0.96.2-2.el4.rf clamav-db-0.96.2-2.el4.rf clamav-0.96.2-2.el4.rf clamd-0.96.2-2.el4.rf

4) Ahora, editamos el /etc/clamd.conf y en la linea donde dice:

User clamav

modificamos por

User qscand

5) Ahora, editamos el /etc/freshclam.conf y en la linea donde dice:

DatabaseOwner clamav

modificamos por

DatabaseOwner qscand

Esto es para que utilice el usuario del qmail-scanner para el antivirus. Ojo con algunas instalaciones de Qmailrocks que sugerían utilizar el clamdscan para escanear y consumen enormes cantidades de recursos en el servidor. Gracias JSimpson por esta info.

6) Luego, verificamos los permisos en los archivos que puedan existir de versiones anteriores:

# chown -R qscand:qscand /var/lib/clamav
# chown -R qscand:qscand /var/run/clamav
# chown -R qscand:qscand /var/log/clamav

7) Iniciamos nuevamente los servicios:

# service clamd start 
# qmailctl start

That’s All Folks !

GRUB 2 Cambiando configuración / Change Settings


En Fedora 18, si tenemos instalado el boot dual en un equipo, seguramente nos planteemos como ampliar el tiempo de delay antes del booteo o cuál es el sitema operativo que arranca por defecto.

1) Editamos el archivo de configuración de grub2 en /etc/default/grub

GRUB_TIMEOUT=10
GRUB_DISTRIBUTOR="$(sed 's, release .*$,,g' /etc/system-release)"
GRUB_DEFAULT=”Windows7(loader) on /dev/sda1
GRUB_CMDLINE_LINUX="rd.lvm.lv=fedora/swap nomodeset rd.md=0 rd.dm=0 $([ -x /usr/sbin/rhcrashkernel-param ] && /usr/sbin/rhcrashkernel-param || :) vconsole.keymap=fr rd.luks=0 rd.lvm.lv=fedora/root rhgb quiet"
GRUB_DISABLE_RECOVERY="true"
GRUB_THEME="/boot/grub2/themes/system/theme.txt"

2) Para que el cambio tenga efecto, debemos ejecutar:

# grub2-mkconfig -o /boot/grub2/grub.cfg

Con este comando podremos ver todas las entradas disponibles para booteo:

# grep ^menuentry /boot/grub2/grub.cfg | cut -d "'" -f2

Con este comando podremos ver cuál es la entrada seteada en este momento por defecto:

# grub2-editenv list

Y alternativamente, podríamos utilizar este comando para establecer una determinada entrada por default para booteo:

# grub2-set-default <menu entry title>

Ojo que de todas maneras, deberemos ejecutar el comando del punto 2) para que el cambio tenga efecto.