jueves, 26 de diciembre de 2013

Encriptar datos locales con Adobe AIR

Encriptamos datos por medio de la clase flash.utils.BytesArray, que nos servirá para guardar datos en forma binaria. Cada una de las palicaciones (y cada uno de los usuarios de la aplicación) tendrá una archivo cifrado, el cual se puede guardar y extraer información con la clase EncryptedLocalStore.

Los datos encriptados se colocan en un subdirectorio del directorio de datos de aplicación del usuario; la ruta del subdirectorio es Adobe/AIR/ELS/ seguido del identificador de la aplicación.
Si se manejan datos en el disco duro del usuario, se recomienda que la información se encuentre encriptada.

Si actualiza una aplicación de AIR, se recomienda el uso de BytesArray.
Se debe usar una instacia BytesArray dentro de la clase EncryptedLocalStore.

//Almacenar como datos binarios:
var data:String = "Esta es una cadena";
var ba:BytesArray = new BytesArray();
ba.writeUTFBytes(data);

//Recuperar los datos binarios a datos decimales
var returnedData:String = ba.readUTFBytes(ba.bytesAvailable);

La clase BytesArraytiene varios métodos para escribir y leer información en diferentes formatos:
writeUTFBytes() readUTFBytes()
writeInt() readInt()
writeBoolena() readBoolena()

Información encriptada

Sólo se puede almacenar 10MB de información encriptada por aplicación AIR

