jueves, 14 de junio de 2012

Construya un WebService Con PHP. 2a Parte - SERVIDOR SOAP SENCILLO

Servidor SOAP en PHP 

Vamos a crear un servidor SOAP sencillo de aprender a utilizar las capacidades del servidor de base de PHP SOAP. En esta sección se le dará una idea de y te preparará para el resto del tutorial.

Creando un servidor 

Un servidor simple toma una solicitud SOAP y devuelve una respuesta. Crear una aplicación simple eco que tiene en una cadena y lo devuelve con la palabra ECHO clavada en el frente. Cree un archivo denominado simple_server.php, y definirlo como se muestra a continuación.

Listado 2. Un servidor SOAP sencillo
                    
<?php

function echoo($echo){
    return "ECHO: ".$echo;
}

$server = new SoapServer(null,
                         array('uri' => "urn://tyler/res"));
$server->addFunction('echoo');
$server->handle();

?>


El primer punto es la función echoo. Devuelve la cadena que se le pasa y ECHO agrega: al frente de la misma. Por otra parte, ver cómo el objeto SoapServer se crea en PHP. A continuación, agregue la función echoo a la lista de funciones que el servidor SOAP admite. Usted tiene que llamar a la función porque echoo eco es una palabra reservada en PHPsimilares a el comando de impresión. La última línea llama al método de la manija del objeto SoapServer, lo que permite el servidor para manejar la petición SOAP y devolver una respuesta, tal como se define en el método de echoo.


Mensajes SOAP 

Apuntando el navegador a su servidor SOAP en su estado actual provoca un error debido a la forma en que se envió la solicitud. Las necesidades de datos para ser enviados como datos POST puros a través de HTTP, como lo describe el faultstring.

Listado 3. Apuntando el navegador al servidor SOAP

                    
<SOAP-ENV:Envelope>
  <SOAP-ENV:Body>
    <SOAP-ENV:Fault>
      <faultcode>SOAP-ENV:Server</faultcode>
      <faultstring>Bad Request. Can't find
                   HTTP_RAW_POST_DATA</faultstring>
    </SOAP-ENV:Fault>
  </SOAP-ENV:Body>
</SOAP-ENV:Envelope>


Su servidor está vivo, pero sólo se puede acceder a él a través de un cliente SOAP u obtendrá errores de fallos, como se muestra arriba. Ahora que usted sabe el servidor SOAP está trabajando, usted puede moverse sobre la creación de un simple cliente.

Creación de un cliente: Formulario de Echo 

Un cliente le permite enviar los datos al servidor SOAP usando el protocolo correcto esperado. Puesto que todo lo que necesita es cualquier cadena a enviar al servidor SOAP para probarlo, vamos a crear un sencillo formulario con un cuadro de texto y un botón. Cree un archivo denominado simple_client.php y definirlo, como se muestra a continuación.

Listado 4. Creación de una forma simple

                    
<?php

$echo = $_GET['input'];

print "<h2>Echo Web Service</h2>";
print "<form action='simple_client.php' method='GET'/>";
print "<input name='input' value='$echo'/><br/>";
print "<input type='Submit' name='submit' value='GO'/>";
print "</form>";
...



Debido a la función de la aplicación, el método por el cual usted envía peticiones al servidor SOAP será a través de GET. Si la función tiene efectos secundarios, como la modificación de bases de datos o acceder al sistema, usted querría utilizar POST.

El primer código recupera el valor de la entrada de la matriz GET o URL. A continuación, se crea el formulario, con el campo de acción que es este mismo script PHP, simple_client.php, así que las peticiones de este formulario se envió a este mismo script PHP. Tenga en cuenta que hay dos etiquetas de entrada: el cuadro de texto donde puedes escribir el valor que ha devuelto desde el servidor SOAP y el botón GO. Una vista previa del formulario se muestra a continuación.

Figura 2. La forma Echo


Creación de un cliente: Haciendo la solicitud 

Una vez que se pulsa el botón, el texto en el cuadro de texto, se muestra más arriba, se envía al script PHP en la URL, la cual se puede extraer de la matriz de GET. Esto le permite comprobar que se envió una solicitud y procesarla. Continue definiendo el archivo simple_client.php, como se muestra a continuación.

Listado 5. Tramitación de las solicitudes y enviarlas al servidor SOAP

                    
...
print "</form>";

if($echo != ''){
    $client = new SoapClient(null, array(
      'location' => "http://localhost/soap/simple_server.php",
      'uri'      => "urn://tyler/req"));

    $result = $client->
        __soapCall("echoo",array($echo));

    print $result;
}
?>
                


Ahora bien, si $ echo tiene datos en él, es porque algo que se ha introducido en el cuadro de texto, y una solicitud fue hecha. Esto le permite iniciar la solicitud al servidor SOAP mediante la creación del objeto SoapClient. El cliente sabe a dónde enviar las solicitudes por la ubicación en la matriz de parámetros. Lo que el URI ofrece al paquete SOAP es un espacio de nombres, lo que es esencialmente es un contexto. Una vez que el SoapClient se inicializa, realiza la solicitud al servidor SOAP al llamar al método del cliente __soapCall con dos parámetros: el método en el servidor SOAP al que desea llamar y una matriz de parámetros. A continuación se muestra la respuesta enviada por el servidor SOAP debajo del botón GO, que se puede obtener una vista previa a continuación.

Figura 3. Mostrando la respuesta del servidor SOAP 

!Ahí lo tienen¡. Usted puede incluso ver el valor del cuadro de texto de entrada en la URL. Ahora que ha creado un servidor SOAP simple, vamos a crear uno más complejo que utiliza Apache Derby y varios servidores SOAP.

Traducido de: IBM developer works

Construya un WebService Con PHP. 1a Parte - GENERALIDADES Y CONFIGURACION

Información general y configuración.

Los servicios Web han sido un éxito desde hace algún tiempo, y la popularidad sigue creciendo. Pero ¿por qué? Es porque son la manera perfecta para integrar varias entidades en una sola, lo que permite un mejor flujo de información a la administración y los clientes.

PHP no está definitivamente atrás en esta área. Siendo uno de los idiomas de más rápido crecimiento, PHP demanda una gran cantidad de desarrolladores que requieren de esta tecnología, también. Echa un vistazo a la tecnología detrás de los servicios Web, SOAP, y cómo las bases de datos como el Derby de ayudar a habilitar un servicio Web más poderoso.

SOAP 

