<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>ChristianMania</title>
	<atom:link href="http://www.christianmania.com/feed" rel="self" type="application/rss+xml" />
	<link>http://www.christianmania.com</link>
	<description>Desarrollo de Sistemas &#38; Soluciones Web</description>
	<lastBuildDate>Thu, 29 Dec 2011 14:49:01 +0000</lastBuildDate>
	<language>es</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
<xhtml:meta xmlns:xhtml="http://www.w3.org/1999/xhtml" name="robots" content="noindex" />
		<item>
		<title>Búsquedas Booleana con Match() Against()</title>
		<link>http://www.christianmania.com/2011/12/busquedas-booleana-con-match-against/</link>
		<comments>http://www.christianmania.com/2011/12/busquedas-booleana-con-match-against/#comments</comments>
		<pubDate>Thu, 29 Dec 2011 14:42:00 +0000</pubDate>
		<dc:creator>ChristianMania</dc:creator>
				<category><![CDATA[Base de Datos]]></category>

		<guid isPermaLink="false">http://www.christianmania.com/?p=586</guid>
		<description><![CDATA[MySQL puede realizar búsquedas booleanas de texto completo con el IN BOOLEAN MODE modificador. Con esta forma de búsqueda las palabras tienen un significado especial al principio o al final de las palabras en la cadena de búsqueda. En la consulta siguiente, el + y &#8211; los operadores de indicar que una palabra tiene que [...]]]></description>
			<content:encoded><![CDATA[<p>MySQL puede realizar búsquedas booleanas de texto completo con el IN BOOLEAN MODE modificador. Con esta forma de búsqueda  las palabras tienen un significado especial al principio o al final de las palabras en la cadena de búsqueda. En la consulta siguiente, el + y &#8211; los operadores de indicar que una palabra tiene que estar presente o ausente respectivamente, para un partido que se produzcan. Por lo tanto, la consulta recupera todas las filas que contienen la palabra &#8221; MySQL &#8220;, pero que sí que no contengan la palabra &#8221; YourSQL &#8220;:</p>
<p>mysql> SELECT * FROM artículos donde MATCH (titulo, cuerpo)<br />
    -> AGAINST (&#8216;+ MySQL-YourSQL&#8217; IN BOOLEAN MODE);<br />
+&#8212;-+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211; &#8212;&#8212;&#8212;&#8212;&#8212;&#8211;+<br />
| ID | Nombre | cuerpo |<br />
+&#8212;-+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211; &#8212;&#8212;&#8212;&#8212;&#8212;&#8211;+<br />
| 1 | MySQL Tutorial | DBMS es sinónimo de base de datos &#8230; |<br />
| 2 | Cómo utilizar MySQL Bueno | Después de que pasó por una &#8230; |<br />
| 3 | Optimización de MySQL | En este tutorial vamos a mostrar &#8230; |<br />
| 4 | 1001 Trucos MySQL | 1. Nunca ejecutar mysqld como root. 2. &#8230; |<br />
| 6 | MySQL Seguridad | Cuando se configura correctamente, MySQL &#8230; |<br />
+&#8212;-+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211; &#8212;&#8212;&#8212;&#8212;&#8212;&#8211;+<br />
Nota<br />
En la implementación de esta función, MySQL utiliza lo que se refiere a veces como la lógica implícita booleanas , en el que</p>
<p>+ representa y</p>
<p>- es sinónimo de NO</p>
<p>[ ningún operador ] implica O</p>
<p>Booleana búsquedas de texto completo tiene las siguientes características:</p>
<p>No utilizan el umbral del 50%.</p>
<p>No de forma automática ordenar las filas en orden decreciente de importancia. Esto se puede ver el resultado de la consulta anterior: la fila con la mayor relevancia es el que contiene &#8221; MySQL &#8220;dos veces, pero no es el último, en primer lugar.</p>
<p>Ellos pueden trabajar incluso sin FULLTEXT índice, aunque una búsqueda ejecutada de esta manera sería muy lenta.</p>
<p>La longitud mínima y máxima de texto completo parámetros se aplican.</p>
<p>La lista de palabras de parada se aplica.</p>
<p>El booleana de texto completo la capacidad de búsqueda compatible con los siguientes operadores:</p>
<p>+</p>
<p>Un signo más indica que esta palabra debe estar presente en cada fila que se devuelve.</p>
<p>-</p>
<p>Un signo menos indica que esta palabra debe no estar presente en cualquiera de las filas que se devuelven.</p>
<p>Nota: El &#8211; operador actúa sólo para excluir filas que de otra forma igualada por otros términos de búsqueda. Por lo tanto, un modo de búsqueda booleana, que contiene términos sólo precedido por &#8211; devuelve un resultado vacío. No devuelve &#8221; todos los registros excepto los que contengan cualquiera de los términos excluidos. &#8221;</p>
<p>(Sin operador)</p>
<p>Por defecto (cuando ni + ni &#8211; se especifica) la palabra es opcional, pero las filas que contienen una clasificación mayor. Esto imita el comportamiento de MATCH () &#8230; AGAINST () sin el IN BOOLEAN MODE modificador.</p>
<p>> <</p>
<p>Estos dos operadores se utilizan para cambiar la contribución de la palabra al valor de relevancia que se asigna a una fila. El > operador incrementa la contribución y el < operador disminuye. Vea el siguiente ejemplo de esta lista.</p>
<p>()</p>
<p>Los paréntesis agrupan palabras en subexpresiones. Los grupos entre paréntesis se pueden anidar.</p>
<p>~</p>
<p>Una tilde actúa como operador de negación, causando que la contribución de la palabra a la relevancia de la fila a ser negativo. Esto es útil para marcar " ruido "las palabras. Una fila que contiene una palabra es una calificación más baja que otros, pero no se excluye por completo, como lo sería con el - operador.</p>
<p>*</p>
<p>El asterisco sirve como el truncamiento (o comodín) del operador. A diferencia de los otros operadores, debe ser añadido a la palabra de ser afectados. Concuerden con las palabras si empiezan con la palabra que precede a la * operador.</p>
<p>Si una palabra se especifica con el operador de truncamiento, no se elimina de una consulta booleana, aunque es muy corto (como lo determina la ft_min_word_len configuración) o de palabras de parada una. Esto ocurre porque la palabra no se ve como muy corta o una palabra vacía, sino como un prefijo que debe estar presente en el documento en forma de una palabra que comience con el prefijo. Supongamos que ft_min_word_len = 4 . ft_min_word_len = 4 . A continuación, una búsqueda de "+ palabra + el * " Es probable que devolver menos filas que una búsqueda de "+ palabra + la ' :</p>
<p>La consulta anterior queda como está y requiere tanto de palabra y de la * (una palabra que comienza con la información) estar presente en el documento.</p>
<p>La consulta de esta última se transforma en + palabra (que requiere sólo la palabra de estar presente). el es al mismo tiempo muy corto y una palabra vacía, y cualquiera de estas condiciones es suficiente para causar que sea ignorada.</p>
<p>"</p>
<p>Una frase que se incluye dentro de comillas (" " ") coincide con los caracteres sólo las filas que contienen la frase literalmente, ya que se ha escrito . El texto completo del motor se divide la frase en palabras y realiza una búsqueda en el FULLTEXT índice de las palabras. Antes de MySQL 5.0.3, el motor realiza entonces una búsqueda de la subcadena de la frase en los registros que se encontraron, por lo que el partido debe incluir caracteres de otro tipo en la frase A partir de MySQL 5.0.3, caracteres de otro tipo no tiene por qué corresponder exactamente.: buscar frase sólo requiere que los partidos contienen exactamente las mismas palabras que la frase y en el mismo orden. Por ejemplo, "la frase de prueba" coincide con "la prueba, la frase" en MySQL 5.0.3, pero no antes.</p>
<p>Si la frase no contiene palabras que están en el índice, el resultado está vacío. Por ejemplo, si todas las palabras son palabras vacías o más corta que la longitud mínima de palabras indexadas, el resultado está vacío.</p>
<p>Los siguientes ejemplos muestran algunas cadenas de búsqueda que utilizan booleanas de texto completo operadores:</p>
<p>'Manzana banana'</p>
<p>Encuentra registros que contengan al menos una de las dos palabras.</p>
<p>'+ Manzana + jugo'</p>
<p>Encuentra registros que contengan ambas palabras.</p>
<p>'+ Apple macintosh'</p>
<p>Encuentra registros que contengan la palabra " manzana ", pero las filas rango más alto si también contienen" Macintosh ".</p>
<p>'+ Apple-macintosh'</p>
<p>Encuentra registros que contengan la palabra " manzana ", pero no" macintosh ".</p>
<p>'+ Apple macintosh ~'</p>
<p>Encuentra registros que contengan la palabra " manzana ", pero si la fila también contiene la palabra" Macintosh ", la tasa es más baja que si la fila no. Esto es " más suave "que la búsqueda de '+ apple-macintosh' , por lo que la presencia de " Macintosh "hace que la fila no se devolverá nada.</p>
<p>'+ Manzana + (> volumen de negocios <strudel)&#8217;</p>
<p>Encuentra registros que contengan la palabra &#8221; manzana &#8220;y&#8221; facturación &#8220;, o&#8221; manzana &#8220;y&#8221; strudel &#8220;(en cualquier orden), pero son considerados&#8221; rotación de la manzana &#8220;mayor que&#8221; apple strudel &#8220;.</p>
<p>&#8216;Manzana *&#8217;</p>
<p>Encuentra registros que contienen palabras como &#8221; manzana &#8220;,&#8221; manzanas &#8220;,&#8221; manzana &#8220;, o&#8221; applets &#8220;.</p>
<p>&#8220;Algunas palabras&#8221; &#8216;</p>
<p>Encuentra registros que contengan la frase exacta &#8221; algunas palabras &#8220;(por ejemplo, las filas que contienen&#8221; algunas palabras de sabiduría &#8220;pero no&#8221; algunas palabras irrelevantes &#8220;). Tenga en cuenta que el &#8221; &#8221; &#8220;caracteres que escriba la frase son caracteres operadores que delimitan la frase. No son las comillas que encierran la cadena de búsqueda en sí.</p>
<img src="http://www.christianmania.com/?ak_action=api_record_view&id=586&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://www.christianmania.com/2011/12/busquedas-booleana-con-match-against/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Python en Facebook</title>
		<link>http://www.christianmania.com/2011/11/python-en-facebook/</link>
		<comments>http://www.christianmania.com/2011/11/python-en-facebook/#comments</comments>
		<pubDate>Sun, 27 Nov 2011 19:29:53 +0000</pubDate>
		<dc:creator>ChristianMania</dc:creator>
				<category><![CDATA[Python]]></category>
		<category><![CDATA[Redes Sociales]]></category>

		<guid isPermaLink="false">http://www.christianmania.com/?p=577</guid>
		<description><![CDATA[ACTUALIZAR: fbconsole paquete PyPI y repositorio Github A veces lo que desea es escribir un pequeño script usando la API de Facebook que las actualizaciones de su estado, o descargas de todas tus fotos, o se eliminan todos los álbumes de vacío de forma accidental. Con el fin de escribir scripts en facebook, se ha [...]]]></description>
			<content:encoded><![CDATA[<p>ACTUALIZAR: fbconsole paquete PyPI y repositorio Github</p>
<p>A veces lo que desea es escribir un pequeño script usando la API de Facebook que las actualizaciones de su estado, o descargas de todas tus fotos, o se eliminan todos los álbumes de vacío de forma accidental. Con el fin de escribir scripts en facebook, se ha creado un micro API cliente que implementa el flujo de autenticación del cliente y tiene una función de utilidad algunos para acceder a la API gráfica y FQL.</p>
<p>Para usar este mini cliente de la API, todo lo que tienes que hacer es poner 4 líneas de código en la parte superior de la secuencia de comandos Python:</p>
<p>urllib de importación urlretrieve<br />
importación imp<br />
urlretrieve (&#8216;https://raw.github.com/gist/1194123/fbconsole.py&#8217;, &#8216;. fbconsole.py)<br />
fb = imp.load_source (&#8216;FB&#8217;, &#8216;. fbconsole.py)</p>
<p>Ahora usted puede especificar los permisos que necesita para que su guión (de la lista de los permisos de api) y autenticarse:</p>
<p>fb.AUTH_SCOPE = ['publish_stream']<br />
fb.authenticate ()</p>
<p>Por defecto, el cliente de la API hace peticiones como la &#8220;fbconsole&#8221; app. Usted puede utilizar su propia aplicación mediante el establecimiento de fb.APP_ID. Cuando se autentifica, una ventana se abrirá pidiendo los permisos que fueron solicitados por el script. Después de pasar por el diálogo de permiso, el script seguirá funcionando. El token de acceso utilizada se almacena en un archivo local al que se autentifique por lo que la próxima vez no se le presentará un cuadro de diálogo en su navegador.</p>
<p>Una vez autenticado, puede hacer lo que las llamadas a la API gráfica o FQL que desee. Por ejemplo:</p>
<p>Después de una actualización de estado</p>
<p>status = fb.graph_post (&#8220;/ me / feed&#8221;, {&#8220;mensaje&#8221;: &#8220;Hola desde mi guión increíble&#8221;})</p>
<p>Buscar gusta en una actualización de estado</p>
<p>le gusta = fb.graph estado (&#8220;/&#8221;+ ["id gusta "]+&#8221;/&#8221;)</p>
<p>Eliminar una actualización de estado</p>
<p>fb.graph_delete estado (&#8220;/&#8221;+ ["id"])</p>
<p>Subir una foto (¿Por qué Python hacen tan difícil?)</p>
<p>fb.graph_post (&#8220;/ me / fotos&#8221;, {&#8220;mensaje&#8221;: &#8220;Mis fotos&#8221;, &#8220;fuente&#8221;: open (&#8220;mi-foto.jpg&#8221;);})</p>
<p>Consulta las tablas de FQL</p>
<p>amigos = fb.fql (&#8220;SELECT * FROM nombre de usuario uid EN DONDE&#8221;<br />
                 &#8220;(SELECT uid2 DE DONDE amigo uid1 = me ())&#8221;)</p>
<p>Si descarga https://raw.github.com/gist/1194123/fbconsole.py y ejecutarlo, se le deja caer en un intérprete de Python por lo que sólo puede jugar con llamadas a la API en un entorno interactivo. Una cáscara IPython se utiliza si usted tiene instalado IPython.</p>
<p>El código es sólo una esencia en github en https://gist.github.com/1194123. Siéntete libre de comentar en este blog o en la esencia, si tiene alguna pregunta.</p>
<img src="http://www.christianmania.com/?ak_action=api_record_view&id=577&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://www.christianmania.com/2011/11/python-en-facebook/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Metodologías de desarrollo de software. ¿Cuál es el camino?</title>
		<link>http://www.christianmania.com/2011/10/metodologias-de-desarrollo-de-software-%c2%bfcual-es-el-camino/</link>
		<comments>http://www.christianmania.com/2011/10/metodologias-de-desarrollo-de-software-%c2%bfcual-es-el-camino/#comments</comments>
		<pubDate>Sun, 23 Oct 2011 18:36:22 +0000</pubDate>
		<dc:creator>ChristianMania</dc:creator>
				<category><![CDATA[Project Management]]></category>
		<category><![CDATA[3p]]></category>
		<category><![CDATA[Metodologías de desarrollo de software]]></category>
		<category><![CDATA[rup]]></category>
		<category><![CDATA[XP]]></category>

		<guid isPermaLink="false">http://www.christianmania.com/?p=553</guid>
		<description><![CDATA[1. Introducción El desarrollo de software no es sin dudas una tarea fácil. Como resultado a este problema ha surgido una alternativa desde hace mucho: la Metodología. Las metodologías imponen un proceso disciplinado sobre el desarrollo de software con el fin de hacerlo más predecible y eficiente. Lo hacen desarrollando un proceso detallado con un [...]]]></description>
			<content:encoded><![CDATA[<h4>1. Introducción</h4>
<p>El desarrollo de software no es sin dudas una tarea fácil. Como resultado a este problema ha surgido una alternativa desde hace mucho: la Metodología. Las metodologías imponen un proceso disciplinado sobre el desarrollo de software con el fin de hacerlo más predecible y eficiente. Lo hacen desarrollando un proceso detallado con un fuerte énfasis en planificar inspirado por otras disciplinas de la ingeniería.</p>
<p>Las metodologías ingenieriles han estado presentes durante mucho tiempo. No se han distinguido precisamente por ser muy exitosas. Aún menos por su popularidad. La crítica más frecuente a estas metodologías es que son burocráticas. Hay tanto que hacer para seguir la metodología que el ritmo entero del desarrollo se retarda.</p>
<p>Hoy en día existen numerosas propuestas metodológicas que inciden en distintas dimensiones del proceso de desarrollo. Un ejemplo de ellas son las propuestas tradicionales centradas específicamente en el control del proceso. Estas han demostrado ser efectivas y necesarias en un gran número de proyectos, sobre todo aquellos proyectos de gran tamaño (respecto a tiempo y recursos).</p>
<p>Sin embargo la experiencia ha demostrado que las metodologías tradicionales no ofrecen una buena solución para proyectos donde el entorno es volátil y donde los requisitos no se conocen con exactitud, porque no están pensadas para trabajar con incertidumbre.</p>
<p>Aplicar metodologías tradicionales nos obliga a forzar a nuestro cliente a que tome la mayoría de las decisiones al principio. Luego el coste de cambio de una decisión tomada puede llegar a ser muy elevado si aplicamos metodologías tradicionales.</p>
<p>Es por ello que varios problemas como los que a continuación mencionamos han sido detectados:</p>
<ul>
<li>Retrasos en la planificación: llegada la fecha de entregar el software éste no está disponible.</li>
<li>Sistemas deteriorados: el software se ha creado pero después de un par de años el coste de su mantenimiento es tan complicado que definitivamente se abandona su producción.</li>
<li>Tasa de defectos: el software se pone en producción pero los defectos son tantos que nadie lo usa.</li>
<li>Requisitos mal comprendidos: el software no resuelve los requisitos planificados inicialmente.</li>
<li>Cambios de negocio: el problema que resolvía nuestro software ha cambiado y nuestro software no se ha adaptado.</li>
<li>Falsa riqueza: el software hace muchas cosas técnicamente muy interesantes y divertidas, pero no resuelven el problema de nuestro cliente, ni hace que éste gane más dinero.</li>
<li>Cambios de personal: después de unos años de trabajo los programadores comienzan a odiar el proyecto y lo abandonan.</li>
</ul>
<p>Como respuesta a los problemas aplicando metodologías tradicionales surgieron otras metodologías que tratan de adaptarse a la realidad del desarrollo de software.</p>
<p>El encanto de estas metodologías ágiles es su reacción ante la burocracia de las metodologías monumentales. Estos nuevos métodos buscan un justo medio entre ningún proceso y demasiado proceso, proporcionando simplemente suficiente proceso para que el esfuerzo valga la pena.</p>
<p>El resultado de todo esto es que los métodos ágiles cambian significativamente algunos de los énfasis de los métodos ingenieriles. La diferencia inmediata es que son menos orientados al documento, exigiendo una cantidad más pequeña de documentación para una tarea dada. De muchas maneras son más bien orientados al código: siguiendo un camino que dice que la parte importante de la documentación es el código fuente.</p>
<h4>2. Desarrollo</h4>
<p><strong>Metodologías pesadas.</strong></p>
<p><strong>RUP</strong><br />
El proceso unificado de desarrollo (RUP) es una metodología para la ingeniería de software que va más allá del mero análisis y diseño orientado a objetos para proporcionar una familia de técnicas que soportan el ciclo completo de desarrollo de software. El resultado es un proceso basado en componentes, dirigido por los casos de uso, centrado en la arquitectura, iterativo e incremental.</p>
<p><b>Características principales de RUP</b></p>
<ul>
<li>&#8220;Centrado en los modelos: Los diagramas son un vehículo de comunicación más expresivo que las descripciones en lenguaje natural. Se trata de minimizar el uso de descripciones y especificaciones textuales del sistema.&#8221;</li>
<li>&#8220;Guiado por los Casos de Uso: Los Casos de Uso son el instrumento para validar la arquitectura del software y extraer los casos de prueba.&#8221;</li>
<li>&#8220;Centrado en la arquitectura: Los modelos son proyecciones del análisis y el diseño constituye la arquitectura del producto a desarrollar.&#8221;</li>
<li>&#8220;Iterativo e incremental: Durante todo el proceso de desarrollo se producen versiones incrementales (que se acercan al producto terminado) del producto en desarrollo.&#8221;</li>
</ul>
<h4>Beneficios que aporta RUP</h4>
<ul>
<li>Permite desarrollar aplicaciones sacando el máximo provecho de las nuevas tecnologías, mejorando la calidad, le rendimiento, la reutilización, la seguridad y el mantenimiento del software mediante una gestión sistemática de los riesgos. </li>
<li>Permite la producción de software que cumpla con las necesidades de los usuarios, a través de la especificación de los requisitos, con una agenda y costo predecible.</li>
<li>Enriquece la productividad en equipo y proporciona prácticas óptimas de software a todos sus miembros. </li>
<li>Permite llevar a cabo el proceso de desarrollo práctico, brindando amplias guías, plantillas y ejemplos para todas las actividades críticas.</li>
<li>Proporciona guías explicitas para áreas tales como modelado de negocios, arquitectura Web, pruebas y calidad. También se proporciona guías para desarrollar en plataformas IBM WebSphere y Microsoft Web Solution para acelerar el desarrollo de los proyectos. </li>
<li>Se integra estrechamente con herramientas Rational, permitiendo a los equipos de desarrollo aprovechar todas las ventajas de las características de los productos Rational, el Lenguaje de Modelado Unificado (UML) y otras prácticas óptimas de la industria. </li>
<li>Unifica todo el equipo de desarrollo de software y mejora la comunicación al brindar a cada miembro del mismo una base de conocimientos, un lenguaje de modelado y un punto de vista de cómo desarrollar software. </li>
<li>Optimiza la productividad de cada miembro del equipo al poner al alcance la experiencia derivada de miles de proyectos y muchos líderes de la industria.</li>
<li>No solo garantiza que los proyectos abordados serán ejecutados íntegramente sino que además evita desviaciones importantes respecto a los plazos.</li>
<li>Permite una definición acertada del sistema en un inicio para hacer innecesarias las reconstrucciones parciales posteriores. 	</li>
</ul>
<h4>Metodologías ágiles.</h4>
<h4>XP</h4>
<p>La Programación Extrema surge ideada por Kent Beck, como proceso de creación de software diferente al convencional. En palabras de Beck: &#8220;XP es una metodología ligera, eficiente, con bajo riesgo, flexible, predecible y divertida para desarrollar software&#8221;.</p>
<p><b>Objetivos de XP:</b><br />
Los objetivos de XP son muy simples: la satisfacción del cliente. Esta metodología trata de dar al cliente el software que él necesita y cuando lo necesita. Por tanto, debemos responder muy rápido a las necesidades del cliente, incluso cuando los cambios sean al final de ciclo de la programación.</p>
<p>El segundo objetivo es potenciar al máximo el trabajo en grupo. Tanto los jefes de proyecto, los clientes y desarrolladores, son parte del equipo y están involucrados en el desarrollo del software.</p>
<p><b>Bases de XP</b><br />
La programación extrema se basa en la simplicidad, la comunicación y el reciclado continuo de código, para algunos no es más que aplicar una pura lógica. Lo que buscan en definitiva es la reducción de costes.</p>
<p><b>Valores XP</b><br />
Una de las cosas que a los programadores nos tiene que quedar muy claro es que en el ciclo de vida del desarrollo de un proyecto software los cambios van a aparecer, cambiarán los requisitos, las reglas de negocio, el personal, la tecnología, todo va a cambiar. Por tanto el problema no es el cambio en si, ya que este va a suceder sino la incapacidad de enfrentarnos a estos cambios.</p>
<p>Como en otra cualquier actividad humana necesitamos valores para desarrollar nuestro trabajo y conseguir los planteamientos iniciales.</p>
<p>Estos cuatro valores son:</p>
<ul>
<li>Comunicación</li>
<li>Sencillez</li>
<li>Retroalimentación</li>
<li>Valentía</li>
</ul>
<p><b>Variables XP</b><br />
XP define cuatro variables para proyectos de software:</p>
<p>Coste<br />
Tiempo<br />
Calidad<br />
Ámbito.<br />
Actividades básicas XP</p>
<p>Ahora que tenemos nuestros cuatro valores estamos preparados para construir una disciplina de desarrollo de software. ¿Qué tareas debemos de llevar a cabo para desarrollar un buen software?</p>
<p>Codificar</p>
<p>Es la única actividad de la que no podremos prescindir. Sin código fuente no hay programa, aunque hay gente que cuenta que existe software en producción del que se perdió el código fuente. Por tanto necesitamos codificar y plasmar nuestras ideas a través del código. En una programación en XP en pareja el código expresa tu interpretación del problema, así podemos utilizar el código para comunicar, para hacer mías tus ideas, y por tanto para aprender y mejorar.</p>
<p>Hacer pruebas</p>
<p>Las características del software que no pueden ser demostradas mediante pruebas simplemente no existen. Las pruebas me dan la oportunidad de saber si lo que implementé es lo que en realidad yo pensaba que había implementado. Las pruebas nos indican que nuestro trabajo funciona, cuando no podemos pensar en ninguna prueba que pudiese originar un fallo en nuestro sistema entonces has acabado por completo.</p>
<p>No debemos de escribir tan solo una prueba ver que funciona y salir corriendo, debemos de pensar en todas las posibles pruebas para nuestro código, con el tiempo llegarás a conclusiones sobre las pruebas y podrás pensar que si dos de tus pruebas ya funcionan la tercera prueba no será necesaria escribirla, sin caer en demasiada confianza.</p>
<p>Programar y probar es más rápido que sólo programar. Puedes ganar media hora de productividad sin hacer pruebas, pero perderás mucho tiempo en la depuración. Tendrás menos errores, tendrás que volver menos veces sobre el código, te costará menos localizar los errores, perderás menos tiempo escuchado como tus clientes te dicen que no funciona.</p>
<p>Las pruebas deben de ser sensatas y valientes. No podemos hacer pruebecillas que no testen a fondo el sistema, esos agujeros que vamos dejando nos esperan para cuando pasemos de nuevo por allí y volveremos a caer dentro.</p>
<p>Escuchar</p>
<p>Los programadores no lo conocemos todo, y sobre todo muchas cosas que las personas de negocios piensan que son interesantes. Si ellos pudieran programarse su propio software ¿ para que nos querrían ?.</p>
<p>Si vamos a hacer pruebas tenemos que preguntar si lo obtenido es lo deseado, y tenemos que preguntar a quien necesita la información. Tenemos que escuchar a nuestros clientes cuales son los problemas de su negocio, debemos de tener una escucha activa explicando lo que es fácil y difícil de obtener, y la realimentación entre ambos nos ayudan a todos a entender los problemas.</p>
<p>Diseñar</p>
<p>El diseño crea una estructura que organiza la lógica del sistema, un buen diseño permite que el sistema crezca con cambios en un solo lugar. Los diseños deben de ser sencillos, si alguna parte del sistema es de desarrollo complejo, divídela en varias. Si hay fallos en el diseño o malos diseños, estos deben de ser corregidos cuanto antes.</p>
<p>Tenemos que codificar porque sin código no hay programas, tenemos que hacer pruebas por que sin pruebas no sabemos si hemos acabado de codificar, tenemos que escuchar, porque si no escuchamos no sabemos que codificar ni probar, y tenemos que diseñar para poder codificar, probar y escuchar indefinidamente.</p>
<p>Prácticas Básicas de XP</p>
<p>El juego de la planificación.</p>
<p>Hay una comunicación frecuente el cliente y los programadores. El equipo técnico realiza una estimación del esfuerzo requerido para la implementación de las historias de usuario y los clientes deciden sobre el ámbito y tiempo de las entregas y de cada iteración.</p>
<p>Pequeñas versiones.</p>
<p>Cada versión debe de ser tan pequeña como fuera posible, conteniendo los requisitos de negocios más importantes, las versiones tiene que tener sentido como un todo, me explico no puedes implementar media característica y lanzar la versión.</p>
<p>Es mucho mejor planificar para 1 mes o 2 que para seis meses y un año, las compañías que entregan software muy voluminoso no son capaces de hacerlo con mucha frecuencia.</p>
<p>Metáfora.</p>
<p>Una metáfora es una historia que todo el mundo puede contar a cerca de cómo funciona el sistema. Algunas veces podremos encontrar metáforas sencillas &#8220;Programa de gestión de compras, ventas, con gestión de cartera y almacén&#8221;. Las metáforas ayudan a cualquier persona a entender el objeto del programa.</p>
<p>Diseño sencillo.</p>
<p>El diseño adecuado par el software es aquel que:</p>
<p>1. Funciona con todas las pruebas.</p>
<p>2. No tiene lógica duplicada.</p>
<p>3. Manifiesta cada intención importante para los programadores</p>
<p>4. Tiene el menor número de clases y métodos.</p>
<p>Haz el diseño lo más simple posible borra todo lo que puedas sin violar las reglas 1,2 y 3. Contrariamente a lo que se pensaba el &#8220;Implementa para hoy, diseña para mañana&#8221;, no es del todo correcto si piensas que el futuro es incierto.</p>
<p>Hacer pruebas.</p>
<p>No debe existir ninguna característica en el programa que no haya sido probada, los programadores escriben pruebas para chequear el correcto funcionamiento del programa, los clientes realizan pruebas funcionales. El resultado un programa mas seguro que conforme pasa el tiempo es capaz de aceptar nuevos cambios.</p>
<p>Recodificación.</p>
<p>Cuando implementamos nuevas características en nuestros programas nos planteamos la manera de hacerlo lo mas simple posible, después de implementar esta característica, nos preguntamos como hacer el programa mas simple sin perder funcionalidad, este proceso se le denomina recodificar o refactorizar (refactoring). Esto a veces nos puede llevar a hacer mas trabajo del necesario, pero a la vez estaremos preparando nuestro sistema para que en un futuro acepte nuevos cambios y pueda albergar nuevas características. No debemos de recodificar ante especulaciones si no solo cuándo el sistema te lo pida.</p>
<p>Programación por parejas.</p>
<p>Todo el código de producción lo escriben dos personas frente al ordenador, con un sólo ratón y un sólo teclado. Cada miembro de la pareja juega su papel: uno codifica en el ordenador y piensa la mejor manera de hacerlo, el otro piensa más estratégicamente, ¿Va a funcionar?, ¿Puede haber pruebas donde no funcione?, ¿Hay forma de simplificar el sistema global para que el problema desaparezca?</p>
<p>El emparejamiento es dinámico, puedo estar emparejado por la mañana con una persona y por la tarde con otra, si tienes un trabajo sobre un área que no conoces muy bien puedes emparejarte con otra persona que si conozca ese área. Cualquier miembro del equipo se puede emparejar con cualquiera.</p>
<p>Propiedad colectiva.</p>
<p>Cualquiera que crea que puede aportar valor al código en cualquier parcela puede hacerlo, ningún miembro del equipo es propietario del código. Si alguien quiere hacer cambios en el código puede hacerlo. Si hacemos el código propietario, y necesitamos de su autor para que lo cambie entonces estaremos alejándonos cada vez mas de la comprensión del problema, si necesitamos un cambio sobre una parte del código lo hacemos y punto. XP propone un propiedad colectiva sobre el código nadie conoce cada parte igual de bien pero todos conoce algo sobre cada parte, esto nos preparará para la sustitución no traumática de cada miembro del equipo.</p>
<p>Integración continúa.</p>
<p>El código se debe integrar como mínimo una vez al día, y realizar las pruebas sobre la totalidad del sistema. Una pareja de programadores se encargara de integrar todo el código en una maquina y realizar todas las pruebas hasta que estas funcionen al 100%.</p>
<p>40 Horas semanales.</p>
<p>Si queremos estar frescos y motivados cada mañana y cansado y satisfecho cada noche. El viernes quiero estar cansado y satisfecho para sentir que tengo dos días para pensar en algo distinto y volver el lunes lleno de pasión e ideas. Esto requiere que trabajemos 40 horas a la semana, mucha gente no puede estar más de 35 horas concentrados a la semana, otros pueden llegar hasta 45 pero ninguno puede llegar a 60 horas durante varias semanas y aun seguir fresco, creativo y confiado. Las horas extras son síntoma de serios problemas en el proyecto, la regla de XP dice nunca 2 semanas seguidas realizando horas extras.</p>
<p>Cliente In-situ.</p>
<p>Un cliente real debe sentarse con el equipo de programadores, estar disponible para responder a sus preguntas, resolver discusiones y fijar las prioridades. Lo difícil es que el cliente nos ceda una persona que conozca el negocio para que se integre en el equipo normalmente estos elementos son muy valiosos, pero debemos de hacerles ver que será mejor para su negocio tener un software pronto en funcionamiento, y esto no implica que el cliente no pueda realizar cualquier otro trabajo.</p>
<p>Estándares de codificación.</p>
<p>Si los programadores van a estar tocando partes distintas del sistema, intercambiando compañeros, haciendo refactoring, debemos de establecer un estándar de codificación aceptado e implantado por todo el equipo.</p>
<p>Características esenciales de XP</p>
<p>Roles.<br />
Programador: Produce el código del sistema.<br />
Cliente: Escribe las HU y las pruebas funcionales para validar su implementación, así como asigna la prioridad de la HU y decide cuál se implementara en cada iteración.<br />
Encargado de pruebas: Ayuda al cliente a escribir las pruebas funcionales, ejecuta las pruebas y difunde resultados además es responsable de las herramientas de soporte para prueba.<br />
Rastreador (Tracker):también conocido como &#8220;Metric Man&#8221;, observa sin molestar y mantiene los datos históricos.<br />
Consultor: Es un miembro externo del equipo con conocimiento especifico de algún tema necesario para el proyecto. Guía al equipo para resolver un problema específico.<br />
Gestor (Big Boss): Es el vínculo entre clientes y programadores, ayuda a que el equipo trabaje efectivamente creando las condiciones adecuadas. Su labor esencial es de coordinación.<br />
Artefactos esenciales.<br />
Historias de Usuario.<br />
Tareas de Ingeniería.<br />
Pruebas de Aceptación.<br />
Procesos.<br />
Ciclo de desarrollo.<br />
Ciclo de vida(Fases)<br />
Exploración<br />
Planificación.<br />
Iteraciones.<br />
Producción.<br />
Mantenimiento.<br />
Muerte Proyecto.<br />
Prácticas.<br />
3P [ECH08].</p>
<p>Paradigma 3P es una metodología de desarrollo de software nacida al calor de la experiencia acumulada del grupo de investigación y desarrollo Atis debido a la insuficiente capacidad de respuesta a los clientes utilizando las metodologías tradicionales.</p>
<p>Principios que sustentan el modelo</p>
<p>Los individuos y sus interacciones son más importantes que los procesos y las herramientas: El PERSONAL.<br />
La comunicación con el cliente evita construir una elegante solución para un problema equivocado: El PROBLEMA.<br />
El software que funciona es más importante que la documentación exhaustiva. El PROCESO.<br />
Valores 3P</p>
<p>Comunicación: Sin comunicación todo proyecto estaría destinado a fracasar , comunicar no es escribir o hablar muchas palabras sino utilizar solo las palabras necesarias para trasmitir una idea.<br />
Sencillez: Nadie es mejor o peor que los demás miembros del grupo de desarrollo , todos tenemos fortalezas y debilidades, conocerlas hará que nuestras relaciones con los miembros del grupo sean mejores en el orden profesional y personal.<br />
Retroalimentación: Saber cuándo se debe rehacer algo que no funciona, equivocarse es de humanos, encarar nuevamente la tarea con emprendimiento y optimismo.<br />
Emprendimiento: estar dispuesto siempre a acometer las tareas más complejas, encararla con esmero y con alegría hará que crezca nuestro prestigio entre los demás miembros, la convicción y el deseo del triunfo debe prevalecer.<br />
Optimismo: Ser realista pero tener siempre el pensamiento orientado hacia el éxito.<br />
Actividades básicas</p>
<p>Codificar.<br />
Probar.<br />
Comunicar<br />
Idear<br />
Escuchar.<br />
Diseñar.<br />
Roles del proyecto</p>
<p>Jefe del Proyecto<br />
Cliente<br />
Consultor<br />
Analista-Programador<br />
Programador<br />
Diseñador de Interfaces<br />
Principios que sustentan la metodología</p>
<p>EL Personal: Gestión de Proyecto<br />
El Problema: Gestión del Cliente<br />
El Proceso: Ciclo de Vida de Desarrollo<br />
Ciclo de vida de desarrollo</p>
<p>Definición del problema.<br />
Identificación de los procesos unitarios.<br />
Diseño del prototipo.<br />
Desarrollo del prototipo.<br />
Prueba del prototipo.<br />
Si <no prueba de Prototipo>ir a Paso 3.<br />
Si <Prototipo difiere Sistema Deseado>ir a Paso 2.<br />
Si <no Necesidades satisfechas>ir a Paso 2.<br />
Implantación.<br />
Mantenimiento.<br />
Resumen puntos clave</p>
<p>RUP</p>
<p>Pesado<br />
Dividido en cuatro fases, que se dividen en iteraciones<br />
El discurrir del proyecto se define en Workflows<br />
Los artefactos son el objetivo de cada actividad<br />
Se basa en roles<br />
UML<br />
Muy organizativo<br />
Mucha documentación<br />
3P</p>
<p>Ágil<br />
Cercano al desarrollo, pero sin olvidar el diseño.<br />
Se basa en 3 principios: Personal, Problema, Proceso.<br />
Gran interacción con el cliente.<br />
Pruebas de funcionalidad y calidad.<br />
Logra alcanzar un control y organización del proceso.<br />
Logra un equilibrio en cuanto a la generación de documentación<br />
XP</p>
<p>Ligero<br />
Cercano al desarrollo<br />
Se basa en UserStories<br />
Fuerte comunicación con el cliente<br />
El código fuente pertenece a todos<br />
Programación por parejas<br />
Tests como base de la funcionalidad<br />
Solo el mínimo de organización<br />
Pobre en cuanto a documentación<br />
3. Conclusiones<br />
¿Qué debemos esperar entonces de un proceso de desarrollo?</p>
<p>¿Qué criterios debe cumplir para que aporte algo a la empresa?</p>
<p>Básicamente el proceso de desarrollo tiene que ayudarnos a escribir software, tiene que poner las reglas necesarias para alcanzar el éxito en nuestro proyecto pero dejando la libertad suficiente para no sentirnos agobiados.</p>
<p>Esto no nos lo va a ofrecer ningún proceso estándar, y como dice el refrán (aunque no se cumple exactamente en el mundo de la informática) todos los caminos conducen a Roma.</p>
<p>De forma que es tarea de cada empresa, casi para cada proyecto, decidir cual es el mejor modo de llegar a nuestra meta.</p>
<img src="http://www.christianmania.com/?ak_action=api_record_view&id=553&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://www.christianmania.com/2011/10/metodologias-de-desarrollo-de-software-%c2%bfcual-es-el-camino/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>FullCalendar plugin para jQuery</title>
		<link>http://www.christianmania.com/2011/10/fullcalendar-plugin-para-jquery/</link>
		<comments>http://www.christianmania.com/2011/10/fullcalendar-plugin-para-jquery/#comments</comments>
		<pubDate>Tue, 18 Oct 2011 16:41:17 +0000</pubDate>
		<dc:creator>ChristianMania</dc:creator>
				<category><![CDATA[JQuery]]></category>
		<category><![CDATA[calendar]]></category>
		<category><![CDATA[fullcalendar]]></category>
		<category><![CDATA[jquery]]></category>

		<guid isPermaLink="false">http://www.christianmania.com/?p=560</guid>
		<description><![CDATA[FullCalendar es un plugin para jQuery que ofrece una de tamaño completo, arrastrar y soltar calendario. Se utiliza AJAX para traer eventos en la marcha de cada mes y se puede configurar fácilmente para utilizar su formato de fuente propia (una extensión está prevista Google Calendar). Visualmente es personalizable y expone los ganchos para el [...]]]></description>
			<content:encoded><![CDATA[<p>FullCalendar es un plugin para jQuery que ofrece una de tamaño completo, arrastrar y soltar calendario. Se utiliza AJAX para traer eventos en la marcha de cada mes y se puede configurar fácilmente para utilizar su formato de fuente propia (una extensión está prevista Google Calendar). Visualmente es personalizable y expone los ganchos para el usuario activa los eventos (como hacer clic o arrastrar un evento).</p>
<p><a href="http://www.christianmania.com/wp-examples/fullcalendar-1.5.2/fullcalendar-1.5.2.zip" title="Descargar ejemplo...">Descargar ejemplo…</a></p>
<p><iframe height="1520" frameborder="0" width="500" scrolling="no" name="fullcalendar-1.5.2" marginwidth="0" marginheight="0" hspace="0" allowtransparency="true" src="http://www.christianmania.com/wp-examples/fullcalendar-1.5.2/demos/selectable.html?s"></iframe></p>
<img src="http://www.christianmania.com/?ak_action=api_record_view&id=560&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://www.christianmania.com/2011/10/fullcalendar-plugin-para-jquery/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Tips para optimizar tus palabras clave de búsqueda</title>
		<link>http://www.christianmania.com/2011/10/tips-para-optimizar-tus-palabras-clave-de-busqueda/</link>
		<comments>http://www.christianmania.com/2011/10/tips-para-optimizar-tus-palabras-clave-de-busqueda/#comments</comments>
		<pubDate>Mon, 17 Oct 2011 16:50:22 +0000</pubDate>
		<dc:creator>ChristianMania</dc:creator>
				<category><![CDATA[Redes Sociales]]></category>
		<category><![CDATA[SEO]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[keywords]]></category>
		<category><![CDATA[marketing]]></category>
		<category><![CDATA[online]]></category>
		<category><![CDATA[palabras clave]]></category>
		<category><![CDATA[posicionamiento]]></category>

		<guid isPermaLink="false">http://www.christianmania.com/?p=555</guid>
		<description><![CDATA[Para tener una buen marketing online es bueno tener una buena selección de palabras clave o keywords que son la clave para poder marketearte por Internet y el posicionamiento de tu sitio web. Sin embargo es importante saber que las palabras que seleccionas pueden tener variantes que podrían afectar o beneficiar la relevancia de las [...]]]></description>
			<content:encoded><![CDATA[<p>Para tener una buen marketing online es bueno tener una buena selección de palabras clave o keywords que son la clave para poder marketearte por Internet y el posicionamiento de tu sitio web. Sin embargo es importante saber que las palabras que seleccionas pueden tener variantes que podrían afectar o beneficiar la relevancia de las mismas en los resultados de búsqueda.</p>
<p>Si no tienes a un especialista en Google Adwords dentro de tu equipo de trabajo que haga ésto por ti, estos tips te serán de mucha ayuda.</p>
<p>Google Adwords maneja algo que se llama tipos de concordancia, en ingles (Match Types). Adwords se basa en hacer coincidir anuncios relevantes con la búsqueda que realiza el usuario, por lo que las palabras clave son  fundamentales para ayudar tanto al usuario a encontrar lo que busca, como al anunciante a encontrar quien está interesado en lo que ofrece. Cuando uno ingresa sus palabras claves por default viene la opción de concordancia amplia.</p>
<p>Concordancia Amplia (Broad match). Es la configuración predeterminada para todas las palabras clave, esto significa que todas las búsquedas que realize el usuario sin importar orden o combinación podrían mostrar tu anuncio. Por ejemplo; Libros usados</p>
<p>Al seleccionar esta palabra en Broad match</p>
<p>Tu anuncio aparecería en la búsqueda:</p>
<p>*  Distribuidor de libros usados<br />
*  Libros de segunda mano<br />
*  Libros usados<br />
*  Venta de libros usados<br />
*  Libreros usados</p>
<p>Como vemos las posibilidades de que tu anuncio aparezca en los resultados de búsqueda es muy amplia y ésto es bueno si deseas que tu palabra aparezca en los resultados de búsqueda con diversas variaciones, de lo contrario, Adwords ofrece 4 métodos para poder ser más específicos y objetivos con los resultados de búsqueda donde nuestro anuncio debería aparecer.</p>
<p><strong>1.- Concordancia de frase (Phrase match).</strong> Se reduce a su alcance al exigir que las palabras aparezcan exactamente en el orden que especifiques, (pueden aparecer palabras adicionales antes o después de la frase).</p>
<p>Para habilitar Phrase match encierra tu palabra clave entre comillas “Libros usados”.</p>
<p>Ejemplo:</p>
<p>Tu anuncio aparecería en la búsqueda:</p>
<p>*  Distribuidor de libros usados<br />
*  Compro libros usados<br />
*  Reparación de libros usados</p>
<p>Tu anuncio no aparecería en la búsqueda:</p>
<p>*  Venta de libros nuevos y usados<br />
*  Libros de literatura usados</p>
<p><strong>2.- Concordancia exacta (Exact match). </strong>Minimiza aún más el alcance para mostrar su anuncio, cuando la palabra o frase se debe mostrar exactamente como se escribe y no debe incluir ninguna otra palabra antes o después.</p>
<p>Para habilitar Exact match encierra tu palabra clave entre corchetes [Libros usados]</p>
<p>Ejemplo:</p>
<p>Tu anuncio aparecería en:</p>
<p>*  Libros usados</p>
<p>Tu anuncio no aparecería en:</p>
<p>*  Libro usado<br />
*  Vendedor de libros usados</p>
<p><strong>3.- Concordancia negativa (Negative match).</strong> Elimina frases de búsqueda en donde no quieres que tu anuncio aparezca, como; barato o gratuito. Es decir previene que tu anuncio aparezca cuando la frase de búsqueda incluye una palabra que no es relevante para tu anuncio.</p>
<p>Para habilitar Negative match asigna un – antes de tu palabra clave por ejemplo: libros usados y la palabra negativa sería -ingles</p>
<p>Tu anuncio aparecería en:</p>
<p>*  Vendedor de libros usados</p>
<p>Tu anuncio no aparecería en:</p>
<p>*  Libros usados en ingles</p>
<p><strong>4.- Concordancia integrada (Embedded match)</strong>, permite evitar que tu anuncio aparezca en relación con cierta frase o coincidencias exactas.</p>
<p>Un ejemplo de ésto: Un anunciante vende juguetes de la película Toy Story, por lo que si utiliza la opción de Embedded match para integrar Negative match y Exact match -[Toy Story], de ésta manera tu anuncio aparecería para (Muñecos Toy Story) y (Productos de Toy Story), pero no aparecerá para la frase exacta Toy Story.</p>
<p><strong>Tips:</strong></p>
<p>*Crea una lista con todas tus palabras clave, luego agrupa tus palabras, por ejemplo, por líneas de producto como; café organico y café gourmet. Cada agrupación deberá pertenecer a un ad group, del cual podrás crear diversos anuncios y realizar un test con diferentes palabras clave para ver los keywords con mejores resultados.</p>
<p>*Manten tus opciones de campaña en mente. Si tu campaña está configurada para dirigirse a un segmento geográfico muy específico, usar palabras más generales podría funcionar bien. Pero, si está dirigida a uno o más países o territorios, es posible considerar el uso de palabras clave más específicas para enfocar mejor el tráfico.</p>
<p>*La concordancia de palabras clave no distingue entre mayúsculas y minúsculas. Es decir; no es necesario introducir ‘libros’ y ‘Libros’ como palabras clave; bastará con que especifiques ‘libros’.</p>
<p>*No se tienen que incluir signos de puntuación como los puntos, comas y guiones. La palabra clave “ante-ojos” es la misma que “ante ojos” pero distinta de “anteojos“. Si la palabra clave tiene concordancia amplia, es probable que ya se haya establecido la orientación de variaciones como éstas.</p>
<p>*Incluye variaciones. Como ayuda para que tu anuncio se muestre con más frecuencia, incluye variaciones de palabra clave relevantes, por ejemplo: versiones en singular y plural, considera la posibilidad de utilizar, si aplica, términos coloquiales, variaciones ortográficas, sinónimos y números de producto o serie.</p>
<p>*Permite que tus palabra clave corra al menos 30 días antes de decidir si te dio buenos resultados o se debe modificar.</p>
<img src="http://www.christianmania.com/?ak_action=api_record_view&id=555&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://www.christianmania.com/2011/10/tips-para-optimizar-tus-palabras-clave-de-busqueda/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Búsquedas Avanzadas con Mysql usando FullText Match() Against()</title>
		<link>http://www.christianmania.com/2011/10/busquedas-avanzadas-con-mysql-usando-fulltext-match-against/</link>
		<comments>http://www.christianmania.com/2011/10/busquedas-avanzadas-con-mysql-usando-fulltext-match-against/#comments</comments>
		<pubDate>Fri, 07 Oct 2011 22:28:20 +0000</pubDate>
		<dc:creator>ChristianMania</dc:creator>
				<category><![CDATA[Base de Datos]]></category>
		<category><![CDATA[against]]></category>
		<category><![CDATA[fulltext]]></category>
		<category><![CDATA[match]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[search]]></category>

		<guid isPermaLink="false">http://www.christianmania.com/?p=546</guid>
		<description><![CDATA[Todo eso es posible, aquí verás cómo. Primero: el engine indicado para almacenar documentos es MYISAM, porque es el único que tiene los índices de tipo fulltext. Lamentablemente MyISAM no tiene integridad referencial ni es transaccional, pero en fin, los documentos tampoco son datos tan críticos (por lo general están escritos en otro documento antes [...]]]></description>
			<content:encoded><![CDATA[<p>Todo eso es posible, aquí verás cómo.</p>
<p>Primero: el engine indicado para almacenar documentos es MYISAM, porque es el único que tiene los índices de tipo fulltext. Lamentablemente MyISAM no tiene integridad referencial ni es transaccional, pero en fin, los documentos tampoco son datos tan críticos (por lo general están escritos en otro documento antes de cargarlos) ni tampoco se generan tantos por segundo.</p>
<p>Hay 3 clases de búsquedas:</p>
<p>Lenguaje natural: Se localizan los registros que incluyen la o las palabras suministradas.</p>
<p>Modo booleano: es posible indicar palabras a incluir, a excluir y buscar frases exactas o partes de palabras (¡como Google!)</p>
<p>Expansión de consultas: tiene dos fases, la primera es la búsqueda natural, en la segunda (que es la que se presenta como resultado) busca todos los registros que incluyan algún término presente en cualquiera de los registros hallados en la primera fase.</p>
<p>Requisitos para que no te falle:</p>
<p>1) La tabla debe ser MyISAM<br />
2) Debe crearse un índice fulltext sobre cada campo donde se desee buscar<br />
3) Los tipos aceptados en índices Fulltext son CHAR, VARCHAR y TEXT (y sus variantes MEDIUM o LONG).<br />
4) La diferencia es la longitud aceptada: TEXT=2 elevado a la 16 bytes, MEDIUMTEXT=2 a la 24 bytes, LONGTEXT=2 a la 32 bytes (aprox. 4096 MB por registro). Un TEXT almacena 64MB, lo cual no es poco.<br />
5) Las palabras que aparecen un 50% de las veces o más se ignoran por ser &#8220;comunes&#8221; (pero no en modo booleano)<br />
6) Hay una lista de palabras comunes en inglés que también se ignoran.<br />
7) Por defecto se ignoran las palabras de menos de 4 caracteres de longitud<br />
 <img src='http://www.christianmania.com/wp-includes/images/smilies/icon_cool.gif' alt='8)' class='wp-smiley' /> Una &#8220;palabra&#8221; es cualquier combinacion de caracteres A-Z,a-z,0-9,&#8217; y _. Otros caracteres hacen que el motor fulltext las considere 2 palabras (por ejemplo, &#8220;entrada/salida&#8221;, la barra las separa en dos, pero &#8220;entrada_salida&#8221; se considera una sola).</p>
<p>Las búsquedas se hacen así:</p>
<p>supongamos que tenemos la tabla &#8220;textos&#8221; con los campos &#8220;titulo&#8221; y &#8220;contenido&#8221;, y tres indices:</p>
<p>mysql> ALTER TABLE textos ADD FULLTEXT titulo(titulo);<br />
mysql> ALTER TABLE textos ADD FULLTEXT contenido(contenido);<br />
mysql> ALTER TABLE textos ADD FULLTEXT titcont(titulo,contenido);</p>
<p>Para buscar el término &#8216;amanecer&#8217; en el título solamente:</p>
<p>mysql> SELECT titulo FROM textos WHERE MATCH(titulo, contenido) AGAINST(&#8216;amanecer&#8217;);</p>
<p>Para buscarlo en título y contenido:</p>
<p>mysql> SELECT titulo FROM textos WHERE MATCH(titulo,) AGAINST(&#8216;amanecer&#8217;);</p>
<p>Para realizar una búsqueda booleana que permita excluir la palabra &#8216;gris&#8217;:</p>
<p>mysql> SELECT titulo FROM textos WHERE MATCH(titulo) AGAINST(&#8216;+amanecer -gris&#8217; IN BOOLEAN MODE);</p>
<p>Para realizar una expansión de consultas:</p>
<p>mysql> SELECT titulo FROM textos WHERE MATCH(titulo,contenido) AGAINST(&#8216;amanecer&#8217; WITH QUERY EXPANSION);</p>
<p>Ahora paso a tu segunda pregunta: obtener relevancia.<br />
La expresión MATCH(titulo) AGAINST(&#8216;amanecer&#8217; WITH QUERY EXPANSION) no es una simple instrucción &#8220;que debe estar ahí&#8221;, en realidad devuelve un valor que es la relevancia de cada registro. Inclusive, además del WHERE puede colocarse en la lista del SELECT (como haremos a continuación) para ver el valor devuelto. Pero no es un valor porcentual como acostumbramos ver, sino un número, producto de algún cálculo interno.</p>
<p>No es fácil (quizá imposible) darle una importancia determinada a la relevancia de cada registro, porque no se sabe bien cuál es el máximo (el mínimo es 0) y además varía mucho según el tipo de búsqueda realizada. </p>
<p>Así que recomiendo que se considere como &#8220;100%&#8221; a la máxima relevancia obtenida, y en función de eso se calcule el porcentaje de los demás registros.</p>
<p>Esto requiere dos consultas diferentes:</p>
<p>En la primera se crea una variable de usuario con el valor de máxima relevancia obtenido:</p>
<p>mysql> SELECT MAX( MATCH(titulo) AGAINST(&#8216;amanecer&#8217; IN BOOLEAN MODE) ) INTO @maximo;</p>
<p>Ahora resta hacer la búsqueda como se aprendió, pero incluyendo el porcentaje correspondiente a la relevancia, mediante la fórmula: relevancia * (100/maxima_relev):</p>
<p>mysql> SELECT title, MATCH(title) AGAINST(&#8216;amanecer&#8217; IN BOOLEAN MODE)*(100/@maximo)<br />
     > FROM textos WHERE MATCH(title) AGAINST(&#8216;amanecer&#8217; IN BOOLEAN MODE);</p>
<p>Obsérvese que se usa la misma expresión MATCH &#8230; AGAINST en la lista del SELECT y en el WHERE.</p>
<p>Si se omitiera en el WHERE se traerían todos los registros, inclusive los que tienen relevancia 0. La razón de que funcione en el WHERE sin compararla con ningún valor es porque el 0 se considera falso, y cualquier valor no cero se considera verdadero.</p>
<p>He tratado de responder rápido para contestar razonablemente a todos, se me ocurre la idea de hacer un artículo más extenso sobre este tema, pero posiblemente sea luego de mejorar el artículo sobre Rutinas Almacenadas.</p>
<p>Espero comentarios.</p>
<img src="http://www.christianmania.com/?ak_action=api_record_view&id=546&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://www.christianmania.com/2011/10/busquedas-avanzadas-con-mysql-usando-fulltext-match-against/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>StopWords de mysql match against</title>
		<link>http://www.christianmania.com/2011/10/stopwords-de-mysql-match-against/</link>
		<comments>http://www.christianmania.com/2011/10/stopwords-de-mysql-match-against/#comments</comments>
		<pubDate>Mon, 03 Oct 2011 23:07:30 +0000</pubDate>
		<dc:creator>ChristianMania</dc:creator>
				<category><![CDATA[Base de Datos]]></category>
		<category><![CDATA[against]]></category>
		<category><![CDATA[match]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[stopwords]]></category>

		<guid isPermaLink="false">http://www.christianmania.com/?p=549</guid>
		<description><![CDATA[un una unas unos uno sobre todo también tras otro algún alguno alguna algunos algunas ser es soy eres somos sois estoy esta estamos estais estan como en para atras porque por qué estado estaba ante antes siendo ambos pero por poder puede puedo podemos podeis pueden fui fue fuimos fueron hacer hago hace hacemos [...]]]></description>
			<content:encoded><![CDATA[<p>un<br />
una<br />
unas<br />
unos<br />
uno<br />
sobre<br />
todo<br />
también<br />
tras<br />
otro<br />
algún<br />
alguno<br />
alguna<br />
algunos<br />
algunas<br />
ser<br />
es<br />
soy<br />
eres<br />
somos<br />
sois<br />
estoy<br />
esta<br />
estamos<br />
estais<br />
estan<br />
como<br />
en<br />
para<br />
atras<br />
porque<br />
por qué<br />
estado<br />
estaba<br />
ante<br />
antes<br />
siendo<br />
ambos<br />
pero<br />
por<br />
poder<br />
puede<br />
puedo<br />
podemos<br />
podeis<br />
pueden<br />
fui<br />
fue<br />
fuimos<br />
fueron<br />
hacer<br />
hago<br />
hace<br />
hacemos<br />
haceis<br />
hacen<br />
cada<br />
fin<br />
incluso<br />
primero	desde<br />
conseguir<br />
consigo<br />
consigue<br />
consigues<br />
conseguimos<br />
consiguen<br />
ir<br />
voy<br />
va<br />
vamos<br />
vais<br />
van<br />
vaya<br />
gueno<br />
ha<br />
tener<br />
tengo<br />
tiene<br />
tenemos<br />
teneis<br />
tienen<br />
el<br />
la<br />
lo<br />
las<br />
los<br />
su<br />
aqui<br />
mio<br />
tuyo<br />
ellos<br />
ellas<br />
nos<br />
nosotros<br />
vosotros<br />
vosotras<br />
si<br />
dentro<br />
solo<br />
solamente<br />
saber<br />
sabes<br />
sabe<br />
sabemos<br />
sabeis<br />
saben<br />
ultimo<br />
largo<br />
bastante<br />
haces<br />
muchos<br />
aquellos<br />
aquellas<br />
sus<br />
entonces<br />
tiempo<br />
verdad<br />
verdadero<br />
verdadera<br />
cierto<br />
ciertos<br />
cierta<br />
ciertas<br />
intentar<br />
intento<br />
intenta<br />
intentas<br />
intentamos<br />
intentais<br />
intentan<br />
dos<br />
bajo<br />
arriba<br />
encima<br />
usar<br />
uso<br />
usas<br />
usa<br />
usamos<br />
usais<br />
usan<br />
emplear<br />
empleo<br />
empleas<br />
emplean<br />
ampleamos<br />
empleais<br />
valor<br />
muy<br />
era<br />
eras<br />
eramos<br />
eran<br />
modo<br />
bien<br />
cual<br />
cuando<br />
donde<br />
mientras<br />
quien<br />
con<br />
entre<br />
sin<br />
trabajo<br />
trabajar<br />
trabajas<br />
trabaja<br />
trabajamos<br />
trabajais<br />
trabajan<br />
podria<br />
podrias<br />
podriamos<br />
podrian<br />
podriais<br />
yo<br />
aquel</p>
<img src="http://www.christianmania.com/?ak_action=api_record_view&id=549&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://www.christianmania.com/2011/10/stopwords-de-mysql-match-against/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Alt vs título para el SEO</title>
		<link>http://www.christianmania.com/2011/08/alt-vs-titulo-para-el-seo/</link>
		<comments>http://www.christianmania.com/2011/08/alt-vs-titulo-para-el-seo/#comments</comments>
		<pubDate>Thu, 04 Aug 2011 14:38:19 +0000</pubDate>
		<dc:creator>ChristianMania</dc:creator>
				<category><![CDATA[SEO]]></category>
		<category><![CDATA[alt]]></category>
		<category><![CDATA[alt vs title]]></category>
		<category><![CDATA[seo]]></category>
		<category><![CDATA[title]]></category>

		<guid isPermaLink="false">http://www.christianmania.com/?p=527</guid>
		<description><![CDATA[Siempre estoy confundido sobre si el uso de atributos < Alt > o etiqueta < title > al añadir imágenes a mi contenido. Hice una investigación sobre este tema y esto es lo que se me ocurren al final. Efectos de atribuir < Alt > para SEO El objetivo principal del uso de es hacer [...]]]></description>
			<content:encoded><![CDATA[<p>Siempre estoy confundido sobre si el uso de atributos < Alt > o etiqueta < title > al añadir imágenes a mi contenido. Hice una investigación sobre este tema y esto es lo que se me ocurren al final.</p>
<h3>Efectos de atribuir < Alt > para SEO</h3>
<p>El objetivo principal del uso de <Alt> es hacer que su contenido sea accesible. Que mejoren la accesibilidad de su sitio web, como si alguien está usando un lector de pantalla, no se puede cargar la imagen por alguna razón, el navegador mostrará el texto alternativo dándoles una mejor experiencia de usuario. El más accesible un sitio web es la más probable es que se ubicará en el SERP. Utilizando el atributo < Alt > de imágenes ayudará a los motores de búsqueda para entender lo que sus imágenes son todas de rango y sus imágenes en las páginas de resultados de búsqueda de imágenes, tales como Google la imagen y se mezcla las páginas de resultados. Se dice que Google incluso el uso de los atributos alt como descripciones de las imágenes en Google Image por lo que este es el éxito de un atributo < Alt > prueba es al final de Google.</p>
<p>Usando la etiqueta < Alt > es simple. Normalmente, cuando se agrega la imagen de arriba en su contenido, el código HTML se parece a esto:</p>
<p>< Img src = "http://www.futuresearches.com/wp-content/uploads/ SEO . jpg " ></p>
<p>Esto no es suficiente decirle a SE es lo que la imagen se trata. Es una mejor práctica para aplicar la etiqueta <Alt> como:</p>
<p>< Img src = "http://www.futuresearches.com/wp-content/uploads/SEO.jpg" alt = "estrategia de SEO, el análisis del sitio, la Recomendación SEO, Link Building , Presentación Directorio " ></p>
<p>Recuerde que no debe hacer ningún relleno de palabras clave y no utilice más de 70 a 10 palabras clave en las etiquetas alt de lo contrario, puede ser percibido como spam.</p>
<h3>Efectos de las etiquetas < title > para SEO</h3>
<p>Etiquetas de título proporciona información adicional acerca de los vínculos, diciendo a los usuarios donde se vinculará si hacen clic en el enlace con una pantalla de descripción. También son útiles en algunos navegadores que no admite el atributo < Alt >. Los motores de búsqueda no da el peso en las etiquetas de título, en términos de ranking, pero todos sabemos motores de búsqueda clasifican sitios web fáciles de usar para el uso de etiquetas < title > son útiles para su SEO en la final.</p>
<p>El uso de etiquetas título es casi lo mismo como ejemplo alt arriba, solo que en lugar de insertar título alt:</p>
<p>< img src="http://www.futuresearches.com/wp-content/uploads/SEO.jpg"title="SEO Strategy, sitio Analysis, SEO Recommendation, Enlace Building, Directorio Submission" ></p>
<p>Finalmente me decidí a usar los dos sólo para asegurarme de que mi contenido es accesible con todos los navegadores y optimizado.</p>
<p>¿Cuál es su opinión sobre < Alt > atributo y etiqueta < title >? ¿Crees que alguno de ellos tiene más sentido en términos de SEO?</p>
<img src="http://www.christianmania.com/?ak_action=api_record_view&id=527&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://www.christianmania.com/2011/08/alt-vs-titulo-para-el-seo/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Aprender Python en 10 minutos</title>
		<link>http://www.christianmania.com/2011/07/aprender-python-en-10-minutos/</link>
		<comments>http://www.christianmania.com/2011/07/aprender-python-en-10-minutos/#comments</comments>
		<pubDate>Sun, 10 Jul 2011 19:16:54 +0000</pubDate>
		<dc:creator>ChristianMania</dc:creator>
				<category><![CDATA[Python]]></category>
		<category><![CDATA[python]]></category>

		<guid isPermaLink="false">http://www.christianmania.com/?p=517</guid>
		<description><![CDATA[Por lo tanto, que quieren aprender el lenguaje de programación Python, pero no puede encontrar un manual conciso y tiene varias opciones. En este tutorial se trata de enseñar a Python en 10 minutos. Probablemente no sea tanto un tutorial, ya que es un cruce entre un tutorial y una hoja introductoria, por lo que [...]]]></description>
			<content:encoded><![CDATA[<p>Por lo tanto, que quieren aprender el lenguaje de programación Python, pero no puede encontrar un manual conciso y tiene varias opciones. En este tutorial se trata de enseñar a Python en 10 minutos. Probablemente no sea tanto un tutorial, ya que es un cruce entre un tutorial y una hoja introductoria, por lo que sólo le mostrará algunos conceptos básicos para comenzar. Obviamente, si realmente quieres aprender un idioma que usted necesita para programar en ella por un tiempo. Voy a suponer que usted ya está familiarizado con la programación y, por lo tanto, pase la mayor parte de las cosas no específicos del lenguaje. Las palabras claves importantes se destaca de esta manera puede detectarlos. También, preste atención , ya que, debido a la brevedad de este tutorial, algunas cosas se introducirá directamente en el código y sólo comentó brevemente.</p>
<h3>Propiedades</h3>
<p>Python es fuertemente tipado (es decir, los tipos se aplican), de forma dinámica, de tipo implícito (es decir, que no tienen que declarar las variables), mayúsculas y minúsculas (es decir, var y VAR son dos variables diferentes) y orientada a objetos (es decir, todo es un objeto) .</p>
<h3>Obtener ayuda</h3>
<p>Ayuda en Python siempre tiene la razón disponibles en el intérprete. Si quieres saber cómo funciona un objeto, todo lo que tienes que hacer es pedir ayuda (<object>)! También son útiles dir (), que muestra todos los métodos del objeto, y <object> __doc__, lo que demuestra su cadena de documentación.:</p>
<p>>>> ayuda ( 5 )<br />
Ayuda  en int  objeto :<br />
(etc etc)</p>
<p>>>> dir ( 5 )<br />
[ '__abs__' , '__add__' , ...]</p>
<p>>>> abs . __doc__<br />
&#8221; abs (numero) &#8211; > Número</p>
<p>Devuelve el valor absoluto del argumento.</p>
<h3>Sintaxis</h3>
<p>Python tiene ningún carácter obligatorio la declaración de terminación y los bloques se especifica la sangría . Guión para comenzar un bloque, dedent a un extremo. Las declaraciones que esperar un nivel de sangría en la final dos puntos (:). Comentarios comienzan con (#) el signo de número y de una sola línea, multilínea cadenas se utilizan para comentarios multilínea . Se asignan valores (de hecho, los objetos son vinculado a los nombres) con el signo (&#8220;=&#8221;), _equals_ y pruebas de la igualdad se realiza mediante dos signos _equals_ (&#8220;==&#8221;). Puede incrementar / disminuir los valores utilizando los operadores + = y -= operadores, respectivamente, por la cantidad de la derecha. Esto funciona en muchos tipos de datos, las cadenas incluidas. También puede utilizar las múltiples variables en una línea. Por ejemplo:</p>
<p>>>> MiVar =  3<br />
>>> MiVar + =  2<br />
>>> Myvar<br />
5<br />
>>> MiVar &#8211; =  1<br />
>>> Myvar<br />
4<br />
&#8220;&#8221; &#8220;Este es un comentario de varias líneas.<br />
Las siguientes líneas concatenar las dos cadenas. &#8220;&#8221; &#8221;<br />
>>> MiCadena =  &#8220;Hola&#8221;<br />
>>> MyString + =  &#8220;mundo&#8221;.<br />
>>> print  miCadena<br />
¡Hola, mundo.<br />
# Esto intercambia las variables en una línea (!).<br />
# No viola inflexible porque los valores no son<br />
# Realidad que se le asigne, sino que son objetos nuevos están obligados a<br />
# Los nombres antiguos.<br />
>>> Myvar, Myst anillo =  anillo de Myst, myvar</p>
<h3>Los tipos de datos</h3>
<p>Las estructuras de datos disponibles en python son listas, tuplas y diccionarios . Los juegos están disponibles en los juegos de la biblioteca (pero están incorporados en Python 2.5 y posteriores). Las listas son como arrays de una dimensión (pero también puede tener una lista de otras listas), los diccionarios son matrices asociativas (también conocido como tablas hash) y las tuplas son inmutables arrays de una dimensión (Python &#8220;arrays&#8221; puede ser de cualquier tipo, por lo que puede mezcla de números enteros, por ejemplo, cadenas, etc en las listas / diccionarios / tuplas). El índice del primer elemento de todos los tipos de matriz es 0. Los números negativos cuentan desde el final hacia el principio, -1 es el último elemento. Las variables pueden apuntar a las funciones. El uso es como sigue:</p>
<p>>>> Muestra =  [ 1 , [ "otro" , "lista" ], ( &#8220;a&#8221; , &#8220;tupla&#8221; )]<br />
>>> Mi lista =  [ "elemento de la lista 1" , 2 , 3,14 ]<br />
>>> Mi lista [ 0 ] =  &#8220;tarea de la Lista 1 de nuevo&#8221;<br />
>>> Mi lista [ - 1 ] =  3,14<br />
>>> Mydict =  { &#8220;clave 1&#8243; : &#8220;Valor 1&#8243; , 2 : 3 , &#8220;pi&#8221; : 3,14 }<br />
>>> Mydict [ "pi" ] =  3,15<br />
>>> Mytuple =  ( 1 , 2 , 3 )<br />
>>> Mifuncion =  len<br />
>>> print  MyFunction (milista)<br />
3</p>
<p>Se puede acceder a rangos de serie con dos puntos (:). Dejando vacío el índice de inicio asume el primer punto, dejando el índice final asume el último elemento. Índices negativos cuentan desde el último punto al revés (por lo tanto -1 es el último elemento), así:</p>
<p>>>> Mi lista =  [ "elemento de la lista 1" , 2 , 3,14 ]<br />
>>> print  milista [:]<br />
[ "Lista de punto 1 ' , 2 , 3.1400000000000001 ]<br />
>>> print  milista [ 0 : 2 ]<br />
[ "Lista de punto 1 ' , 2 ]<br />
>>> print  milista [ - 3 : - 1 ]<br />
[ "Lista de punto 1 ' , 2 ]<br />
>>> print  milista [ 1 :]<br />
[ 2 , 3,14 ]</p>
<h3>Cadenas</h3>
<p>Sus cuerdas pueden utilizar comillas simples o dobles , y usted puede tener las comillas de un tipo dentro de una cadena que utiliza el otro tipo (es decir, &#8220;Me dijo &#8216;hola&#8217;.&#8221; es válido). Cadenas de varias líneas se escriben _triple doble (o individual) quotes_ (&#8220;&#8221;"). Python soporta Unicode de la caja, utilizando la sintaxis u &#8220;Esta es una cadena unicode&#8221;. Para completar una cadena con los valores , se utiliza el% ( . módulo) y el operador de una tupla Cada% s se reemplaza con un elemento de la tupla, de izquierda a derecha, y también se puede usar sustituciones con diccionario, de este modo:</p>
<p>>>> print  &#8220;Nombre: % s \<br />
Número: % s \<br />
Cadena: % s &#8220;% (myclass.name, 3, 3 *&#8221; &#8211; &#8220;)<br />
Nombre: Poromenos<br />
Número: 3<br />
Cadena: &#8211; - -</p>
<p>strString =  &#8220;&#8221; &#8220;Este es<br />
una multilínea<br />
cadena. &#8220;&#8221; &#8221;</p>
<p># AVISO: Tenga cuidado con la s final en &#8220;% (clave) s&#8221;.<br />
>>> print  &#8220;Este% (verbo)% (sustantivo) s.&#8221;  %  { &#8220;nombre&#8221; : &#8220;test&#8221; , &#8220;verbo&#8221; : &#8220;es&#8221; }<br />
Esta es  una prueba.</p>
<h3>Declaraciones de control de flujo</h3>
<p>Estados de flujo de control , si , para , y al mismo tiempo . No hay seleccionar , en cambio, si el uso. Se utiliza para el fin de enumerar los miembros de una lista. Para obtener una lista de números, el uso de rango (<número>) . La sintaxis de estas declaraciones es así:</p>
<p>rangelist =  rango ( 10 )<br />
>>> print  rangelist<br />
[ 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 ]<br />
para  el número en  una lista estricta:<br />
    # Comprobar si el número es uno de los<br />
    # El número de la tupla.<br />
    si  el número de  ( 3 , 4 , 7 , 9 ):<br />
        # &#8220;Break&#8221; termina un puesto que sin<br />
        # Ejecutar el &#8220;otro&#8221; cláusula.<br />
        romper<br />
    más :<br />
        # &#8220;Continuar&#8221;, comienza la siguiente iteración<br />
        # Del bucle. Es bastante inútil aquí,<br />
        # Ya que es la última declaración del bucle.<br />
        continuar<br />
más :<br />
    # El &#8220;otro&#8221; cláusula es opcional y se<br />
    # Ejecuta sólo si el bucle no &#8220;romper&#8221;.<br />
    paso  # No hacer nada</p>
<p>si  rangelist [ 1 ] = =  2 :<br />
    print  &#8220;El segundo elemento (las listas se basa en 0) es de 2&#8243;<br />
elif  rango de la lista [ 1 ] = =  3 :<br />
    print  &#8220;El segundo elemento (las listas se basa en 0) es de 3&#8243;<br />
más :<br />
    print  &#8220;No sé&#8221;</p>
<p>mientras que  la lista rango [ 1 ] = =  1 :<br />
    pasar</p>
<h3>Funciones</h3>
<p>Las funciones se declaran con la &#8220;definición&#8221; de palabras clave. argumentos opcionales se establecen en la declaración de la función después de los argumentos obligatorio que se le asigne un valor predeterminado. De argumentos con nombre , el nombre del argumento se le asigna un valor. Las funciones pueden devolver una tupla (y el uso de desempaquetar tupla que pueden regresar múltiples valores ). funciones lambda son ad hoc las funciones que se componen de una sola sentencia. Los parámetros se pasan por referencia , pero los tipos inmutables (tuplas, enteros, cadenas, etc) * no se puede cambiar *. Esto es porque sólo la ubicación de memoria del elemento se pasa , y la unión de otro objeto a una variable de descarta la antigua , por lo que los tipos inmutables sustitución. Por ejemplo:</p>
<p># Igual que el def f (x): return x + 1<br />
functionvar =  Lambda  x: x +  1<br />
>>> print  functionvar ( 1 )<br />
2</p>
<p># Un_int y una_cadena son opcionales, que tienen valores por defecto<br />
# Si no se pasa (2 y &#8220;Una cadena por defecto&#8221;, respectivamente).<br />
def  passing_example (una_lista, un_int = 2 , una_cadena = &#8220;Una cadena por defecto&#8221; ):<br />
    a_list.append ( &#8220;Un nuevo elemento&#8221; )<br />
    un_int =  4<br />
    volver  una_lista, un_int, una_cadena</p>
<p>>>> My_list =  [ 1 , 2 , 3 ]<br />
>>> My_int =  10<br />
>>> print  passing_example (my_list, my_int)<br />
([ 1 , 2 , 3 , 'Un nuevo elemento' ], 4 , &#8220;Una cadena por defecto&#8221; )<br />
>>> My_list<br />
[ 1 , 2 , 3 , 'Un nuevo elemento' ]<br />
>>> My_int<br />
10</p>
<h3>Clases</h3>
<p>Python admite una forma limitada de herencia múltiple en las clases. Las variables y métodos privados pueden ser declarados (por convención, esta no es impuesta por el lenguaje) mediante la adición de al menos dos caracteres de subrayado y en la mayoría de una final de un (por ejemplo, &#8220;__spam&#8221;). También se puede unir nombres arbitrarios a instancias de clase. Un ejemplo es el siguiente:</p>
<p>clase  MyClass ( objeto ):<br />
    común =  10<br />
    def  __init__ ( auto ):<br />
        auto . myvariable =  3<br />
    def  myFunction ( sí , arg1, arg2):<br />
        retorno  auto . myvariable</p>
<p>    # Esta es la instanciación de la clase<br />
>>> Classinstance =  MiClase ()<br />
>>> Classinstance.myfunction ( 1 , 2 )<br />
3<br />
# Esta variable es compartida por todas las clases.<br />
>>> Classinstance2 =  MiClase ()<br />
>>> Classinstance.common<br />
10<br />
>>> Classinstance2.common<br />
10<br />
# Tenga en cuenta cómo se utiliza el nombre de la clase<br />
# En lugar de la instancia.<br />
>>> MyClass.common =  30<br />
>>> Classinstance.common<br />
30<br />
>>> Classinstance2.common<br />
30<br />
# Esto no va a actualizar la variable de la clase,<br />
# En lugar de ello se unirá un nuevo objeto a la antigua<br />
# Nombre de la variable.<br />
>>> Classinstance.common =  10<br />
>>> Classinstance.common<br />
10<br />
>>> Classinstance2.common<br />
30<br />
>>> MyClass.common =  50<br />
# Esto no ha cambiado, porque &#8220;común&#8221; es<br />
# Ahora una variable de instancia.<br />
>>> Classinstance.common<br />
10<br />
>>> Classinstance2.common<br />
50</p>
<p># Esta clase hereda de MyClass. En el ejemplo de<br />
# Clase por encima de hereda de &#8220;objeto&#8221;, lo que hace<br />
# Es lo que se llama un &#8220;nuevo estilo de clase&#8221;.<br />
# Herencia múltiple se declara como:<br />
# Clase OtherClass (MyClass1, MyClass2, MyClassN)<br />
clase  OtherClass (MyClass):<br />
    # El &#8220;sí mismo&#8221; argumento se pasa de forma automática<br />
    # Y se refiere a la instancia de clase, por lo que se puede establecer<br />
    # Variables de instancia como el anterior, pero desde el interior de la clase.<br />
    def  __init__ ( sí , arg1):<br />
        auto . myvariable =  3<br />
        imprimir  arg1</p>
<p>>>> Classinstance =  OtherClass ( &#8220;hola&#8221; )<br />
¡Hola<br />
>>> Classinstance.myfunction ( 1 , 2 )<br />
3<br />
# Esta clase no tiene un miembro de la prueba., Pero<br />
# Podemos añadir una a la instancia de todos modos. Nota<br />
# Que esto sólo será un miembro de classinstance.<br />
>>> Classinstance.test =  10<br />
>>> Classinstance.test<br />
10</p>
<h3>Excepciones</h3>
<p>Excepciones en Python se manejan con try-excepto [exceptionname] bloques:</p>
<p>def  some_function ():<br />
    tratar :<br />
        # La división por cero genera una excepción<br />
        10  /  0<br />
    excepto  ZeroDivisionError:<br />
        imprimir  &#8220;Uy, no válido.&#8221;<br />
    más :<br />
        Excepción # no ocurrió, estamos bien.<br />
        pasar<br />
    por último :<br />
        # Esto es ejecutado después de que el bloque de código que se ejecuta<br />
        # Y todas las excepciones se han manipulado, incluso<br />
        # Si una nueva excepción se eleva durante la manipulación.<br />
        print  &#8220;Ya terminamos con eso.&#8221;</p>
<p>>>> Some_function ()<br />
Vaya, no válido.<br />
Ya hemos terminado con eso.</p>
<h3>Importador</h3>
<p>Bibliotecas externas se utilizan con la importación [libname] palabra clave. También se puede utilizar a partir de [libname] la importación [funcname] para funciones individuales. Aquí está un ejemplo:</p>
<p>importación  al azar<br />
de  tiempo de la importación  del reloj</p>
<p>randomInt =  random.randint ( 1 , 100 )<br />
>>> print  randomInt<br />
64</p>
<h3>Archivo I / O</h3>
<p>Python tiene una amplia gama de bibliotecas construido adentro Como ejemplo, aquí es cómo serializar (la conversión de las estructuras de datos en cadenas utilizando la salmuera de la biblioteca) con el archivo de E / S se utiliza:</p>
<p>importación  salmuera<br />
milista =  [ "Esto" , "es:" , 4 , 13 327 ]<br />
# Abra el archivo C: \ \ binary.dat para la escritura. La letra r antes de la<br />
Cadena # nombre de archivo se utiliza para prevenir barra invertida de escape.<br />
miarchivo =  abierto (r &#8220;C: \ \ binary.dat&#8221; , &#8220;w&#8221; )<br />
pickle.dump (milista, miarchivo)<br />
myfile.close ()</p>
<p>miarchivo =  abierto (r &#8220;C: \ \ text.txt&#8221; , &#8220;w&#8221; )<br />
myfile.write ( &#8220;Esto es una cadena de ejemplo&#8221; )<br />
myfile.close ()</p>
<p>miarchivo =  abierto (r &#8220;C: \ \ text.txt&#8221; )<br />
>>> print  myfile.read ()<br />
&#8220;Esto es una cadena de ejemplo&#8221;<br />
myfile.close ()</p>
<p># Abra el archivo para su lectura.<br />
miarchivo =  abierto (r &#8220;C: \ \ binary.dat&#8221; )<br />
loadedlist =  pickle.load (miarchivo)<br />
myfile.close ()<br />
>>> print  loadedlist<br />
[ 'Este' , 'es' , 4 , 13327 ]</p>
<h3>Misceláneo</h3>
<p>Las condiciones pueden ser encadenados . 1 <a <3 cheques que se encuentran a menos de 3 y mayor que 1.<br />
Usted puede utilizar del que eliminar variables o elementos de las matrices .<br />
Las listas por comprensión constituyen una forma eficaz para crear y manipular listas. Consisten en una expresión seguida de una de cláusula seguido por cero o más si o por las cláusulas, así:</p>
<p>>>> Lst1 =  [ 1 , 2 , 3 ]<br />
>>> Lst2 =  [ 3 , 4 , 5 ]<br />
>>> print  [x *  y para  x en  lst1 para  y en  lst2]<br />
[ 3 , 4 , 5 , 6 , 8 , 10 , 9 , 12 , 15 ]<br />
>>> print  [x para  x en  lst1 si  4  > x> 1 ]<br />
[ 2 , 3 ]<br />
# Comprueba si un elemento tiene una propiedad específica.<br />
# &#8220;Cualquier&#8221; devuelve true si algún elemento de la lista es cierto.<br />
>>> alguna ([i %  3  para  i en  [ 3 , 3 , 4 , 4 , 3 ]])<br />
Verdadero<br />
# Esto se debe a un 4% 3 = 1, y 1 es cierto, por lo que cualquier ()<br />
# Devuelve True.</p>
<p># Comprobar cuántos elementos tienen esta propiedad.<br />
>>> suma ( una  para  i en  [ 3 , 3 , 4 , 4 , 3 ] , si  i = =  4 )<br />
2<br />
>>> del  lst1 [ 0 ]<br />
>>> print  lst1<br />
[ 2 , 3 ]<br />
>>> del  lst1</p>
<p>Las variables globales se declaran fuera de las funciones y se pueden leer sin ningún tipo de declaraciones especiales, pero si quieres escribir en ellos se debe declarar en el comienzo de la función con el &#8220;global&#8221; de palabras clave, de lo contrario Python se unirá a ese objeto a un nuevo variable local (tenga cuidado de que se trata de una pequeña captura que se puede obtener si no lo saben). Por ejemplo:</p>
<p>número =  5</p>
<p>def  myfunc ():<br />
    # Esto imprimirá 5.<br />
    imprimir  el número</p>
<p>def  anotherfunc ():<br />
    # Esto plantea una excepción ya que la variable no ha<br />
    # Estado atado antes de imprimir. Python sabe que una<br />
    # Objeto estará obligado a ella más adelante y crea un nuevo local,<br />
    # Objeto en lugar de acceder a un mundial.<br />
    imprimir  el número<br />
    número =  3</p>
<p>def  yetanotherfunc ():<br />
    mundial  número<br />
    # Esto va a cambiar la forma correcta global.<br />
    número =  3</p>
<h3>Epílogo</h3>
<p>Este tutorial no pretende ser una lista exhaustiva de todos (o un subconjunto) de Python. Python tiene una gran variedad de bibliotecas y la funcionalidad mucho, mucho más que usted tendrá que descubrir a través de otros medios, como el excelente libro de Inmersión en Python . Espero haber hecho su transición más fácil en Python. Por favor, dejar comentarios, si usted cree que hay algo que puede ser mejorado o añadido o si hay algo más que le gustaría ver (las clases, manejo de errores, cualquier cosa).</p>
<img src="http://www.christianmania.com/?ak_action=api_record_view&id=517&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://www.christianmania.com/2011/07/aprender-python-en-10-minutos/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Mejore su jQuery &#8211; 25 consejos excelentes</title>
		<link>http://www.christianmania.com/2011/04/mejore-su-jquery-25-consejos-excelentes/</link>
		<comments>http://www.christianmania.com/2011/04/mejore-su-jquery-25-consejos-excelentes/#comments</comments>
		<pubDate>Thu, 14 Apr 2011 14:41:07 +0000</pubDate>
		<dc:creator>ChristianMania</dc:creator>
				<category><![CDATA[javascript]]></category>
		<category><![CDATA[JQuery]]></category>
		<category><![CDATA[jquery]]></category>

		<guid isPermaLink="false">http://www.christianmania.com/?p=502</guid>
		<description><![CDATA[Introducción jQuery es impresionante. He estado usando durante un año y aunque me impresionó, para empezar estoy gusto más y más mientras más lo use y cuanto más se enteren de funcionamiento interno. No soy un experto jQuery. No pretendo ser, por lo que si hay errores en este artículo a continuación, no dude en [...]]]></description>
			<content:encoded><![CDATA[<h3>Introducción </h3>
<p>jQuery es impresionante. He estado usando durante un año y aunque me impresionó, para empezar estoy gusto más y más mientras más lo use y cuanto más se enteren de funcionamiento interno. </p>
<p>No soy un experto jQuery. No pretendo ser, por lo que si hay errores en este artículo a continuación, no dude en corregir o hacer sugerencias de mejora. </p>
<p>Me llamo a mí mismo un &#8220;intermedio&#8221; de usuario jQuery y pensé que algunos otros por ahí podría beneficiarse de todos los pequeños consejos trucos y técnicas que he aprendido a lo largo del año pasado. El artículo también terminó siendo mucho más tiempo de lo que pensé que iba a ser así que voy a empezar con una tabla de contenido para que pueda saltar a los bits que está interesado pulg </p>
<p>Tabla de contenidos </p>
<p>1. Cargue el marco de Google Code<br />
2. Use una hoja de trucos<br />
3. Combine todos los scripts y los minify<br />
4. Utilice la consola de Firebug es excelente registro de instalaciones<br />
5. Mantener las operaciones de selección para un mínimo de almacenamiento en caché<br />
6. Mantenga la manipulación DOM al mínimo<br />
7. Envolver todo en un solo elemento al hacer cualquier tipo de inserción DOM<br />
8. Utilizan números de identificación en lugar de las clases siempre que sea posible<br />
9. Dé a sus selectores de un contexto<br />
10. Usar correctamente el encadenamiento<br />
11. Aprenda a usar correctamente animados<br />
12. Más información sobre la delegación de eventos<br />
13. clases de uso para almacenar el estado<br />
14. Mejor aún, en la utilización de datos de jQuery () para almacenar el estado<br />
15. Escribe tu propia selectores<br />
16. Racionalizar el código HTML y modificar una vez cargada la página ha<br />
17. Perezoso contenido de la carga de las prestaciones de velocidad y SEO<br />
18. jQuery uso de funciones de utilidad<br />
19. Utilice noconflict cambiar el nombre del objeto jQuery utilizando otros marcos<br />
20. Cómo saber cuando las imágenes se hayan cargado<br />
21. Utilice siempre la versión más reciente<br />
22. Cómo comprobar si existe un elemento<br />
23. Agregue una clase JS a su atributo HTML<br />
24. Volver &#8216;falsa&#8217; para evitar el comportamiento por defecto<br />
25. Atajo para el evento ready</p>
<h3>1. Cargue el marco de Google Code </h3>
<p>Google ha sido anfitrión de varias bibliotecas de JavaScript desde hace un tiempo en Google Code, y hay varias ventajas para la carga de los mismos en lugar de desde el servidor. Se ahorra ancho de banda, que va a la carga muy rápidamente de CDN de Google y lo más importante es que ya estará en caché si el usuario ha visitado un sitio que ofrece desde Google Code. </p>
<p>Esto tiene mucho sentido. ¿Cuántos sitios por ahí están sirviendo copias idénticas de jQuery que no están recibiendo en caché? Es fácil de hacer demasiado &#8230; </p>
<p> < script src="http://www.google.com/jsapi"> </ script><br />
 < script type="text/javascript"> </p>
<p>     / / Cargar jQuery<br />
     google.load (&#8220;jquery&#8221;, &#8220;1.2.6&#8243;);</p>
<p>     google.setOnLoadCallback (function () {<br />
         / / El código va aquí.<br />
     });</p>
<p> </ Script></p>
<p>O, usted puede incluir una referencia directa de esta &#8230; </p>
<p> < script src="http://ajax.googleapis.com/ajax/libs/jquery/1.2.6/jquery.min.js"  type="text/javascript"> </ script></p>
<p>Las instrucciones completas aquí </p>
<h3>2. Use una hoja de trucos </h3>
<p>No es sólo una punta de jQuery, hay algunos grandes hojas de trucos que hay para la mayoría de idiomas. Es muy útil tener todas las funciones en una hoja A4, puede imprimir para consulta y afortunadamente estos muchachos han producido un par de los agradables .. </p>
<p>http://www.gscottolson.com/weblog/2008/01/11/jquery-cheat-sheet/</p>
<p>http://colorcharge.com/jquery/</p>
<h3>3. Combine todos los scripts y los minify </h3>
<p>OK, un general punta JavaScript aquí. Sin embargo, cualquier gran proyecto que utiliza un montón de jQuery probablemente usa un montón de plugins (este sitio utiliza relajación, localScroll, mesa de luz y de la precarga) por lo que es generalmente aplicable. </p>
<p>Los navegadores no pueden cargar las secuencias de comandos al mismo tiempo (bueno, la mayoría no puede, sin embargo), lo que significa que si tienes varios guiones descargar uno a la vez entonces usted está realmente desacelerando la carga de la página. Así, suponiendo que el scrips se cargan en cada página entonces usted debería considerar la combinación de ellos en una larga secuencia de comandos antes de implementar. </p>
<p>Algunos de los plugins que ya se minified, pero debe tener en cuenta el empaque de sus guiones y las que no están listos. Sólo toma unos segundos. Yo soy personalmente un fan de Packer por Dean Edwards </p>
<h3>4. Utilice la consola de Firebug es excelente registro de instalaciones </h3>
<p>Si usted no ha instalado Firebug entonces usted realmente debe. Aparte de muchas otras funciones útiles, tales como lo que le permite inspeccionar el tráfico HTTP y encontrar problemas con el CSS tiene un excelente registro de comandos que le permiten fácilmente depurar sus scripts. </p>
<p>He aquí una explicación completa de todos los de sus características </p>
<p>Mis características favoritas son &#8220;console.info&#8221;, que puede utilizar para descargar sólo los mensajes y las variables a la pantalla sin tener que utilizar las cajas de alerta y &#8220;console.time&#8221;, que le permite configurar fácilmente un contador de tiempo para ajustar un montón de código y ver cuánto tiempo tarda. Todos son muy fáciles de utilizar también &#8230; </p>
<p> console.time (&#8216;crear una lista&#8217;);</p>
<p> for (i = 0; i <1000; i + +) {<br />
     myList var = $ ('myList.');<br />
     myList.append ('Esto es elemento de la lista "+ i);<br />
 }</p>
<p> console.timeEnd ('crear una lista');</p>
<p>En este caso he escrito deliberadamente un código muy ineficiente! En las puntas de los próximos te mostraré cómo se puede utilizar el temporizador para mostrar algunas mejoras que se pueden hacer. </p>
<h3>5. Mantener las operaciones de selección para un mínimo de almacenamiento en caché </h3>
<p>selectores de jQuery son impresionantes. Ellos hacen la selección de cualquier elemento de la página muy simple, pero internamente tienen que hacer una buena cantidad de trabajo y si se vuelven locos con ellos es posible encontrar las cosas empiezan a ser bastante lento. </p>
<p>Si usted está seleccionando el elemento de tiempo mismo una y otra vez (en un bucle por ejemplo) entonces sólo se puede seleccionar una vez y lo mantenga en la memoria mientras lo manipulan a su antojo. Considere el siguiente ejemplo donde podemos añadir elementos a una lista desordenada con un lazo. </p>
<p> for (i = 0; i <1000; i + +) {<br />
     myList var = $ ('myList.');<br />
     myList.append ('Esto es elemento de la lista "+ i);<br />
 }</p>
<p>Para eso se necesita 1.066 milisegundos en mi PC en Firefox 3 (imaginar cuánto tiempo se IE6!), Que es bastante lento en términos de JavaScript. Ahora visita el siguiente código donde se utiliza el selector de una sola vez. </p>
<p> myList var = $ ('myList.');</p>
<p> for (i = 0; i <1000; i + +) {<br />
     myList.append ('Esto es elemento de la lista "+ i);<br />
 }</p>
<p>Que sólo tiene 224 milisegundos, más de 4 veces más rápido, con sólo mover una línea de código. </p>
<h3>6. Mantenga la manipulación DOM al mínimo </h3>
<p>Podemos hacer que el código de la extremidad anterior aún más rápido al reducir el número de veces que se inserte en el DOM. las operaciones de inserción, DOM. append (). anteponer (). después de () y. envoltura () son relativamente costosos lotes y realizar de ellos realmente pueden retrasar las cosas. </p>
<p>Todo lo que necesitamos hacer es usar la concatenación de cadenas para crear la lista y luego usar una sola función para agregarlos a su lista desordenada como. Html () es mucho más rápido. Tomemos el ejemplo siguiente &#8230; </p>
<p> myList var = $ (&#8216;# myList&#8217;);</p>
<p> for (i = 0; i <1000; i + +) {<br />
     myList.append ('Esto es elemento de la lista "+ i);<br />
 }</p>
<p>En mi PC que tiene 216 milisegundos, poco más de un 1/5th de un segundo, pero si podemos construir los elementos de lista como una cadena de primera y utilizar el método de HTML para hacer el relleno, como este .... </p>
<p> myList var = $ ('myList.');<br />
 myListItems var ='';</p>
<p> for (i = 0; i <1000; i + +) {<br />
     myListItems + = '< li> Este es elemento de la lista &#8220;+ i +&#8221; </ li>&#8216;;<br />
 }</p>
<p> myList.html (myListItems);</p>
<p>Para eso se necesita 185 milisegundos, no mucho más rápido, pero esa es otra 31 milisegundos en el tiempo. </p>
<h3>7. Envolver todo en un solo elemento al hacer cualquier tipo de inserción DOM </h3>
<p>OK, no me pregunten por qué se trabaja (estoy seguro que un programador con más experiencia a explicar). </p>
<p>En nuestro último ejemplo se inserta 1,000 elementos de la lista en una lista desordenada con el html. () Método. Si tuviéramos los han envuelto en la etiqueta UL antes de hacer el relleno y se inserta la UL completado en otra etiqueta (un DIV), entonces estamos efectivamente sólo la inserción de una etiqueta, no 1000, que parece ser mucho más rápido. Al igual que este &#8230; </p>
<p> myList var = $ (&#8216;myList.&#8217;);<br />
 myListItems var = &#8216;< ul>;</p>
<p> for (i = 0; i <1000; i + +) {<br />
     myListItems + = '< li> Este es elemento de la lista &#8220;+ i +&#8221; </ li>&#8216;;<br />
 }</p>
<p> myListItems + = &#8216;</ ul>&#8216;;<br />
 myList.html (myListItems);</p>
<p>El momento es ahora sólo 19 milisegundos, una mejora masiva, 50 veces más rápido que nuestro primer ejemplo. </p>
<h3>8. Utilizan números de identificación en lugar de las clases siempre que sea posible </h3>
<p>jQuery hace que la selección de elementos DOM utilizando las clases tan fácil como seleccionar los elementos de identificación que solía ser, por lo que es la tentación de utilizar las clases mucho más liberal que antes. Todavía es mucho mejor para seleccionar por ID, porque aunque jQuery utiliza método nativo del navegador (getElementById) para hacer esto y no tiene que hacer nada de su propio recorrido DOM, que es mucho más rápido. ¿Cuánto más rápido? Vamos a ver. </p>
<p>Voy a usar el ejemplo anterior y adaptarlo de manera que cada LI creamos tiene una clase única agregado a él. Entonces voy a recorrer y seleccionar cada uno una vez. </p>
<p> / / Crear la lista myList var = $ (&#8216;myList.&#8217;); MyListItems var = &#8216;< ul>; for (i = 0; <i 1000, i + +) {myListItems + =' < li class = "ListItem '+ i + '"> Este es un elemento de la lista </ li>&#8216;;} myListItems + = &#8216;</ ul>&#8216;; myList.html (myListItems); / / Seleccione cada elemento una vez for (i = 0; i <1,000; i + +) {var selectedItem = $ ('. ListItem' + i);} </p>
<p>Justo cuando pensé que mi navegador había colgado, terminó, en 5066 milisegundos (más de 5 segundos). Así que he modificado el código para dar a cada elemento un identificador en lugar de una clase y luego selecciona usando el identificador. </p>
<p> / / Crear la lista<br />
 myList var = $ ('myList.');<br />
 myListItems var = '< ul>;</p>
<p> for (i = 0; i <1000; i + +) {<br />
     myListItems + = '< li id="listItem'+ i +'"> Se trata de un elemento de la lista </ ​​li>&#8216;;<br />
 }</p>
<p> myListItems + = &#8216;</ ul>&#8216;;<br />
 myList.html (myListItems);</p>
<p> / / Seleccione cada elemento una vez<br />
 for (i = 0; i <1000; i + +) {<br />
     selectedItem var = $ ('# ListItem' + i);<br />
 }</p>
<p>Esta vez sólo tuvo 61 milisegundos. Casi 100 veces más rápido. </p>
<h3>9. Dé a sus selectores de un contexto </h3>
<p>De forma predeterminada, cuando se utiliza un selector como $ (&#8216;. MyDiv&#8217;) el conjunto de la DOM se atraviesa, que dependiendo de la página podría ser costoso. </p>
<p>La función de jQuery toma un segundo parámetro al realizar una selección. </p>
<p>jQuery (expresión, el contexto) </p>
<p>Al proporcionar un contexto para el selector, que le dan un elemento para iniciar la búsqueda dentro de lo que no tiene que recorrer el conjunto de la DOM. </p>
<p>Para demostrar esto, vamos a tomar el primer bloque de código por encima de la punta. Crea una lista desordenada con 1000 puntos, cada uno con una clase individual. A continuación, recorre y selecciona cada artículo una sola vez. Usted recordará que al seleccionar por clase que tomó poco más de 5 segundos para seleccionar todos los 1.000 de ellos con este selector. </p>
<p> selectedItem var = $ (&#8216;# ListItem&#8217; + i);</p>
<p>Luego añade un contexto para que sólo ejecuta el selector dentro de la lista desordenada, así &#8230; </p>
<p> selectedItem var = $ (&#8216;# ListItem&#8217; + i, $ (&#8216;myList.&#8217;));</p>
<p>Todavía tuvo 3.818 milisegundos porque todavía terriblemente ineficiente, pero eso es más que un aumento de velocidad del 25% al ​​hacer una pequeña modificación a un selector. </p>
<h3>10. Usar correctamente el encadenamiento </h3>
<p>Una de las mejores cosas acerca de jQuery es su capacidad de método de la cadena de llamadas entre sí. Así, por ejemplo, si usted quiere cambiar la clase de un elemento. </p>
<p> $ (&#8216;MyDiv&#8217;) removeClass (&#8216;off&#8217;) addClass (&#8220;on&#8221;)..;</p>
<p>Si eres como yo, entonces probablemente se enteró de que en sus primeros 5 minutos de lectura sobre jQuery pero va más allá que eso. En primer lugar, que todavía funciona a través de saltos de línea (porque jQuery = JavaScript), lo que significa que puede escribir código limpio como este &#8230; </p>
<p> . $ (&#8216;# MyPanel&#8217;) find (&#8216;LA MESA firstCol.&#8217;) RemoveClass CSS (&#8216;fondo&#8217;: &#8216;rojo&#8217;). (&#8216;FirstCol.&#8217;). Append (&#8216;< span> Esta célula es ahora rojo </ span. > &#8216;); </p>
<p>Hacer un hábito de utilizar el encadenamiento de forma automática le ayuda a reducir el uso del selector también. </p>
<p>Pero va más allá que eso. Digamos que usted desea llevar a cabo varias funciones en un elemento, pero uno de los cambios primeras funciones el elemento de alguna manera, así &#8230; </p>
<p> . $ (&#8216;# MyTable&#8217;) encuentran CSS (&#8216;fondo&#8217;, &#8216;rojo&#8217;) (&#8216;firstColumn.&#8217;).;</p>
<p>Hemos seleccionado una tabla, perforado hacia abajo para encontrar células con una clase de &#8220;firstColumn&#8221; y coloreado en rojo. </p>
<p>Digamos que ahora desea colorear todas las celdas con una clase de &#8220;lastColumn&#8221; azul. Debido a que hemos utilizado el find () funciton que hemos filtrado a cabo todas las células que no tienen una clase de &#8220;firstColumn&#8221; por lo que necesitamos para utilizar el selector de nuevo para obtener el elemento de la tabla y no podemos seguir el encadenamiento, ¿no? jQuery Por suerte tiene un fin () que en realidad vuelve a la selección sin alteraciones previas para que pueda llevar a cabo el encadenamiento, así &#8230; </p>
<p> $ (&#8216;# MyTable&#8217;)<br />
     . Find (&#8216;. FirstColumn&#8217;)<br />
         . Css (&#8216;fondo&#8217;, &#8216;rojo&#8217;)<br />
     . End ()<br />
     . Find (&#8216;. LastColumn&#8217;)<br />
         . Css (&#8216;fondo&#8217;, &#8216;azul&#8217;);</p>
<p>También es más fácil de lo que piensa escribir su propia función de jQuery que puede encadenar. Todo lo que tienes que hacer es escribir una función que modifica un elemento y lo devuelve. </p>
<p> $. Fn.makeRed = function () {<br />
     return $ (este) CSS (&#8216;fondo&#8217;, &#8216;rojo&#8217;).;<br />
 }</p>
<p> . $ (&#8216;# MyTable&#8217;) encuentran makeRed () append (&#8216;hola&#8217;) (&#8216;firstColumn.)..;</p>
<p>¿Qué tan fácil es eso? </p>
<h3>11. Aprenda a usar correctamente animados </h3>
<p>Cuando comencé a usar jQuery Me encantó el hecho de que fuera fácil de utilizar las animaciones predefinidas como slideDown () y fadeIn () para obtener algunos efectos realmente genial increíblemente fácil. Es fácil tomar las cosas aún más, porque aunque animar jQuery () es muy fácil de usar y muy potente. De hecho, es mirar el código fuente jQuery verá que los métodos internos son accesos directos que utilizan la animación () función. </p>
<p> slideDown: function (velocidad, de devolución de llamada) {<br />
     this.animate retorno ({height: &#8220;espectáculo&#8221;}, la velocidad, de devolución de llamada);<br />
 },</p>
<p> fadeIn: function (velocidad, de devolución de llamada) {<br />
     this.animate retorno ({opacidad: &#8220;show&#8221;}, la velocidad, de devolución de llamada);<br />
 }</p>
<p>La animación () simplemente toma cualquier estilo CSS y sin problemas las transiciones desde un valor a otro. Así, usted puede cambiar el ancho, la altura, la opacidad, el color de fondo, arriba, izquierda, margen, color, tamaño de fuente, lo que quieras. </p>
<p>Esto es lo fácil que es animar a todos los elementos de menú crecer a 100 píxeles de alto, cuando al lanzar sobre ellos. </p>
<p> $ (&#8216;# Li myList&#8217;). Mouseover (function () {<br />
     $ (Este) animar ({&#8220;altura&#8221;: 100}, &#8220;lento&#8221;);.<br />
 });</p>
<p>A diferencia de otras funciones de jQuery, las animaciones son automáticamente en la cola, así que si desea ejecutar una segunda animación una vez que el primero ha terminado a continuación, sólo se llama al método animar dos veces, no hay devolución de llamada es necesario. </p>
<p> $ (&#8216;# MyBox&#8217;). Mouseover (function () {<br />
     $ (Este) animar ({&#8220;title&#8221;: 200}, &#8220;lento&#8221;);.<br />
     $ (Este) animar ({&#8220;altura&#8221;: 200}, &#8220;lento&#8221;);.<br />
 });</p>
<p>Si desea que la animación a suceder a continuación, al mismo tiempo sólo hay que poner los dos estilos en el params objeto de una sola llamada, así &#8230; </p>
<p> $ (&#8216;# MyBox&#8217;). Mouseover (function () {<br />
     $ (Este) animar. ({&#8220;Title&#8221;: 200, &#8220;altura&#8221;: 200}, &#8220;lento&#8221;);<br />
 });</p>
<p>Puede animar cualquier propiedad que es numérico. También puede descargar los plugins que le ayudarán a animar las propiedades que no son, como los colores y los colores de fondo </p>
<p>12. Más información sobre la delegación de eventos </p>
<p>jQuery hace que sea más fácil que nunca para añadir eventos a los elementos en el DOM discretamente, que es grande, pero la adición de muchos eventos es ineficiente. delegación de eventos le permite añadir eventos menos para lograr el mismo resultado que en muchas situaciones. La mejor manera de ilustrar esto es con un ejemplo &#8230; </p>
<p> $ (&#8216;# MyTable TD). Click (function () {<br />
     $ (Este) CSS (&#8216;fondo&#8217;, &#8216;rojo&#8217;).;<br />
 });</p>
<p>Una simple función que convierte a las celdas de una tabla de color rojo cuando se hace clic en ellos. Digamos que tienes una red con 10 columnas y 50 filas, sin embargo, que los 500 eventos consolidados. ¿No sería más limpio si pudiéramos colocar un solo evento a la mesa y cuando la tabla se hace clic en tener el trabajo de controlador de eventos a la celda que se ha hecho clic antes de volver a rojo? </p>
<p>Bueno, eso es exactamente lo que la delegación de eventos es y es fácil de implementar &#8230; </p>
<p> $ (&#8216;# MyTable&#8217;). Haga clic en (función (e) {<br />
     var clic = $ (e.target);<br />
     clicked.css (&#8216;fondo&#8217;, &#8216;rojo&#8217;);<br />
 });</p>
<p>«E» contiene información sobre el evento, incluyendo el elemento objetivo que realmente recibió el clic. Todo lo que tenemos que hacer es inspeccionar para ver la celda que se ha hecho clic en realidad. Mucho más limpio. </p>
<p>delegación de eventos tiene otra ventaja. Normalmente, cuando se enlaza un controlador a una colección de elementos que se apega a los elementos y los únicos elementos. Si se agregan nuevos elementos a la DOM, que habría tenido como contrapartida por el selector a continuación, no tienen el controlador de eventos vinculados a ellos (me estás siguiendo?), Entonces no pasará nada. </p>
<p>Cuando se utiliza la delegación de eventos que pueden añadir tantos elementos coincidentes con el DOM como quiera después de que el caso está vinculado y trabajan demasiado. </p>
<h3>13. clases de uso para almacenar el estado </h3>
<p>Esta es la forma más básica de almacenamiento de información sobre un bloque de HTML. jQuery es muy bueno para la manipulación de elementos basados ​​en sus clases, así que si usted necesita almacenar información sobre el estado de un elemento, entonces por qué no añadir una clase extra para guardarlo? </p>
<p>He aquí un ejemplo. Queremos crear un menú en expansión. Al hacer clic en el botón que queremos que el panel slideDown () si es actualmente cerradas, o slideUp () si es abierto. Empezaremos con el código HTML </p>
<p>  < div class="menuItem expanded"><br />
    < div  class="button"><br />
         haga clic en mí<br />
     </ div><br />
     < div class="panel"></p>
<ul>
             < li> Elemento de menú 1 </ li><br />
             < li> Elemento de menú 2 </ li><br />
             < li> Elemento de menú 3 </ li><br />
         </ ul><br />
     </ div><br />
 </ div></p>
<p>Muy sencillo! Acabamos de agregar una clase extra para el div contenedor que no tiene otro propósito que no sea para decirnos el estado del tema. Así que todo lo que necesitamos es un controlador de eventos click que realiza slideUp () o slideDown () en el panel correspondiente cuando se pulsa el botón. </p>
<p> (&#8220;Botón.&#8221;) $. Click (function () {</p>
<p>     . MenuItem var = $ (este) de los padres ();<br />
     panel var = menuItem.find (un grupo especial. &#8216;);</p>
<p>     if (menuItem.hasClass (&#8220;ampliado&#8221;)) {<br />
         menuItem.removeClass (&#8220;ampliado&#8221;) addClass (&#8216;colapso&#8217;).;<br />
         panel.slideUp ();<br />
     }<br />
     else if (menuItem.hasClass (&#8220;colapsado&#8221;)) {<br />
         menuItem.removeClass (&#8216;colapso&#8217;) addClass (&#8220;ampliado&#8221;).;<br />
         panel.slideDown ();<br />
     }<br />
 });</p>
<p>Eso es un ejemplo muy simple, pero usted puede agregar clases adicionales para almacenar todo tipo de información acerca de un elemento o fragmento de HTML. </p>
<p>Sin embargo, en los casos más sencilla es probablemente mejor usar el siguiente consejo. </p>
<h3>14. Mejor aún, los datos internos de uso de jQuery () para almacenar el estado </h3>
<p>No es muy bien documentada por alguna razón, pero tiene una jQuery datos internos (), que se puede utilizar para almacenar información en pares de clave y valor en contra de cualquier elemento DOM. Almacenamiento de un conjunto de datos es tan simple como esto &#8230; </p>
<p> $ (&#8216;# MyDiv&#8217;) de datos (&#8216;CurrentState&#8217;, &#8216;off&#8217;).;</p>
<p>Podemos modificar el ejemplo de la extremidad anterior. Vamos a utilizar el mismo código HTML (con el &#8220;ampliado&#8221; la clase social) y utilizar la función data () en su lugar. </p>
<p> (&#8220;Botón.&#8221;) Haga clic en $ (function () {var menuItem = $ (este) de los padres ();.. Panel var = menuItem.find () de un grupo especial. &#8220;If (menuItem.data (&#8216;colapso&#8217;)) {menuItem.data (&#8216;colapso&#8217;, false); panel.slideDown ();} else {menuItem.data (&#8216;colapso&#8217;, true); panel.slideUp ();}}); </p>
<p>Estoy seguro de que estará de acuerdo en esto es mucho más limpio. Para obtener más información acerca de los datos () y removeData (), ver esta página &#8230; </p>
<p>jQuery internos </p>
<h3>15. Escribe tu propia selectores </h3>
<p>jQuery tiene un montón de construcción en los selectores de selección de elementos de identificación, clase, etiquetas, atributos y muchos más. Pero, ¿qué hace usted cuando tiene que seleccionar los elementos basados ​​en otra cosa y jQuery no tiene un selector? </p>
<p>Bueno, una respuesta sería añadir clases a los elementos desde el principio y utilizar esos para seleccionarlos, pero resulta que no es difícil de ampliar jQuery para añadir nuevos selectores. </p>
<p>La mejor manera de demostrar es con un ejemplo. </p>
<p> $. Ampliar ($. [':'], Expr {<br />
     over100pixels: function (a) {<br />
         return $ (a) altura ()> 100.;<br />
     }<br />
 });</p>
<p> $ (&#8216;Caja:. Over100pixels&#8217;). Click (function () {<br />
     alert (&#8216;El elemento que se hace clic en más de 100 píxeles de alto);<br />
 });</p>
<p>El primer bloque de código crea un selector de costumbre que encuentra cualquier elemento que tiene más de 100 píxeles de alto. El segundo bloque sólo se utiliza para agregar un controlador de clic a todos los elementos. </p>
<p>No voy a entrar en más detalles aquí, pero usted puede imaginarse lo poderoso que es esto y si google de la búsqueda para &#8220;selector de jQuery costumbre&#8221; que encontrarás un montón de buenos ejemplos. </p>
<h3>16. Racionalizar el código HTML y modificar una vez cargada la página</h3>
<p>El título no podría hacer mucho sentido, pero este consejo puede potencialmente neaten su código, reducir el peso y el tiempo de descarga de la página y ayudar a su SEO. Tome el siguiente código HTML por ejemplo &#8230; </p>
<p>  < div class="fieldOuter"><br />
    < div  class="inner"><br />
         < div class="field"> Este es el campo número 1 </ div><br />
     </ Div><br />
    < div class="errorBar"><br />
        < div class="icon">  <img src="icon.png" alt="icon" /> </ div><br />
        < div class="message">  <span> Este es un mensaje de error </ span> </ div><br />
     </ Div><br />
 </ Div><br />
< div class="fieldOuter"><br />
    < div  class="inner"><br />
         < div class="field"> Este es el campo número 2 </ div><br />
     </ Div><br />
   < div  class="errorBar"><br />
        < div  class="icon"> <img src="icon.png" alt="icon" /> </ div><br />
         < div  class="message"><span> Este es un mensaje de error </ span> </ div><br />
     </ Div><br />
 </ Div></p>
<p>Eso es un ejemplo de cómo una forma puede ser marcado, ligeramente modificada con fines ilustrativos. Estoy seguro de que estará de acuerdo en que es bastante feo y si había una forma larga que acabaría con una página fea bastante largo. Es más agradable si pudieras poner esto en el código HTML. </p>
<p> < div class="field"> Este es el campo 1 </ div><br />
 < div class="field"> Este es el campo 2 </ div><br />
 < div class="field"> Este es el campo 3 </ div><br />
 < div class="field"> Este es el campo 4 </ div><br />
 < div class="field"> Este es el campo 5 </ div></p>
<p>Todo lo que tienes que hacer es un poco de manipulación de jQuery para añadir todas las feas HTML volver pulg Me gusta esto &#8230; </p>
<p> &#8216;Campo&#8217;. $ (Document) listo (function () {$ () antes (&#8216;class=&#8221;inner&#8221;> < div class="fieldOuter">&#8216;);.. $ () Después de &#8220;campo&#8221;.. (&#8216;</ div> < div class="errorBar"> class=&#8221;icon&#8221;> < img src="icon.png" alt="icon" /> </ div> < div class="message"> < span> Este es un mensaje de error </ span> </ div> </ div> </ div> &#8220;);}); </p>
<p>No siempre es aconsejable hacer esto, usted conseguirá un poco de un flash que se carga la página, pero en determinadas situaciones en las que se ha repetido un montón de HTML que puede realmente reducir su peso de página y los beneficios SEO de reducir todos los su margen de beneficio extraños repetidas debería ser obvio. </p>
<h3>17. Perezoso contenido de la carga de las prestaciones de velocidad y SEO </h3>
<p>Otra forma de acelerar su carga la página y neaten el HTML que las arañas de búsqueda se ve es a pedazos toda la carga perezosa de la misma mediante una solicitud AJAX después de que el resto de la página se ha cargado. El usuario puede obtener la navegación de inmediato y las arañas sólo ven el contenido que ellos quieren para su indexación. </p>
<p>Hemos utilizado esta técnica en nuestro propio sitio. Los botones de color púrpura en la parte superior de la caída de la página hacia abajo tres formas, direcciones y un mapa de Google, que se duplicaba el tamaño de nuestras páginas. Así pues, sólo hay que poner todo lo que HTML en una página estática y el uso de la carga () para cargarlo en el DOM, una vez estaba listo. Al igual que este &#8230; </p>
<p> &#8216;Contenido / headerForms.html&#8217; $ (&#8216;# formas »). Carga (, function () {<br />
     / / Código de aquí se ejecuta una vez el contenido se haya cargado<br />
     / / Poner todos sus eventos, etc controladores de aquí.<br />
 });</p>
<p>Yo no usaría esta en todas partes. Usted tiene que considerar las compensaciones aquí. Estás haciendo peticiones adicionales para el servidor y las porciones de la página pueden no estar disponibles para el usuario de inmediato, pero se utiliza correctamente, puede ser una técnica de optimización grandes. </p>
<h3>18. jQuery uso de funciones de utilidad </h3>
<p>jQuery no es sólo acerca de los efectos de flash. El creador ha expuesto algunos métodos muy útiles que llenar algunas lagunas en el repertorio de JavaScript. </p>
<p>http://docs.jquery.com/Utilities</p>
<p>En particular, el apoyo a determinadas funciones de navegador matriz común es irregular (IE7 ni siquiera tiene un método indexOf ()!). JQuery tiene métodos para iterar, el filtrado, la clonación, la fusión y eliminación de duplicados a partir de matrices. </p>
<p>Otras funciones comunes que son difíciles de conseguir en Javascript incluyen el elemento seleccionado en una lista desplegable. En la llanura de edad JavaScript usted tendría que obtener el elemento<br />
<select> usando getElementById, obtener los elementos secundarios como una matriz y recorrer a través de ellos verificar si cada uno de ellos fue seleccionado o no. jQuery hace que sea fácil &#8230; </p>
<p> . $ (&#8216;# SelectList&#8217;) val ();</p>
<p>Vale la pena pasar algún tiempo mirando a través de la documentación de jQuery en el sitio principal y que tiene una nariz en torno a algunas de las funciones menos conocidas. </p>
<h3>19. Utilice noconflict cambiar el nombre del objeto jQuery utilizando otros marcos </h3>
<p>La mayoría de los marcos Javascript hacer uso de los $ símbolo como una forma rápida y esto puede causar conflictos al tratar de utilizar más de un marco en la misma página. Por suerte hay una solución simple. El. Noconflict () la función da el control de los $ espalda y le permite establecer su propio nombre de la variable, así &#8230; </p>
<p> var $ j = jQuery.noConflict ();<br />
 J $ (&#8216;# myDiv&#8217;) ocultar ().;</p>
<h3>20. Cómo saber cuando las imágenes se hayan cargado </h3>
<p>Este es otro de los problemas que no parecen estar tan bien documentados como debe ser (no cuando me puse a buscar de todos modos) y es un requisito muy común en la construcción de galerías de fotos, cintas, etc, pero es bastante fácil. </p>
<p>Todo lo que tienes que hacer es usar el. Método load () de un elemento IMG y poner una función de devolución de llamada en el mismo. En el ejemplo siguiente se cambia el atributo &#8220;src&#8221; de una etiqueta de imagen para cargar una nueva imagen y atribuye una función de carga sencilla. </p>
<p> $ (&#8216;# MyImage&#8217;). Attr (&#8216;src&#8217;, &#8216;imagen.jpg&#8217;). Carga (function () {<br />
     alert (&#8216;Imagen Cargado&#8217;);<br />
 });</p>
<p>Debes encontrar que la alerta se llama tan pronto como se carga la imagen. </p>
<h3>21. Utilice siempre la versión más reciente </h3>
<p>jQuery está mejorando constantemente y John Resig, su creador, siempre parece estar en busca de maneras de mejorar el rendimiento. </p>
<p>jQuery es actualmente la versión 1.2.6, pero John ya ha revelado que está trabajando en un motor nuevo selector llamado Arden , que aparentemente pueden mejorar la velocidad de selector en Firefox hasta 4x. Por lo tanto, vale la pena estar al día. </p>
<h3>22. Cómo comprobar si existe un elemento </h3>
<p>No es necesario comprobar si existe un elemento en la página antes de manipular porque jQuery que simplemente no hará nada si intenta seleccionar algo y no es en el DOM. Pero cuando usted tiene que comprobar si algo ha sido seleccionado, o cuántos artículos han sido seleccionados puede utilizar la propiedad length. </p>
<p> si myDiv ($(&#8216;#). longitud) {<br />
     / / El código<br />
 }</p>
<p>Simple, pero obvio no. </p>
<h3>23. Agregue una clase JS a su atributo HTML </h3>
<p>Me enteré de este consejo de Karl Swedberg cuyos excelentes libros que utilizan para aprender jQuery. </p>
<p>Recientemente ha dejado un comentario sobre uno de mis artículos anteriores sobre esta técnica y las bases son las siguientes &#8230; </p>
<p>En primer lugar, tan pronto como jQuery se ha cargado lo usa para agregar una &#8220;JS&#8221; clase para la etiqueta HTML. </p>
<p> $ (&#8216;HTML&#8217;) addClass (&#8216;JS&#8217;).;</p>
<p>Debido a que sólo ocurre cuando se habilita Javascript se puede utilizar para agregar estilos CSS que sólo funciona si el usuario tiene JavaScript activado, así &#8230; </p>
<p> . MyDiv JS # {display: none;}</p>
<p>Por lo tanto, lo que esto significa es que podemos ocultar el contenido cuando JavaScript está encendido y luego usar jQuery para mostrar el resultado cuando sea necesario (por ejemplo, por el colapso de algunos paneles y la ampliación cuando el usuario hace clic en ellos), mientras que los de JavaScript (y de la búsqueda arañas de los motores) ver todos los contenidos, ya que no se esconde. Voy a utilizar esta mucho en el futuro. </p>
<p>Para leer el artículo completo haga clic aquí . </p>
<h3>24. Volver &#8216;falsa&#8217; para evitar el comportamiento por defecto </h3>
<p>Esto debería ser obvia, pero tal vez no. si usted tiene el hábito de hacer esto &#8230; </p>
<p> <a href="#" class="popup"> Hacer clic </ a></p>
<p>&#8230; y luego conectar un controlador de eventos como este &#8230; </p>
<p> . $ (&#8216;Popup&#8217;), haga clic en (function () {/ / Lanzamiento código popup}); </p>
<p>&#8230; probablemente va a funcionar bien hasta que lo utilice en una página de largo, y en ese momento te darás cuenta de que el # que está causando a saltar a la parte superior de la página cuando el evento click se dispara. </p>
<p>Todo lo que tienes que hacer para evitar este comportamiento por defecto, o cualquier comportamiento por defecto en cualquier controlador de eventos es añadir &#8220;return false;&#8221; al controlador, así &#8230; </p>
<p> $ (&#8216;Popup&#8217;). Click (function () {<br />
     / / Lanzamiento código emergente<br />
     return false;<br />
 });</p>
<p>25. Atajo para el evento ready </p>
<p>Un pequeño consejo este, pero usted puede ahorrar unos cuantos caracteres utilizando la abreviatura del $ (document). Función de listo. </p>
<p>En lugar de esto &#8230; </p>
<p> $ (Document). Ready (function () {<br />
     / / El código<br />
 });</p>
<p>Usted puede hacer esto &#8230; </p>
<p> $ (Function () {<br />
     / / El código<br />
 });</p>
<img src="http://www.christianmania.com/?ak_action=api_record_view&id=502&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://www.christianmania.com/2011/04/mejore-su-jquery-25-consejos-excelentes/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

