martes, 21 de agosto de 2012

Logster - instalación con Graphite


Logster es (según su página) una utilidad para leer archivos de log y generar métricas para Graphite o Ganglia. Es ideal para visualizar tendencias de eventos que están ocurriendo en su aplicación/sistema/error log. Por ejemplo, puede usar logster para graficar el numero de ocurrencias de respuestas http que sucedan en el log de su servidor web.

Logster mantiene un cursor, vía logtail, en cada archivo log que es leído, por lo tanto, cada sucesiva ejecución solo inspecciona las nuevas entradas del log. En otras palabras, un crontab configurado para correr cada un minuto generará la visualización de tendencias en tiempo real para Graphite o ganglia para cualquier cosa que quiera medir de sus logs.

Instalación

Logster depende de la utilidad logtail, por lo que primero la instalamos
apt-get install logtail
apt-get install logcheck
Bajamos Logster de su página de download, bajamos el archivo y lo descomprimimos, luego hacemos desde una consola con superusuario...
python setup.py install
y se instala... la instalación deja dos archivos de ejemplo... podemos correrlo con:
/usr/sbin/logster --dry-run --output=graphite --graphite-host=mi_server_graphite:puerto_gralmente_2003 SampleLogster /var/log/apache2/access.log 

Con --dry-run le decimos que "simule" la ejecución, pero mostrando la salida por pantalla, para ver si anda... si quitamos esa opción se ejecutará contra nuestro graphite y tendríamos que ver los datos graficados... Ejecutando 
logster -h
nos da la ayuda para mas información...
Los archivos de ejemplo (por ejemplo el SampleLogster al que hago referencia arriba), así como cualquier otro que querramos correr se encuentran en /usr/share/logster
Una gran utilidad de esto es por ejemplo crear un crontab que ejecute
/usr/sbin/logster --output=graphite --graphite-host=mi_server_graphite:puerto_gralmente_2003 SampleLogster /var/log/apache2/access.log 
una vez por minuto, con lo que conseguimos que nuestro gráfico se ven en vivo.



miércoles, 15 de agosto de 2012

Tips Linux Debian

Copiar archivos de una máquina a otra por la red muy facil

Sin samba ni cosas raras, lo más simple...usando NetCat (nc)
Desde la máquina que tiene el archivo que queremos copiar
nc -l -p puerto < archivoEnviar -q 0
puerto: es el puerto en el que se enviará el archivo
Desde la máquina que debe recibir el archivo
nc servidor puerto > nombreArchivo
servidor: la ip o nombre de la máquina que envía el archivo.
puerto: el  puerto (el mismo de arriba)
nombreArchivo: el nombre que se le da al archivo una vez recibido.+

Correr un programa en background

Se pone un & al final de la línea cuando se ejecuta el programa.
Si el programa ya está corriendo hacer CTRL+Z (lo deja en suspenso) despues escribir bg y ENTER.
Para volverlo al primer plano usar jobs para ver el número de trabajo asignado y fg <nro trabajo> para ponerlo en 1er. plano).

Agregar procesos o correr programas al inicio de debian

Agregarlos en /etc/rc.local

Teclado

Cambiar mapa de caracteres desde consola:
loadkeys es
Ver la lista de mapas de caracteres disponible
ls -l /usr/share/kvm/keymaps/
en squeezy
     loadkeys /usr/share/keymaps/i386/qwerty/es.kmap.gz
     loadkeys es

Otros simples

Cambiar password: comando passwrd

Comprimir/Descomprimir con tar


Comprimir un directorio:
tar -cvf nombre_comprimido.tar directorio_a_comprimir/
Descomprimir:
tar -xvf nombre_del_fichero
Ver el contenido de un tar
tar -tf nombre_del_fichero
Significado de las letras:
f: indica que a continuación viene el nombre del fichero; c: comprimir; x: extraer; v: que muestre lo que va haciendo.

martes, 14 de agosto de 2012

Graphite