¿Qué significa de SOAP? Es sinónimo de Simple Object Access Protocol, y es esencialmente un estándar para el intercambio de datos basados ​​en XML a través de HTTP. En otras palabras: es la señal que va hacia abajo las líneas telefónicas si estuviera hablando con su amigo en el teléfono, pero en vez de usted y su amigo hablando por teléfono, va a ser clientes de vehículos en busca de los vehículos de sus sueños en una cadena de concesionarios de automóviles. Un ejemplo de un mensaje SOAP se muestra en el Listado 1.


Listado 1. Un mensaje SOAP

                    
<SOAP-ENV:Envelope>
  <SOAP-ENV:Body>
    <SOAP-ENV:Fault>
      <faultcode>SOAP-ENV:Server</faultcode>
      <faultstring>Bad Request. Can't find
                   HTTP_RAW_POST_DATA</faultstring>
    </SOAP-ENV:Fault>
  </SOAP-ENV:Body>
</SOAP-ENV:Envelope>


usted verá esto otra vez más adelante, se muestra aquí para que usted pueda tener una idea de la tecnología. El cuerpo de la mayoría de los mensajes SOAP tiene datos similares a la avería se muestra aquí. A veces un encabezado se utiliza para mantener el cifrado y otros datos sensibles al contexto para la construcción SOAP que se envía. Además, los mensajes SOAP se envían como datos XML sin formato.

¿Cómo encaja con la base de datos?

Un servicio web difícilmente puede ser útil sin una base de datos. Puede utilizar una base de datos para almacenar información acerca de lo que un usuario particular haría: consultar o búsqueda durante una visita. La mayoría de los sistemas existentes de las grandes empresas tienen una amplia gama de bases de datos e información, por lo que el uso de base de datos es de vital importancia para un servicio Web exitoso - incluso para los sitios Web establecidos.

La información del sitio casi siempre se almacenan en una base de datos, y el acceso a dicha información se hace a través de un servicio Web se hace tan importante. Así que aprender a integrar su servicio Web PHP con una base de datos es de vital importancia, al igual que ocurre con la instalación de PHP básico. El desarrollo de PHP simplemente no es el desarrollo de PHP, sin una base de datos lista y a su entera disposición.

Ejemplo en PHP: La solicitud de concesión 

En este tutorial, podrás disfrutar de todo lo expresado anteriormente para el servicio Web, que le permite obtener un inicio en el desarrollo de su propio servicio Web con PHP. La aplicación que vamos a construir tiene una interfaz de usuario donde los usuarios pueden realizar consultas, como se muestra a continuación.

Figura 1. En busca del vehículo de sus sueños


Traducido de: IBM developer works

miércoles, 13 de junio de 2012

Construya un WebService Con PHP

Aprenda como crear aplicaciones Web integradas con SOAP

Resumen:

En los últimos años, los nuevos servicios Web han venido apareciendo en todo el Internet. ¿Y qué mejor lenguaje para construir su propio servicio web que PHP?. Con PHP, usted tiene la ventaja de un lenguaje de scripts, con el poder de conectarse a bases de datos, una curva de fácil desarrollo, que permite un desarrollo más rápido y tiempos de respuesta altos, gracias a las bibliotecas subyacentes compilados para el rendimiento.

Antes de Comenzar


Acerca de este tutorial 
Este tutorial es para los programadores de PHP que quieran subirse al carro de los servicios Web mediante la creación de un servicio web en PHP. Vas a crear un servicio Web mediante la creación de un servidor SOAP en PHP. El servicio web que creará será un servicio de búsqueda del vehículo que se lleva en las consultas basadas en la marca, modelo y año. El servicio web se consulta una base de datos interna y responder apropiadamente. Un cliente basado en Web también será codificado en PHP para comunicarse y consultar al servidor SOAP. Se crea una cadena de tres servidores SOAP en PHP. En realidad, cada uno de los tres servidores se localizan en tres localidades diferentes físicas o ciudades donde una cadena de concesionarios de automóviles, coexistiendo. El cliente entonces se hospedaría en un lugar donde los clientes de coches venía a visitar, entrar en las consultas de búsqueda para encontrar los vehículos de sus sueños. Las rutas de los clientes la consulta a cada uno de los tres servidores SOAP, lo que, a su vez, envían los resultados al cliente. Tras la recepción de cada respuesta, el cliente muestra los resultados de búsqueda para el usuario para el análisis.

Requisitos del sistema 
Las siguientes herramientas son necesarias para seguir adelante:

Servidor Web 
Cualquier sistema operativo y cualquier servidor web puede ser utilizado. Siéntase libre de utilizar Apache v2.x, o el servidor IBM HTTP, descarga de Apache o desde IBM.

PHP 
Debido al uso de los objetos de datos PHP, PHP V5.1 o posterior es necesario. Asegúrese de configurar la siguiente opción para incluir soporte para el Derby y las extensiones SOAP: - with-pdo-odbc = ibm-db2 / home/db2inst1/sqllib - enable-soap. Lea la sección Recursos para obtener información sobre la configuración de Apache o IBM HTTP Server con PHP.

Base de datos 
Este tutorial usa Apache Derby, que es de código abierto y ligero. Descargue también el IBM DB2 ® controlador Universal  y el cliente en tiempo de ejecución DB2 . Asegúrese de establecer el CLASSPATH adecuadamente siguiendo las instrucciones en cada página. Usted puede seguir el Linux ® o Windows ® las instrucciones para instalar y descargar el DB2 Run-Time Client. Lea la sección Recursos para obtener más información para ayudarle a obtener la configuración deseada.

IBM Cloudscape también se puede utilizar para este tutorial. Los detalles internos de la misma son los mismos que Derby, sin embargo, el controlador JDBC de DB2 Universal y otras cosas que son empaquetados en nubes, y es compatible con IBM. Descargar IBM Cloudscape V10.1 y el cliente DB2 Run-Time de IBM.

La tecnología Java 
Derby requiere la tecnología Java ™. Descarga de Sun Microsystems o desde IBM.

viernes, 24 de febrero de 2012

TRUCOS DE CODIFICACIÓN DE LOS DESARROLLADORES DE JUEGOS - PARTE 1

Si tienes algo de experiencia en el mundo de programación real, entonces sin duda en algún momento usted ha tenido que recurrir a alguna solución rápida y sucia para resolver un problema o una característica de ejecución, mientras que un plazo se vencía. Los desarrolladores de juegos a menudo experimentan una terrible "crisis" (también conocido como "marcha de la muerte"), lo que ocurre en los últimos meses de un proyecto anterior a la fecha del lanzamiento del juego. El no poder cumplir el plazo puede significar a menudo que el proyecto se cancela o, peor aún, usted pierde su trabajo. Entonces, ¿qué tipo de trucos se usan cuando se encuentran debajo de la bomba, haciendo 12 horas + por día durante semanas?

