¿Que es lo que hace: jQuery.noConflict()?


De vez en cuando me gusta leer el código de alguna buena librería para descubrir cosas interesantes. El código de jQuery es de esos que contiene un buen número de detalles de los que se puede aprender bastante. Es un código atractivo y más sencillo de seguir de lo que podría imaginarse.
Hoy, tras una conversación reciente, me quiero centrar en la implementación de la función noConflict()

El problema

Ya desde su versión 1.0, John Resig -creador de jQuery- tuvo muy clara una idea en la arquitectura de la librería: Causar la mínima polución de nombres posible. ¿Por qué? Por aquel entonces, la librería más popular -PrototypeJS- había seguido el camino de crear las funciones globales que creyó necesarias y de añadir propiedades y métodos a los objetos nativos de Javascript. Entre esas funciones globales, lo que más llamaba la atención era el uso de alias como $$H o $F$ es un nombre muy corto que enseguida se hizo popular. Claro, otras librerías decidieron usar ese mismo alias. Luego, cuando los desarrolladores-usuarios querían incluir en su página un determinado elemento hecho con una librería y otro hecho con otra distinta... Colisión de nombres y problemas sin fin.
Pero claro, por otra parte el alias $ es realmente apetecible por su comodidad. Así que en jQuery, buscando dar a sus usuarios la mayor flexibilidad posible para utilizar su librería junto a otras, se decidió usar el alias pero a la vez proporcionar un medio de liberar ese alias, la función noConflict().

Uso de noConflict()

El uso de noConflict() es sencillo. Cargamos jQuery, lo que define el alias $. Luego usamos noConflict() y eso libera el alias, dejando disponible el que hubiera antes en caso de que lo hubiera.
No hay mucho más que decir, más que nada porque ya está dicho en muchos sitios. Incluso en la propia documentaciónoficial de jQuery.

Pero, ¿cómo funciona?

En realidad es bastante sencillo. Todo se basa en el estricto seguimiento por parte de los desarrolladores del principio de encapsulación de alcance. Veámoslo directamente sobre el código. Lo que sigue es el código de jQuery 1.4.4. pero sólo las partes implicadas, claro:
(function( window, undefined ) {

    // Use the correct document accordingly with window argument (sandbox)
    var document = window.document;
    var jQuery = (function() {
        // Define a local copy of jQuery
        var jQuery = function( selector, context ) {
            // The jQuery object is actually just the init constructor 'enhanced'
            return new jQuery.fn.init( selector, context );
        }

        // Map over jQuery in case of overwrite
        _jQuery = window.jQuery
        // Map over the $ in case of overwrite
        _$ = window.$

        jQuery.fn = jQuery.prototype = {
            // The current version of jQuery being used
            jquery: "1.4.4"
        };
        jQuery.extend = jQuery.fn.extend = function() {
            // ...
        };

        jQuery.extend({
            noConflict: function( deep ) {
                window.$ = _$;
                if ( deep ) {
                    window.jQuery = _jQuery;
                }
                return jQuery;
            }
        });
        // Expose jQuery to the global object
        return (window.jQuery = window.$ = jQuery);
    })();
})(window);
Lo primero es que todo el código de la librería está contenido dentro de una función anónima a la que se llama de forma inmediata, recibiendo los valores de window y de undefined. Con esto lo que se logra es que, si seguimos la recomendable práctica de declarar nuestras variables localmente en el entorno que corresponde (usando var) evitaremos causar cualquier conflicto en el alcance global del intérprete. El recibir undefined se hace con un objetivo simétrico: evitar recibir valores de undefined que vengan alterados por otros scripts. window se recibe para obtener una referencia local (más rápido) y localizar la referencia al entorno global en 1 único sitio ( ver explicación en el comentario más abajo )
Una vez nos encontramos en ese entorno, se declara una variable llamada jQuery. Es importante notar que esta variable es local, vive únicamente dentro de este alcance. Y no va a salir de ahí. Definimos ahí un nuevo alcance y dentro de él es donde se va a desarrollar todo el contenido de jQuery. De hecho, es en ese nuevo alcance donde se define otrajQuery local y sobre ella se trabaja, añadiéndole todas las funciones que usamos habitualmente.
En ese mismo alcance donde está definiendo jQuery, se da el primer paso necesario para el funcionamiento denoConflict(): Se captura el (posible) valor existente de $. Fijémonos porque es interesante:
// Map over the $ in case of overwrite
_$ = window.$
Para acceder al $ global, lo hacemos explícitamente a través de window. Ah, y lo mismo se hace con el propio nombrejQuery. Bien, ambos valores se guardan creando sobre ellos una closure. Ahí estarán disponibles para cuando los necesitemos.
Tras crear todas las funciones y objetos necesarios, la forma de hacer disponibles tanto jQuery como $ en el alcance global, no es simplemente devolver los objetos in más, sino que se exponen explícitamente sobre el objeto window:
return (window.jQuery = window.$ = jQuery);
Ahora, después de haber cargado y construido jQuery, es cuando podemos llamar a noConflict(). ¿Qué es lo que ocurre cuando lo hacemos? Sencillo:
            noConflict: function( deep ) {
                window.$ = _$;
                if ( deep ) {
                    window.jQuery = _jQuery;
                }
                return jQuery;
            }
