martes, 30 de julio de 2013

Mostrar todas las Aplicaciones al inicio en Ubuntu.

Hay ocasiones en las que requerimos deshabilitar algunas aplicaciones que hemos instalado o algunas que sabemos que el mismo sistema operativo inicia por defecto. El problema es en el último caso ya que en la ventana de aplicaciones al inicio solo muestra las que hemos instalado como se muestra en la siguiente imagen:


Por lo que si queremos que se muestren las demás aplicaciones debemos de realizar lo siguiente:
  1. Abrir un terminal. (Ctrl+Alt+T)
  2. cd /etc/xdg/autostart
  3. sudo sed -i 's/NoDisplay=true/NoDisplay=false/g' /etc/xdg/autostart/*.desktop
Abriendo nuevamente la ventana de aplicaciones al inicio se nos mostrará lo siguiente:


!Listo¡

Lo siguiente es por si quieres sabes que es lo que se realizo con el comando sed si no puedes marcharte...

Explicando un poco el comando sed es un editor de flujo muy utilizado cuando requerimos de transformar un texto proveniente de una tubería (Ej. echo Hola | sed s/H/h/)

En este caso estamos editando directamente los archivos que terminen con .desktop del directorio  /etc/xdg/autostart/ con la bandera -i, lo que se encuentra entre comillas simple sirve para sustituir NoDisplay=true por NoDisplay=false este se realiza con la opción s. Es importante recordar que con esta opción únicamente reemplazara la primera coincidencia del texto NoDisplay=true por lo que si este archivo contiene más lineas de esta forma por alguna extraña razón no realizará el reemplazo. Si no queremos que tenga este comportamiento debemos de colocar al final la opción g que aplicará la sustitución me manera global.

Ahora si, eso es todo...

lunes, 29 de julio de 2013

Autocompletar comandos: Bash-Completion

Sabemos que cuando utilizamos la terminal podemos auto-completar el nombre de un archivo o comando utilizando la tecla [TAB].

Ejemplo:

usuario@host:~$ sudo apt-get [TAB]
autoclean        check            dselect-upgrade  source
autoremove       clean            install          update
build-dep        dist-upgrade     purge            upgrade
changelog        download         remove

Tal como en el ejemplo esto lo realizo con un usuario que se encuentra dentro del archivo /etc/sudoers capas de utilizar comando como si se tratase del root. Hablaremos de este archivo en estradas posteriores.

La situación cambia cuando nosotros nos cambiamos al usuario root ya sea con:

usuario@host:~$ sudo su # Utilizando contraseña del usuario que ejecuta el comando. En este caso usuario.
su # utilizando contraseña del usuario root.

Si tratamos de realizar lo anterior nos damos cuenta de que nos muestra algo similar a lo siguiente:

root@host:~# apt-get [TAB]
Display all N possibilities? (y or n)
#
# Lista de archivos del directorio actual.
#
--More--

Cuando en realidad queremos que nos auto-complete o muestra las opciones que tenemos disponibles.

Este comportamiento no esta disponible por defecto por lo que si queremos activarlo tenemos la necesidad de editar el archivo /root/.bashrc


root@host:~# nano .bashrc
Buscar lo siguiente:

# enable programmable completion features (you don't need to enable
# this, if it's already enabled in /etc/bash.bashrc and /etc/profile
# sources /etc/bash.bashrc).
#if [ -f /etc/bash_completion ] && ! shopt -oq posix; then
#    . /etc/bash_completion
#fi
y descomentamos las últimas tres lineas que muestro, es decir, debe quedar así:
# enable programmable completion features (you don't need to enable
# this, if it's already enabled in /etc/bash.bashrc and /etc/profile
# sources /etc/bash.bashrc).
if [ -f /etc/bash_completion ] && ! shopt -oq posix; then
    . /etc/bash_completion
fi

Podemos reiniciar nuestra terminal o simplemente cargar nuestra configuración haciendo uso de source:

root@host:~# source .bashrc
¡Listo! ya nos podrá auto-completar los comando también con el usuario root.

Si queremos que este cambio se realice con todos los usuario deberemos debemos de editar el /etc/bash.bashrc y descomentar las mismas lineas o algunas similares.

NOTA:

Como se indica en los comentarios del archivo ~/.bashrc si ya se encuentra habilitado en /etc/bash.bashrc no es necesario realizarlo en este archivo.

Eso es todo por el momento si quieren más información revisar los siguiente sitios:
http://bash-completion.alioth.debian.org/
http://tldp.org/LDP/abs/html/tabexpansion.html
http://www.debian-administration.org/articles/316

sábado, 27 de julio de 2013

Algoritmo de Euclides

En esta ocasión les traigo este programa hecho en c++ para calcular el máximo común divisor haciendo uso del Algoritmo de Euclides.
A continuación les muestro el código completo:
//============================================================================
// Name        : mcd.cpp
// Author      : Oropeza Uribe Jose Angel
// Description : Función para encontrar el máximo común divisor haciendo
//    uso del llamado algoritmo de Euclides.
//============================================================================

#include 
using namespace std;
int mcd(int,int);
int main()
{
 int x,y;
 cin >> x >> y;
 if( x > 0 && y >0 )
 {
  cout << x << " " << y << " " << mcd(x,y) << endl;
 }
 return 0;
}
int mcd(int x, int y)
{
 int aux;
 while( x > 0)
 {
  if ( x < y)
  {
   aux = x;
   x = y;
   y = aux;
  }
  x = x - y;
 }
 return y;
}
Un ejemplo de entrada son dos números separados por un espacio los cuales son 345 y 45 y mostrará lo siguente:
345 45 # Números ingresados
345 45 15 # Primeros dos números ingresados y el tercero es el Máximo Común Divisor.

miércoles, 24 de julio de 2013

Una clase que utilizo cuando hago uso de PostgreSQL.

usuario = $infoDB['usuario'];
        $this->password = $infoDB['password'];
        $this->nombre = $infoDB['db'];
        $this->port = $infoDB['port'];
        $this->host = $infoDB['host'];        
        $this->link = pg_pconnect("host=".$this->host." port=".$this->port." dbname=".$this->nombre." user=".$this->usuario." password=".$this->password);
        if (!$this->link) {
            die("Error al conectar con la base de datos");
        }
        return $this->link;
    }
}
$link = new ConexionBD(
                array(
                    'db' => 'NombreBD',
                    'port'    => '5432',
                    'usuario' => 'Usuario',
                    'password' => 'Password',
                    'host' => 'localhost')
                );
?>

Fórmulas para Conteo

Les presento una tabla tomada del libro de Matemáticas Discretas y Combinatoria: Una introducción con aplicaciones de Ralph p: Grimaldi
Muy útil para resolver problemas básicos de conteo.
El orden es significativo Se permiten repeticiones Tipo de resultad Fórmula
No Permutación $$P\left( n,r\right) =n! / \left( n-r\right) !, 0 \leq r \leq n $$
Disposición $$ n^{r},n,r\geq 0 $$
No No Combinación $$ C\left( n,r\right) =\dfrac {n!} {r!\left( n-r\right) !}, 0 \leq r \leq n $$
No Combinación con repetición $$ \binom{n+r-1}{r} , n,r \geq 0 $$

sábado, 6 de julio de 2013

Generación de números aleatorios en bash shell y uso de for.

Esta ocasión les traigo dos formas de generar número aleatorios que me fueron de utilidad para un programa en c++ que realice.

La primera es haciendo uso de la variable $RANDOM

Su forma de trabajar es muy simple
$ echo $RANDOM
18636
Que en mi caso ese resultado obtuve.

Pero si lo que quieres es generar un número aleatorio de un rango en especial podemos modificarlo ligeramente de la siguiente manera:

$ echo $((RANDOM%32))
21

El cual lanza un número del intervalo [0,32) = [0,31] en caso de no querer iniciar con 0 podemos sumar 1 de la siguiente manera:

$ echo $((1+RANDOM%32))
30

El cual lanzará algún número del intervalo [1,31].

La forma es agradable y con un poco de imaginación se podría generar una lista de números pero si no te quieres quebrar la cabeza puedes hacer uso del comando shuf el cual si una lista de números aleatorios indicando un intervalo y cantidad.

Como ejemplo vamos a generar 23 números dentro del intervalo [0,44] el cual se haría de la siguiente manera:

$ shuf -n 23 -i 0-44
15
9
12
...
11
13
35

Ya que si la forma en que se te presento no fue de tu agrado podemos modificarlo para que aparezcan en una sola linea separados por un espacio:

$ echo $(shuf -n 23 -i 0-44)
41 28 33 34 38 6 26 27 42 4 31 43 40 25 21 2 8 5 19 10 37 3 13

Bueno como les comente al principio esto salio de la necesidad de obtener números aleatorios para probar un programa. De hecho loo que necesitaba era obtenerlos de la siguiente manera;

2 56 369 78 12
32 456 8789 7 2

Ya que el programa consistía en llenar una matriz para verificar que se tratase de un Rectángulo Latino (en otro post tal vez coloque el código por si a alguien le interesa y hablaré más al respecto) y debido a que tenia bastante flojera de teclearlos cada que probara el programa se me ocurrió que sería mejor generarlos con nuestra siempre amigable terminal :)

Así que agregando un ciclo for queda de la siguiente manera:
$ for i in `seq 1 20`
> do
>   echo $(shuf -n 23 -i 0-44 )
> done

Explico brevemente el comando seq es utilizado para generar números consecutivos de un rango en este caso del 1 al 20 los cuales se le asignan a la variable i (que no esta siendo utilizada para este ejemplo)  en cada iteración el valor que retorne el comando seq.

Para ver esto más claro pensemos en esto:
$ for i in `seq 1 2`
do
echo $i
done
1
2

El ciclo for separa por espacio todo lo obtenido en seq por lo cual sería equivalente a escribir:
$ for i in 1 2...

Cuando detecte el ciclo for que ya no hay más elementos se termina el ciclo.

Como ejemplo nuevamente generaremos una lista de números que estén dentro del intervalo [0,50]  con 10 filas y 15 columnas de la siguiente manera:

$ for i in `seq 1 10`; do   echo $(shuf -n15 -i 0-50 ); done
39 13 35 44 42 43 7 29 22 37 2 47 6 36 18
24 30 1 12 8 32 48 39 29 33 44 9 20 43 13
34 28 2 47 12 44 16 1 31 24 22 15 18 35 0
48 11 49 18 4 34 30 20 17 46 9 45 29 38 7
11 21 9 20 1 44 31 35 17 15 47 13 18 46 12
47 40 26 48 15 38 19 3 16 34 24 37 44 45 14
39 1 21 4 20 22 38 13 24 6 17 42 43 10 41
46 31 47 33 28 1 14 2 20 35 23 27 36 38 48
42 5 46 6 16 21 27 33 35 48 25 49 10 47 36
33 30 3 15 20 47 2 45 13 5 34 19 29 0 14

Espero les sirva.

Y luego hablaremos de algo llamado IFS y profundizaremos en el ciclo FOR.

martes, 5 de marzo de 2013

Definición de una clase en C++ I

Para definir una clase en c++ se debe de comenzar por la palabra reservada class seguida del nombre de la clase.

class NombreDeLaClase
{
  private:Atributos y métodos

  public:

    //Atributos y métodos

  protected:

    //Atributos y métodos

};


Debemos de recordar el ; al cierre de la llave ya que es un error común.

Si no se declara ninguno de los tipos de visibilidad los métodos y atributos se declararan como privados. A diferencia de las estructuras que estas por defecto tienen una visibilidad pública.
Las clases pueden contener las tres secciones anteriormente mencionadas o cualquier combinación de ellas.

Para declarar un objeto del tipo de clase definida se emplea la siguiente sintaxis.

NombreDeLaClase NombreObjetoDeLaClase;

Para dar un ejemplo de lo anterior mostramos el siguiente código:

class Persona
{
  public:
       char Nombre[32];
       int Edad;
       void cambiarNombre(char NuevoNombre[]);
};

void main()
{
       Persona personaUno, personaDos;
       // Más código.
}