A continuación se presentan algunas anécdotas clásicas y consejos - muchas gracias a Brandon Sheffield quien originalmente elaboró este artículo en Gamasutra. He reposteado algunas de sus historias y tambien tiene añadido un poco más de las nuevas fuentes. También he enlazado en cada historia a la página principal del autor o blog siempre que sea posible.

1. El antihéroe de programación - Noel Llopis


Yo estaba recién salido de la universidad, todavía húmeda detrás de las orejas, y estaba a punto entrar en la fase beta de mi primer proyecto profesional del juego - un título a finales de los años 90 para PC. Había sido un viaje en montaña rusa emocionante, ya que en los proyectos a menudo son así. Todo el contenido estaba dentro y el juego se ve bien. Había un problema: Estábamos muy por encima de nuestro presupuesto de la memoria.

Dado que la mayoría de memoria fue recogida por los modelos y texturas, se trabajó con los artistas para reducir la huella de la memoria del juego tanto como sea posible. Hemos reducido las imágenes, modelos y texturas diezmadas comprimido. A veces lo hicimos con el apoyo de los artistas, y, a veces encima de sus cadáveres.

Cortamos megabytes después de megabytes, y después de unos días de frenética actividad, llegamos a un punto en que sentía que no había nada que pudiéramos hacer. A menos que cortar un poco de mayor contenido, no había manera de que pudiéramos liberar memoria más. Exhausto, se evaluó el uso de nuestra memoria actual. Todavía estábamos 1,5 MB por encima del límite de memoria!

En este punto, uno de los programadores más experimentados del equipo, quien había sobrevivido a muchos años de desarrollo en los "buenos viejos tiempos", decidió tomar el asunto en sus propias manos. Él me llamó a su oficina, y se encamina por lo que me imaginaba sería otra agotadora sesión de la liberación de memoria.

En cambio, trajo a colación un archivo de origen y se refirió a esta línea:

static char buffer[1024*1024*2];


"¿Ves esto?" dijo. Y luego se elimina con una sola tecla. ¡Hecho!

Probablemente vio el horror de mis ojos, así que él me explicó que había dejado de lado esos dos megabytes de memoria al inicio del ciclo de desarrollo. Sabía por experiencia que siempre era imposible cortar contenido a los presupuestos de la memoria, y que muchos proyectos había estado a punto de fallar a causa de ella. Así que ahora, como una práctica regular, el siempre pone a un lado un bonito bloque de memoria para liberar cuando es realmente necesario.

Salió de la oficina y anunció que había reducido el consumo de memoria dentro de las limitaciones presupuestarias - se le brindó como el héroe del proyecto.

la práctica Tan horrorizado como yo estaba en ese entonces sobre tal "barbaridad", tengo que admitir que estoy calentando a la misma. No he entrado en el estado de ánimo en el que puede ponerla en uso todavía, pero puedo ver cómo a veces, cuando estás contra la pared, con un poco de memoria escondida para un día lluvioso puede marcar la diferencia. qué gracioso es ver como el tiempo y la experiencia, cambia todo.

2. Caché para arriba - Andrew Russell


Para mejorar el rendimiento cuando se están procesando las cosas en un ciclo cerrado, quieres hacer que los datos para cada repetición lo más pequeño posible, y lo más cerca posible entre sí en la memoria. Eso significa que el ideal es una matriz o un vector de objetos (no punteros) que contienen sólo los datos necesarios para el cálculo.

De esta manera, cuando la CPU obtiene los datos para la primera iteración del bucle, para las siguientes iteraciones muchas líneas de datos son cargados en la memoria caché de la misma.

Realmente no hay mucho que puedas hacer con el uso de pocas y mas rápidas instrucciones porque la CPU es lo más rápida que vas a conseguir, y el compilador no puede ser mejorado. La coherencia de caché es donde está - este artículo contiene un buen ejemplo de coherencia de caché para obtener un algoritmo que no se limita a ejecutar a través de los datos de forma lineal.

3. Planee sus distracciones - Jay Barnson

El Internet es una de las mejores herramientas que se han inventado, tanto para la mejora de la productividad y su destrucción. Twitter y los foros y blogs y sitios web institucionales puede ser muy motivacionales y educativos, pero también pueden ser una distracción que destruye por completo toda esperanza de conseguir cualquier cosa hecha. Una cosa que he hecho en el pasado que ha demostrado ser muy exitosa es ceñirse a un plan para cuando puedo pasar algunos minutos consultar el correo electrónico y Twitter, o jugar una partida rápida o algo así. Ya sea en la realización de una tarea, o después de un período de tiempo (por ejemplo una de cinco minutos por cada hora). De lo contrario, el único uso del navegador es para la lectura de las páginas de referencia del manual, si es necesario. De esa manera convertir una distracción potencial en una herramienta de motivación.

4. El daño colateral - Jim Van Verth (@ cthulhim)

No sé cómo muchos recuerdan la Fuerza 21, pero fue uno de los primeros de RTS (estrategia en tiempo real) en 3D que utiliza una cámara de seguimiento para observarsu pelotón actual. Hacia el final del proyecto que tenía un error extraño en donde la cámara se detendría siguiendo el pelotón - que sólo se quedaría donde estaba, mientras que el pelotón pasó y nada se movió. La causa aparente fue al azar porque no podíamos encontrar un caso de reproducción decente. Hasta que, finalmente, uno de los probadores se dio cuenta de que ocurrió con más frecuencia cuando un ataque aéreo se produjo cerca de sus vehículos. Con esa información yo era capaz deseguirle la pista.


Debido a que la cámara estaba usando la velocidad y la aceleración y era chocable, loderivado de nuestra clase PhysicalObject, que tenía esas características. También tenía otra característica: PhysicalObjects podría recibir daño. Los ataques aéreos hizobastante daño en un radio lo suficientemente grande que fueron literalmente "matar" ala cámara.


Hice arreglar el fallo, asegurando que las cámaras no podían recibir daño, pero sólo para estar seguro, que aumentó su armadura y puntos de vida a niveles ridículos. Creo que puedo decir con seguridad que tenía la cámara más dura en cualquier juego.


5. El ciego guiando al ciego - Mauricio Gomes


En la universidad había un equipo que hizo un juego flash FPS. Por alguna extraña razón, el programador, en lugar de comprobar si el personaje estaba chocando con la pared y dejar que ir allí, lo hizo a la inversa, él comprobó si había una pared, y sólo se permite que se mueva paralelo a ella!

Esto provocó un error extraño: en los cruces o uniones T en el nivel, en realidad no se podía cruzar, sólo recurren a la aprobación a la izquierda oa la derecha. La fecha límite se acercaba, y no tenían ni idea de cómo solucionarlo.