Por una parte, volvemos a exponer como window.$ el objeto que habíamos capturado inicialmente en _$. Si lo pedimos, se hace también lo mismo con el nombre jQuery. La liberación de $ es interesante para cualquier librería que lo use, la de jQuery permite la convivencia con otras versiones de la propia librería. Además, por si el usuario lo prefiere devolvemos también el objeto jQuery.

Ejemplo

Si vemos el siguiente ejemplo:
<!DOCTYPE HTML >
<html>
<head>
<title>Muchas jQueries!</title>
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.1/jquery.min.js" ></script>
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js" ></script>
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.3/jquery.min.js" ></script>
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.4/jquery.min.js" ></script>
<script type="text/javascript">
    var jqs = {};
    jqs.jq144 = jQuery.noConflict(true);
    jqs.jq143 = jQuery.noConflict(true);
    jqs.jq142 = jQuery.noConflict(true);
    jqs.jq141 = jQuery.noConflict(true);

    jqs.jq144(function($) {
        $("#out").html("141: " + jqs.jq141().jquery + "<br/>142: " + jqs.jq142().jquery +"<br/>143: " + jqs.jq143().jquery +"<br/>144: " + jqs.jq144().jquery );
    });
</script>
</head>
<body>
<div id="out"></div>
</body>
</html>
Tras haber cargado las 4 versiones de jQuery, lo que tenemos es algo como esto:
jQuery {
    version 1.4.4
    closure ( _jQuery = jQuery {
        version 1.4.3
        closure ( _jQuery = jQuery {
            version 1.4.2
            closure ( _jQuery = jQuery {
                version 1.4.1
            })
        })
    })
}
Con la primera llamada a jQuery.noConflict() lo que hacemos es devolver el actual jQuery y asignar el anterior (_jQuery) a window.jQuery. Así queda nuestra estructura:
    jQuery {
        version 1.4.3
        closure ( _jQuery = jQuery {
            version 1.4.2
            closure ( _jQuery = jQuery {
                version 1.4.1
            })
        })
    }
Algo similar se va haciendo con $. Cuando llamamos por segunda vez... Realmente estamos llamando alnoConflict() del objeto que está ahora en jQuery, que es la versión 1.4.3. Es decir, no es -aunque lo parezca- la misma llamada que antes. Se llama igual, pero es una función de otro objeto.

Conclusiones

jQuery utiliza una estructura muy definida para evitar por todos los medios crear conflictos de colisiones con otras librerías o incluso con otras versiones de ella misma. Además, proporciona la función noConflict() como herramienta fundamental para solucionar esas colisiones.

Diferencias entre null y undefined


En javascript existen cinco tipos primitivos de datos: undefined, null, boolean, number y string.
A primera vista no se aprecia la diferencia entre los tipos undefined y null.
El tipo undefined corresponde a las variables que han sido definidas y todavía no se les ha asignado un valor.
El tipo null se suele utilizar para representar objetos que en ese momento no existen.
Sin embargo aunque son conceptos distintos el operando de igualdad los considera iguales. No así el operando typeof o el operador de igualdad estricta ===
(undefined == null) //--> true
(undefined === null) //--> false
(typeof undefined == typeof undefined null) //--> false
Si intentamos operar con una variable que tiene valor null, según el contexto devolverá los siguientes resultados.
Boolean: false
Numeric: 0
String: null
Si intentamos operar con una variable que tiene valor undefined, según el contexto devolverá los siguientes resultados.
Boolean: false
Numeric: NaN
String: undefined

Recomendación SQLera