Graphite (http://graphite.wikidot.com/) es un soft que básicamente hace dos cosas (documentación sobre el soft se puede encontrar en http://graphite.readthedocs.org):
  • Almacena series cronológicas de datos numéricos.
  • Crea gráficos de esos datos contra demanda.
Tiene 3 componentes
  • carbon - un demonio que queda escuchando a la espera de series cronológicas de datos
  • whisper - una librería para base de datos simples para almacenar las series cronológicas de datos (similar en diseñó a RRD)
  • graphite webapp - Un Django webapp que renderiza los gráficos on-demand usando Cairo

Instalación en Debian

Bajamos Graphite y sus accesorios desde https://launchpad.net/graphite/
wget https://launchpad.net/graphite/0.9/0.9.10/+download/graphite-web-0.9.10.tar.gz
(o la versión más nueva que haya)... lo mismo con Carbon, Whisper y el archivo check-dependencies.py.
Los descomprimimos
tar xzvf graphite-web-0.9.10.tar.gz
... lo mismo para carbon y whisper
Antes de seguir vamos a correr (en realidad se pueden instalar Carbon y Whisper antes de correr esto, que nos dirá si están los prerequisitos de Graphite Web App)
python check-dependencies.py

que nos va a decir que está faltando para poder instalar Graphite... el resultado puede ser algo como esto...

[FATAL] Unable to import the 'whisper' module, please download this package from the Graphite project page and install it.
[FATAL] Unable to import the 'django' module, do you have Django installed for python 2.6.6?
[FATAL] Unable to import the 'tagging' module, do you have django-tagging installed for python 2.6.6?
[WARNING] Unable to import the 'mod_python' module, do you have mod_python installed for python 2.6.6?
mod_python is one of the most common ways to run graphite-web under apache.
Without mod_python you will still be able to use the built in development server; which is not
recommended for production use.
wsgi or other approaches for production scale use are also possible without mod_python
[WARNING]
Unable to import the 'memcache' module, do you have python-memcached installed for python 2.6.6?
This feature is not required but greatly improves performance.

[WARNING]
Unable to import the 'ldap' module, do you have python-ldap installed for python 2.6.6?
Without python-ldap, you will not be able to use LDAP authentication in the graphite webapp.

[WARNING]
Unable to import the 'txamqp' module, this is required if you want to use AMQP.
Note that txamqp requires python 2.5 or greater.
3 necessary dependencies not met. Graphite will not function until these dependencies are fulfilled.
4 optional dependencies not met. Please consider the warning messages before proceeding.


Por lo que procederemos a instalar lo que esté faltando, la primer línea se refiere al whisper que acabamos de bajar.
Para instalarlo simplemente vamos a la carpeta donde lo descargamos
cd whisper-0.9.10
en mi caso... luego ejecutamos
python setup.py install 
(para instalar los 3 programas se procede igual, se entra en el dir donde se descomprimió y se ejecuta python setup.py install)
Se sigue instalando todo lo que haga falta... y listo...

Carbon

Configurando Carbon

La configuración de Carbon se encuentra en /opt/graphite/conf/carbon.conf en un principio no existe y uno debe crearlo, para facilitar las cosas tiene por defecto un archivo carbon.conf.example con un ejemplo de configuración... en el mismo directorio encontrarás otros archivos con configuraciones. Otro archivo que es necesario para poner a andar el daemon es storage-schemas.conf; una vez configurados arrancamos el daemon con:
/opt/graphite/bin/carbon-cache.py start
los logs quedan en opt/graphite/storage/log/carbon-cache/ es bueno verlos para ver si hay algún error tras lanzar el demonio.
(para agregarlo para que inicie cada vez que se inicia linux agregar esa línea al archivo /etc/rc.local)

Graphite Web App

Inicializar la base de datos

vamos a
cd /opt/graphite/webapp/graphite
y ejecutamos
python manage.py syncdb
Debemos luego verificar que opt/graphite/storage/, opt/graphite/storage/log/webapp/ y opt/graphite/storage/graphite.db tengan permisos de escritura para el usuario de apache y permiso de lectura en opt/graphite/storage/whisper/.
La base de datos que se usa por defecto es sqlite.
Una vez instalado es una buena idea darse una vuelta por /opt/graphite/webapp/graphite y ver el archivo local_settings.py para cambiar lo que sea necesario, por ejemplo yo seteo mi timezone a la de Buenos Aires
TIME_ZONE = 'America/Buenos_Aires'

Configurar Apache

Usaré Apache con wsgi, si aun no está instalado hacemos:
apt-get install libapache2-mod-wsgi
luego agregamos esta línea al httpd.conf (en debian en /etc/apache2/httpd.conf)
LoadModule wsgi_module    modules/mod_wsgi.so
Luego habilitamos el host
cp /opt/graphite/examples/example-graphite-vhost.conf /etc/apache2/sites-available/default
(si no esta el default en /etc/apache2/sites-available/default crearlo y hacer el link en sites-enabled)
ahora entrar en /etc/apache2/sites-available/default y modificar la línea del WSGISocketPrefix por
WSGISocketPrefix /var/run/apache2/wsgi
copiamos el arch de settings, debemos cambiar adentro si queremos usar una base de datos que no sea la por defecto.
cp local_settings.py.example local_settings.py
creamos la base de datos
cd /opt/graphite/webapp/graphite/
python manage.py syncdb

reiniciar el apache
/etc/init.d/apache2 restart
y tendríamos que ver todo andando en el localhost, hagamos una prueba...

Un pequeño script en perl que se conecta con Carbon y manda datos para ver en Graphite, manda números al azar durante 2 hs una vez por minuto.

#!/usr/bin/perl
use IO::Socket::INET;
use strict;

my($carbon_server) = '<la ip de su serv>';
my($carbon_port) = <el puerto en gral 2003>;
my ($path) = "pancho.y.z";
my ($dato) = "";
my ($i) = 0;

my($sock) = IO::Socket::INET->new (
 PeerAddr => $carbon_server,
 PeerPort => $carbon_port,
 Proto => 'tcp'
);
die "Unable to connect: $!\n" unless ($sock->connected);
for ($i = 0; $i < 120; $i++)
{
 $dato = $path . " " . int(rand(11)) . " " . time . "\n";
 print $dato;
 $sock->send($dato);
 sleep(60);
}
$sock->shutdown(2);


lunes, 13 de agosto de 2012

GLPI & Fusion Inventory

GLPI (Gestion Libre de Parc Informatique, algo así como Gestionador Libre del Parque Informático), es, según su web un software libre distribuido bajo licencia GPL, que facilita la administración de recursos informáticos. GLPI es una aplicación basada en Web escrita en PHP, que permite registrar y administrar los inventarios del hardware y el software de una empresa.

GLPI incluye también software de mesa de ayuda para el registro y atención de solicitudes de servicio de soporte técnico, con posibilidades de notificación por correo electrónico a usuarios y al mismo personal de soporte, al inicio, avances o cierre de una solicitud.

Las principales funcionalidades de GLPI están articuladas sobre dos ejes:

1) el inventario preciso de todos los recursos informáticos, y el software existente, cuyas características se almacenan en bases de datos.

