viernes, 26 de febrero de 2010

Instalar Symfony en Windows Vista (con XAMPP)

Siempre he dicho que Windows Vista es malo, y aún lo es. Sin embargo, estos días he estado probando la versión 64bits y, como estoy desarrollando un par de sitios en Symfony, me vi en la obligación de instalarlo. Al principio no fue facil, pero luego de revisar un par de tutoriales, y rescatar lo mejor de cada uno, logré hacerlo de la siguiente forma.
Primero, instalar el servidor web Apache/PHP/MySQL. Para esta ocasión use XAMPP, el cual se puede descargar aquí. Después de instalarlo los pasos para hacer que Symfony ande son los siguientes:

Instalación de Pear

  1. Ir a la consola de comandos. Menú inicio -> Ejecutar -> cmd
  2. Ir a la carpeta de php: cd c:xamppphp
  3. Ejecutar el instalador/configurador de Pear con el comando go-pear.bat


  4. Preguntara si es una copia local. Sólo presionar ENTER


  5. Mostrará una lista de directorios de pear. Presionar ENTER


  6. Se creara el archivo PEAR_ENV.reg en c:xamppphp, el cual debemos ejecutar y confirmar la operación como administrador.


  7. Se habra creado (también en c:xamppphp) el archivo pear.bat. Debemos copiarlo y pegarlo en c:windowssystem32.


  8. Para comprobar que se ha instalado correctamente, ejecutamos el comando pear config-show desde cualquier ubicación, donde mostrará la configuración actual. Si no aparecen errores, todo ok hasta aquí y tenemos Pear instalado.

Instalación de Symfony

  1. En la consola de comandos (Inicio -> Ejecutar -> cmd) agregamos el ‘channel’ de Symfony en Pear ejecutando pear channel-discover pear.symfony-project.com.


  2. Instalar Symfony con el comando pear install symfony/symfony.


  3. Si todo va bien se creará el archivo symfony.bat en c:xamppphp, el cual debemos copiar y pegar en c:windowssystem32 (al igual que con pear.bat).


  4. Como estamos cambiando la ruta desde donde se accede, hay que modificar el symfony.bat que esta en la carpeta system32 para que funcione. Las modificaciones son las siguientes:
     

Esta es otra configuración
 @echo off
rem *************************************************************
rem ** symfony CLI for Windows based systems (based on phing.bat)
rem *************************************************************
rem This script will do the following:
rem - check for PHP_COMMAND env, if found, use it.
rem   - if not found detect php, if found use it, otherwise err and terminate
if "%OS%"=="Windows_NT" @setlocal
rem %~dp0 is expanded pathname of the current script under NT
set SCRIPT_DIR="C:\php\" aqui cambie la ruta de mi php 
goto init
:init
if "%PHP_COMMAND%" == "" goto no_phpcommand
if "%SCRIPT_DIR%" == "" (
  %PHP_COMMAND% "symfony" %*
) else (
  %PHP_COMMAND% "%SCRIPT_DIR%\symfony" %*
)
goto cleanup
:no_phpcommand
rem echo ------------------------------------------------------------------------
rem echo WARNING: Set environment var PHP_COMMAND to the location of your php.exe
rem echo          executable (e.g. C:\PHP\php.exe).  (assuming php.exe on PATH)
rem echo ------------------------------------------------------------------------
set PHP_COMMAND=C:\php\php.exe aqui tambien cambie la ruta de php.exe 
goto init
:cleanup
if "%OS%"=="Windows_NT" @endlocal
rem pause
  1. Si todo esta bien, al ejecutar el comando symfony desde cualquier ubicacion deberiamos encontrar la lista de comandos, como muestra la siguiente imagen.


  2. Tambien se debe instalar el paquete phing, con el comando pear install phing/phing
  3. Es imporante actualizar pear y todos los paquetes que dependen de el. Para esto basta con ejecutar el comando pear upgrade-all
  4.  Notas: para el problema de instalacion de phing primero debes ejecutar :
    pear channel-discover pear.phing.info
    y luego
    pear install phing/phing
  5. Con todo esto ya tenemos instalado symfony en nuestro PC.

Configuracion de Virtual Host en apache.