Bueno mis estimados lectores el día de hoy les comento sobre un libro que esta muy interesante, y que esta enfocado en ayudar a dar ese paso a los desarrolladores de ASP.Net 2.0 hacia el 4.0, su temática es sencilla, ponernos en contexto sobre que es la tecnología de lado de servidor, su evolución... protagonismo el scripting por lado del cliente, y como aprovechar al máximo las bondades de ambas, tecnologías.

Este libro y el autor José Manuel Alarcón Aguín, nos llevan de la mano, en sus capítulos, si bien se parte desde 0 en la explicación de las tecnologías, es necesario tener conocimiento básico o intermedio de ASP.Net, Javascript y html.


los temas tratados los capitulo son los siguientes:

  • Las diferentes versiones de ASP.NET y qué ofrecen al programador
  • Fundamentos de AJAX. Con cualquier tecnología, no atado a ASP.NET.
  • ASP.NET AJAX en el lado servidor.
  • ASP.NET AJAX en el lado cliente y el modelo de desarrollo “puro” con AJAX
  • Enlazado a datos en el lado cliente. La tecnología de Live Binding es la principal novedad de ASP.NET 4.0. Este es el primer libro del mercado en el que se trata esta nueva funcionalidad.
  • Generación automática de interfaces de “mantenimiento” con Dynamic Data.
  • Filtrado automático de datos con Query Extenders. Otra novedad de ASP.NET 4.0 sobre la que no verás escrito en ningún otro lado.
En resumen lo que podemos aprender del libro y sus tips es:
  •  asp.net y sus versiones
  • fundamentos de ajax
  • asp.net ajax en el navegador
  • asp.net ajax en el servidor
  • optimización y uso de bibliotecas
  • asp.net dynamic data interfaces de datos adaptables
  • filtrado de datos automatico con query extender
muy buen libro y altamente recomendado si te llama la atención en desarrollo web y la plataforma .net. Les dejo el link del libro en linea para que si es de su agrado le den un vistazo.


Saludos!

Enviar correo electrónico en un formato tabular utilizando el correo electrónico de la base datos SQL Server

Enviar correo electrónico en un formato HTML utilizando el correo electrónico de la base datos SQL Server

101 citas célebres del mundo de la informática

Después de pasar un buen rato entretenido con la recopilación de frases célebres relacionadas con el mundo de la informática y especialmente el desarrollo de software, "101 Great computer programming quotes", publicado en DevTopics hace unas semanas

Tips para ser un mejor programador

1. Estudia, estudia y estudia
El estudiar nos permite perfeccionarnos, cuanto mas estudiemos mas oportunidades de programar mejor tendremos, no solamente estoy hablando de universidades, ni tampoco de cursos, hoy por hoy gracias a internet existen

LINQ: Consulta Maestro-Detalle

Problema


Lo primero, voy a exponer el problema que me han planteado:
Dada una tabla, digamos, “Cabecera”, con una tabla relacionada de “Detalle” con una relación 1 a

Diez Años de .Net

En el boletín de Microsoft del MSDN Flash que recibí este día dice que ya son 10 años de .Net y justamente recuerdo cuando inicie mis días de programación con .Net.


En aquella época estaba la versión 2002 de Visual Studio

Más allá de las bases de datos relacionales

supernova

Las bases de datos relacionales, como MySQLPostgreSQL y varios productos comerciales, nos han servido bien durante muchos años. Últimamente, sin embargo, ha habido mucha discusión sobre si el modelo relacional está llegando al final

Cannot resolve the collation conflict between "Modern_Spanish_CI_AS" and "SQL_Latin1_General_CP1_CI_AS" in the equal to operation.

El día de hoy estaba trabajando con unas tablas de unas bases de datos del servidor en donde trabajo... y al realizar una consulta, me arrojaba un error sobre su COLLATION (intercambio de caracteres entre columnas). Un error así...:

Cannot resolve the collation conflict between "Modern_Spanish_CI_AS" and "SQL_Latin1_General_CP1_CI_AS" in the equal to operation.

Diez errores comunes de CSS

Recientemente he estado modificando el código en un sitio web diseñado por alguien más, cuando vi a varios errores comunes en la hoja de estilos. Pensé que sería útil

Como incluir jQuery usando los host de google

Actualmente hay dos maneras de incluir la librería jQuery en nuestras paginas. La primera opción es bajar una copia desde su sitio Web enjQuery.com e incluirla en nuestro código; pero veamos como hacerlo también usando la copia que Google nos hace el favor de tener siempre disponible en su propio servidor web.