2) administración e historiales de las diferentes labores de mantenimiento y procedimientos relacionados, llevados a cabo sobre esos recursos informáticos.

Este soft que estuve probando tiene toda la funcionalidad necesaria para manejar el inventario completo del hardware y el software de una organización, su manejo es fácil e intuitivo.

Instalación GLPI

Para instalar el soft, se puede descargar de la web http://www.glpi-project.org/ en la sección Downloads.
Luego de haberlo bajado su instalación es bastante simple, necesitamos tener le lenguaje PHP y un servidor MySQL instalado, funciona tanto en Linux como en Windows (por ejemplo usando WAMP en windows).  Una vez bajado, descomprimimos el archivo en la carpeta web de nuestro servidor (en linux var/www generalmente); al descomprimirse el GLPI queda en una carpeta llamada glpi. Una vez hecho esto, si entramos en localhost/glpi podemos ver la pantalla de instalación.
Durante la instalación, que es casi automática, se le pedirán algunos datos, como el acceso a la base de datos y se verificará que el servidor tenga lo necesario (permiso de escritura en varios directorios, tal vez alguna configuración en php, etc.). Sin mayores problemas se instala en unos 5 minutos, luego ya podremos entrar en htt.://localhost/glpi y ver el sistema ya en funcionamiento con los usuarios por defecto.