A continuación, el escritor del equipo solucionado el problema, dijo al artista que añadiera una animación de las manos tocando las paredes, y luego añadió en la historia de fondo que el personaje principal era ciego y tenía que tocar constantemente las paredes para saber a dónde iba.

6. No te gusto cuando estoy enojado - Waanders Nick


Una vez trabajé en THQ Relic Entertainment estudio en conjunto, que algunos recordarán como uno de los primeros juegos para la Xbox 360. Comenzamos con un motor de PC (único - subproceso), y tuvimos que convertirlo en un juego completo en una nueva generación de núcleos múltiples de la consola en unos 18 meses. Unos tres meses antes de su envío, que todavía estaban en curso en alrededor de 5 disparos en el 360. Obviamente este juego necesita alguna optimización enorme.

Cuando hice algunas mediciones de desempeño, se hizo evidente que tanto como el código fue lento y muy "PC", también hubo un montón de problemas en el lado del contenido. Algunos modelos eran demasiado detalladas, algunas sombras eran demasiado costosos, y algunas misiones sólo tenía a muchos chicos dando vueltas.

Es difícil convencer a un equipo de 100 personas que los programadores no puede limitarse a "arreglar" el rendimiento del motor, y que algunas de las maneras que la gente se había acostumbrado a trabajar necesitaba ser cambiado. La gente necesita entender que el rendimiento del juego era un problema de todos, y pensé que la mejor manera de hacerlo es con un poco de humor que tenía un poco de la verdad oculta detrás de él.

La solución me llevó una hora. Un programador de compañeros tomó cuatro fotos de mi cara, uno muy feliz, normal, un poco enojado uno, y uno donde estoy tirando de mi pelo. Pongo esta imagen en la esquina de la pantalla, y que estaba vinculada a la velocidad de fotogramas. Si el juego corría a más de 30 cuadros por segundo, me sentí muy feliz, si corriera por debajo de 20, yo estaba enojado.

Después de este cambio, la cuestión pasó de todo FPS, "¡Ah, los programadores se lo arreglaran". que, "Hmm, si pongo este modelo en, Nick va a estar enfadado! mejor que optimizar esta un poco primero." Inmediatamente la gente puede ver si un cambio que hicieron tuvo un impacto en la velocidad de fotogramas, y acabamos de enviar el juego a 30 fps.

7. No es un error, es una función! - Philip Tan


He trabajado en un juego de rol en el que estábamos tratando de conseguir los NPCs (personajes no jugadores) para detectar cuando usted estaba en el rango, camina hacia ti, y entablar una conversación con usted por la activación del sistema de diálogo.

Nos olvidamos de agregar el código para distinguir los PNJ (Personajes de la PC del jugador), por lo que íbamos a pie a la ciudad y todos los puntos de contacto estaría hablando unos con otros. Debido a que todo el código de la APN de IA usaba la plantilla de diálogo misma, que en realidad tiene un par de frases antes de que las conversaciones se hizo absurda. Y debido a que fue transmitido en carácter de diálogo, ud podia leer todo lo que decían si estaban en el rango.

Hemos decidido convertir ese error en una de las principales características.

8. Acciones sucias - Tim Randall (Desarrollador @ Encore)

El equipo de motor en Gremlin Interactive mantiene un guante en su oficina. Cuando alguien le preguntó por qué estaba allí, se les dijo que sólo se usaba cuando alguien estaba a punto de escribir algo de código muy sucio. No era tanto un caso de no querer dejar huellas dactilares, sino más bien que no quería tocar en realidad correcciones muy sucias!








miércoles, 22 de febrero de 2012

YO SOY UN GRAN PROGRAMADOR, PERO TERRIBLE PARA HACER ALGORITMOS


Traducido de TREND LINE:

Yo soy un gran programador, pero un algoritmista terrible. Es un pensamiento que ha pesado sobre mí muy poco, y me gustaría recoger los sentimientos de otros desarrolladores sobre el tema también.

Comencé a lo que puede llamarse mis espaldas profesionales de desarrollo profesional en 1999. Yo todavía estaba en la escuela media, pero mi padre me contrató en su compañía de software. Mi misión oficial era hacer cambios a nuestros sitios web, pero sobre todo terminó molestando a otros desarrolladores para ayudarme a aprender.

A partir de ahí cogí Perl (un poco) y luego se trasladó para el desarrollo de PHP y la interfaz web final, donde me he alojado cómodamente durante los últimos doce años.

Cuando se trata de la construcción de sistemas de gran escala, la comprensión de los detalles de estos sistemas, y en realidad a escribir, lo hago muy bien. Soy capaz de escribir código PHP elegante (creo que existe), y realmente entiende de programación también. Hago todas las cosas que hace un artesano del software: escribe pruebas automatiza la medida de lo posible, se entera de las nuevas tecnologías, piedras de afilar mi oficio con el trabajo de lado y el trabajo de código abierto, y construyo sistemas que escalan con las peticiones de la demanda y el cliente.


Incluso tengo una licenciatura en Ciencias de la Computación de lo que creo que es una gran universidad.

Sin embargo, siento que soy un algoritmista Terrible

Pídeme que escribir un algoritmo complejo (incluso uno que se ha descubierto), y me pongo a sudar en las palmas de las manos y nervioso. ¿Es este un síntoma que usted también? Para que sea realmente capaz de expresar un algoritmo en el código, realmente tengo que pasar mucho tiempo en comprender que lo haga.

Yo entiendo que un algoritmo es una serie de pasos para completar un problema. Me refiero a los algoritmos complejos como la clasificación, las estrategias recursivas que se fusionan, la criptografía y la compresión, por nombrar algunos.

Mi mayor orgullo logrado en la universidad fue escribir el algoritmo A * para mis primeras estructuras de datos y algoritmos de clase. Me pasaba las horas físicamente dibujando gráficas y mantenia escribiendo las tablas de la pila que los nodos estaban siendo empujados hacia dentro y fuera de.

Incluso mantuve los dibujos porque yo estaba muy orgulloso de ellos.




Lo que se reduce a es a menudo tengo problemas para ver el algoritmo subyacente a un problema complejo. Una vez entrevisté con Amazon y no lo hace más allá de la segunda vuelta porque no podía ver el algoritmo subyacente en una de las preguntas que me pidieron (las preguntas sobre la arquitectura en general, sin embargo, lució muy bien). Afortunadamente, esto no es algo que se tiene o no. Algunos programadores tienen una habilidad natural para ver el algoritmo subyacente de un problema, pero si no puede, se puede aprender.