combinando MS Access con Oracle

Combinando Microsoft Access y Oracle
En este artículo vamos a ver cómo implementar una sencilla aplicación que trabaje sobre una base de datos Oracle para actualizar datos y generar reportes, usando una herramienta amigable y disponible en la mayoría de los ordenadores como lo es Microsoft Access.

La idea es, en 5 pasos crear una interfase gráfica con poco esfuerzo y en tiempo récord, que facilite la vida de muchos usuarios no IT, como por ejemplo la del Gerente del Area de Recursos Humanos que necesita ingresar y consultar datos en su base de datos corporativa. No hay necesidad de comprar un caro producto comercial para esa sencilla tarea.

Qué software necesitamos para desarrollar y ejecutar nuestra aplicación?

- Microsoft Access, sino nuestro archivo .mdb no será reconocido por Windows.
- Un cliente Oracle, para que podamos conectarnos con la base de datos de destino.

(Este software debe estar presente ya sea en la máquina que usemos para desarrollar como en la máquina destino donde va a correr el programa. No está en el alcance de este artículo explicar cómo instalar estos dos productos)

Los 5 pasos para crear la aplicación

1) Crear una conexión ODBC
2) Vincular en Access las tablas de Oracle
3) Crear las relaciones existentes
4) Crear formularios
5) Crear un reporte

Nuestra aplicación va a conectarse y trabajar con el usuario Oracle SCOTT. Uso Windows Vista, Access 2003 y un cliente Oracle 10g.

Disculpas por las pantallas de Access en portugués y Windows en inglés, pero es todo lo que tengo en la vuelta :)

Paso 1. Crear una conexión ODBC

- En Windows, vamos al menú Start, Control Panel, Administrative Tools y seleccionamos Data Sources (ODBC)

- En la lengueta User DNS, presionar sobre el botón Add. Una lista de drivers disponibles aparecerá en un diálogo. Tenemos dos posiblidades para seleccionar, una es elegir el driver de Microsoft para Oracle (Microsoft ODBC for Oracle), y la otra es elegir el driver de Oracle que fue instalado con nuestro cliente (en mi caso Oracle em OraClient10g). Recomiendo usar el driver nativo de Oracle, ya que está optimizado y se corresponde exactamente con la versión de Oracle que acabamos de instalar.

Nota: En caso que se nos presente un mensaje de error con el título SQORAS32 y el mensaje An unsupported operation was attemped, se trata de un bug conocido cuya solución está en Metalink nota NR.5699495. Será necesario descargar un patch y reemplazar algunos archivos en el cliente Oracle. Es aplicable a los clientes 10.2.0.3.0 a 10.2.0.3.7 y las instrucciones vienen con el propio patch.

- En el diálogo siguiente, ingresar los datos de la conexión:

Data Source Name: Un nombre cualquiera describiendo nuestra conexión
Description: Opcional, puede ser nada
TNS Service Name: El mismo nombre de servicio en nuestro tnsnames.ora
User ID: Opcional, puede ser nada



- Pulsar Test Connection para ver si nuestra conexión funciona. Aparecerá un diálogo solicitando usuario y password. En mi caso colocaré scott/tiger. El mensaje Connection successfull deberá aparecer para poder continuar. De lo contrario, revisar el tnsnames.ora que está siendo usado, para ver si tiene la entrada correcta.

Luego de seleccionar OK en el diálogo principal, nuestra conexión ODBC está lista para ser usada.

Paso 2. Vincular en Access las tablas de Oracle

- Ingresar a Access y comenzar un nuevo proyecto en blanco.

- En el menú Insertar, elegir Tabla y Vinculación de tabla.



Aparecerá un diálogo como los de seleccionar archivos, pero tenemos primero que elegir en el combo Tipos de archivos, la opción Bases de datos (ODBC).

Luego se muestra el diálogo Select Data Source. Ir a la lengueta Machine Data Source y seleccionar la conexión ODBC creada en el paso anterior.



Somos solicitados para informar el usuario y password de la base de datos Oracle (scott/tiger).

Observar que se nos presentan todas las tablas y vistas a las que el usuario scott tiene acceso. Buscar aquellas que comienzan con el prefijo SCOTT y marcarlas: BONUS, DEPT, EMP y SALGRADE. Seleccionar OK.

- Access solicitará indicar para algunas tablas las columnas identificadoras (clave primaria). Eso dependerá si la clave está definida en la tabla original o no. En este caso vamos a ignorar el aviso simplemente seleccionando OK.

