viernes, 31 de enero de 2014

Dibujar una flecha con ActionScript 3.0


Autor: Francisco Arce
Correo: fj_arce@yahoo.com.mx


Es util dibujar una flecha con el API de dibujo sin necesidad de las herramientas de EDI,

package {<br />
   import flash.display.Sprite;
    public class Arrow extends Sprite {<br />
    public function Arrow() {<br />
       init();<br />
    }<br /><br />
    private function init() {<br />
            graphics.lineStyle(1,0,1);<br />
            graphics.beginFill(0xffff00);<br />
            graphics.moveTo(-50,-25);<br />
            graphics.lineTo(0,-25);<br />
            graphics.lineTo(0,-50);<br />
            graphics.lineTo(50,0);<br />
            graphics.lineTo(0,50);<br />
            graphics.lineTo(0,25);<br />
            graphics.lineTo(-50,25);<br />
            graphics.lineTo(-50,25);<br />
            graphics.lineTo(-50,-25);<br />
            graphics.endFill();<br />
    }<br />
  }<br />
}

http://www.pacoarce.com

miércoles, 29 de enero de 2014

Joomla tiene cuatro extensiones:

  1. Modulos
  2. Componentes
  3. Plugins
  4. Plantillas
Los módulos son las extensiones más sencillas en Joomla, Son pedazos de código que podemos colocar en cualquier parte y en cualquier número. Los siguientes datos es parte de lo que investigué en la página de joomla.org/Developpers:

Estructura de archivos

Iniciaremos, aunque usted no lo crea, con el "hola mundo". Hay cuatro archivos básicos que se utilizan dentro del patrón estándar en el desarrollo de un módulo:
  • mod_helloworld.php - Este archivo es el principal punto de entrada para el módulo. Se llevarán a cabo las rutinas de inicialización necesarias, llamar a las rutinas auxiliares para recoger todos los datos necesarios, e incluir la plantilla que muestra la salida del módulo.
  • mod_helloworld.xml - Este archivo contiene información acerca del módulo. En él se definen los archivos que necesitan ser instalados por el instalador de Joomla! y especifica los parámetros de configuración del módulo.
  • helper.php - Este archivo contiene la clase helper que se utiliza para hacer el trabajo real en la recuperación de la información que se muestra en el módulo (por lo general a partir de la base de datos o alguna otra fuente).
  • tmpl / default.php - Esta es la plantilla del módulo. Este archivo tomará los datos recogidos por el mod_author_related.php y generará el código HTML que se muestra en la página.
Con esta estructura de archivos, se está siguiendo un esquema MVC, donde la "Vista" es el archivo default.php y las reglas de negocio se encuentran en helper.php.

Faltan otros dos archivos, como veremos más adelante, que servirán para preveer que alguien ejecute directamente muestro módulo entrando a su directorio o carpeta.

1) Creación del mod_helloworld.php

Primero crea una carpeta para almacenar tu super módulo. Por tradición milenario se llamaría como se llama tu módulo, en este caso mod_helloworld y ahi vas escribiendo y almacenandotus archivos.

El archivo mod_helloworld.php llevará a cabo tres tareas:
  • Incluir el archivo helper.php que contiene la clase que se utiliza para recoger los datos necesarios.
  • Invocar el método apropiado para recuperar los datos.
  • Incluir la plantilla para mostrar la salida.
 Aqui ek primer despiste; helper a mi me sonaba como archivos para desplegar la ayuda, pero son las rutinas auxiliares. Punto muy importante, se utiliza PHP orientado a objetos.

Siguiendo estos tres puntos, vamos a colocar un poco de código en nuestro archivo.
La clase helper está definida en nuestro archivo helper.php .
Este archivo se incluye con la declaración require_once .

require_once dirname(__FILE__).'/helper.php';
 
require_once se utiliza porque nuestras funciones auxiliares se definen dentro de una clase, y sólo queremos la clase definida, una vez.

Para invocar a nuestro método utilizaremos la siguiente líneas:

$hello = modHelloWorldHelper::getHello( $params );
  
Recuerde que es programación ortinetada a objetos. Estamos definiendo una método que se llama getHello() y estamos pasando un parámetro. El primer archivo completo quedaría así:

<?php
// no direct access
defined( '_JEXEC' ) or die( 'Restricted access' );
 
// Include the syndicate functions only once
require_once( dirname(__FILE__).DS.'helper.php' );
 