¿Soy el único en sentir esto? ¿Es la lucha de otros programadores con esto también? ¿Es esta una manifestación del síndrome del impostor? Lo disfrutamos en la universidad, pero yo no estudié tanto como debería haberlo hecho. Si eres un mayor en Ciencia de la Computación de la universidad ahora y mucho de esto no es algo natural, le pido: por favor, pasar tiempo en sus estudios. Realmente se aprende de los algoritmos presentados en clase. Asi usted nunca se aproveche de ellas durante su carrera, por lo menos le ayudará a sentirse más como un programador.





lunes, 20 de febrero de 2012

UN TUTORIAL PARA PRINCIPIANTES EN ASP.NET PARA ADMINISTRACIÓN DE ESTADOS


Introducción

Este artículo analiza la necesidad de que la administración del estado en las aplicaciones ASP.NET, ¿cuáles son las distintas formas de gestión estatal en ASP.NET y un análisis comparativo de todas las técnicas de administración de estado.

En el fondo

HTTP es un protocolo sin estado. Una vez que el servidor sirve las peticiones cursadas por el usuario, se limpia todos los recursos utilizados para atender esa petición. Estos recursos incluyen los objetos creados durante esa solicitud, la memoria asignada en esa solicitud, etc Para un tipo que viene de un fondo de desarrollo de aplicaciones Windows, esto podría ser una gran sorpresa porque no hay manera de que podía confiar en los objetos y miembros las variables por sí solas para realizar un seguimiento del estado actual de la aplicación.

Si tenemos que seguir la información de los usuarios entre las visitas a la página e incluso en múltiples visitas de la misma página, entonces tenemos que utilizar las técnicas de gestión del Estado proporcionados por ASP.NET. La gestión del Estado es el proceso mediante el cual los desarrolladores de ASP.NET permiten mantener información de estado y la página sobre el pedido múltiple de las mismas páginas o diferentes.

Tipos de la administración del estado

Hay principalmente dos tipos de gestión estatal que ASP.NET ofrece:

  1. Del lado del cliente de administración de estado
  2. El lado del servidor de administración de estado
Cuando usamos el lado del cliente la administración del estado, la información de estado relacionada se almacenan en el lado del cliente. Esta información viaja de ida y vuelta con cada petición y respuesta. Esto puede ser visualizado como:

Nota: Imagen tomada del libro de Microsoft Press.

La ventaja principal de tener este tipo de gestión del Estado es que a aliviar el servidor de la carga de mantener actualizada la información relacionada con el estado, se ahorra una gran cantidad de memoria del servidor. La desventaja de la administración del estado del lado del cliente es que se necesita más ancho de banda considerable cantidad de datos está viajando de ida y vuelta. Pero hay otro problema que es más grande que el problema del ancho de banda. El lado del cliente la administración del estado hace que la información viaja de ida y vuelta y por lo tanto esta información puede ser interceptada por alguien en el medio. Así que no hay manera de que podamos almacenar la información confidencial como contraseñas, número de tarjeta de crédito y el importe a pagar en el lado del cliente, tenemos que del lado del servidor de gestión de estado para estas cosas.

El lado del servidor de gestión estatal, en contraste con el lado del cliente, mantiene toda la información en la memoria del usuario. La desventaja de esto es más el uso de memoria en el servidor y el beneficio es que la información de los usuarios es confidencial y segura.

Nota: Imagen tomada del libro de Microsoft Press.

No podemos decir que vamos a utilizar un solo tipo de gestión estatal en nuestra aplicación. Tendremos que encontrar una mezcla de lado del cliente y la gestión del lado del servidor del Estado en función del tipo y el tamaño de la información. Ahora echemos un vistazo a lo que son las diferentes maneras en que puede manejar el estado en el lado cliente y del servidor.

Del lado del cliente las técnicas de administración de estado
  • Ver Estado
  • Control del Estado
  • Los campos ocultos
  • Galletitas
  • Cadenas de consulta
Ver Estado - ViewState

ASP.NET utiliza este mecanismo para el seguimiento de los valores de los controles en la página web entre la solicitud de página para una misma página. También podemos añadir valores personalizados para ver el estado. El marco ASP.NET se encarga de almacenar la información de los controles en el estado de vista y recuperar de nuevo de estado de vista antes de renderizar la devolución de datos.

Si tenemos que usar ViewState para almacenar nuestra información, sólo tenemos que recordar que el estado de vista es un objeto de diccionario. Podemos tener nuestros datos almacenados como un par de valores clave en el estado de vista (véase el código de abajo). La información que los controles también se está ordenada en este diccionario en la petición y se rellena de nuevo durante la respuesta.

Dado que esta información se almacena en la propia página web, ASP.NET codifica la información. Podemos ajustar los parámetros relacionados con el cifrado de web.config.

<Configuration>
       <system.web>
        <pages viewStateEncryptionMode="Always"/>
      </system.web>
</configuration>

o en la página declarativa:

<%@ Page Language="C#" AutoEventWireup="true"
CodeFile="Default.aspx.cs" Inherits="_Default" 
ViewStateEncryptionMode="Always"%>


Veamos ahora en una aplicación pequeña de estado de vista. Contamos con una simple página web con un cuadro de texto y un botón. La idea es que vamos a escribir algo en el cuadro de texto y ver cómo ASP.NET almacena esta información en el estado de vista. Vamos a almacenar nuestra propia información en el estado de vista también. Al ejecutar la página y escribir mi nombre en el cuadro de texto y pulse el botón, se produce una devolución de datos, pero mi nombre se mantiene en el cuadro de texto. Viewstate hecho posible así que después de la devolución de datos, la página se ve así:

Cuando nos fijamos en la fuente, el estado de vista se parece a:

<input type="hidden" name="__VIEWSTATE"
id="__VIEWSTATE" value="/wEPDwUKMTkwNjc4NTIwMWRkfIZa4Yq8wUbdaypyAjKouH5Vn1Y=" />



Ahora vamos a tratar de añadir nuestra propia información en el estado de vista. Vamos a 
llevar un registro de devolución de datos de los usuarios en esta página. Cada vez que el 
usuario se presiona un botón, vamos a añadir 1 al valor de marihuana almacenadas. La forma 
de hacerlo sería la siguiente:

protected void Page_Load(object sender, EventArgs e)
{
    if(IsPostBack == true)
    {
        if (ViewState["number"] != null) //Lets retrieve, increase and store again
        {
            ViewState["number"] = Convert.ToInt32(ViewState["number"]) + 1;
        }
        else //First postback, lets store the info
        {
            ViewState["number"] = 1;
        }

        Label1.Text = ViewState["number"].ToString();
    }
}
Al ejecutar la página y pulsa el botón para hacer una devolución de datos, la web nosmostrará las devoluciones de datos está haciendo hasta ahora que se está almacenando en el estado de vista:

client side
El estado de vista está habilitado por defecto, pero podemos deshabilitar estableciendo la propiedad EnableViewState para cada control en la web en false. Esto reduce el tiempo de procesamiento del servidor y disminuye el tamaño de la página.


Control del Estado

Ahora sabemos lo que es un estado de vista es, y también sabemos que podemos desactivar el estado de vista de los controles en la página. Pero imagino que si estamos desarrollando un control personalizado y el interior están el uso de ViewState para almacenar alguna información, pero el usuario del control se puede desactivar el estado de vista de nuestro control. Para evitar este problema, podemos tener un comportamiento similar al estado de vista que no puede ser desactivado por los usuarios de control y se llama ControlState. Los estados de control se encuentra dentro de los controles personalizados y funcionan igual que funciona viewstate.

Para utilizar el estado del control en un control personalizado, tenemos que reemplazar el método OnInit y llame al método RegisterRequiresControlState durante la inicialización. Entonces tenemos que reemplazar los métodos SaveControlState y LoadControlState.

Campos ocultos

Campo oculto son los controles previstos por el ASP.NET y y permiten almacenar información en ellos. La única restricción es que en los campos ocultos, mantendrán la información cuando el post HTTP se envía, es decir, hace clic en el botón. No va a funcionar con HTTP gey. Vamos a hacer el mismo ejercicio de hacer el seguimiento de las devoluciones de datos utilizando HiddenFields ahora.
(Nota: ViewState también utiliza campo oculto por debajo.)

//Store in Hidden Field -----------------------------------------------------------
int newVal = Convert.ToInt32(HiddenField1.Value) + 1; //Hidden field default value was 0
HiddenField1.Value = newVal.ToString();
Label2.Text = HiddenField1.Value;
Al ejecutar la página y pulsa el botón para hacer una devolución de datos, la web nos mostrará las devoluciones de datos está haciendo hasta ahora que se está almacenando en HiddenFields (Ver código para más detalles).

Galletitas

Hay situaciones en que tenemos que almacenar los datos entre las peticiones de páginas. Hasta ahora, las técnicas que hemos discutido almacenan los datos de las solicitudes de páginas individuales. Ahora nos centraremos en las técnicas que almacenan información entre solicitudes de páginas.

Las cookies son pequeñas piezas de información que pueden ser almacenados en un archivo de texto en el ordenador del usuario. La información se puede acceder por el servidor y se puede utilizar para almacenar información que se requiere entre las visitas de página y entre las múltiples visitas en la misma página por parte del usuario. Vamos a hacer el mismo ejercicio de hacer el seguimiento de la devolución de datos mediante el uso de cookies.

int postbacks = 0;
if (Request.Cookies["number"] != null) //Lets retrieve, increase and store again
{
    postbacks = Convert.ToInt32(Request.Cookies["number"].Value) + 1;
}
else //First postback, lets store the info
{
    postbacks = 1;
}
Response.Cookies["number"].Value = postbacks.ToString();

Label3.Text = Response.Cookies["number"].Value;

No podemos hacer un seguimiento de las devoluciones de datos que utilizan las cookies como cookies permaneceran en la máquina del usuario, por lo que en esencia estamos ante el número de veces el usuario ACCEDE en su página hasta el momento desde el comienzo.

Al ejecutar la página y pulsa el botón para hacer una devolución de datos, la web nos mostrará las devoluciones de datos que se han hecho hasta ahora, que está siendo almacenada en Cookies (véase el código para más detalles). Las cookies pueden tener varios parámetros como el tiempo que son válidas y cuándo deben caducar. Estos parámetros pueden ser manipulados como:

Response.Cookies["number"].Expires = DateTime.Now.AddDays(1);


Esta cookie expira después de 1 día de su creación.

Cadenas de consulta

Las cadenas de consulta se utilizan para almacenar las variables que identifican páginas específicas, tales como términos de búsqueda o números de página. Una cadena de consulta es la información que se anexa al final de la URL de la página. Se pueden utilizar para almacenar / pasar información de una página a otra e incluso a la misma página. Vamos a trabajar sobre el almacenamiento de la información de devolución de datos en cadenas de consulta ahora:

//GetDataItem from querystring
if (Request.QueryString["number"] != null) //Lets retrieve, increase and store again
{
    Label4.Text = Request.QueryString["number"];
}

//set in query string
int postbacks = 0;

if (Request.QueryString["number"] != null) //Lets retrieve, increase and store again
{
    postbacks = Convert.ToInt32(Request.QueryString["number"]) + 1;
}
else //First postback, lets store the info
{
    postbacks = 1;
}

Response.Redirect("default.aspx?number=" + postbacks);
Una cosa a notar aquí es que no hay manera de almacenar la información de devolución de datos en la cadena de consulta que se envía con la misma página. La razón es que la cadena de consulta crea una nueva dirección URL cada vez y será una nueva solicitud cada vez que utilice cadenas de consulta. Así que ahora, esencialmente hacemos seguimiento al número de clics aquí. La idea detrás de la cadena de consulta es pasar pequeña información a OTRAS páginas que pueden ser utilizados para llenar la información en esa página.

NOTA: El uso de cookies y QueryString aquí son sólo para propósitos de demostración. En escenarios reales, nunca debe ser usado para almacenar información necesaria para la misma página. Las cadenas de consulta se debe utilizar para almacenar la información de las visitas de varias páginas. Las cookies se utilizan para almacenar información entre múltiples visitas a nuestra página web desde la misma computadora.

Estado de la aplicación

ASP.NET permite guardar valores utilizando el estado de la aplicación. Un mecanismo de almacenamiento global que sea accesible desde todas las páginas de la aplicación web. El estado de aplicación se almacena en la Solicitud de clave / valor del diccionario. Esta información también estará disponible para todos los usuarios de la web. En caso de que necesitemos información específica del usuario, entonces es mejor usar sessionState.

ASP.NET proporciona tres eventos que le permiten inicializar las variables de aplicación (liberando recursos cuando se cierra la aplicación) y responder a los errores de aplicación:


  • Application_Start: Se produce cuando se inicia la aplicación. Este es el lugar perfecto para inicializar las variables de la aplicación.
  • Application_End: Se produce cuando una aplicación se cierra. Utilice esta aplicación a los recursos libres y realizar el registro.
  • Application_Error: Se produce cuando se produce un error no controlado. Use esto para realizar el registro de errores.
Vamos ahora a almacenar la información de las devoluciones de datos en el estado de la aplicación:

//global.asax
void Application_Start(object sender, EventArgs e)
{
    Application["number"] = 0;
}