Es muy util, cuando desarrollamos distintos proyectos, que cada uno funcione de forma independiente. Esto es sencillo gracias a los vhosts de apache. Para configurar, seguir los siguientes pasos:
  1. Abrir el archivo de configuracion de vhosts de apache, el cual esta en c:xamppapacheconfextrahttpd-vhosts.conf.
  2. Descomentar la linea que dice ##NameVirtualHost *:80 quedando sólo NameVirtualHost *:80


  3. Agregar los permisos para la carpeta de symfony sf.


  4. Para cada proyecto agregar el virtual host de la siguiente forma.


  5. Al guardar los cambios, hay que reiniciar el servidor apache para que tengan efecto. Para esto ir al panel de control de XAMPP, detener apache, e iniciarlo nuevamente.
  6. Finalmente, para que el navegador nos reconozca la ruta a nuestro virtual host, respondiendo a la dirección http://nombreproyecto (lo que pusimos en la opcion ServerName del virtual host) debemos editar el archivo hosts que esta en c:windowssystem32driversetchosts, por supuesto como Administrador.


  7. Si todo va bien, al guardar los cambios ya podremos acceder a nuestro proyecto a través del navegador con la direccion http://nombreproyecto.
Este pequeño how-to esta pensado en alguien que conoce el funcionamiento de windows, servidores web, php y sabe que es y para que sirve Symfony. Cualquier error o agregado es bien recibido.

 Post Original tomado de http://davidvega.net/2008/04/26/instalar-symfony-en-windows-vista-con-xampp/

Este manual tambien sirve para instalar symfony sin xampp, solo debes cambiar las rutas donde está php.

viernes, 19 de febrero de 2010

Google - moreplusplus - Scrip para greasemonkey

// ==UserScript==
// @author jazdian
// @version 1.0.0
// @namespace http://programadoresmx.blogspot.com/
// @description Google - Agrega un link al menu de google, con un submenu con links a paginas web reconocidas.
// @name moreplusplus
// @namespace http://programadoresmx.blogspot.com/
// @include http://www.google.tld/webhp?*
// @include http://www.google.tld/search?*
// @include http://www.google.tld/ig?*
// @include http://www.google.tld/
// @include http://www.google.tld/#*
// @include http://www.google.com*
// @include http://*.google.*
// @include https://*.google.*
// @include https://mail.google.com*
// ==/UserScript==

//alert('');
//Variable de posición X para colocar el menu en la posicion requerida
var PosX;
var PosY;

//acceder a el elemento Id 'gbar'
var MenuGoogle = document.getElementById('gbar');

var ElBody = document.getElementById('body');
ElBody.addEventListener("click", OcultarDiv, false);


//Función para mostrar el DIV con los links
function MostrarDiv() {
//alert(PosX);
EleDiv.style.left = PosX + "px";
EleDiv.style.top = PosY + 21 + "px";
EleDiv.style.right = "auto";
EleDiv.style.visibility = "visible";
}

function OcultarDiv() {
//alert(PosX);
EleDiv.style.left = PosX + "px";
EleDiv.style.top = PosY + 21 + "px";
EleDiv.style.right = "auto";
EleDiv.style.visibility = "hidden";
}

//Crear elemento
var a = document.createElement('A');
a.className = ('gb3');
a.setAttribute('aria-haspopup', true);
a.addEventListener("click", MostrarDiv, false);
a.style.marginLeft = "5px";
a.setAttribute('href', '#');



//Crear elemento u
var u = document.createElement('U');
var txtU = document.createTextNode('more');
u.appendChild(txtU);
u.style.marginRight = "5px";

a.appendChild(u);


//Crear elemento Small
var Small = document.createElement('SMALL');
var txtSmall = document.createTextNode('++');
Small.appendChild(txtSmall);

a.appendChild(Small);

MenuGoogle.firstChild.appendChild(a);

var EleDiv = document.createElement('DIV');
EleDiv.className = ('gbm');
EleDiv.style.backgroundColor = "#FE9A2E";

//******Obtener la posición del DIV**********
PosX = u.offsetLeft;
PosY = u.offsetTop;