$hello = modHelloWorldHelper::getHello( $params );
require( JModuleHelper::getLayoutPath( 'mod_helloworld' ) );
?> 

La clase modHelloWorldHelper se crea dentro del archivo helper.php, como se ve a continuación

2) Creación del helper.php

El archivo helper.php contiene la clase necesaria para recuperar los datos que se muestran en la salida del módulo. Esta clase a su vez tendrá un método que se encargara de dicha tarea.

Aquí está el código para el archivo helper.php:


<?php
class modHelloWorldHelper
{
    
    public static function getHello( $params )
    {
        return 'Hello, World!';
    }
}
?>

En el ejemplo estamos leyendo un parámetro que no utilizamos, pero es para preveer su uso, aunque obviamente aqui no es necesario. Creamos la clase modHelloWorldHelper (que no hay ninguna regla que te obligue escribir con esa sintaxis el nombre de la clase, pero ya es un clásico en la comunidad de joomleros) y luego el método getHello, donde puedes vaciar todos tus conocimientos sobre la herramienta e impresionar a tus cuates.

3) Creación del tmpl/default.php

El archivo default.php es la plantilla que muestra la salida del módulo. El código para el archivo default.php es el siguiente:

<?php // no direct access
defined( '_JEXEC' ) or die( 'Restricted access' ); ?>
<?php echo $hello; ?>

 O sea, que hay que hacer una carpeta que se llame tmpl y ahi guardar el archivo. Ojo.

4) Creación del mod_helloworld.xml

El mod_helloworld.xml se utiliza para especificar los archivos que el instalador tiene que copiar, y sean usados por el gestor de módulos para determinar qué parámetros se utilizan para configurar el módulo. Otras informaciones sobre el módulo también se especifica en este archivo.
El código para mod_helloworld.xml es el siguiente:

<?xml version="1.0" encoding="utf-8"?>
<extension type="module" version="2.5.0" client="site" method="upgrade">
    <name>Hello, World!</name>
    <author>John Doe</author>
    <version>1.0.0</version>
    <description>A simple Hello, World! module.</description>
    <files>
        <filename>mod_helloworld.xml</filename>
        <filename module="mod_helloworld">mod_helloworld.php</filename>
        <filename>index.html</filename>
        <filename>helper.php</filename>
        <filename>tmpl/default.php</filename>
        <filename>tmpl/index.html</filename>
    </files>
    <config>
    </config>
</extension>

Si ha manejado otras aplicaciones, como el SCORM, verá que es muy similar al "manifiesto".

Y si observa, aparecen dos archivos invitados nuevos: index.html y tmpl/index.html. Ambos son para preveer a los aprendices de hacker entrar a nuestra carpeta. Este archivo puede ser tan sencillo como:

<html><body bgcolor="#FFFFFF"></body></html>
 
Con esto hemos completado nuestro directorio del módulo, el cual deberá tener los siguientes archivos:
  • mod_author_related.php
  • mod_author_related.xml
  • helper.php
  • tmpl / default.php
Opcionalmente puede añadir los archivos
  • index.html
  • tmpl / index.html

Si no va a utilizar los archivos html, no olvide también quitarlos del manifiesto.

Empaquete en un formato zip todos los archivos (no el directorio, sino solo los archivos y la carpeta tmpl).
Intégrelos a Joomla por medio de Extensiones
Colóquelo dentro de la página con  Extensiones > Administrador de módulos

Asi tendremos un módulo muy sencillo en Joomla! y lo mejor de todo es que si funciona. El presente blog fue tomado delmanual de desarrolladores.

Los archivos los encuentras aqui.


http://www.pacoarce.com

lunes, 27 de enero de 2014

ActionScript: Línea que se estira (AS 3.0)

Autor: Francisco Arce
Correo: fj_arce@yahoo.com.mx


Algunas veces queremos tener una línea que se estire de ambos extremos. Eso nos podría servir para juegos, diagramas, etc. El siguiente código genera una linea, creada desde el archivo SWF, de una linea. Se le indica la ubicación, la longitud y el color:

package {
   import flash.display.Sprite;
   import flash.events.MouseEvent;
   import flash.utils.Timer;
   import flash.events.TimerEvent;

   public class Linea extends Sprite {
      var tiempo:Timer = new Timer(60,0);
      var contenedor:Sprite;
      var cuadro1:Sprite;
      var cuadro2:Sprite;
      var x1:int = 0;
      var y1:int = 0;
      var x2:int = 100;
      var y2:int = 100;
      var color:uint = 0;

      public function Linea(xx,yy,lon,color):void {
         //Sujetador
         this.color = color;
         this.x1 = xx;
         this.y1 = yy;
         this.x2 = xx + lon;
         this.y2 = yy;
         //
         cuadro1=new Sprite ;
         cuadro1.graphics.beginFill(0xffffff);
         cuadro1.graphics.lineStyle(1,0,1);
         cuadro1.graphics.moveTo(0,0);
         cuadro1.graphics.lineTo(0,5);
         cuadro1.graphics.lineTo(5,5);
         cuadro1.graphics.lineTo(5,0);
         cuadro1.graphics.lineTo(0,0);
         //Sujetador 2
         cuadro2=new Sprite;
         cuadro2.graphics.beginFill(0xffffff);
         cuadro2.graphics.lineStyle(1,0,1);
         cuadro2.graphics.moveTo(0,0);
         cuadro2.graphics.lineTo(0,5);
         cuadro2.graphics.lineTo(5,5);
         cuadro2.graphics.lineTo(5,0);
         cuadro2.graphics.lineTo(0,0);
         //
        contenedor=new Sprite ;
        contenedor.graphics.lineStyle(2,color,.7);
        contenedor.graphics.moveTo(x1,y1);
        contenedor.graphics.lineTo(x2,y2);
        //contenedor.x=xx;
        //contenedor.y=yy;
        addChild(contenedor);
        addChild(cuadro1);
        addChild(cuadro2);
        //
        cuadro1.x=x1-2.5;
        cuadro1.y=y1-2.5;
        cuadro2.x=x2-2.5;
        cuadro2.y=y2-2.5;
        //
        cuadro1.addEventListener(MouseEvent.MOUSE_DOWN, onMueveCuadro1);
        cuadro2.addEventListener(MouseEvent.MOUSE_DOWN, onMueveCuadro1);
        //
        cuadro1.addEventListener(MouseEvent.MOUSE_UP, onMueveCuadro2);
        cuadro2.addEventListener(MouseEvent.MOUSE_UP, onMueveCuadro2);
     }

     function onMueveCuadro1(e:MouseEvent):void {
         e.target.startDrag();
         tiempo.addEventListener(TimerEvent.TIMER, onMueve);
         tiempo.start();
         //trace("inicio",e.target.name,e.target.x, e.target.y);
     }

    function onMueveCuadro2(e:MouseEvent):void {
         tiempo.stop();
         e.target.stopDrag();
         pintaLinea();
     }

     function onMueve(e:TimerEvent):void {
           pintaLinea();
     }

     function pintaLinea () {
         this.removeChild(contenedor);
         contenedor=new Sprite;
         contenedor.graphics.lineStyle(2,color,1);
         contenedor.graphics.moveTo(cuadro1.x+2.5,cuadro1.y+2.5);
         contenedor.graphics.lineTo(cuadro2.x+2.5,cuadro2.y+2.5);
         addChild(contenedor);
         swapChildrenAt(2, 0);
     }
   }
}

http://www.pacoarce.com

viernes, 24 de enero de 2014

Conectar a un módulo de Joomla 2.5 con la base de datos interna

Por lo general, las cosas divertidas empiezan cuando nos conectamos a las bases de datos. En Joomla tenemos una base de datos interna dentro de la instalación del paquete, que puede ser MySQL y en la versión 3.0 pueden sel otras, incluso SQLite.

También podemos conectar con una base de datos externa, por ejemplo, una base de datos de clientes, facturación, libros, lo que sea. En este blog, que se basa en la documentación de Joomla! Developers, trataré de poner las cosas en claro (al menos para mi) de cómo conectarnos con la base de datos interna, crear una tabla, leerla, etcétera.

Para ello tenemos que utilizar la clase JDatabase, que nos simplifica mucho el uso de la base de datos. Recuerde que se está utilizando PHP orientado a objetos, de locual es deseable que tenga conocimientos.

También necesita tener conocimientos de cómo hacer un módulo en Joomla 2.5.

Crear una tabla desde el instalador del módulo

Desde e proceso de intslación de nuestro módulo, podemos crear una tabla y todo el código para manipularla. Incluso se puede hacer para diferentes tipos de bases de datos, no sólo para MySQL.

Este código se anexa desde el "manifiesto" de nuestro módulo, es decir, el archivo XML. En nuestro ejemplo anterior, de donde puede bajar los archivos, puede definir estos procesos con el siguiente código:

<install>
     <sql>
         <file driver="mysql" charset="utf8">sql/mysql/install.mysql.utf8.sql</file>
     </sql>
</install>
 
<uninstall>
     <sql>
         <file driver="mysql" charset="utf8">sql/mysql/uninstall.mysql.utf8.sql</file>
     </sql>
</uninstall>
 
<update> 
    <schemas>
        <schemapath type="mysql">sql/mysql/updates</schemapath>
    </schemas> 
</update>

Necesita crear, dentro de la carpeta de su módulo, las subcarpetas sql y otra para mysql, para crear los archivos para otras bases de datos. Ahi guardará los archivos  install.mysql.utf8.sql, que no es otra cosa que archivos de texto con las instrucciones correspondientes para cada base de datos, que por lo general estarán en SQL.

El archivo install.mysql.utf8.sql se muestra a continuación, y si sabe MySQL observará que es código propio de esta base de datos:

CREATE TABLE IF NOT EXISTS '#__helloworld' (
        `id` int(10) NOT NULL AUTO_INCREMENT,
        `hello` text NOT NULL,
        `lang` varchar(25) NOT NULL,
 
  PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1;
 
INSERT INTO '#__helloworld' ('hello', 'lang') VALUES ('Hello World', 'en-GB');
INSERT INTO '#__helloworld' ('hello', 'lang') VALUES ('Hola Mundo', 'es-ES');
INSERT INTO '#__helloworld' ('hello', 'lang''') VALUES ('Bonjour tout le monde', 'fr-FR');

Este listado, tomado del ejemplo del manual, crea la tabla y unos cuantos elementos. Aún no hemos utilizado estas instrucciones.

El siguiente archivo utilizamos la peligrosa sentencia drop-table en el archivo
uninstall.mysql.utf8.sql:

DROP TABLE IF EXISTS '#__helloworld'
 
El siguiente archivo no es un UPDATE de un registro, sino más bien la actualizacion de la base de datos y de momento solo tiene un comentario:

# Placeholder file for database changes for version 1.0.0



Cómo utilizar las sentencias de la base de datos


Una vez que ya tenemos nuestras definiciones y archivos para crear y desinstalar la tabla en la base de datos interna de Joomla!, procederemos a llamar a los archivos. Recuerde que la lógica del módulo la encontraremos en el archivo helper.php. 

Necesitamos conectarnos a la base de datos y crear la tabla



http://www.pacoarce.com

jueves, 23 de enero de 2014

Introducción a XML

Las siglas XML significan eXtensible Markup Language. Este lenguaje está diseñado para transportar y almacenar datos y es muy fácil de aprender.

XML fue diseñado para transportar y almacenar datos, mientras que HTML fue diseñado para mostrar los datos.

¿Qué es XML?


• XML Extensible Markup Language
• XML es un lenguaje de etiquetas como HTML
• XML fue diseñado para transportar datos, no para mostrarlos
• Las etiquetas XML no están predefinidas. Usted debe definir sus propias etiquetas
• XML está diseñado para ser auto-descriptivo
• XML es una Recomendación del W3C

XML y HTML fueron diseñados con diferentes objetivos:


• XML fue diseñado para transportar y almacenar datos, con especial atención a los datos
• HTML fue diseñado para mostrar los datos

XML no hace nada


Tal vez es un poco difícil de entender, pero XML no hace nada. XML fue creado para estructurar, almacenar y información.

Con XML usted inventa sus propias etiquetas

Estas etiquetas son "inventados" por el autor del documento XML. El lenguaje XML no tiene etiquetas predefinidas.

Las etiquetas utilizadas en HTML están predefinidos. Los documentos HTML sólo pueden utilizar las etiquetas definidas en el estándar HTML (como <p>, <h1>, etc.)
XML permite al autor definir  sus propias etiquetas y  su propia estructura del documento.

XML no sustituye a HTML, XML es un complemento de HTML

Es importante entender que XML no es un sustituto de HTML. En la mayoría de las aplicaciones web, XML se utiliza para el transporte de datos, mientras que HTML se utiliza para dar formato y mostrar los datos.

·      XML es un lenguaje independiente del hardware y de herramientas para transportar  información.
·      XML se convirtió en una Recomendación del W3C, el 10 de febrero de 1998.
·      XML está en todas partes
·      XML es ahora tan importante para la Web como HTML fue la fundación de la Web.
·      XML es la herramienta más común para las transportar datos entre todas las clases de aplicaciones en Internet.

hhttp://www.pacoarce.com




domingo, 19 de enero de 2014

Los atributos data-* en HTML5


Los  atributos data-* se utiliza para almacenar datos personalizados privados en la página o aplicación.

Los atributos data-* nos da la posibilidad de incorporar los datos de atributos personalizados en todos los elementos HTML.

Los datos almacenados (personalizadas) se pueden utilizar en JavaScript de la página para crear una experiencia de usuario más atractiva (sin llamadas Ajax o consultas de bases de datos en el servidor).

Los atributos data-* se componen de dos partes:

  • El nombre del atributo no debe contener letras mayúsculas, y debe tener al menos un carácter de largo después de que el prefijo "data"
  • El valor del atributo puede ser cualquier cadena

Nota: Los atributos personalizados prefijados con "data-*" será completamente ignorado por el analizador sintáctico del navegador.

http://www.pacoarce.com



jueves, 16 de enero de 2014


Tipo de columnas MySQL

Como ya se había dicho, una tabla es un conjunto de uno o más columnas. Cuando se crea una tabla con la sentencia CREATE TABLE, se especifica el tipo deseado para cada columna. Un TIPO DE COLUMNA es más específico que un TIPO DE DATO. El tipo de dato es una categoría general como "número"o "cadena". A un tipo de cadena le caracteriza precisamente la clase de valores que puede contener, como SMALLINT o VARCHAR(32).

            Los tipos de columna MySQL son los responsables de describir qué clase de valores quiere que contenga una columna, lo que determina a su vez la manera en que MySQL tratará dichos valores. Cada tipo de columna tiene varias características:

·                Qué clase de valores quiere almacenar.
·                Cuánto espacio ocupan los valores, si son de longitud fija o de longitud variable.
·                Cómo se clasifican o comparan los valores del tipo.
·                Si el tipo permite o no valores NULL
·                Si el tipo se puede indexar o no

Comprender los tipos de columna es muy importante para reducir el tamaño de la base de datos y aumentar su velocidad de los procesos.

MySQL proporciona tipos de columna para todas las categorías de valores de datos en general, excepto para el valor NULL.

Tipo de columna entera

Para números enteros (que no tienen parte fraccional), como 43, -1, 3, 0 o -789345, los formatos que MySQL puede manejar son:

Nombre del tipo            Significado                        Rango

TINYINT                        Entera muy pequeña            Con signo -128 a 127
                                    Requiere 1 byte                        Sin signo 0 a 255

SMALLINT                        Entera pequeña                        Con signo -32768 a 32767
                                    Requiere 2 bytes            Sin signo 0 a 65535

MEDIUNMINT                        Entera mediana                        Con signo -8388608 a 8388607
                                    Requiere 3 bytes            Sin signo 0 a 1677215

INT                                    Entera estándar                        Con signo -2147683648 a 2147483647
                                    Requiere 4 bytes            Sin signo 0 a 4,294,967,295

BIGINT                                    Entero muy grande            Con signo -9223372036854775808 a
                                    Requiere 8 bytes                            9223372036854775807
                                                                        Sin signo 0 a 18,446,744,073,709,551,615


Observe que el rango de los cinco tipos de enteros depende de si tiene o no signo (UNSIGNED), que es uno de los atributos. Un ATRIBUTO es una característica adicional a la columna. Para seleccionar algún tipo de columna necesitamos analizar el rango de nuestra información y seleccionar el tipo más pequeño que satisfaga ese rango, de lo contrario estaremos desperdiciando recursos de nuestra base de datos.

Por ejemplo, si tenemos un campo que almacenará la edad de una persona (entre 0 y 120 años) nos funciona perfectamente la columna tipo TINYINT. Si se utilizara para este campo un tipo de columna como INT (con 4 bytes), en realidad está desperdiciando 3 bytes. Si su base de datos es grande, por ejemplo, la población de un municipio con 100,000 habitantes, usted está desperdiciando en un solo campo 300,000 bytes.

Si usted intenta almacenar un campo mayor al rango del tipo de columna, el proceso marcará un error y solo cargará hasta el rango máximo, por ejemplo: Tiene un campo tipo TINYINT con signo, y almacena un valor como 500, solo se almacenará 127.

http://www.pacoarce.com
 

martes, 14 de enero de 2014

¿Qué diablos es una sentencia condicional?

Sentencias condicionales

En AS3.0 contaremos con tres sentencias, las cuales no sufrieron cambios de las versiones anteriores:

Sentencia if

La sentencia if efectuará una verificación de una expresión con resultado booleano (true/false). Si la condición resulta verdadera, efectuará un bloque de sentencias. Su sintaxis es:
if(condición){
            sentencia1…
            sentencia2…
            etcétera…
}

Opcionalmente puede tener una sentencia else, la cual agrupa las sentencias que se ejecutarán si la condición da como resultado un valor false, La sentencia else siempre tiene que ir precedida de un if. Su sintaxis es:

if(condición){
            sentencia1…
            sentencia2…
            etcétera…
} else {
            sentencia1…
            sentencia2…
            etcétera…
}

Sentencia if.. else if

Si necesita verificar varias condicionales se puede utilizar la sentencia if… else if…
La última sentencia if, puede llevar su contraparte else, la cual se ejecutará si no se cumple ninguna de las anteriores. Digamos que desea tomar diferentes decisiones dependiendo de la edad del usuario:
if(edad<18){
            trace(“Usted no puede acceder el portal”);
} else if(edad<25){
            trace(“Solo tiene acceso a ciertas paginas de nuestro portal”);
} else if(edad<40){
            trace(“Usted tiene acceso completo a nuestra información”);
} else {
            trace(“Lo sentimos, su edad rebasa el limite de nuestra página”);
}

Sentencia switch()

Una sentencia switch puede sustituir a una estructura if… else if… Con la diferencia en que en ves de un resultado booleano, regresará un valor con el cual tomará las decisiones. Si se cumple la condición se ejecutarán las sentencias hasta encontrar la sentencia break, incluso si hay otras condiciones. Si ninguna de las condiciones se cumplen, se ejecutará el bloque de sentencias después de la sentencia default (la cual es opcional). Su sintaxis es:
switch(numVidas){
            case 8:
                        trace(“Felicidades, estás enterito”),
                        break;
            case 7:
            case 6:
            case 5:
                        trace(“Vas muy bien, aun puedes superar la prueba”);
                        break;
            case 4:
            case 3:
                        trace(“Ups, necesitas esforzarte más”);
                        break;
            case 2:
            case 1:
                        trace(“Vamos, estás a punto de perder el juego!”);
break;
            default:
                        trace(“Lo sentimos, vuelve a intentarlo”);
}
Enlaces de interés:
http://www.youtube.com/watch?v=xUOtWcHj-bk

http://www.pacoarce.com

viernes, 10 de enero de 2014

La neutralidad o calibración de una página Web

Todos los navegadores tienen una hoja de stilos propia que contienen las reglas con las cuales se interpretarán as etiquetas en la pantalla. Un problema radica en que no todos los navegadores (y no todas la versiones del mismo, ni en todas las plataformas) tenían las mismas medidas, sobre todo en los márgenes y los paddings de los elementos de bloque.

Era muy conocido, por ejemplo, que Internet Explorer hiciera más los cálculos de los CSS para las cajas de texto con respecto a los márgenes y sobretodo, a los paddings. Es por eso que la misma página llegara lucir un poco diferente (y a veces muy diferente) de navegador a navegador.

Una buena práctica es "eliminar" en las primeras líneas de nuestra página todos los márgenes y paddings, y a partir de ahí nosotros los modificamos a nuestro gusto. Obviamente con estas instrucciones la página luce terrible, pero nos forza a que utilicemos en forma explícita las márgenes y paddings para que luzca (más o menos) igual en todos los navegadores, incluso en IE.

Para ello podemos hacer algo tan drástico como:

* {padding:0; margin;0}

O hay personas que prefieren colocal únicamente las etiquetas que utilizan:

body, p, h1, h2, h3 {padding:0; margin;0}

Ambas prácticas son correctas, con la salvedad de que el selector universal asterisco (*) fallaba en algunas versiones de Internet Explorer (para variar).

Más información y cursos gratuitos de Desarrollo Web en http://www.pacoarce.com

miércoles, 8 de enero de 2014

Modificar las columnas de un data Grid con Adobe AIR

Uno de los controles más utilizados en el desarrollo de aplicaciones con AIR, Flash y Flex es el data Grid. Esta herramienta es aún más poderosa al momento de manipular las columnas por medio de la clase DataGridColumn. Para ello puede importar las siguientes tres clases que se muestra a continuación:

import fl.data.DataProvider;
import fl.controls.DataGrid;
import fl.controls.dataGridClasses.DataGridColumn;

Por ejemplo, una vez abierta una bas de datos, podemos leer una tabla y vaciarla en un datagrid de la siguiente forma:

function onQueryLeeTabla (e:SQLEvent) {
var q:SQLStatement=e.target as SQLStatement;
var r:SQLResult=q.getResult();
        //
var dp:DataProvider = new DataProvider();
//
datos_dg.addColumn(new DataGridColumn("Fecha"));
datos_dg.addColumn(new DataGridColumn("Cliente"));
datos_dg.addColumn(new DataGridColumn("Correo"));
datos_dg.addColumn(new DataGridColumn("Confirmada"));
//
datos_dg.dataProvider = dp;
datos_array = new Array();
datos_dg.dataProvider.removeAll();
for each (var o:Object in r.data) {
var obj:Object = new Object();
obj.Fecha = o.fecha;
obj.Cliente = o.cliente;
obj.Correo = o.correo;
obj.Confirmada = o.confirmada;
datos_dg.addItem(obj);
datos_array.push(o);
  reg++;
}
if(reg==0){
mensaje_txt.text = "No hay registros en la tabla";
} else {
//datos_dg.addEventListener(Event.CHANGE, onSelecciona);
//mensaje_txt.text = "Selecciona un registro";
}
}

Cursos gratuitos de programación web en: http://www.pacoarce.com

lunes, 6 de enero de 2014

Tipo de datos en MySQL

MySQL reconoce varios tipos de datos, o lo que es lo mismo, categorías generales (abstracciones) cuyos valores se pueden representar:

Valores numéricos

Los números son valores como 48 o 193.62. MySQL entiende los números especificados como enteros (sin parte fraccional) o valores de como flotante (que si lo tienen). Los enteros se pueden especificar de forma decimal o hexadecimal.

Un entero consiste en una secuencia de dígitos. Un entero hexadecimal está compuesto por "0x" seguido de uno o mas números hexadecimal.

MySQL reconoce las notaciones científicas. Van indicadas inmediatamente después de un número entero o de coma flotante con una "e" o "E", un signo "+" o "-" y un exponente entero. 1.34E+12 y 42.27e-1 son números con notación cintífica correcta.

Los decimales se conocerán como DOBLES o de punto FLOTANTE, ya que se visualizan como un número con dos partes enteras dividivas por un punto, por ejemplo 100.30.

Valores (caracteres) de cadena

Las cadenas son valores como "MySQL es una base de datos" o "en el mar, la vida es más sabrosa". Puede utilizar comillas dobles o sencillas para agrupar a una cadena. Para representar caracteres de escape existen varias secuencias de escape. Cada secuencia comienza con una barra invertida (\), que significa  un escape temporal de las reglas para la interpretación de los carateres.

Secuencia                        Significado
\0                                    ASCII 0
\'                                    Comilla simple
\"                                    Comilla doble
\b                                    Retroceso
\n                                    Nueva línea
\r                                    Retorno
\t                                    Tabulador
\\                                    Barra invertida

Por ejemplo:

'I can \'t'
"Marco dijo, \"Hasta Luego\""

Valores de fecha y hora

Fechas y horas son valores del tipo "1999-06-17" o "12:30:43". También reconoce las combinaciones de ambos valores como "1999-06-17 12:30:43". Como se puede observar, MySQL mantiene el formato YYYYMMDDHHMMSS, sin embargo se puede cambiar el mismo con la función DATE_FORMAT().

Valor NULL


NULL se puede considerar un valor "sin tipo". Normalmente quiere decir  "sin valor", "valor desconocido", etc- Puede insertar en la tabla valores NULL y hacer selecciones de campos si tienen en valor NULL, etc. No se puede realizar ningún operación con el valor NULL, pues su resultado siempre será NULL.

domingo, 5 de enero de 2014

El Application Framework en Coldfusion 10


El Application Frameworks provee una forma de crear una zona de datos persistentes y ejecutar código durante los eventos del ciclo de vida de la aplicación (application lifecycle).

El componente Application.cfc

• En el archivo del componente Application.cfc se puede escribir el código para manejar los siguientes eventos:

■ Application startup (onApplicationStart())
■ Application shutdown (onApplicationEnd())
■ Session startup (onSessionStart())
■ Session timeout (onSessionEnd())
■ At the start of each page request (onRequestStart())
■ At the start of each CFC request (onCFCRequest())
■ At the end of each page request (onRequestEnd())
■ Prior to the start of each page request (onRequest())
■ When an error occurs (onError())
■ When a CFM file is not found (onMissingTemplate())

Dentro de un proyecto, se puede contar con varios archivos Application.cfc. Cuando abrimos cualquier página de Colfusion, éste abrirá el archivo Application.cfc más cercano al mismo.

Las variables de la aplicación

• Para declarar una variable de aplicación dentro del archivo Application.cfc, tenemos que definirlas por medio de la etiqueta <cfapplication> despueés de la etiqueta <cfcomponent> pero antes de la etiqueta  <cffunction>
• El uso de estas variables es opcional.

Atributo name

Especifica el nombre de la aplicación. Es un cadena con un nombre válido (sin espacios en blanco o caracteres especiales) e indirectamente se puede usar para llamar las zonas de almacenamiento remoto como application, client o session. Sólo puede haber un nombre por aplicación.

Atributo applicationTimeout

Determina el tiempo que una apliacación puede estar sin actividad antes de cerrarse en forma automática. Las variables de aplicación se eliminan una vez cerrada la aplicación.

Atributo clientManagement

Este atributo activa o desactiva el soporte para las variables en la zona client.

Atributo clientStorage

En esta área se almacena información cómo:
  • El regestry de la ventana
  • Datos
  • Cookies

Atributo customTagPaths

Indica el camino para la carpeta donde se tienen las etiquetas personalizadas

Atributo dataSource

Indica el nombre de la fuente de datos de la aplicación.

Atributo debugIPAddress

 Lista de direccione IP que serán debugeadas

Atributo enableRobustException

Sobreescribe los valores del administrador. No reporta errores de excepciones de compilación.

Atributo GoogleMapKey

La llave de Google Maps para los mapas de la aplicación.

Atributo loginStorage

Especifica dónde se almacenará la información generada en <cflogin> / <cfloginuser>. Por omisión, los datos se almacenan en cookies.

Atibutos mappings

 Para poder utilizar el mapeo de la aplicación, se debe permitir desde al Administrador de Coldfusion. Con este parámetro podrá configurar el mapeo de la aplicación, por ejemplo:

<cfset this.mappings[“/stuff”] = “c:\stuff”>

Atributo secureJSON

Especifica protección en contra del ataque llamado  cross-site scripting.

Ejemplo:

<cfcomponent>
<cfset this.name="firstApplication">
<cfset this.sessionManagement=”true”>
<cfset this.dataSource=”miBaseDatos”>
<cfset this.clientManagement=”false”>
<!--- Application.cfc event handlers --->
</cfcomponent>

sábado, 4 de enero de 2014

Ejecutar un proceso de login con <cflog> en Coldfusion 10

La etiqueta <cflog> permite una cadena que puede ser manejada desde el Administrador de Coldfusion

• La cadena de entrada del Log contiene:

■ Type
■ Thread
■ Date
■ Time
■ Application
■ Text

Manejo de otros eventos eventos en Coldfusion 10

ColdFusion ejecuta en forma automática el código contenido en las funciones de Application.cfc en cualquiera de las tres eventos:

■ Cuando la solicitud inicia
■ Al inicio de una solicitud de la página
■Al final deuna solicitud de la página

Manejo del inicio de la solicitud

• ColdFusion procesa el código dentro del método onRequestStart() cada vez qye una página es solicitada al servidor ColdFusion.
•Por lo general, un método onRequestStart() efectúa una de las siguientes funciones:

■ Redirecciona a los usuarios a una página login
■ Verificar los derchos del usuario y redireccionarlo
■ Redireccionar dependiendo de las variables URL/form

Un método onRequestStart() regresa un valor booleano indicando el resultado de la operación.

Interceptar la solicitud de una página con onRequest()

• ColdFusion proceso automáticamente el código contenido en el método onRequest() después de la ejecución del método onRequestStart().

Por lo general el método onRequest() ejecuta:

■Capturar el contenido generado y ejecuta alguna rutina de validación de la inforación
■ Contiene reglas de negocio que direcciona a diferentes páginas de la aplicación

El método onRequest() no regresa ningún valor. El sistema le pasa automáticamente la ruta del root.

Hay que tener en consideración varios puntos al utilizar el método onRequest():

■ Cuando un método onRequest() está presente, implícitamente ejecuta la página objetivo, generalmente a través de una etiqueta  <cfinclude>
■ Un método onRequest() se ejecuta en lugar de la solicitud de la página original
■ Un método onRequest() no puede responder a un llamado de un servicio web, un eveneto  gateways o una solicitud de Flash remoting