Listo! Las tablas ya están vinculadas en nuestro proyecto. Notar que el nombre de cada tabla asignado automáticamente por Access es [ESQUEMA]_[TABLA].

Paso 3. Crear las relaciones

Cuando se vinculan las tablas del esquema Oracle en Access, no se crean los relacionamientos entre ellas. Es necesario hacerlo manualmente, si queremos mantener el esquema de integridad de datos.

- En el menú Herramientas, ingresar a Relaciones.

- En el diálogo Mostrar Tabla, en la lengueta Tablas, seleccionar (presionando Control) las tablas SCOTT_EMP y SCOTT_DEPT, y pulsar Agregar. Las tablas se mostrarán en la ventana de relacionamientos, y podremos cerrar el diálogo Mostrar Tabla.

- Si la tabla SCOTT_EMP no muestra todas las columnas, agrandarla desde el vértice inferior derecho para permitir ver la columna DEPT.



- Hacer click (izquierdo) sobre la columna DEPT de SCOTT_EMP, y sin soltar, arrastrar la columna hacia la tabla SCOTT_EMP, soltándola encima de la columna DEPTNO (clave primaria de SCOTT_DEPT). Un nuevo diálogo se abrirá con la definición de la relación.

- Podemos elegir las propiedades de esta relación, en nuestro caso vamos a dejar todo por defecto, que corresponde a un INNER JOIN entre ambas tablas. Luego de seleccionar Crear, la relación entre las tablas será visible gráficamente en pantalla.



- Cerrar la ventana de relacionamientos y elegir Sí para guardar los cambios.

Paso 4. Crear formularios

Tenemos las tablas vinculadas en Access con sus relaciones, y de aquí para adelante depende exclusivamente de nuestros conocimientos en Access. Da lo mismo que sean tablas propias de Access o de Oracle con las que estemos trabajando. Podemos inclusive usar este mismo esquema para importar datos desde una tabla Oracle a una local.

Crearemos un formulario para cada una de las tablas importadas, para facilitar el mantenimiento de los datos a través de la aplicación. Explicaré cómo hacer los formularios de DEPT y EMP; para el resto es el mismo procedimiento.

- En la ventana principal de Access, ir a Formularios, y elegir la opción Crear formulario usando el asistente.

- Seleccionar la tabla SCOTT_DEPT en el combo de tablas, y seleccionar todos los campos disponibles (DEPTNO, DNAME, LOC) con el botón >>.

- Presionar Avanzar, elegir el layout 'Columna', el estilo 'Standard', y escribir el título 'Departamentos'. Seleccionar Concluir.



Ya está listo nuestro primer formulario donde daremos mantenimiento a los departamentos. Por defecto, todas las operaciones sobre los datos están permitidas. Si se desea, se pueden alterar las propiedades del formulario activando la caja Propiedades con Alt-Enter.

Ahora vamos al formulario de empleados.

- En la ventana Formularios, elegir la opción Crear formulario usando el asistente.

- Seleccionar la tabla SCOTT_EMP en el combo de tablas, y seleccionar todos los campos disponibles con el botón >>.

- Elegir las mismas opciones que en la tabla anterior, excepto por el título 'Empleados'.

Nuestro formulario de empleados está listo, pero vamos a introducir una pequeña mejora: que el campo DEPTNO en lugar de un texto numérico sea un combo list con los nombres de los departamentos, para evitar tener que recordar los números.

- Seleccionar en el menú Exibir, el modo Diseño.

- Marcar el campo DEPTNO en el formulario y borrarlo (pulsando la tecla DELETE)

- En la caja de herramientas (lateral izquierda) seleccionar la herramienta Caja de Combinación.



- Crear el combo en el lugar que eliminamos el campo numérico DEPTNO. Se abrirá automáticamente el asistente para caja de combinación.

- Seleccionar la primera opción para que el combo busque los datos a partir de una consulta y Avanzar.

- Elegir la tabla SCOTT_DEPT y Avanzar.

- Seleccionar los campos DEPTNO y DNAME y Avanzar

- Definir el orden de ordenamiento por DNAME (creciente) y Avanzar.

- Dejar seleccionado el checkbox Ocultar llave primaria y Avanzar.

- Dejar la opción Recordar valor para uso posterior y Avanzar.

- Si se desea modificar el rótulo, puede alterarse para 'DEPTO'.

- Concluir la operación.



