Instalar Firefox 7 en Fedora 14 y Fedora 15


Dado que Firefox 7 aún no está disponible para instalar desde los repositorios oficiales de Fedora 14 y Fedora 15, aqui dejamos como hacerlo utilizando el repositorio remi.

Fedora 14:
Descargamos el paquete de instalación del repositorio remi y lo instalamos para poder utilizar por yum:
$ wget http://rpms.famillecollet.com/remi-release-14.rpm
#  rpm -i remi-release-14.rpm
luego hacemos simplemente:
# yum —enablerepo=remi update firefox

Fedora 15:
Descargamos el paquete de instalación del repositorio remi y lo instalamos para poder utilizar por yum:
$ wget http://rpms.famillecollet.com/remi-release-15.rpm

# rpm -i remi-release-15.rpm
luego:
# yum —enablerepo=remi update firefox

Eso es todo !

C# tcp listener multithreading / multiple connections


Hace un tiempo “el negro” me había pedido el tcp listener modo consola… ahora necesitaba una mejora para que acepte multiples conecciones, dado que el anterior, solo aceptaba una.
No pude encontrar nada concreto que funcionara en la web, asi que me tuve que poner a hacer el trabajo pesado: un rejunte de código para obtener un tcp listener multithreading.
El resultado es este:

Program.cs:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace tcplistener_console
{
    class Program
    {
        static int Main(string[] args)
        {
            Console.Write(“tcplistener by hvivani – 20110225 – para el negro: \r\n”);
            if (args.Length == 0)
            {
                System.Console.WriteLine(“Parametros: Puerto IP   \r\n”);
                System.Console.WriteLine(“Ejemplo: tcplistener 2525 127.0.0.1  \r\n”);
                System.Console.WriteLine(“si tenes mas de una interfaz de red, usa la ip de dicha interfaz.  \r\n”);
                return 1;
            }
            else
            {
                multicnnNew.iniciar(args[0], args[1]);
                return 0;
            }

        } 
    }
}


multicnnNew.cs:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Net;
using System.Net.Sockets;
using System.Threading;

namespace tcplistener_console
{
    public class multicnnNew
    {
        // Thread signal.
        public static ManualResetEvent clientConnected = new ManualResetEvent(false);

        public static void iniciar(string puerto, string addr)
        {
            IPAddress localAddr = IPAddress.Parse(addr);
            TcpListener server = new TcpListener(localAddr, int.Parse(puerto));
            server.Start();

            server.BeginAcceptTcpClient(AcceptCallback, server);
            clientConnected.WaitOne();
        }

        private static void AcceptCallback(IAsyncResult ar)
        {
            TcpListener server = (TcpListener)ar.AsyncState;
            ClientState state = new ClientState();

            // Once the accept operation completes, this callback will
            // be called.  In it, you can create a new TcpClient in much
            // the same way you did it in the synchronous code you had:

            state.client = server.EndAcceptTcpClient(ar);

            // We’re going to start reading from the client’s stream, and
            // we need a buffer for that:

            state.buffer = new byte[4096];

            // Note that the TcpClient and the byte[] are both put into
            // this “ClientState” object.  We’re going to need an easy
            // way to get at those values in the callback for the read
            // operation.

            // Next, start a new accept operation so that we can process
            // another client connection:

            server.BeginAcceptTcpClient(AcceptCallback, server);

            // Finally, start a read operation on the client we just
            // accepted.  Note that you could do this before starting the
            // accept operation; the order isn’t really important.

            state.client.GetStream().BeginRead(state.buffer, 0, state.buffer.Length, ReadCallback, state);
        }

        private static void ReadCallback(IAsyncResult ar)
        {
            ClientState state = (ClientState)ar.AsyncState;
            int cbRead = state.client.GetStream().EndRead(ar);

            if (cbRead == 0)
            {
                // The client has closed the connection
                return;
            }
            //else
            //{
                //Console.WriteLine(“hay datos”);
            //}

            // Your data is in state.buffer, and there are cbRead
            // bytes to process in the buffer.  This number may be
            // anywhere from 1 up to the length of the buffer.
            // The i/o completes when there is _any_ data to be read,
            // not necessarily when the buffer is full.

            // So, for example:

            string strData = Encoding.ASCII.GetString(state.buffer, 0, cbRead);
            Console.WriteLine(strData);

            // For ASCII you won’t have to worry about partial characters
            // but for pretty much any other common encoding you’ll have to
            // deal with that possibility, as there’s no guarantee that an
            // entire character will be transmitted in one piece.

            // Of course, even with ASCII, you need to watch your string
            // terminations.  You’ll have to either check the read buffer
            // directly for a null terminator, or have some other means
            // of detecting the actual end of a string.  By the time the
            // string goes through the decoding process, you’ll have lost
            // that information.

            // As with the accept operation, we need to start a new read
            // operation on this client, so that we can process the next
            // bit of data that’s sent:

            state.client.GetStream().BeginRead(state.buffer, 0, state.buffer.Length, ReadCallback, state);
        }
    }
}