var CrearLink = new Array();
var TextoLink = new Array();
//Para agregar las etiquetas del link
var VarEtiqueta = new Array('Yahoo Search', 'Bing', 'Ask', 'Altavista', 'Mooter', 'Clusty', 'Dogpile', 'Turbo10', 'Lycos',
                            '.....', 'Facebook', 'Twitter', 'Yahoo Answers', 'Hi5', 'MySpace', 'Orkut',
                            '.....', 'Yahoo', 'AOL');
//Para agregar la direccion url a la que va dirigida la etiqueta
var VarURL = new Array('http://www.search.yahoo.com/', 'http://www.bing.com/', 'http://www.ask.com/',
                    'http://www.altavista.com/', 'http://mooter.com/', 'http://clusty.com/',
                    'http://www.dogpile.com/', 'http://turbo10.com/', 'http://www.lycos.com/',
                    '#', 'http://www.facebook.com/', 'http://twitter.com/', 'http://answers.yahoo.com/',
                    'http://www.hi5.com/', 'http://www.myspace.com/', 'http://www.orkut.com/Main#Home',
                    '#', 'http://www.yahoo.com/', 'http://www.aol.com/');
//La cantidad de links

var i = VarEtiqueta.length - 1;

var x;
for (x = 0; x <= i; x++) {
    CrearLink[x] = document.createElement('A');
    TextoLink[x] = document.createTextNode(VarEtiqueta[x]);
    CrearLink[x].appendChild(TextoLink[x]);
    CrearLink[x].setAttribute('href', VarURL[x]);
    CrearLink[x].className = ('gb2');
    EleDiv.appendChild(CrearLink[x]);
}



//*********************************

MenuGoogle.firstChild.appendChild(EleDiv);

//*****************************

martes, 16 de febrero de 2010

Crear controles en tiempo de ejecucion con ASP.NET (Insertar datos en SQL Server)

//Creación de controles en tiempo de ejecución basado en una tabla de sql server

//Creamos un array de controles
Public TextBox[] LabelArrayIdProd, LabelArrayProd, TBArrayInvTot
TextBox labelIdProd, labelProd, TBInvTot
 //Varible para generar n cantidad de controles
static int CantidadRegistros = 0;

    protected void Page_Load(object sender, EventArgs e)
    {
        if(!IsPostBack)
       {
            CrearControles();
             this.NumberOfControls = 1;
      }
    }

        protected int NumberOfControls
    {
        get { return (int)ViewState["NumControls"]; }
        set { ViewState["NumControls"] = value; }
    }

        protected override void CreateChildControls()
    {
        // Aqui estamos recreando los controles para que se mantengan en cada post back
            if (this.NumberOfControls == 1)            {
                CrearControles();
            }
            else
            {
                return;
            }
   }