Terminamos nuestro formulario para dar mantenimiento a los empleados.
Ahora nuestro campo de departamentos se actualiza dinámicamente a partir de la tabla SCOTT_DEPT.

Repetir el proceso de creación de formularios para el resto de las tablas, y estaremos aptos para insertar, borrar y alterar registros completamente a través de nuestra interface gráfica.

Paso 5. Crear un reporte

Crearemos un reporte para mostrar un ejemplo más de funcionalidad.

- En la ventana principal de Access, ir a Consultas, y elegir la opción Crear consulta en modo diseño.

- Cerrar la ventana Mostrar tabla y en el menú Exibir seleccionar SQL.

- Escribir la query:

SELECT e.empno, e.ename, e.job, e.sal, d.dname, s.grade
FROM scott_emp e, scott_dept d, scott_salgrade s
WHERE e.deptno=d.deptno
AND e.sal BETWEEN s.losal AND s.hisal

- Cerrar la ventana query y elegir Sí para grabar los cambios, asignando un nombre cualquiera para la consulta, por ejemplo 'Salarios de empleados por departamento'.

- En la ventana principal de Access, ir a Reportes, y elegir la opción Crear reporte usando el asistente.



- En el combo Tablas/Consultas elegir la consulta creada anteriormente, junto con todas las columnas disponibles en la consulta, y avanzar.

- En el nivel de agrupamiento, elegir DNAME (el departamento) y avanzar.



- Elegir el ordenamiento por orden de ENAME creciente.

- Dejar las opciones de diseño por defecto y avanzar hasta visualizar el reporte.



Nuestro reporte está listo luego de 10 minutos con cero esfuerzo de programación, simplemente usando una sencilla consulta SQL.

Combinamos la facilidad de uso y versatilidad de una herramienta como Access con el potencial de una base de datos Oracle. Las posibilidades dependen sólo de nuestra voluntad, pudiendo integrar planillas de Excel, gráficos, multimedia y mejorar la lógica de nuestra aplicacion con VBA (Visual Basic for Applications).

PD: hago mención de que esta tuto no es mio,, es publicad por Ifer de este blog, solo para que no digan repost o lammer o demas tonterias,, ahi se los dejo,, es bueno hacer este tipo de post xDXDXDXDXD KDSDSDSD

see u next time

Convertir campos públicos en propiedades publicas usando Expresiones Regulares

Buen día lectores ya llevaba algo de tiempo sin presentar nada en el blog, salvo, las intervenciones del Kellogs, que ha sido muy amable al postear varios artículos, ahora me encuentro

Aprendiendo Script en InDesign CS4 - Learning Script in ID CS4

bueno,, por motivos mas complejos e internos,, deje de postear hace mucho tiempo,, pero no he dejado de ver los post,, ya que me gusta ir aprendiendo cosas nuevas,, aki les traigo un pequeño manual que encontre en la red, con ejemplos muy practicos, para algunos puede ser muy fácil pero puede que vean puntos más claros o comprendan aun más algo que ya sabían.

Todo es en base a JavaScript,, pero pueden manejar apple o visualscript,, depende de cada uno,, lo cual se le haga más fácil,, de uno a otro no hay mucha diferencia de sintaxis XDXD asi que comenzamos:

manejando el ejemplo más auditable y común entre los newbies es un "Hola Mundo" jeje,, muchos van a decir,, "ahh ese es fácil con java o cualquier otro" pues sí, es fácil,, pero lo pongo :@ :P

var myWindow = new Window ("dialog"); ---> creamos una nueva ventana de tipo dialogo
var myMessage = myWindow.add ("statictext"); ---> la cual agregamos un elemento "myMessage" el cual tiene texto
myMessage = "Hola, Mundo"; ---> texto
myWindow.show (); ---> mostrando la ventana