ClientState.cs:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net.Sockets;

namespace tcplistener_console
{
    public class ClientState
    {
        public TcpClient client;
        public byte[] buffer;
    }
}

Estas son las clases necesarias para crear un proyecto en modo consola.
y, como diría “el negro”: 
SALUTE !

Grabar NULL con DataEnvironment en VB6


Supongamos que tenemos la siguiente estructura en una tabla de SQL Server (2000,2005,2008):

id    numeric(18, 0)    
descripcion    numeric(18, 0)   
Minimo    float    Allow Nulls

Maximo    float    Allow Nulls


Y asociamos un comando en un dataenvironment para hacer un insert en esa tabla, algo asi:

insert into pruebaMinMax (id, descripcion, Minimo, Maximo) values (?,?,?,?)


Si queremos grabar un valor NULL en los campos Minimo y Maximo vamos a obtener un error “Uso inválido de NULL” dado que el comando espera un “valor” en ese parámetro.
Para que me permita grabar un valor nulo, debo modificar el Comando y en los parámetros de Minimo y Maximo establecer las siguientes opciones:
Tipo de Datos del Host: Variant (VT_VARIANT)
Necesario: False

Con estos valores vamos a poder grabar valores null en los campos de nuestra tabla.


Error al hacer commit con Tortoise SVN – Error 403 Forbidden


Durante un buen tiempo he estado buscando la solición a este problema.
El tema es que luego de hacer algún cambio nos comienza a dar este error el Tortoise al tratar de hacer commit de cambios en el servidor. Los usuarios y sus permisos están chequeados y podemos hacer un update, pero al tratar de commitear los cambios obtenemos el famoso forbidden.
El tema está en que el servidor SVN maneja las cadenas de path en modo case SENSITIVE y Windows es case INSENSITIVE, es decir, que las rutas del path deben respetarse en mayúsculas y minúsculas tal cuál existen en el servidor.
Por ejemplo, si el servidor define:
http://servidor.com/MiRepo
el cliente que tenga http://servidor.com/mirepo comenzará a dar forbidden al hacer commit.
La solución es hacer un relocate y colocar definir el path de la misma manera que en el servidor: http://servidor.com/MiRepo

Espero que esto sirva para ahorrar tiempo a unos cuantos !!

OpenOffice 3 / LibreOffice: No se puede iniciar la aplicación. [context=”user”] caught unexpected exception!


No he podido establecer si este error es un bug o algún problema con NFS al producirse algún corte de red que pueda dejar archivos lockeados. El tema es que resulta imposible abrir la aplicación.

La solución que encontré, como alternativa a reinstalar el openoffice es la siguiente:

1) Revisar con un ps -ef|grep openoffice cualquier instancia corriendo y matarla: kill -9 PID
2) Renombrar la carpeta /home/[username]/.libreoffice/3/user a /home/[username]/.libreoffice/3/user.bak
3) Volver a ejecutar el openoffice / libreoffice: al abrir la aplicación vuelve a crear los directorios del usuario.

Si alguien encontró una explicación o solución mas ortodoxa me avisa … 😉

Teclado desactivado / bloqueado al iniciar sesión de usuario


Nos ocurrió que en un equipo con Fedora y KDE, al iniciar la sesión de usuario, el teclado dejaba de responder por completo.
El mouse funcionaba correctamente, iniciar sesión en otros usuarios funcionaba correctamente.
Solo para ese usuario, el teclado no funcionaba !!
Después de buscar las posibles causas un buen rato encontramos que involuntariamente se había habilitado una opción de accesibilidad llamada “Slow Keys” (teclas lentas) que lo que hace es que para que el sistema detecte la presión de una tecla, esta debe mantenerse presionada por un determinado período de tiempo.
Esta configuración puede habilitarse/deshabilitarse en:

Sistema –>Preferencias –>Teclado –>Accesibilidad