var ba:BytesArray = new BytesArray();
ba.writesUTFBytes( password.text);
EncrypedLocalStore.setItem(username.text, ba);
username.text = "";
password.text = "";
Leer los datos encriptados:
var ba:ByteArray = EncryptedLoaclStore.getItem(username.text);
if(ba){
var returnedPassword:String = ba.readUTFBytes( ba.bytesAvailable );
if(password.text==returnedPassword){
this.visible = false;
} else {
trace("Password incorrecto");
} else {
trace("No existe el usuario");
}

Otro ejemplo:
 
var str:String = "Bob";  
var bytes:ByteArray = new ByteArray();  
bytes.writeUTFBytes(str);  
EncryptedLocalStore.setItem("firstName", bytes);    

var storedValue:ByteArray = EncryptedLocalStore.getItem("firstName");  
trace(storedValue.readUTFBytes(storedValue.length)); // "Bob"    

EncryptedLocalStore.removeItem("firstName");
 
http://www.pacoarce.com 

martes, 24 de diciembre de 2013

Herencia y manejo de eventos del sistema entre componentes en Coldfusion 10

Podemos heredar las propiedades y métodos de otro componente usando la propiedad extends dentro de la etiqueta <cfcomponent>.
Si el componente no se encuentra en la misma carpeta, se tiene que indicar por medio de un "path", por ejemplo:

<cfcomponent extends = "components.myComponent">

Los componentes se pueden "extender" varias veces y los componentes hijos se pueden convertir en otro componentes.


Llamar a métodos de componentes padre

Por medio de la instrucción super se puden llamar métodos de un componente padre desde un componente hijo.

Manejo de eventos de aplicación por medio del componente Application.cfc

Con el componente Application.cfc se pueden detectar dos eventos de la aplicación:

■ onApplicationStart
■ onApplicationEnd

Por medio del uso del componente Application.cfc se puede generar un archivo con extensión XML o INI para almacenar valores que serán utilizados en la aplicación.


Por seguridad, este archivo se mantiene fura de la carpeta raíz (webroot) de la aplicación.

ColdFusion procesa automáticamente el método onApplicationStart() en cualquiera de estas tres opciones:

■ La primer página de la aplicación es lanzada
■ El primer componente es invocado desde un gateway asíncrono
■ La primera consulta de un web service un componente flash remoting es ejecutado

Un método onApplicationStart() contiene código que lanza las siguientes tareas:

■ Inicialización de variables globales
■ Procesos de Loggingnotificaciones de reinicio del Administrador
■ Bloque el acceso a recursos vitales, como la base de datos, cuando no se encuentran disponibles o existe un proceso de reiniciación del servicio

El método onApplicationStart() regresa un valor booleano:

■ true: el proceso de inicio fue correcto y continua la aplicación
■ false: el proceso de inicio fue incorrecto y debe abortar la aplicación

Manejo de cierre de la aplicación o baja en el servicio

Coldfusion lanzará en forma automáica el código que se encuentre en el método: onApplicationEnd() si:

■ Está abajo el servicio de ColdFusion
■ Se agotó el tiempo de espera de la aplicción

Por lo general este método contendrá notificaciones de salidaq al usuario y grabar los datos que se encuentran en la memoria cache.

Este método no recibe ni regresa valor alguno.

http://www.pacoarce.com

lunes, 23 de diciembre de 2013

Las expresiones regulares en PHP

Una herramienta muy poderosa que nos brinda PHP para poder validar cadenas, por ejemplo, nombres, correos electrónicos, números de tarjeta de crédito, com muchos, muchos etcéteras, son las expresiones regulares.

Las expresiones regulares son un conjunto de caracteres especiales que nos enviarán un valor verdadero si la cadena a comparar coincide con la expresión regular, o un cero si no coindicen.

El punto

El punto representa cualquier caracter. Escribiendo un punto en un patrón querrás decir que ahí hay un caracter, cualquiera. Desde la A a la Z (en minúscula y mayúscula), del 0 al 9, o algún otro símbolo, incluyendo los acentos y la eñe.

Principio y fin de cadena

Con ^ para inicio y $ para final de una cadena.

Contadores

Usando + queremos decir que el elemento anterior aparece una o más veces. Usando * decimos que el elemento anterior aparece cero o más veces.

Si lo que queremos indicar al patrón es que un elemento puede que esté (una vez) o puede que no, lo haremos con el signo de interrogación.

Para definir la cantidad de veces que va a repetirse el elemento, tendremos que hacer uso de las llaves { }.

Rangos

Los corchetes [] incluidos en un patrón permiten especificar el rango de caracteres válidos a comparar. Basta que exista cualquiera de ellos para que se de la condición. Dentro de ellos pondremos cualquier cantidad de caracteres, uno a continuación del otro; o un rango del abecedario o de los números enteros del 0 al 9.

Dentro de los corchetes, hay que tener en cuenta que el símbolo ^ ya no significa inicio, sinó que es un negador, es decir: “[^a-Z]” coincidirá con cualquier texto que NO tenga ningún caracter alfabético (ni minúsculas ni mayúsculas), y “^@ ” coincide con cualquier caracter excepto “@” y “espacio

Alternancia

Para alternar entre varias opciones de caracteres, usamos el símbolo |  o barra vertical. Con este mecanismo haremos un disyuntor, que nos permitirá dar varias opciones. Si una de ellas coincide, el patrón será cierto.

Agrupadores

Los paréntesis nos sirven para agrupar un subconjunto.

Secuencias de escape

 Si deseamos representar algún caracter especial, como *, $, etc. en nuestro patrón, necesitamos utilizar una diagonal invertida \, por ejemplo \$ o \* para que el analizador sintáctico "escape" de su lógica.

Modificadores (del manual de PHP)

i (PCRE_CASELESS)
Si se aplica este modificador, las letras en el patrón coincidirán tanto con letras mayúsculas como minúsculas. 
 
m (PCRE_MULTILINE)
 
Por defecto, PCRE trata la cadena objetivo como si fuera una única "línea" de caracteres (incluso si en realidad contiene varias nuevas líneas). El meta-carácter "inicio de línea" (^) coincide sólo con el inicio de la cadena, mientras que el meta-carácter "final de línea" ($) coincide sólo con el final de la cadena, o antes del final de una nueva línea (a menos que el modificador D se aplique). 
Esto es igual que en Perl. Cuando se aplica este modificador, los constructores "inicio de línea" y "final de línea" coinciden inmediatamente después o inmediatamente antes que cualquier nueva línea de la cadena objetivo, respectivamente, así como al inicio y final absolutos. 
Esto es equivalente al modificador /m de Perl. Si no hay caracteres "\n" en una cadena objetivo, o no hay incidencias de ^ o $ en el patrón, la aplicación de este modificador no tiene efecto. 
 
s (PCRE_DOTALL)
 
Si se aplica este modificador, un meta-carácter punto en el patrón coincide con todos los caracteres, incluyendo nuevas líneas. Sin él, las nuevas líneas son excluidas. Este modificador es equivalente al modificador /s de Perl. Una clase negativa como [^a] siempre coincidirá con un carácter de nueva línea, independientemente de la aplicación de este modificador. 
 
x (PCRE_EXTENDED)
 
Si se aplica este modificador, los caracteres de información de espacios en blanco en el patrón se ignoran totalmente excepto cuando están escapados (diagonal invertida) o dentro de una clase carácter, y los caracteres entre un # sin escapar fuera de una clase carácter y el siguiente carácter nueva línea, inclusive, también son ignorados. Esto es equivalente al modificador /x de Perl, y hace posible incluir comentarios dentro de patrones complicados. Observe, sin embargo, que esto se aplica sólo a caracteres de información.
A (PCRE_ANCHORED)
 
Si se aplica este modificador, el patrón es forzado a ser "anclado", es decir, se le obliga a coincidir sólo con el inicio de la cadena que está siendo buscada (la "cadena objetivo"). Este efecto también se puede lograr mediante construcciones apropiadas en el patrón mismo, lo cual es la única manera de hacerlo en Perl. 
 
D (PCRE_DOLLAR_ENDONLY)
 
Si se aplica este modificador, un meta-carácter dólar en el patrón coincidirá sólo con el final de la cadena objetivo. Sin este modificador, un dólar coincide también inmediatamente antes del carácter final si éste es una nueva línea (pero no antes de cualquier otra nueva línea). Este modificador es ignorado si el modificadr m se aplica. No existe equivalente a este modificador en Perl. 
 
S
Cuando un patrón se va a usar varias veces, merece la pena dedicar más tiempo a analizarlo a fin de acelerar el tiempo tomado para las comparaciones. Si se aplica este modificador, se realiza este análisis extra. Actualmente, estudiar un patrón es útil sólamente para patrones no anclados que no tienen un carácter de inicio único fijo. 
 
U (PCRE_UNGREEDY)
 
Este modificador invierte la "codicia" de los cuantificadores de modo que no sean codiciosos por defecto, pero se vuelven codiciosos si son seguidos por ?. Esto no es compatible con Perl. También se puede aplicar por un modificador de ajuste dentro del patrón (?U) o por un signo de interrogación detrás del cuantificador (p.ej. .*?). 
X (PCRE_EXTRA)
 
Este modificador pone en marcha funcionalidad adicional de PCRE que es incompatible con Perl. Cualquier barra invertida en un patrón que esté seguida por una letra que no tenga un significado especial causa un error, por lo que se reservan estas combinaciones para futuras expansiones. Por defecto, como en Perl, una barra invertida seguida de una letra que no tenga un significado especial se trata como un literal. No hay en la actualidad otras características controladas por este modificador. 
 
J (PCRE_INFO_JCHANGED)
 
El ajuste de opción interna (?J) cambia la opción local PCRE_DUPNAMES. Permite nombres duplicados para sub-patrones. 
 
u (PCRE_UTF8)
 
Este modificador pone en marcha funcionalidad adicional de PCRE que es incompatible con Perl. Las cadenas de patrones son tratadas como UTF-8. Este modificador está disponible a partir de PHP 4.1.0 o posterior en Unix y desde PHP 4.2.3 en win32. La validez UTF-8 del patrón es verificada desde PHP 4.3.5.

Curso con 50% de descuento de php en Udemy

sábado, 21 de diciembre de 2013

El DataGrid en Flex


Ejemplo de un DataGrid

<mx:DataGrid columns="No default." dataProvider="No default." sortableColumns="true|false" . . . />

Cargar datos a un DataGrid

Los datos se cargan a un DataGrid por medio de la propiedad dataProvider.

La mejor manera de cargar datos es por medio de un ArrayCollection.

Es necesario importar la clase:


mx.collections.ArrayCollection

Cargar con datos a un DataGrid

Ejemplo para poblar un DataGrid desde un modelo de datos:

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/ 2006/mxml" xmlns="*"
layout="absolute" creationComplete="restaurants = new ArrayCollection(myDataModel.item)">

<mx:Model id="myDataModel">
<item>
<key>0</key>
<style>Thai</style>
<number>6</number>
</item>
<item>
<key>1</key>
<style>Indian</style>
<number>14</number>
</item>
</mx:Model>

<mx:Script>
<![CDATA[
import mx.collections.ArrayCollection;

[Bindable]

public var restaurants:ArrayCollection;

]]>

</mx:Script>
<mx:DataGrid dataProvider="{restaurants}"/>

</mx:Application>


Una columna es creada para cada propiedad

El orden de las columnas no es previsible

El nombre de las columnas por omisión es el nombre de la propiedad

Más información: http://www.pacoarce.com

viernes, 20 de diciembre de 2013

ActionScript 3.0: Pasar parámetros a una película en ActionScript 3.0

Autor: Francisco Arce
Correo: fj_arce@yahoo.com.mx
Fecha: 20110222
 
Si deseas pasar código a una película AS 3.0 necesitamos un objeto de la clase LoaderInfo, el cual proporciona información sobre un objeto visual (display objet) ya sea una película swf o un archivo de imagen.

Para obtener información de un objeto LoaderInfo existen dos maneras;
  • Por la propiedad loaderInfo de los objetos visuales
  • Por la propiedad contentLoaderInfo de un objeto Loader.
Si deseas extraer la información de estos objetos, necesitamos la propiedad parameters. Según el manual:

"Las dos fuentes de parámetros son: la cadena de consulta de la URL del archivo SWF principal y el valor del parámetro HTML FlashVars (éste sólo afecta al archivo SWF principal)."

Por HTML (flashVars) o llamando al archivo SWF desde la URL (método GET).
Se puede utilizar las siguientes instrucciones:

var parametros:Object = LoaderInfo(this.root.loaderInfo).parameters;

O leerlo directamente com:

var miParametro = LoaderInfo(this.root.loaderInfo).parameters.parametro;

También se puede aceptar:

var titulo = MovieClip(this.root).loaderInfo.parameters.titulo;

Observe que this.root es la película principal. Un buen tutorial de uso de flashVars es el siguiente:

http://blogs.adobe.com/pdehaan/2006/07/using_flashvars_with_actionscr.html
http://gotoandlearn.com/play.php?id=77

domingo, 15 de diciembre de 2013

Las instancias de los componentes en Coldfusion 10

Existen tres maneras de crear o llamar a un componente en Coldfusion 10:

• <cfinvoke> llama el metodo dentro de un componente
• <cfobject> crea una instancia de un componente
• createObject() Crea una sintancia de un componente

Caracteristicas de las instancias de los componentes

• Con una instancia se pueden llamar a varios metodos de componentese methods
• Podemos almacenar informacion en una instanciaa
• Podemos subir una instancia a la memoria cache
• Podemos crear diferentes instancias con diferentes datos del mismo componente

Crear una instancia con <cfobject>

• Use la etiqueta <cfobject> con las siguientes propiedades:
  • component: es la ruta del archivo del componente, como se utiliza en <cfinvoke>
  • name: el nombre que ser'a utilizado para llamar al componente en los programas
  • type: el tipo de objeto que sera instanciado (opcional)

• Ejemplo

<cfobject component="componentes.alumno" name="alumno" >

Uso de las instancias de un componente
Por medio de las instancias de un component de ColdFusion podemos llamar a los metodos y propiedades almacenadas en el mismo, por ejemplo:

<cfobject component="componentes.alumno" name="alumno" >
<cfset cali = alumno.calificacion >
<cfset promedio = alumno.promedio() >

Tambien podemos llamar a un metodo al momento de crearlo:


<cfset miAlumno= createObject("cfcAlumno", "components.alumno").init()>



Más información en: http://www.pacoarce.com


 

Conexión a una base de datos a Coldfusion 10

Una de las características de ColdFusion más utilizados y potentes es la conectividad de base de datos. Usando sólo una pocas etiquetas CFML, puede conectarse y manipular datos de una amplia variedad de bases de datos.

Revisión de las bases de datos relacionales

• Una base de datos relacional es un conjunto estructurado de datos relacionados
• Los datos se organizan en tablas con filas y columnas de información
• Cada fila de una tabla se le asigna un identificador único, que se refiere como una clave principal, que se utiliza para relacionar tablas

Entender controladores de base de datos relacionales

ColdFusion se comunica con la fuente de datos a través de una interfaz de base de datos llamada Java Database Connectivity (JDBC).

JDBC es una API estándar para acceder a la información de diferentes sistemas de bases de datos y formatos de almacenamiento
Una vez que se configura una conexión entre una base de datos y ColdFusion, utilice Query Language (SQL) consultas estructuradas para extraer datos de la base de datos
El controlador convierte el SQL a la lengua materna adecuada de la base de datos

La etiqueta <cfquery>

La creación de los resultados de conjunto de registros (recordset)  en una sentencia SQL SELECT envuelto dentro de la etiqueta de un CFML <cfquery> en la parte superior de la página que está abierta:


<cfquery ...>
SELECT id, nombre, apeliido
FROM alumnos
ORDER BY apellido
</ cfquery>

Agregar el atributo datasource  de origen de datos

El atributo datasource  identifica la fuente de datos para la etiqueta <cfquery>, que a utiliza los parámetros de conexión establecidos en el. Este parámetro es requerido para la etiqueta <cfquery>.


<cfquery datasource=“miBaseDatos”...>
SELECT id, nombre, apeliido
FROM alumnos
ORDER BY apellido
</ cfquery>

El resultado del query lo almacenaremos en una variable del atributo name. Por convención, es decir, si quiere seguir la regla, qué bueno, y si no, pues ni modo, iniciamos estas variables (en realidad objetos) con la letra “q”.

<cfquery datasource=“miBaseDados”. name=”qAlumnos”>
SELECT id, nombre, apeliido

FROM alumnos
ORDER BY apellido
</ cfquery>

A este tio de objeto lo conoceremos con “recordset”.

Una forma fácil de visualizar el resultado de un recordset es por medio de la etiqueta <cfdump>:

<cfdump var="#recordset#" />

Un recordset contiene, a parte de la información, el timpo de ejecución, el número de renglones etraidos, si el query a sido “cachado” (la nformación se encuentra en el cache del servidor), la sentencia SQL de donde provino la información.

Más información en http://www.pacoarce.com

lunes, 9 de diciembre de 2013

Alimentar diferentes listas en forma dinámica con Adobe AIR


Una aplicación muy frecuente para la explotación de información de una base de datos, es leer una tabla y armar diferentes listas o combo box para después seleccionar los datos. Una vez ye tenemos los datos leídos, por medí de un ciclo y de diferentes sentencias condicionales, generamos un arreglo para cada características, llenamos las listas y esperamos a que el usuario seleccione el criterio para consultar los datos de las tablas.

En la siguiente función, seleccionaremos los correos de los criterios seleccionados y los enviaremos al protocolo malito, para generar un correo electrónico con el agente de correo de la computadora.

private function cargaComponentes(){
var meses_array:Array = new Array("","Enero", "Febrero", "Marzo", "Abril", "Mayo", "Junio", "Julio", "Agosto", "Septiembre", "Octubre", "Noviembre", "Diciembre");
contacto_array = new Array();
genero_array = new Array;
edad_array = new Array;
fecha_array = new Array;
//
var i,j,genero,edad,fecha;
//
for(i=0; i<datos_array.length; i++){
contacto_array.push({label:datos_array[i].nombres, data:datos_array[i].rfc});
//genero
for(j = 0; j<genero_array.length; j++){
if(genero_array[j].label==datos_array[i].genero){
break;
}
}
if(j==genero_array.length){
genero = (datos_array[i].genero=="M")?"Masculino":"Femenino";
genero_array.push({label:genero, data:datos_array[i].genero});
}
//Edad
for(j = 0; j<edad_array.length; j++){
if(edad_array[j].label==datos_array[i].edad){
break
}
}
if(j==edad_array.length){
edad_array.push({label:datos_array[i].edad, data:datos_array[i].edad});
}
//Fecha
fecha  = datos_array[i].diaNacimiento+" de ";
fecha += meses_array[Number(datos_array[i].mesNacimiento)]+" de ";
fecha += datos_array[i].anioNacimiento;
datos_array[i].fecha = fecha;
for(j = 0; j<fecha_array.length; j++){
if(fecha_array[j].label==fecha){
break
}
}
if(j==fecha_array.length){
fecha_array.push({label:fecha, data:fecha});
}
}
contacto_array.sort();
edad_array.sortOn("label", Array.NUMERIC);
fecha_array.sortOn("label");
//
contacto_array.unshift({label:"---Seleccione paciente---", data:"vacio"});
genero_array.unshift({label:"---Seleccione un género---", data:"vacio"});
edad_array.unshift({label:"---Seleccione por edad---", data:"vacio"});
fecha_array.unshift({label:"---Seleccione por fecha---", data:"vacio"});
//
var contacto_dp:DataProvider = new DataProvider(contacto_array);
var genero_dp:DataProvider = new DataProvider(genero_array);
var edad_dp:DataProvider = new DataProvider(edad_array);
var fecha_dp:DataProvider = new DataProvider(fecha_array);
//
contacto_cb.enabled = true;
todos_cb.enabled = true;
genero_cb.enabled = true;
edad_cb.enabled = true;
fecha_cb.enabled = true;
//
contacto_cb.dataProvider = contacto_dp;
genero_cb.dataProvider = genero_dp;
edad_cb.dataProvider = edad_dp;
fecha_cb.dataProvider = fecha_dp;
}

Más información en http://www.pacoarce.com

lunes, 2 de diciembre de 2013

Detectar las características de HTML5 y CSS3 con Modernizr

Modernizr es una biblioteca JavaScript de código abierto que facilita a los diseñadores web para desarrollar diferentes niveles de experiencias, sobre la base de las capacidades del navegador del visitante.
Esto permite a los diseñadores sacar el máximo provecho de todo en HTML5 y CSS3 que se implementa en algunos navegadores, sin sacrificar el control sobre la experiencia del usuario en otros navegadores.
Y sobre todo contestar la pregunta: ¿qué hacemos con IE 6-9?


<!doctype html>
<html class="no-js">
<head>
<meta charset="UTF-8">
<title>Untitled Document</title>
<script src="js/modernizr.js"></script>
<style>
.reflejo{
font-size:5em;
font-family:Verdana, Geneva, sans-serif;
text-align:center;
-webkit-box-reflect:below -0em -webkit-linear-gradient(top, rgba(255,255,255,0.6) 0%, rgba(255,255,255,0) 100%);
box-reflect:below -0em linear-gradient(top, rgba(255,255,255,0.6) 0%, rgba(255,255,255,0) 100%);
}
.no-cssreflections .reflejo{
color:red;
box-reflect:none;
text-shadow:10px 10px 10px black;
}
.no-js .reflejo{
color:green;
box-reflect:none;
text-shadow:10px 10px 10px black;
}

</style>
</head>

<body>
<p class="reflejo">Soy espejo y me reflejo</p>
</body>
</html>