Fusion Inventory

Fusion Inventory es un software que tiene la función de obtener los la información del software y hardware instalado en sus computadoras. También dispone de un plugin que funciona con GLPI (también con OCSInventory) y sirve para transferir la información obtenida de cada máquina al GLPI.
Para ello FusionInventory cuenta con:
  1. Un agente (Fusion Inventory Agent) que se instala en cada máquina. Funciona tanto en entornos Linux como Windows, está programado en Perl y es de muy simple instalación y configuración.
  2. Un plugin que se agrega facilmente a GLPI que recibe la información de los agentes instalados en las máquinas y tiene la capacidad de escanear las redes a las que se encuentre conectado descubriendo impresoras y otros hardwares/softwares conectados a sus redes.

Plugin Fusion Inventory For GLPI 

El plugin fusioninventoryforglpi se baja de http://www.fusioninventory.org/ y se instala facilmente, solo hay que descomprimir el archivo bajado en la carpeta plugins de glpi y luego entrar en el sistema GLPI ->Configuración->Plugins.
Una vez allí tendrá la opción de ir instalando y actualizando los diferentes plugins (son 4). Al hacerlo verá que uno de los plugins requiere tener el plugin glpi-webservices instalado, para ello debe bajarlo de la página de plugins (a la que puede acceder también desde (GLPI ->Configuración->Plugins->See the catalogs of plugins) e instalarlo descomplimiendolo en la carpeta plugins igual que hizo antes (lo mismo es para cualquier plugin).
Una vez instalados estos plugins podrá acceder a los mismos desde GLPI->Plugins->Fusion Inventory o bien Web Services.

Deploy

Deploy es una de las características más interesantes que trae Fusion Inventory, ella permite pasar archivos a las pcs de la red que tengan instalado el agente, instalar o desinstalar programas en las mismas, ejecutar comandos, etc.
Se ingresa a la misma por GLPI->Plugins->Fusion Inventory->Deploy->Package Management->Add a package (para agregar uno nuevo). Una vez allí aparecen dos solapas: Installation y Unninstallation. Ambas solapas presentan 3 secciones: List of checks (lo que se debe chequear antes de seguir la tarea), Files to copy on computer (los archivos que se quieren pasar a la/s computadoras y Actions to archieve (lo que se debe hacer una vez pasados los archivos).

Los archivos a pasar pueden subirse desde el browser o bien pasarlos por ftp al servidor (cuando sean mas grandes que el máximo que permita el servidor). Para cambiar el tamaño por defecto que pueden subirse los archivos se hace en /etc/php5/apache2/php.ini por defecto es 2. Cuando se suben archivos para bajar desde el server, se deben subir a /var/www/cd glpi/files/_plugins/fusinvdeploy/upload por defecto, esto se configura desde Plugins ->Fusion Inventory->Configuración (de la botonera de arriba); solapa Fusion Inventory Deploy.

Fusion Inventory Agent


Cliente en linux


Se baja de http://prebuilt.fusioninventory.org/stable/ ver la versión del SO requerida, se corre directamente desde el directorio en que se descomprime.
O bien se instala desde synaptic o con


apt-get install fusioninventory-agent



es el agente principal, otras características se instalan con:

apt-get install libfusioninventory-agent-task-ocsdeploy-perl


apt-get install libfusioninventory-agent-task-netdiscovery-perl


apt-get install libfusioninventory-agent-task-snmpquery-perl 


La configuración se hace desde agent.cfg en el directorio donde se descomprimió, o si se instaló con apt en /etc/fusioninventory/agent.cfg. En la configuración, cambiar el valor de server por http://<el nombre de su servidor>/glpi/plugins/fusioninventory/front/plugin_fusioninventory.communication.php por defecto trae otro valor que sirve para que funcione el inventario, pero no funciona el deploy.
El cliente deja un log en /var/log/fusioninventory.log muy útil para ver errores y como trabaja el programa.

Cliente en windows

Los datos de configuración se pueden cambiar desde la registry (ejecutar regedit) hkey_local_machine->software->FusionInventory-Agent
Cambiar el valor de server por http://<el nombre de su servidor>/glpi/plugins/fusioninventory/front/plugin_fusioninventory.communication.php por defecto trae otro valor que sirve para que funcione el inventario, pero no funciona el deploy. *1
Revisar luego de instalar que el directorio Program Files/FusionInventory-Agent/var tenga permiso de escritura y también e el archivo agent-log o su directorio para crearlo (Program Files/FusionInventory-Agent)
En windows el log del agente queda en C:\Program Files\FusionInventory-Agent

*1 - Ahora en nuevas versiones del GLPI (del plugin fusioninventory) agregaron una muy útil configuración que nos permite elegir en qué carpeta van a recibirse los datos que envía el agente eso podemos cargarlo en Inicio -> Plugins -> FusionInventory -> Configuración general en el campo Service URL de la pestaña Configuración General, para la configuración que estoy armando en este ejemplo debo poner "http://<el nombre de su servidor>/glpi/".
Es importante para la gente que actualiza de versiones anteriores (como me paso a mi) que carguen ese valor ya que al actualizar (por lo menos a mí) me quedo vacío y no recibía los datos de los agentes.

Ver el estado del FusionInventory-Agent

Bueno,  una vez instalado el agente uno puede ir a la página http://localhost:62354 y ver el estado del Agente de Fusion Inventory, ahí aparece una pagina simple que indica la próxima vez que se va a contactar al servidor, el estado actual del agente y también nos da la posibilidad de lanzar un inventario manualmente haciendo click en "Force an inventory".
También podemos lanzar un inventario por medio de la línea de comandos, entrando en windows en c:/Archivos de programa/FusionInvenotry-Agent/perl/bin
y ejecutando 
perl.exe fusioninventory-agent --h
podemos ver la ayuda del agente que nos indicará como llamarlo con sus diferentes opciones y para qué sirve cada una de ellas.






jueves, 19 de julio de 2012

Cómo convertir una solución o proyecto de C# a VB.NET automáticamente

Muchas páginas permiten pasar pedazos de código de VB.Net a C# y viceversa, pero cuando uno tiene un proyecto o solución grande, utilizar éstas páginas para convertir de lenguaje suele ser tedioso y lento. Por eso para pasar una solución completa tuve que ponerme a buscar una mejor opción....
Luego de buscar bastante por internet encontré una mejor forma de hacerlo.
Para poder hacerlo hay que bajar un interesante programa de internet que se llama SharpDevelop (al momento de escribir este artículo en su version 4.2).

SharpDevelop es un interesane IDE de desarrollo en tecnología .NET el cual es gratuito y open-source, dispone de varios lenguajes para desarrollar (C#, VB.NET, C++, F#, Python, Ruby y algunas cosas más)... Es verdaderamente muy liviano y anda muy rápido, aunque lo utilicé poco le encontre un solo defecto importante: no permite, al estar haciendo debug modificar el código y seguir debuguiando (a no ser que reinicie el debug), esto se debe a que (según leí en sus foros) el compilador .NET de Microsoft no tiene abierta la posibilidad de hacer esto (se me ocurre que así Microsoft se asegura que nadie pueda hacer un IDE mejor, o que le pueda competir al Visual Studio)...

Bueno, el tema es que este IDE, entre otras funcionalidades tiene la de convertir Proyectos enteros de un lenguaje a otro de los que tiene para desarrollar. :-)

Por ejemplo para pasar de C# a .NET mi proyecto hago lo siguiente, abro mi solución con SharpDevelop y en la solapa projects selecciono el proyecto a convertir y con botón derecho->Convert->From C# to VB.NET lo convierto y me deja una copia convertida del proyecto con el mismo nombre pero agregando .Converted... GENIAL!!!

Deja algún que otro pequeño error o advertencia, pero no muchas y fáciles de solucionar. Lo único que tardé un poco en darme cuenta fue que deja los Resources en
Global.<nombre proyecto>.Properties.Resources.<recurso>

cuando debería dejarlos en
Global.<nombre proyecto>.Resources.<recurso>

O sea sin el properties... 
También que a algunos controles se "olvida" de ponerles el WithEvents cuando tienen eventos...
En algunas páginas deja los "Option Strict On" "Option Explicit On" sin estar exactamente al principio, lo cual genera algunos errores.
... Fuera de eso y alguna que otra advertencia ¡Compilo y anda!

jueves, 12 de julio de 2012

Cómo convertir una solución de Visual Studio 2010 a 2008

Convertir una vieja solución de VS 2008 a VS 2010 es bastante fácil, se convierte automáticamente al abrirla con el nuevo VS, pero volver de uno en 2010 a ponerlo en 2008 no es tan simple (aunque tampoco es muy complicado).
E aquí los pasos a seguir...
  1. Abra en el notepad, o en el programa de edición de texto que más le guste, en mi caso el NotePad++ (np++ http://notepad-plus-plus.org/) el archivo de la solución (el que termina en .sln).
  2.  Busque la línea que dice "Microsoft Visual Studio Solution File, Format Version 11.00" y reemplace por "Microsoft Visual Studio Solution File, Format Version 10.00" (o sea, cambie la versión de 11 a 10.
  3. Busque la línea que dice "# Visual Studio 2010" y ponga "# Visual Studio 2008" (o sea, cambie 2010 por 2008.
  4. Busque con el explorador de windows y abra la carpeta "obj\x86\Debug" (se encuentra dentro de la carpeta de su proyecto), allí debe eliminar los archivo terminados en .chache.
  5. También busque y elimine los archivos .cache en la carpeta "obj\x86\Release"
  6. ¡Listo! ya puede abrir su solución en VS 2008.
 Espero les sirva de ayuda :-).

Problemas que surgieron en algunos proyectos usando este método y como solucionarlos...
Tiro un mensaje 'Container' is ambiguous in the namespace 'System.ComponentModel': lo solucione quitando la referencia a System dentro de Referencias y luego agregándola nuevamente. (!?)





miércoles, 11 de julio de 2012

Obtener la posicion de un control respecto al parentform

Bueno, aquí un breve código que utilicé para obtener la posición de un control WinForm con respecto a su ParentForm, es útil si se quieren poner controles dinámicamente dentro de un formulario y cambiar su posición (por ejemplo posicionándolo al lado de otro control)... con c# .Net



using System.Drawing;
using System.Windows.Forms;

...

public   class UserControlGeneral : UserControl
    {
        /// <summary>
        /// Busca el Point donde está ubicado el control respecto del ParentForm
        /// </summary>
        /// <returns>Point</returns>
        protected Point buscarLocationRespectoParentForm()
        {
            return buscarLocationRespectoParentForm(this);
        }

        /// <summary>
        /// Busca el Point donde está ubicado el control que recibe de parámetro respecto del ParentForm
        /// </summary>
        /// <param name="control">Control al que se le quiere encontrar la posición</param>
        /// <returns>Point</returns>
        protected Point buscarLocationRespectoParentForm(Control control)
        {
            if (control.Parent == this.ParentForm)
            {
                return new Point(control.Location.X, control.Location.Y);
            }
            else
            {
                Point p = buscarLocationRespectoParentForm(control.Parent);
                p.X += control.Location.X;
                p.Y += control.Location.Y;
                return p;
            }
        }
    }





domingo, 24 de junio de 2012

Cómo ver si un programa está instalado en nuesta PC

Utilizando el registro de windows se pueden ver todos los programas instalados en nuestra máquina (o cualquier texto que esté en la registry de windows). El código que sigue a continuación se desarrolló para buscar una serie de programas instalados en un cliente.

El llamado al método de búsqueda es algo del estilo:
reg.buscarEnLaRegistry(Registry.LocalMachine.OpenSubKey(@"SOFTWARE"), busqueda);

Siendo busqueda:
private List<RegistroWindows.itemBuscar> busqueda;

Y siendo reg
RegistroWindows reg = new RegistroWindows();

Como notarán uso Registry.LocalMachine.OpenSubKey(@"SOFTWARE") solo buscando en el nodo SOFTWARE de la registry ya que allí se encuentra el soft instalado.


using System;
using System.Collections.Generic;
using Microsoft.Win32;

namespace ProgramasInstalados.Clases
{
    /// <summary>
    /// Clase para trabajar con el registro de windows
    /// </summary>
    public class RegistroWindows
    {
        /// <summary>
        /// Item a buscar
        /// </summary>
        public class itemBuscar
        {
            /// <summary>
            /// Nombre del item o texto a buscar
            /// </summary>
            public string Nombre { get; set; }
            public bool Encontrado { get; set; }
            public string Paths { get; set; }
            public itemBuscar(string nombre)
            {
                Nombre = nombre;
                Encontrado = false;
                Paths = "";
            }
        }


        /// <summary>
        /// Busca un texto en la registry
        /// </summary>
        /// <param name="registryKey">Clave del registro donde se realiza la busqueda (y en sus nodos hijo)</param>
        /// <param name="buscar">Lista de items a buscar del tipo itemBuscar</param>
        public void buscarEnLaRegistry(RegistryKey registryKey, List<itemBuscar> buscar)
        {
            foreach (string keyName in registryKey.GetSubKeyNames())// me fijo si esta en alguna clave de este nivel
            {
                if (!ignorar(keyName))// solo veo las claves que no estan en la lista de ignorar
                {
                    try
                    {
                        using (RegistryKey rk = registryKey.OpenSubKey(keyName))
                        {
                            foreach (string valueName in rk.GetValueNames())
                            {
                                foreach (itemBuscar item in buscar)
                                {
                                    string path = "";
                                    if ((path = rk.GetValue(valueName).ToString()).ToLower().EndsWith(item.Nombre.ToLower()))// me fijo si tiene el .exe que estoy buscando
                                    {// si no esta NO lo seteo en false porque podria haberlo encontrado antes
                                        item.Encontrado = true;
                                        if (!item.Paths.Contains(path))// me fijo que ya no este cargado
                                        {
                                            item.Paths += path;
                                        }
                                    }
                                }
                            }
                            buscarEnLaRegistry(rk, buscar);// me fijo si esta en alguno de sus hijos
                        }
                    }
                    catch (Exception)
                    {
                    }
                }
            }
        }

        /// <summary>
        /// Verifica si keyName esta en la lista de ignorar (en los settings, sitting Excluir separado por comas)
        /// </summary>
        /// <param name="keyName">el string a buscar para ver si se debe ignorar</param>
        /// <returns>true si se debe ignorar, sino false</returns>
        private bool ignorar(string keyName)
        {
            foreach (string ignorar in ProgramasInstalados.Properties.Settings.Default.Excluir.Split(','))
            {
             // En settings guardo en un string separado por comas los nodos en los que no quiero
             // que se busque dentro de la registry; ya que por ejemplo el nodo Microsoft tiene
             // todos los programas que instalo Microsoft, tambien se puede evitar el nodo Windows
             // ya que tiene los programas propios de windows, entre otros. Esto hace que sea mas
             // rapida la busqueda dentro de la registry, ya que recorrerla completa si no es
             // necesario insumiria bastante tiempo.
                if (ignorar == keyName)
                {
                    return true;
                }
            }
            return false;
        }
    }
}

sábado, 23 de junio de 2012

Cómo ejecutar un programa con .NET C#

Con una simple instrucción se puede ejecutar un programa que esté instalado en nuestra pd desde .NET... con C# son un par de líneas:

try
{
 Process.Start(item.Paths);
}
catch (Exception exception)
{
 MessageBox.Show("Se ha producido un error al intentar abrir el programa." + Environment.NewLine + "Mensaje de error: " + exception.Message;);
}
 
Para que esto funcione hay que usar también: using System.Diagnostics;

viernes, 22 de junio de 2012

Cómo sacar un ícono de un .exe o .dll en .NET con C#

Aquí una pequeña función que sirve para sacar el ícono de un archivo (.exe, .dll) en windows en c#.



using System;
using System.Drawing;
using System.Runtime.InteropServices;
using System.Windows.Forms;

namespace ProgramasInstalados.Clases
{
    /// <summary>
    /// Clase para extraer iconos de ficheros de recursos.
    /// </summary>
    class Iconos
    {

 ...

 ...

 ...

  
     /// <summary>
     /// Devuelve el icono del programa
     /// </summary>
     /// <param name="path">
     /// La ruta del programa al que se le quiere sacar el ícono 
     /// ej: "c:/prog.exe" </param>
     /// <returns>
     /// Un objeto Icon con el icono o null
     /// </returns>
     public static Icon IconDelPrograma(string path)
     {
          Icon icono = null;
          try
          {
              icono = Icon.ExtractAssociatedIcon(path);
          }
          catch
          { //capturo la excepcion
          }
       return icono;
     }

  

 .........


    }
} 



miércoles, 13 de junio de 2012

Crear calendarios sincronizables en gmail usando outlook para compartir con muchos usuarios


Sincronizar calendarios

Pasos

  1. Ir a Google calendar https://www.google.com/calendar/ e ingresar con el usuario de google.
  2. Crear un nuevo calendario. (Mis calendarios → Crear nuevo calendario)
  3. Agregar las personas que se quiere que vean el calendario y darle los permisos necesarios (deben tener cuentas de gmail)
  4. Click en Crear calendario para crearlo
  5. Ir al calendario, click sobre la flecha que aparece al lado y hacer click en “Compartir calendario”.
  6. Ir a Configuración → Configuración y después a la solapa calendarios donde hacemos click en el calendario que queremos compartir.
  7. Hacer click en el botón ical que aparece abajo en verde y aparecerá un popup que tiene la url para compartir el calendario.
  8. Si se hace click directamente en la url permite abrirla con el outlook y ver el calendario.
  9. Si no se usa esa opción se puede ir al outlook y...
    1. Ir a Herramientas → Configuración de la cuenta.
    2. Elegir la solapa Calendarios e internet
    3. Hacer click en nuevo y se abre un popup para ingresar la url copiada

miércoles, 25 de enero de 2012

¡No me digas que era eso!!!

Este es uno de esos errores tontos que pueden hacer perder mucho tiempo al programador.
Bueno, resulta que desarrollé un template (plantilla) para Joomla para un sitio web. En mi máquina local del laburo tengo instalado wamp para desarrollar en php. El tema es que hice todo mi sitio y una vez funcionando lo publicamos en el servidor.
Al publicarlo, lamentablemente, la planilla no se ve y aparece un mensaje de error: "Error. La plantilla no está disponible para esta presentación. Por favor, contacte con un administrador del sitio.".
Tras mucho maldecir y hacer distintas pruebas descubro cuál es el problema:
El tema vino por el lado de que linux es case sensitive en los archivos (diferencia entre mayúsculas y minúsculas), no así windows; por lo que si la plantilla se llama "MiPlantilla" o "miplantilla" en windows es indistinto, pero en linux no.
Cuando se tiene una plantilla en Joomla la misma va en el directorio templates en un directorio con el nombre de la plantilla. El nombre del directorio debe ser idéntico al de la plantilla para que funcione en linux, también revisar el xml de la plantilla que tenga el mismo nombre.