O directamente desde el teclado: sosteniendo la tecla “Shift” durante 8 segundos.

Es muy probable que el usuario, haya sostenido involuntariamente la tecla shift durante 8 segundos y al aparecer el cartel que pregunta si desea habilitar “Slow Keys” haya puesto “Si”.

Instalar Firefox 4 en Fedora 14


Dado que Firefox 4 aún no está disponible en los repositorios oficiales de Fedora 14, podemos instalarlo utilizando los repositorio Spot:

Instalamos el repo:
$ su -c ‘wget http://repos.fedorapeople.org/repos/spot/firefox4/fedora-firefox4.repo -O /etc/yum.repos.d/fedora-firefox4.repo’

Instalamos Firefox 4:
$ su -c ‘yum –enablerepo fedora-firefox4 install firefox4’

Con esto ya tenemos instalado el Firefox 4 en Fedora 14





Implementación de Factura Electrónica utilizando Software Libre


La implementación Factura Electrónica para Mercado Interno o Exportación en Argentina puede  realizarse utilizando SL.
El código fuente desarrollado en Python se encuentra disponible en Google Code.
Este es un desarrollo de la gente de Sistemas Agiles que ha liberado su codigo fuente a la comunidad bajo licencia GPL v3.
Dado que he tenido que implementar esta funcionalidad para algunas empresas dejo estas notas sobre su utilización para WSFEv1 para cualquiera que esté en el mismo baile…
 
 
Servicio Web de Autenticación y Autorización (WSAA)
Este servicio es necesario para acceder al resto de los servicios de negocios (ej. Factura Electrónica) ofrecidos por la AFIP.
Se debe generar un Ticket de Requerimiento de Acceso (TRA), firmarlo criptográficamente (generando un mensaje CMS) que es envía al servicio web para obtener un Ticket de Acceso (TA).
Esta interfase crea el mensaje en XML, lo firma criptográficamente y lo codifica en base-64 como lo requiere la AFIP, por lo que en general no es necesario realizar ninguno de estos pasos.
 
 
 
 
Generar Certificados:
Para poder utilizar la interfase se deben tramitar y asociar los certificados de homologación/producción en la AFIP. 
Pasos para crear el certificado:
  • Generar la clave privada:
    openssl genrsa -out empresa.key 1024
  • Generar el pedido (CSR: certificate signing request) por línea de comando:
    openssl req -new -key empresa.key -out empresa.csr -config afip-openssl.cnf
    • Country Name (2 letter code) [AR]:AR
    • Organization Name (por ej., empresa) [EMPRESA SA]:ingresar nombre de la empresa tal cual figura en la consulta de inscripción, ej.:Empresa S A
    • Common Name (por ej., su nombre) []:ingresar el nombre del servicio, aplicación u unidad operativa, ej:Sistema Facturas
    • Ingrese: CUIT XXXXXXXXXXX (XXXXXXXXXXX es la CUIT sin guiones)ingresarCUIT xxxxxxxxxxx
  • Enviar el empresa.csr a la AFIP para que lo firmen y devuelvan el certificado empresa.crt. Para asociar el certificado de homologación, enviarlo por email a la AFIP (webservices@afip.gov.ar). Para producción, enviarlo por clave fiscal, y descargar el certificado CRT.
 
El archivo afip-openssl.cnf debe configurarse y puede bajarse desde aca.
 
 
 
Paquete de Librerías:
Descargar e instalar en C:\PyAfipWsd el último paquete completo de librerías desde el sitio de descargas por ejemplo http://pyafipws.googlecode.com/files/instalador-PyAfipWs-1.25c-homo.exe
 
 
 
 
 
Uso en Producción
Por diseño, la interfaz COM (pyafipws.py, wsaa.py) y herramientas (rece.py, recex.py y receb.py) funcionan en modo homologación, para habilitar modo producción, por ej. editar la linea #28:
HOMO = True
y cambiarla a:
HOMO = False
De lo contrario, la interfaz no tendrá en cuenta las URLs de los servidores de Producción, aunque sean informadas en CallWSAA y Conectar.
Nota: Esto no aplica a los módulos para Python (wsfe.py, wsfex.py, etc.), pero también por defecto funcionan con URL de homologación.
Lo mismo aplica para WSFEv1 y WSMTXCA.
 
 
Comentarios:
– Poner “False” con mayúsculas.
 
Proyecto PyPDF utilizado para la creación de facturas digitales en formato PDF.