//Creamos los controles
    protected void CrearControles()
    {
        //************************************************************
        string GenerarProductos;
 
        GenerarProductos = "SELECT idconsecutivo, producto FROM ConnProductos2  "
                                + "ORDER BY idconsecutivo";
        DataTable dt;
        OleDbDataAdapter da;
        da = new OleDbDataAdapter(GenerarProductos, MiConeccion);
        dt = new DataTable();
        da.Fill(dt);
        CantidadRegistros = Convert.ToInt16(dt.Rows.Count);
        //********************************************************
        LabelArrayIdProd = new TextBox[CantidadRegistros];
        LabelArrayProd = new TextBox[CantidadRegistros];
        TBArrayInvTot = new TextBox[CantidadRegistros];

        for (int i = 0; i < CantidadRegistros; i++)
        {
            labelIdProd = new TextBox();
            labelIdProd.ID = "LabelID" + i;
            LabelArrayIdProd[i] = labelIdProd;
            this.Panel1.Controls.Add(labelIdProd);
            //Dar un formato por medio de una hoja de estilo
            LabelArrayIdProd[i].CssClass = "ClaseEtiquetasId";
            //Le asignamos un valor a la etiqueta desde la tabla de nuestra base
            LabelArrayIdProd[i].Text = dt.Rows[i]["idconsecutivo"].ToString();
            LabelArrayIdProd[i].Enabled = false;
            this.Panel1.Controls.Add(new LiteralControl("
"));
            //***************************************************************
            labelProd = new TextBox();
            this.labelProd.ID = "LabelProd" + i;
            LabelArrayProd[i] = labelProd;
            this.Panel2.Controls.Add(this.labelProd);
            LabelArrayProd[i].CssClass = "ClaseEtiquetasProd";
            LabelArrayProd[i].Text = dt.Rows[i]["Producto"].ToString();
            LabelArrayProd[i].Enabled = false;
            this.Panel2.Controls.Add(new LiteralControl("
"));
            //****************************************
         
            TBInvTot = new TextBox();
            this.TBInvTot.ID = "tbInvTot" + i;
            TBArrayInvTot[i] = TBInvTot;
            this.Panel4.Controls.Add(this.TBInvTot);
            TBArrayInvTot[i].CssClass = "ClaseTB";
            TBArrayInvTot[i].Text = "0";
            this.Panel4.Controls.Add(new LiteralControl("
"));
            //**********************************************

        }

    }

//Guardar los datos
protected void LinkButtonGuardarReg_Click(object sender, EventArgs e)
    {

                InsertarCapura();
                this.NumberOfControls = 0;
                 //
    }

   protected void InsertarCapura()
    {

        for (int i = 0; i < CantidadRegistros; i++)
        {
       
                string InsertarDesglose = "INSERT INTO Desglose "
                                        + "(id_producto, invtot) "
                                        + "VALUES (" + Convert.ToInt16(this.LabelArrayIdProd[i].Text) + ", "
                                        + " + Convert.ToInt16(this.TBArrayInvTot[i].Text)) ";

                OleDbConnection MiConexion = new OleDbConnection(MiConeccion);
                OleDbCommand MiInsert = new OleDbCommand(InsertarDesglose, MiConexion);
                MiInsert.Connection.Open();
                MiInsert.ExecuteNonQuery();
                MiInsert.Connection.Close();
             }
        }

 //Este es un código modificado del que uso en mis páginas,
//así que puede que no sea del todo correcto, espero sus comentarios

martes, 24 de noviembre de 2009

Cambiar un estilo (css) con Javascript (getElementByTagName)

Ejemplo:

function CargarEstilo()
{
var MiBody = document.getElementByTagName("body").item(0);
with(MiBody)
{
style.backgroundColor="black";
style.color = "white";
style.fontFamily="Arial";
}
}

Cargar datos a un Gridview o a un Dropdownlist

Antes que nada declaramos la variable de la conexión:

protected void Page_Load(object sender.EventArgs e)
{
string miconexion = "data source=Miservidor; initial catalog=Mibase; user id=Miusuario; password=Micontraseña";

//después creamos una variable para nuestra consulta:

string miconsulta = "SELECT * FROM mitabla";

SqlDataAdapter Mi_da = new SqlDataAdapter(miconsulta, miconexion);
DataTable Mi_dt = new DataTable();

Mi_da.fill(Mi_dt);

//Aquí podemos saber cuantos registros tiene nustra tabla
int CantidadRegistros = Convert.ToInt32(Mi_dt.Rows.Count);
this.TextBox.Text = CantidadRegistros.ToString();

//Aquí podemos cargar nuestro Gridview
this.Gridview.DataSource = Mi_dt;
this.Gridview.DataBind();

//Aqui podemos cargar un DropDownLista
this.DropDownLista.DataSource = Mi_dt;
this.DropDownLista.DataTextField = "NombreCampo";
this.DropDownLista.DataValueField = "IdCampo";
this.DropDownLista.DataBind();
//Si queremos insertar un campo en blanco
this.DropDownLista.Item.Insert(0, "");

}

Ejecutar archivos de Script tipo .sh o .bin

Para ejecutar estos scripts desde la consola teclea esto:

primero das privilegios de ejecución

$ chmod +x ./tuarchivo.sh
$ sudo ./tuarchivo.sh

para ejecutar archivos .bin se dan permisos de ejecución:

$ chmod a+x tuarchivo.bin
$ ./tuarchivo.bin

Para hacer lo anterior en modo gráfico das click derecho sobre el archivo, en el submenu das click a propiedades y luego permisos depués marcas la casilla ejecución.

miércoles, 3 de junio de 2009

Intalando OpenOffice 3.1 en Ubuntu 9.04

Como usuario root Editamos el fichero /etc/apt/sources.list (sudo gedit /etc/apt/sources.list) y añadimos las siguientes lineas:

deb http://ppa.launchpad.net/openoffice-pkgs/ppa/ubuntu jaunty main
deb-src http://ppa.launchpad.net/openoffice-pkgs/ppa/ubuntu jaunty main

Ahora abrimos un editor de texto y guardamos la siguiente clave de repositorio (p.ej como office.key):

-----BEGIN PGP PUBLIC KEY BLOCK-----
Version: SKS 1.0.10

mI0ESXanRwEEAOTPu1sTcJChTjkA9LkIh6WqiBgPzxNY2p8w18Qt/cE3ev4VyjiIadZtr+fh
C+kuRRQuRinLV+MzeD7Od3uqyR1plc90lqUeLeKJMgXfCoGMmKwng0qD2gpevIvEEpdlmsRo
1hutsyRxAL3o/NfFpovg6dWC27Y1Vwwma8UIL5wXABEBAAG0K0xhdW5jaHBhZCBQUEEgZm9y
IE9wZW5PZmZpY2Uub3JnIFNjcmliYmxlcnOItgQTAQIAIAUCSXanRwIbAwYLCQgHAwIEFQII
AwQWAgMBAh4BAheAAAoJEGDREhckfRz/4QoEAOJ429PsO5oi1xsnX/lraHACYpHNvk4KVghu
cY2p6J8M0WTTlfls96jRYGlDBDuyZcfW0W+VJlaiu28u2Y9zEnXTWHMlIk6PiOmLPxXofgDf
lKRqvBFYdRD8+33TBeD6u6qajNOLYTL08dnqCfVqmJTGZxqXTmYIOF1NdIs0KlF/
=1y5I
-----END PGP PUBLIC KEY BLOCK-----

Vamos a Sistema > Administracion > Origenes de Software > Autenticacion y pulsamos en “Importar clave”, seleccionando el fichero que acabamos de guardar.

Ahora actualizamos con el comando:

sudo apt-get update && sudo apt-get upgrade

Ahora desde el gestor de paquetes Synaptic instalamos OpenOffice 3.1

Actualizacion | Gracias por los comentarios. A fecha de hoy (9 Mayo) esta version del repositorio no esta disponible en idioma castellano, asi que os puede dar algun problema si no empleais la version en ingles. Tambien la version que instala es la 3.1 RC2, asi que es mas aconsejable descargar el paquete .deb del siguiente enlace (elegid 3.1 español) y proceder a instalarlo de la siguiente manera (Esta comentado para la version 3.1 RC pero es identico para la version final, usando el nombre de paquete correspondiente)

Fuente Instalar OpenOffice 3.1


Otra forma de instalar OpenOffice 3.1 es bajar desde la pagina de la página oficial de OpenOffice "OOo_3.1.0_LinuxIntel_install_es_deb.tar.gz"

Una vez que lo tenemos desempaquetamos la carpeta DEBS y desde un terminal instalamos todos los paquetes

@ubuntu:~/Escritorio/DEBS$ sudo dpkg -i *.deb

Para integrar OpenOffice al menú debemos instalar el paquete que esta dentro de la carpeta /DEBS/desktop-integration

@ubuntu:~/Escritorio/DEBS/desktop-integration$ sudo dpkg openoffice.org3.1-debian-menus_3.1-9399_all.deb

Y listo.

Los posibles errores que podemos encontrar es la instalación del paquete del menu "openoffice.org3.1-debian-menus_3.1-9399_all.deb". La solucion es desistalar completamente las versiones anteriores de OpenOffice principalmente el paquete openoffice.org-commons y sus dependencias.

Otro error puede ser que al abrir por primera vez nuestro OpenOffice 3.1 nos diga que va a reparar un archivo "sin titulo" y pues uno se puede pasar la vida reparando este archivo y nada, no pasamos de ahí.

Las solución que encontre fue eliminar o renombrar la carpeta oculta que esta en nuestra carpeta personal. /home/usuario/.openoffice.org el inconveniente es que perdemos nuestra configuración personal y los plugins que habiamos instalados.

Saludos.