//In web pages
Application.Lock();
Application["number"] = Convert.ToInt32(Application["number"]) + 1;
Application.UnLock();

Label5.Text = Application["number"].ToString();
Al ejecutar la página y pulsa el botón para hacer una devolución de datos, la web nos mostrará las devoluciones de datos está haciendo hasta ahora que se está almacenando en ApplicationState. Podemos utilizar este objeto para realizar un seguimiento de los clics por todos los usuarios en todo el sitio web (véase el código para más detalles).

Estado de la sesión

Como estado de la aplicación, esta información también está en un almacenamiento global que sea accesible desde todas las páginas de la aplicación web. El estado de sesión se almacena en el diccionario SessionKey / valor. Esta información estará disponible para el usuario actual, es decir, la sesión, actual.

//global.asax
void Session_Start(object sender, EventArgs e)
{
    // Code that runs when a new session is started
    Session["number"] = 0;
}

// Web forms
Session["number"] = Convert.ToInt32(Session["number"]) + 1;

Label6.Text = Session["number"].ToString();
Al ejecutar la página y pulsa el botón para hacer una devolución de datos, la web nos mostrará las devoluciones de datos está haciendo hasta ahora que se está almacenando en SessionState. Podemos utilizar este objeto para realizar un seguimiento de clics el usuario actual, es decir, que es propietaria de la sesión para el sitio web completo (véase el código para más detalles).

Ventajas de la administración de estados del lado del cliente

  • Mayor escalabilidad
  • Soporte para múltiples navegadores
Ventajas de la administración de estados del lado del Servidor
  • Mayor seguridad
  • Reducción del ancho de banda
Puntos de interés Este pequeño documento se ha creado para conocer un poco de material de revisión sobre la gestión de estados. Pensé que dará a conocer en CodeProject para que algunos principiantes puedan encontrar algo útil en ella. En resumen las técnicas de gestión de estados son: • Del lado del cliente la administración del estado debe ser usado cuando Identificación escalabilidad requerida. • El lado del servidor de gestión del Estado debe ser utilizada cuando se requiere seguridad de los datos. • Página por defecto a nivel estatal técnica de gestión utilizado por ASP.NET es ViewState. • Podemos almacenar información personalizada en ViewState. • Controles personalizados ControlState utilizar para almacenar la información. • Campo oculto también se puede utilizar para almacenar información para la misma página. • Las cookies se pueden utilizar para la información que se requiere en múltiples visitas desde el mismo ordenador. • Cadena de consulta se puede utilizar para pasar información de una página a otra. • ApplicationState se debe utilizar para almacenar información que debería ser accesible desde todas las páginas web y para todos los usuarios. • SessionState debe utilizarse cuando la información debe estar disponible en todas las páginas web, pero para el usuario actual.

Agradecimientos: Rahul Rajat Singh y CodeProject




viernes, 17 de febrero de 2012

EVITANDO Y EXPLOTANDO LOS BACHES DE JAVASCRIPT


JavaScript es un lenguaje Gestalt.

Uno de los sentimientos hacia JavaScript que voltea entre la elegancia y el asco, sin tránsito por estados intermedios.

La clave para ver JavaScript tan elegante es la comprensión de sus defectos, y saber cómo evitar, evitar o incluso explotarlos.

Para entender el uso de los terminos evitar / corregir / explotar favor leer el libro de: Doug Crockford - Javascript: The Good Parts.


Doug tiene una toma un poco diferente y más elaborada de las partes malas y partes horribles, así que estoy compartiendo mi punto de vista sobre los cuatro temas que me han causado más dolores de cabeza en el pasado:

  • Cómo solucionar ámbito de bloque roto con With;
  • Los cuatro (! no tres) significados de esto;
  • La promoción de argumentos a una matriz; y
  • Evitando truthiness.
Cuando chocan los baches: var frente a with

Ámbito de un bloque léxico en JavaScript está roto, y piense en el uso de with considerada de forma pobre, es una buena solución a este problema.

En la mayoría de lenguajes de corchetes, los bloques delimitan el alcance léxico. Por ejemplo, en C o Java:

{ 
    int i = 13 ;
    { 
       int i = 42 ; 
       print(i) ;
    }
    print(i) ;
 }

Pero, este código imprime 42 y luego 13.

Y en Javascript:


{
    var i = 13 ;
    {
       var i = 42 ;
       console.log(i) ;
    }
    console.log(i) ;
 }
Este código imprime 42 y 42.

En JavaScript, solo las funciones introducen un nuevo ámbito de léxico y las declaraciones de las variables están implícitamente realzadas a este nivel.

Por ejemplo:

function f ()  {
  var i = 13 ;
  {
     var i = 42 ;
     print(i);
  }
  print(i) ;
}

Es equivalente a:


function f () {
  var i ;
  i = 13 ;
  {
     i = 42 ;
     print(i) ;
  }
  print(i) ;
}
Aparte: elevación bajo el capó

JavaScript lleva la elevación a los extremos.

El siguiente programa - una referencia única para x - provoca un error de referencia:


 x ; // ReferenceError: x is undefined
pero el siguiente programa está bien, porque se declaró var x:


if (false) {
   var x ;
 }
 x ; // No problem! x is declared in this scope.
Por extensión, debe ser el caso (y es) que el siguiente también es legal:


x ; // No problem! x is declared in this scope.
 if (false) {
   var x ;
 }
Función de elevación

La historia de la función de elevación es más desordenado.

El siguiente código funciona:


console.log(fact(3)) ;

 function fact(n) {
  return (n == 0) ? 1 : n*fact(n-1) ;
 }
porque la definición de hecho es izado a la parte superior del bloque.

Así, el siguiente también funciona:

 {
   console.log(fact(3)) ;
   { 
     function fact(n) {
       return (n == 0) ? 1 : n*fact(n-1) ;
     }
   }
 }
Pero, el siguiente falla.

 if (false) {
   function fact(n) {
    return (n == 0) ? 1 : n*fact(n-1) ;
   }
 }
en la mayoría de las implementaciones de JavaScript.

Las declaraciones de variables son levantados fuera de los condicionales.

Las delaraciones de función no lo son.

La fijación de bloque con el ámbito with

Para restaurar el alcance del bloque en JavaScript, trate de usar with con objetos explícitos, por ejemplo:

{ 
   var i = 13 ;
   with ({i: 42}) {
     console.log(i) ; // prints 42
   }
   console.log(i) ; // prints 13
}
Debido a que el objeto se declara explícitamente, que no intefere con el análisis estático del código, y es igualmente claro para el razonamiento humano.

Este es el único uso justificado de with.