no es necesario hacer una explicación,, ya que esto es fácil de comprender para cada uno de los que lee este post, prosigamos (en las lineas principales coloco un comentario hacer de "que hace" ,,,

Puedo imaginar que saben que existen los tipos de ventana, los cuales son "dialog" y "palette"

para crear el ejemplo anterior en una ventana de tipo palette agregamos el siguiente codigo:

#targetengine "session";

var myWindow = new Window ("palette");
var myMessage = myWindow.add ("statictext");
myMessage = "Hola, Mundo";
myWindow.show ();


eeee,,, "no me vengas con tonterías, es muy fácil", jaja pues si, really easily

ok,, continuemos,, ahora iremos complementando el pequeño app, agregando controles XDXD:
pues ya lo hemos echo,, jeje,, en la linea var myMessage = myWindow.add ("statictext") esto es el control --> statictext

complementando lo anterior al código, sería algo como esto:

var myWindow = new Window ("dialog", "Form");
myWindow.add ("statictext", undefined, "Name:");
var myText = myWindow.add ("edittext");
myWindow.show ();


si se dan cuenta,, despues de "dialog" agrege "Form", esto hace que le de un nombre visible.
Además,, si ponen atención,, la orientación de los elementos es en columna,, extraño no,, pues no,, por default esta de esta manera en columna, pero podemos cambiarla a fila,, digamos que son un poco mas quisquillosos en este sentido, pues sería algo así:

var myWindow = new Window ("dialog", "Form");
myWindow.orientation = "row";
myWindow.add ("statictext", undefined, "Name:");
var myText = myWindow.add ("edittext");
myWindow.show ();


agregamos el control orientation XDXDXD, ahora digamos que debe tener un texto cuando corra la aplicación pero que sea editable, con una longitud limitada, seguimos con el código de esta manera:

var myWindow = new Window ("dialog", "Form");
myWindow.orientation = "row";
myWindow.add ("statictext", undefined, "Name:");
var myText = myWindow.add ("edittext", undefined, "Hector F.");
myText.characters = 30;
myWindow.show ();


pueden editar la longitud a su gusto manejando los controles de characters, ahora digamos, que queremos que cuando ejecutemos la aplicación quede activa la parte del texto,, es decir,, cuando este visible el cursor este en la parte del campo de texto, jojo,, :

var myWindow = new Window ("dialog", "Form");
myWindow.orientation = "row";
myWindow.add ("statictext", undefined, "Name:");
var myText = myWindow.add ("edittext", undefined, "Hector F.");
myText.characters = 30;
myText.active = true;
myWindow.show ();


mmm, divertido,, interesante y motivador,, agregemos unos botones de acción (asi me gusta nombrarlos XDXD):

var myWindow = new Window ("dialog", "Form");
myWindow.orientation = "row";
myWindow.add ("statictext", undefined, "Name:");
var myText = myWindow.add ("edittext", undefined, "Hector F.");
myText.characters = 30;
myText.active = true;
myWindow.add ("button", undefined, "OK");
myWindow.add ("button", undefined, "Cancel");
myWindow.show ();


ejecuten la aplicación, al parecer todos los elementos estan orientados en fila, esto es porque la ventana esta orientada a esa posición, para cambiar la orientación, usaremos unos items,, group y panel, estos dos hacen lo mismo, agrupar los controles, pero difieren de la siguiente manera, group tiene bordos, el panel no, para no afectar a todo lo que concierne a esa ventana en la orientación, agregaremos esto XDXD:

var myWindow = new Window ("dialog", "Form");
var myInputGroup = myWindow.add ("group");
myInputGroup.add ("statictext", undefined, "Name:");
var myText = myInputGroup.add ("edittext", undefined, "John");
myText.characters = 20;
myText.active = true;
var myButtonGroup = myWindow.add ("group");
myButtonGroup.alignment = "right";
myButtonGroup.add ("button", undefined, "OK");
myButtonGroup.add ("button", undefined, "Cancel");
myWindow.show ();


he agregado dos grupos, myInputGroup y MyButtonGroup, fijense que he eliminado la linea que setea la orientacion, esto es por que ya no es necesario, por que lo he divido en dos grupos,, digamo que juan es programador,, y botanas es analista, cada quien esta orientado a una funcion diferente aunque esten en la misma empresa, otro punto agregado es ".aligment = right", fácil de deducir :P XDXD, claro esta que si te gusta experimentar más a fondo puedes hacer lo siguiente,, no explicare porque es muy deducible:

var myWindow = new Window ("dialog", "Form");
myWindow.orientation = "row";
var myInputGroup = myWindow.add ("group");
myInputGroup.add ("statictext", undefined, "Name:");
var myText = myInputGroup.add ("edittext", undefined, "John");
myText.characters = 20;
myText.active = true;
var myButtonGroup = myWindow.add ("group");
myButtonGroup.orientation = "column";
myButtonGroup.add ("button", undefined, "OK");
myButtonGroup.add ("button", undefined, "Cancel");
myWindow.show ();


un poco de lucides al app, pondremos la ventana hacia arriba, podemos agregar el siguiente código antes o después de la segunda linea,, no importa:

var myWindow = new Window ("dialog", "Form");
myWindow.orientation = "row";
myWindow.alignChildren = "top";
var myInputGroup = myWindow.add ("group");
myInputGroup.add ("statictext", undefined, "Name:");
var myText = myInputGroup.add ("edittext", undefined, "John");
myText.characters = 20;
myText.active = true;
var myButtonGroup = myWindow.add ("group");
myButtonGroup.orientation = "column";
myButtonGroup.add ("button", undefined, "OK");
myButtonGroup.add ("button", undefined, "Cancel");
myWindow.show ();


hasta aqui es bueno, pero los botones ok y cancel no hacen nada, pues utilizariamos funciones como if else, si se presiona ok que vuelva a mostrar el app, en caso contrario que salga, algo por el estilo sería asi:

if (myWindow.show () == 1)
var myName = myText.text;
else
exit ();


bueno,, seguire en otra ocasión, esto salio por un rato de ocio en la oficina, pero como ya tengo trabajo que hacer, pues hasta aqui le dejo,, ahi cualquier cosa comenten,, no he agregado algo hacia indesign,, pero el punto principal era que tomaran en cuenta que hacer script es dirigido para cualquier cosa que quieras hacer, bla bla,, jaja, k cosas, después pondre scripts dedicados al soft de indesign,, pero son algos complejos,, algo como agregar grids, o posicionar una imagen, hacer un resize de imagens, recolocar texto, cortar texto, y demás, se oye interesante, pero aun no hago algo concreto, he practicado pero necesito mas tiempo para postear un ejemplo práctico funcionable, jeje, suerte nenas, besos.

Google: mod_pagespeed, tus sitios optimizados

El modulo, llamado mod_pagespeed, puede ser instalado y configurado en los servidores web Apache, el software más utilizado para el funcionamiento de sitios web. Una vez instalado, mod_pagespeed determina sobre la marcha la manera de optimizar el rendimiento de una web. Por ejemplo, comprime imágenes de manera más eficiente y cambia la configuración para que un mayor número de páginas se almacenen en el caché del navegador del usuario, de modo que los mismos datos no tengan que cargarse en varias ocasiones. El software se actualiza automáticamente, señala Richard Rabbat, gerente de producto para el nuevo proyecto. Afirma que esto significa que a medida que Google y otras terceras partes realicen mejoras, las personas que lo instalen se beneficiarán de dichas mejoras sin tener que realizar ningún cambio. "Creemos que hacer que toda la red sea más rápida es algo crítico para el éxito de Google", señala Rabbat. Hacer que la red sea más rápida debería animar a la gente a usarla más y aumentar la probabilidad de que usen los servicios y el software de Google. Rabbat señala la frustración que sienten los usuarios cuando hacen clic en un enlace o escriben una dirección URL y observan una página en blanco durante varios segundos. "En muchos casos," afirma, "personalmente abandono esa página cuando algo como eso ocurre". Google ya ofrece una herramienta llamada Page Speed, encargada de medir la velocidad a la que se carga una página web y sugerir formas de mejorarla. "Nos hicimos la siguiente pregunta: en lugar de simplemente decirle a la gente cuáles son los problemas, ¿podemos arreglarlos de forma

Parametros Opcionales en C# 4.0

Buen día SQLeros después de un buen rato de no poner nada en el blog, les preparé un post que versa sobre los parámetros opcionales en el C# 4.0 y la gran utilidad que estos proporcionan  a la hora de codificar y también un pequeño ejemplo de ellos.

Ahora empecemos... ¿Que son los parámetros opcionales?

En la definición de un método, constructor, indizador o delegado se puede especificar si sus parámetros son obligatorios u opcionales. Todas las llamadas deben proporcionar argumentos para todos los parámetros obligatorios, pero pueden omitir los argumentos para los parámetros opcionales.

Cada parámetro opcional tiene un valor predeterminado como parte de su definición. Si no se envía ningún argumento para ese parámetro, se utiliza el valor predeterminado. Los valores predeterminados deben ser constantes.

Los parámetros opcionales se definen al final de la lista de parámetros, después de los parámetros obligatorios. Si el llamador proporciona un argumento para cualquiera de los parámetros opcionales de una sucesión de este tipo, debe proporcionar argumentos para todos los parámetros opcionales anteriores. No se admiten los espacios separados por comas en la lista de argumentos.

Por ejemplo en el siguiente código especificamos parámetros opcionales.