Dave Herman de Mozilla aconseja que, la forma correcta de manejar esta situación es una función de aplicación inmediata anónima:

 {
    var i = 13 ;
    (function () { 
       var i = 42 ;
       console.log(i) ;  // prints 42
    })() ; 
    console.log(i) ; // prints 13
 }
Para la programació funcional está de acuerdo con Dave, pero debería ser más estético.

¿Qué significa this?

El significado de this depende de cómo la función actual fue declarada:

  • Directamente: f(...);
  • Indirectamente: f.call(this,...) o f.apply(this,array);
  • Como un metodo: f.call(this,...) o f.apply(this,array);
  • Como un constructor: new f(...).
Llamada directamente.

Llama directamente, this se enlaza con el objeto de ventana de nivel superior.

Dado que las variables globales son en realidad campos de este objeto, esto modifica el namespace global:

 function f () {
   this.x = 3 ;
 }
 f() ;
 alert(x) ; // alert(3)
Pero, ¿qué pasa con nodejs, donde no hay objeto de la ventana?

Ejecute este código como un experimento:

function f() {
  this.x = 10 ;
  console.log(this) ;
  console.log(this.x) ;
}

f() ;

console.log(x) ;
Esto imprime:

{}
10
10
Claramente, por defecto this que en nodejs no es un objeto vacío ordinario.

Como era de esperar, este objeto conserva sus poderes, incluso si se las devuelve:

function global() {
  return this ;
}

(global()).y = 20 ;

console.log(y) ; // prints 20
Llamado indirectamente

El comportamiento más extraño (y menudo pasado por alto) con respecto a esto viene de llamar a una función directa, y tratar de definir this con la fuerza f.call y f.apply.

Si un objeto se presenta como el primer argumento, entonces el objeto se convierte en this.

Pero, si un átomo como un número, un booleano o una cadena se pasa, this no está ligado a ese valor.

En cambio, this se une a un "átomo objetivado" - un objeto que se comporta como el tipo de átomo.

Pruebe esto en nodejs o Firebug:

function f () { return this ; }

 var myTrue = f.call(true) ;
 console.log(myTrue) ;             // prints {}
 console.log(myTrue.constructor) ; // prints [Function: Boolean] 
 console.log(typeof myTrue) ;      // prints "object"

 var myBar = f.call('bar') ;
 console.log(myBar) ;             // prints {'0': 'b','1': 'a','2': 'r'}
 console.log(myBar.constructor) ; // prints [Function: String]
 console.log(myBar.toString()) ;  // prints bar
 console.log(typeof myBar) ;      // prints "object"

 var myThree = f.call(3) ;
 console.log(myThree) ;             // prints {}
 console.log(myThree.constructor) ; // prints [Function: Number]
 console.log(myThree.valueOf()) ;   // prints 3
 console.log(typeof myThree) ;      // prints "object"
Fascinado, ¿eh?

Llamado como un método

Cuando se invoca como un método - o.f () - una función recibe el objeto o como this.

Hay dos situaciones en las que los métodos conducen a problemas: funciones parcializadas o anidadas y los métodos de primera clase.

Es fácil olvidar que cuando se anidan las funciones, la función interna recibe su propio this, aun cuando this no tenga sentido.

 o.a = 3 ;
 o.b = 4 ;
 o.c = 5 ;

 o.generateValidator = function () {
   return function () {
     if (this.a*this.a + this.b*this.b != this.c*this.c)
       throw Error("invalid right triangle") ;
   } ;
 }
La forma de evitar este problema de alcance es declarar that:

 o.a = 3 ;
 o.b = 4 ;
 o.c = 5 ;

 o.generateValidator = function () {
   var that = this ;
   return function () {
     if (that.a*that.a + that.b*that.b != that.c*that.c)
       throw Error("invalid right triangle") ;
   } ;
 }
Alguna vez me picó user accidentalmente un método en una definición de primera clase:


 engine.setTickHandler(ship.ontick) ;
ship.ontick es un método, pero una vez que se invoca, este no estará obligado a enviarlo.

Con toda probabilidad, quedará vinculado a global().

Mi solución a este problema se inspira en la noción de η-expansión del cálculo lambda:

function eta (that,methodName) {
  var f = that[methodName] ;
  return function () {
    return f.apply(that,arguments) ;
  }
}
Entonces, en lugar de escribir object.methodName para pasar un método como una función de primera clase, se usa(objeto, 'methodName').

Llamado como un constructor

Cuando una función se llama como un constructor, el valor de this es el objeto recién creado.

La omisión de new por accidente destroza el namespace global.

Si las variables globales están mutando sin explicación, trate de guardar constructores with:

 this == global() && error() ;
Fijación de los argumentos

La capacidad de aceptar un número arbitrario de argumentos en JavaScript es con frecuencia útil.

En JavaScript, los argumentos que se pasan a una función están implícitamente ligados a los argumentos de variable.

Este objeto se parece y actúa sobre todo como una matriz, pero es sólo un objeto que pasa a tener índices numéricos, además de un campo llamado longitud.

La mayoría de los programadores no descubren esto hasta que los muerde.

Por ejemplo, con:

function f() {
  return arguments;
}
Una llamada a f(1,2,3), retorna:

{ '0': 1,
  '1': 2,
  '2': 3  }
Mejor que [ 1, 2, 3 ].

Los métodos habituales-como indexOf - están desaparecidos.

Hay un par de maneras para promover argumentos para una matriz real. El método adoptado por muchos frameworks de JavaScript es utilizar el método de corte:

 function f() {
   arguments = Array.prototype.slice.call(arguments) ;
   return arguments ;
 }
En implementaciones no IE de JavaScript, es posible volver a asignar directamente al objeto prototipo para el prototipo de las matrices:

 function f() {
   arguments.__proto__ = Array.prototype ;
   return arguments ;
 }

Evitando truthiness
Hay poco de verdad a la verdad en JavaScript.

Muchos valores se califican como falso en un condicional.


               false0undefinednullNaN; y ''.

A primera vista, parece que == entiende esto, teniendo en cuenta que:

 0 == false

los rendimientos son reales.

Sin embargo, null == false y'' == false son falsas.

Los operadores == y != Intento de coacción operandos de diferentes tipos.

Por ejemplo, "\t\t '== false, sin embargo, '\t\t' es verdadero en un condicional.

En teoría, es mejor utilizar === y !==, Que no trate de coerción.

Sin embargo, todavía hay un valor x tal que x != x and x !== X.

Ese valor es NaN.

Si las cuestiones de igualdad, es necesario utilizar una función auxiliar:

function equal(a,b) {
  if (a === b)
    return true ;
  if (isNaN(a) && isNaN(b))
    return true ;
  return false
}
Traducción de la pagina: http://matt.might.net/articles/javascript-warts/