<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearch/1.1/" xmlns:georss="http://www.georss.org/georss" xmlns:thr="http://purl.org/syndication/thread/1.0" xmlns:gd="http://schemas.google.com/g/2005" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" gd:etag="W/&quot;DEQMRno4cSp7ImA9WhZXFE4.&quot;"><id>tag:blogger.com,1999:blog-8219062580832314459</id><updated>2011-05-03T10:26:27.439-05:00</updated><title>Blog SQLeros</title><subtitle type="html">Blog de tecnologías referentes a SQL, .Net e implementaciones, Linux,Windows, telefonía Móvil.</subtitle><link rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml" href="http://www.sqleros.com.ar/feeds/posts/default" /><link rel="alternate" type="text/html" href="http://www.sqleros.com.ar/" /><link rel="next" type="application/atom+xml" href="http://www.blogger.com/feeds/8219062580832314459/posts/default?start-index=26&amp;max-results=25&amp;redirect=false&amp;v=2" /><author><name>Ramms ZeñábI</name><uri>http://www.blogger.com/profile/05084493704196673506</uri><email>noreply@blogger.com</email></author><generator version="7.00" uri="http://www.blogger.com">Blogger</generator><openSearch:totalResults>86</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="http://feeds.feedburner.com/BlogSqleros" /><feedburner:info uri="blogsqleros" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><entry gd:etag="W/&quot;DEQMRno-eyp7ImA9WhZXFE4.&quot;"><id>tag:blogger.com,1999:blog-8219062580832314459.post-7218004721751632095</id><published>2011-05-03T10:26:00.001-05:00</published><updated>2011-05-03T10:26:27.453-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-05-03T10:26:27.453-05:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="operator" /><category scheme="http://www.blogger.com/atom/ns#" term="javascript" /><category scheme="http://www.blogger.com/atom/ns#" term="strict comparison" /><category scheme="http://www.blogger.com/atom/ns#" term="null" /><category scheme="http://www.blogger.com/atom/ns#" term="undefined" /><title>Diferencias entre null y undefined</title><content type="html">
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/KQb2bM-c_l75EJVvzA_F4_O8rL8/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/KQb2bM-c_l75EJVvzA_F4_O8rL8/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/KQb2bM-c_l75EJVvzA_F4_O8rL8/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/KQb2bM-c_l75EJVvzA_F4_O8rL8/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;&lt;span class="Apple-style-span" style="font-family: Helvetica, Arial, 'Liberation Sans', FreeSans, sans-serif; font-size: 13px; line-height: 19px;"&gt;&lt;/span&gt;&lt;br /&gt;
&lt;div style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; background-position: initial initial; background-repeat: initial initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; font-size: 13px; margin-bottom: 20px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: initial; outline-width: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;En javascript existen cinco tipos primitivos de datos: undefined, null, boolean, number y string.&lt;br /&gt;
A primera vista no se aprecia la diferencia entre los tipos undefined y null.&lt;/div&gt;&lt;div style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; background-position: initial initial; background-repeat: initial initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; font-size: 13px; margin-bottom: 20px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: initial; outline-width: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;El tipo undefined corresponde a las variables que han sido definidas y todavía no se les ha asignado un valor.&lt;br /&gt;
El tipo null se suele utilizar para representar objetos que en ese momento no existen.&lt;/div&gt;&lt;div style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; background-position: initial initial; background-repeat: initial initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; font-size: 13px; margin-bottom: 20px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: initial; outline-width: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;Sin embargo aunque son conceptos distintos el operando de igualdad los considera iguales. No así el operando typeof o el operador de igualdad estricta ===&lt;/div&gt;&lt;pre class="prettyprint" style="background-attachment: initial; background-clip: initial; background-color: #ffffdd; background-image: initial; background-origin: initial; background-position: initial initial; background-repeat: initial initial; border-bottom-color: rgb(136, 136, 136); border-bottom-style: solid; border-bottom-width: 1px; border-color: initial; border-left-color: rgb(136, 136, 136); border-left-style: solid; border-left-width: 1px; border-right-color: rgb(136, 136, 136); border-right-style: solid; border-right-width: 1px; border-style: initial; border-top-color: rgb(136, 136, 136); border-top-style: solid; border-top-width: 1px; font-size: 13px; margin-bottom: 20px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: initial; outline-width: 0px; overflow-x: auto; overflow-y: auto; padding-bottom: 2px; padding-left: 2px; padding-right: 2px; padding-top: 2px; vertical-align: baseline;"&gt;&lt;span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #666600; font-size: 13px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: initial; outline-width: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;(&lt;/span&gt;&lt;span class="kwd" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #000088; font-size: 13px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: initial; outline-width: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;undefined&lt;/span&gt;&lt;span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 13px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: initial; outline-width: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt; &lt;/span&gt;&lt;span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #666600; font-size: 13px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: initial; outline-width: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;==&lt;/span&gt;&lt;span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 13px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: initial; outline-width: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt; &lt;/span&gt;&lt;span class="kwd" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #000088; font-size: 13px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: initial; outline-width: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;null&lt;/span&gt;&lt;span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #666600; font-size: 13px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: initial; outline-width: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;)&lt;/span&gt;&lt;span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 13px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: initial; outline-width: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt; &lt;/span&gt;&lt;span class="com" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #880000; font-size: 13px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: initial; outline-width: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;//--&amp;gt; true&lt;/span&gt;&lt;span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 13px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: initial; outline-width: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;
&lt;/span&gt;&lt;span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #666600; font-size: 13px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: initial; outline-width: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;(&lt;/span&gt;&lt;span class="kwd" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #000088; font-size: 13px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: initial; outline-width: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;undefined&lt;/span&gt;&lt;span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 13px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: initial; outline-width: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt; &lt;/span&gt;&lt;span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #666600; font-size: 13px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: initial; outline-width: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;===&lt;/span&gt;&lt;span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 13px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: initial; outline-width: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt; &lt;/span&gt;&lt;span class="kwd" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #000088; font-size: 13px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: initial; outline-width: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;null&lt;/span&gt;&lt;span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #666600; font-size: 13px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: initial; outline-width: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;)&lt;/span&gt;&lt;span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 13px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: initial; outline-width: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt; &lt;/span&gt;&lt;span class="com" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #880000; font-size: 13px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: initial; outline-width: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;//--&amp;gt; false&lt;/span&gt;&lt;span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 13px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: initial; outline-width: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;
&lt;/span&gt;&lt;span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #666600; font-size: 13px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: initial; outline-width: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;(&lt;/span&gt;&lt;span class="kwd" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #000088; font-size: 13px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: initial; outline-width: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;typeof&lt;/span&gt;&lt;span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 13px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: initial; outline-width: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt; &lt;/span&gt;&lt;span class="kwd" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #000088; font-size: 13px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: initial; outline-width: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;undefined&lt;/span&gt;&lt;span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 13px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: initial; outline-width: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt; &lt;/span&gt;&lt;span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #666600; font-size: 13px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: initial; outline-width: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;==&lt;/span&gt;&lt;span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 13px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: initial; outline-width: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt; &lt;/span&gt;&lt;span class="kwd" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #000088; font-size: 13px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: initial; outline-width: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;typeof&lt;/span&gt;&lt;span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 13px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: initial; outline-width: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt; &lt;/span&gt;&lt;span class="kwd" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #000088; font-size: 13px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: initial; outline-width: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;undefined&lt;/span&gt;&lt;span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 13px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: initial; outline-width: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt; &lt;/span&gt;&lt;span class="kwd" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #000088; font-size: 13px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: initial; outline-width: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;null&lt;/span&gt;&lt;span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #666600; font-size: 13px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: initial; outline-width: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;)&lt;/span&gt;&lt;span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 13px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: initial; outline-width: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt; &lt;/span&gt;&lt;span class="com" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #880000; font-size: 13px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: initial; outline-width: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;//--&amp;gt; false&lt;/span&gt;&lt;/pre&gt;&lt;div style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; background-position: initial initial; background-repeat: initial initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; font-size: 13px; margin-bottom: 20px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: initial; outline-width: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;Si intentamos operar con una variable que tiene valor null, según el contexto devolverá los siguientes resultados.&lt;/div&gt;&lt;pre class="prettyprint" style="background-attachment: initial; background-clip: initial; background-color: #ffffdd; background-image: initial; background-origin: initial; background-position: initial initial; background-repeat: initial initial; border-bottom-color: rgb(136, 136, 136); border-bottom-style: solid; border-bottom-width: 1px; border-color: initial; border-left-color: rgb(136, 136, 136); border-left-style: solid; border-left-width: 1px; border-right-color: rgb(136, 136, 136); border-right-style: solid; border-right-width: 1px; border-style: initial; border-top-color: rgb(136, 136, 136); border-top-style: solid; border-top-width: 1px; font-size: 13px; margin-bottom: 20px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: initial; outline-width: 0px; overflow-x: auto; overflow-y: auto; padding-bottom: 2px; padding-left: 2px; padding-right: 2px; padding-top: 2px; vertical-align: baseline;"&gt;&lt;span class="typ" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #660066; font-size: 13px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: initial; outline-width: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;Boolean&lt;/span&gt;&lt;span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #666600; font-size: 13px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: initial; outline-width: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;:&lt;/span&gt;&lt;span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 13px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: initial; outline-width: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt; &lt;/span&gt;&lt;span class="kwd" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #000088; font-size: 13px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: initial; outline-width: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;false&lt;/span&gt;&lt;span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 13px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: initial; outline-width: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;
&lt;/span&gt;&lt;span class="typ" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #660066; font-size: 13px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: initial; outline-width: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;Numeric&lt;/span&gt;&lt;span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #666600; font-size: 13px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: initial; outline-width: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;:&lt;/span&gt;&lt;span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 13px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: initial; outline-width: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt; &lt;/span&gt;&lt;span class="lit" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #006666; font-size: 13px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: initial; outline-width: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;0&lt;/span&gt;&lt;span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 13px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: initial; outline-width: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;
&lt;/span&gt;&lt;span class="typ" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #660066; font-size: 13px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: initial; outline-width: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;String&lt;/span&gt;&lt;span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #666600; font-size: 13px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: initial; outline-width: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;:&lt;/span&gt;&lt;span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 13px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: initial; outline-width: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt; &lt;/span&gt;&lt;span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #666600; font-size: 13px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: initial; outline-width: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;“&lt;/span&gt;&lt;span class="kwd" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #000088; font-size: 13px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: initial; outline-width: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;null&lt;/span&gt;&lt;span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #666600; font-size: 13px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: initial; outline-width: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;”&lt;/span&gt;&lt;/pre&gt;&lt;div style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; background-position: initial initial; background-repeat: initial initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; font-size: 13px; margin-bottom: 20px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: initial; outline-width: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;Si intentamos operar con una variable que tiene valor undefined, según el contexto devolverá los siguientes resultados.&lt;/div&gt;&lt;pre class="prettyprint" style="background-attachment: initial; background-clip: initial; background-color: #ffffdd; background-image: initial; background-origin: initial; background-position: initial initial; background-repeat: initial initial; border-bottom-color: rgb(136, 136, 136); border-bottom-style: solid; border-bottom-width: 1px; border-color: initial; border-left-color: rgb(136, 136, 136); border-left-style: solid; border-left-width: 1px; border-right-color: rgb(136, 136, 136); border-right-style: solid; border-right-width: 1px; border-style: initial; border-top-color: rgb(136, 136, 136); border-top-style: solid; border-top-width: 1px; font-size: 13px; margin-bottom: 20px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: initial; outline-width: 0px; overflow-x: auto; overflow-y: auto; padding-bottom: 2px; padding-left: 2px; padding-right: 2px; padding-top: 2px; vertical-align: baseline;"&gt;&lt;span class="typ" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #660066; font-size: 13px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: initial; outline-width: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;Boolean&lt;/span&gt;&lt;span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #666600; font-size: 13px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: initial; outline-width: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;:&lt;/span&gt;&lt;span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 13px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: initial; outline-width: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt; &lt;/span&gt;&lt;span class="kwd" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #000088; font-size: 13px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: initial; outline-width: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;false&lt;/span&gt;&lt;span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 13px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: initial; outline-width: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;
&lt;/span&gt;&lt;span class="typ" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #660066; font-size: 13px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: initial; outline-width: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;Numeric&lt;/span&gt;&lt;span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #666600; font-size: 13px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: initial; outline-width: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;:&lt;/span&gt;&lt;span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 13px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: initial; outline-width: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt; &lt;/span&gt;&lt;span class="kwd" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #000088; font-size: 13px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: initial; outline-width: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;NaN&lt;/span&gt;&lt;span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 13px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: initial; outline-width: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;
&lt;/span&gt;&lt;span class="typ" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #660066; font-size: 13px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: initial; outline-width: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;String&lt;/span&gt;&lt;span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #666600; font-size: 13px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: initial; outline-width: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;:&lt;/span&gt;&lt;span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 13px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: initial; outline-width: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt; &lt;/span&gt;&lt;span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #666600; font-size: 13px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: initial; outline-width: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;“&lt;/span&gt;&lt;span class="kwd" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #000088; font-size: 13px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: initial; outline-width: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;undefined&lt;/span&gt;&lt;span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #666600; font-size: 13px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: initial; outline-width: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;”&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8219062580832314459-7218004721751632095?l=www.sqleros.com.ar' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/BlogSqleros/~4/u0O38zxW3Xo" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.sqleros.com.ar/feeds/7218004721751632095/comments/default" title="Enviar comentarios" /><link rel="replies" type="text/html" href="http://www.sqleros.com.ar/2011/05/diferencias-entre-null-y-undefined.html#comment-form" title="0 comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8219062580832314459/posts/default/7218004721751632095?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8219062580832314459/posts/default/7218004721751632095?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/BlogSqleros/~3/u0O38zxW3Xo/diferencias-entre-null-y-undefined.html" title="Diferencias entre null y undefined" /><author><name>Ramms ZeñábI</name><uri>http://www.blogger.com/profile/05084493704196673506</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="13715620155140962144" /></author><thr:total>0</thr:total><feedburner:origLink>http://www.sqleros.com.ar/2011/05/diferencias-entre-null-y-undefined.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CEUBQ38zfip7ImA9WhZXEUg.&quot;"><id>tag:blogger.com,1999:blog-8219062580832314459.post-1295067782339773758</id><published>2011-04-30T03:30:00.001-05:00</published><updated>2011-04-30T03:30:52.186-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-04-30T03:30:52.186-05:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="how to's" /><category scheme="http://www.blogger.com/atom/ns#" term="paginas dinamicas" /><category scheme="http://www.blogger.com/atom/ns#" term="jquery" /><category scheme="http://www.blogger.com/atom/ns#" term="ASP.NET" /><category scheme="http://www.blogger.com/atom/ns#" term="ajax" /><category scheme="http://www.blogger.com/atom/ns#" term="extenders" /><category scheme="http://www.blogger.com/atom/ns#" term="asp.net 4.0" /><category scheme="http://www.blogger.com/atom/ns#" term="asp .net 2.0" /><title>Recomendación SQLera</title><content type="html">
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/MYLW8a3USTy_au74oZb8cAAhRiU/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/MYLW8a3USTy_au74oZb8cAAhRiU/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/MYLW8a3USTy_au74oZb8cAAhRiU/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/MYLW8a3USTy_au74oZb8cAAhRiU/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;Bueno mis estimados lectores el día de hoy les comento sobre un libro que esta muy interesante, y que esta enfocado en ayudar a dar ese paso a los desarrolladores de ASP.Net 2.0 hacia el 4.0, su temática es sencilla, ponernos en contexto sobre que es la tecnología de lado de servidor, su evolución...  protagonismo el scripting por lado del cliente, y como aprovechar al máximo las bondades de ambas, tecnologías.&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;Este libro y el autor José Manuel Alarcón Aguín, nos llevan de la mano, en sus capítulos, si bien se parte desde 0 en la&amp;nbsp;explicación&amp;nbsp;de las tecnologías, es necesario tener conocimiento básico o intermedio de ASP.Net, Javascript y html.&lt;/span&gt;&lt;/div&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;los temas tratados los capitulo son los siguientes:&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;Las diferentes versiones de ASP.NET y qué ofrecen al programador&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;Fundamentos de AJAX. Con cualquier tecnología, no atado a ASP.NET.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;ASP.NET AJAX en el lado servidor.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;ASP.NET AJAX en el lado cliente y el modelo de desarrollo “puro” con AJAX&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;Enlazado a datos en el lado cliente. La tecnología de Live Binding es la principal novedad de ASP.NET 4.0. Este es el primer libro del mercado en el que se trata esta nueva funcionalidad.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;Generación automática de interfaces de “mantenimiento” con Dynamic Data.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;Filtrado automático de datos con Query Extenders. Otra novedad de ASP.NET 4.0 sobre la que no verás escrito en ningún otro lado.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;En resumen lo que podemos aprender del libro y sus tips es:&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;&amp;nbsp;asp.net&amp;nbsp;y sus versiones&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;fundamentos de ajax&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;asp.net ajax en el navegador&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;asp.net ajax en el servidor&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;optimización y uso de bibliotecas&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;asp.net dynamic data interfaces de datos adaptables&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;filtrado de datos automatico con query extender&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;muy buen libro y altamente recomendado si te llama la atención en desarrollo web y la plataforma .net. Les dejo el link del libro en linea para que si es de su agrado le den un vistazo.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;&lt;a href="http://es.scribd.com/doc/20154009/Tecnologias-ASP-NET-4-0-saltando-desde-la-version-2-0"&gt;http://es.scribd.com/doc/20154009/Tecnologias-ASP-NET-4-0-saltando-desde-la-version-2-0&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;Saludos!&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8219062580832314459-1295067782339773758?l=www.sqleros.com.ar' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/BlogSqleros/~4/35nW_P8_tQY" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.sqleros.com.ar/feeds/1295067782339773758/comments/default" title="Enviar comentarios" /><link rel="replies" type="text/html" href="http://www.sqleros.com.ar/2011/04/recomendacion-sqlera.html#comment-form" title="0 comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8219062580832314459/posts/default/1295067782339773758?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8219062580832314459/posts/default/1295067782339773758?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/BlogSqleros/~3/35nW_P8_tQY/recomendacion-sqlera.html" title="Recomendación SQLera" /><author><name>Ramms ZeñábI</name><uri>http://www.blogger.com/profile/05084493704196673506</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="13715620155140962144" /></author><thr:total>0</thr:total><feedburner:origLink>http://www.sqleros.com.ar/2011/04/recomendacion-sqlera.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkUDQnszcSp7ImA9WhZXEUk.&quot;"><id>tag:blogger.com,1999:blog-8219062580832314459.post-3414970709619126078</id><published>2011-04-16T03:01:00.000-05:00</published><updated>2011-04-30T02:24:33.589-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-04-30T02:24:33.589-05:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Frikadas" /><category scheme="http://www.blogger.com/atom/ns#" term="T-SQL" /><category scheme="http://www.blogger.com/atom/ns#" term="programacion" /><category scheme="http://www.blogger.com/atom/ns#" term="mail" /><category scheme="http://www.blogger.com/atom/ns#" term="sql server 2008" /><category scheme="http://www.blogger.com/atom/ns#" term="SQL Server 2005" /><category scheme="http://www.blogger.com/atom/ns#" term="send" /><category scheme="http://www.blogger.com/atom/ns#" term="SQL" /><category scheme="http://www.blogger.com/atom/ns#" term="Tecnologia" /><title>Enviar correo electrónico en un formato tabular utilizando el correo
electrónico de la base datos SQL Server</title><content type="html">
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/VnxqJOF2lBWP8ZBaAub-KQwjgkM/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/VnxqJOF2lBWP8ZBaAub-KQwjgkM/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/VnxqJOF2lBWP8ZBaAub-KQwjgkM/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/VnxqJOF2lBWP8ZBaAub-KQwjgkM/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;a title="View Enviar correo electrónico en un formato HTML utilizando el correo electrónico de la base datos SQL Server on Scribd" href="http://es.scribd.com/doc/53136789/Enviar-correo-electronico-en-un-formato-HTML-utilizando-el-correo-electronico-de-la-base-datos-SQL-Server" style="margin: 12px auto 6px auto; font-family: Helvetica,Arial,Sans-serif; font-style: normal; font-variant: normal; font-weight: normal; font-size: 14px; line-height: normal; font-size-adjust: none; font-stretch: normal; -x-system-font: none; display: block; text-decoration: underline;"&gt;Enviar correo electrónico en un formato HTML utilizando el correo electrónico de la base datos SQL Server&lt;/a&gt;&lt;iframe class="scribd_iframe_embed" src="http://www.scribd.com/embeds/53136789/content?start_page=1&amp;view_mode=list&amp;access_key=key-l62n75nndcton5iaabx" data-auto-height="true" data-aspect-ratio="0.772727272727273" scrolling="no" id="doc_54917" width="100%" height="600" frameborder="0"&gt;&lt;/iframe&gt;&lt;script type="text/javascript"&gt;(function() { var scribd = document.createElement("script"); scribd.type = "text/javascript"; scribd.async = true; scribd.src = "http://www.scribd.com/javascripts/embed_code/inject.js"; var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(scribd, s); })();&lt;/script&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8219062580832314459-3414970709619126078?l=www.sqleros.com.ar' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/BlogSqleros/~4/hRrYpo3Fing" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.sqleros.com.ar/feeds/3414970709619126078/comments/default" title="Enviar comentarios" /><link rel="replies" type="text/html" href="http://www.sqleros.com.ar/2011/04/enviar-correo-electronico-en-un-formato_16.html#comment-form" title="0 comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8219062580832314459/posts/default/3414970709619126078?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8219062580832314459/posts/default/3414970709619126078?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/BlogSqleros/~3/hRrYpo3Fing/enviar-correo-electronico-en-un-formato_16.html" title="Enviar correo electrónico en un formato tabular utilizando el correo electrónico de la base datos SQL Server" /><author><name>Ramms ZeñábI</name><uri>http://www.blogger.com/profile/05084493704196673506</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="13715620155140962144" /></author><thr:total>0</thr:total><feedburner:origLink>http://www.sqleros.com.ar/2011/04/enviar-correo-electronico-en-un-formato_16.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkUDQnszcSp7ImA9WhZXEUk.&quot;"><id>tag:blogger.com,1999:blog-8219062580832314459.post-9051567546288004492</id><published>2011-03-26T16:14:00.000-06:00</published><updated>2011-04-30T02:24:33.589-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-04-30T02:24:33.589-05:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="programacion" /><title /><content type="html">
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/2-o8YStxLChNJ1kynjb7e_0Y4S0/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/2-o8YStxLChNJ1kynjb7e_0Y4S0/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/2-o8YStxLChNJ1kynjb7e_0Y4S0/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/2-o8YStxLChNJ1kynjb7e_0Y4S0/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;How do you pronounce “Nginx”?&lt;br/&gt;&lt;br/&gt;The correct pronunciation sounds like: “engine-ex”.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8219062580832314459-9051567546288004492?l=www.sqleros.com.ar' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/BlogSqleros/~4/LV9_jvTEWJ4" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.sqleros.com.ar/feeds/9051567546288004492/comments/default" title="Enviar comentarios" /><link rel="replies" type="text/html" href="http://www.sqleros.com.ar/2011/03/how-do-you-pronounce-nginx-correct.html#comment-form" title="0 comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8219062580832314459/posts/default/9051567546288004492?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8219062580832314459/posts/default/9051567546288004492?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/BlogSqleros/~3/LV9_jvTEWJ4/how-do-you-pronounce-nginx-correct.html" title="" /><author><name>Ramms ZeñábI</name><uri>http://www.blogger.com/profile/05084493704196673506</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="13715620155140962144" /></author><thr:total>0</thr:total><feedburner:origLink>http://www.sqleros.com.ar/2011/03/how-do-you-pronounce-nginx-correct.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkUDQnsyeCp7ImA9WhZXEUk.&quot;"><id>tag:blogger.com,1999:blog-8219062580832314459.post-1531529461953579248</id><published>2011-03-18T07:09:00.000-06:00</published><updated>2011-04-30T02:24:33.590-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-04-30T02:24:33.590-05:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Frikadas" /><title>101 citas célebres del mundo de la informática</title><content type="html">
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/4FEtpPJIN1MvFTvZEgWYQ-tQ0T4/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/4FEtpPJIN1MvFTvZEgWYQ-tQ0T4/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/4FEtpPJIN1MvFTvZEgWYQ-tQ0T4/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/4FEtpPJIN1MvFTvZEgWYQ-tQ0T4/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;Después de pasar un buen rato entretenido con la recopilación de frases célebres relacionadas con el mundo de la informática y especialmente el desarrollo de software, "&lt;a href="http://www.devtopics.com/101-great-computer-programming-quotes/"&gt;101 Great computer programming quotes&lt;/a&gt;", publicado en &lt;a href="http://www.devtopics.com/"&gt;DevTopics&lt;/a&gt; hace unas semanas&lt;a name='more'&gt;&lt;/a&gt;, no he podido resistir la tentación de traducirlo, previo contacto con su autor, el amabilísimo Timm Martin.&lt;br/&gt;&lt;h3&gt;Ordenadores&lt;/h3&gt;&lt;br/&gt;&lt;ol&gt;&lt;br/&gt;	&lt;li&gt;"Los ordenadores son inútiles. Sólo pueden darte respuestas"&lt;br/&gt;&lt;em&gt;-- Pablo Picasso&lt;br/&gt;&lt;/em&gt;&lt;/li&gt;&lt;br/&gt;	&lt;li&gt;"Los ordenadores son como los bikinis. Ahorran a la gente el hacer muchas conjeturas"&lt;br/&gt;&lt;em&gt;-- Sam Ewing&lt;/em&gt;&lt;/li&gt;&lt;br/&gt;	&lt;li&gt;"Tienen ordenadores, y pueden tener otras armas de destrucción masiva"&lt;br/&gt;&lt;em&gt;--Janet Reno&lt;br/&gt;&lt;/em&gt;&lt;/li&gt;&lt;br/&gt;	&lt;li&gt;"Es genial trabajar con ordenadores. No discuten, lo recuerdan todo y no se beben tu cerveza"&lt;br/&gt;&lt;em&gt;-- Paul Leary)&lt;/em&gt;&lt;/li&gt;&lt;br/&gt;	&lt;li&gt;"Si la industria automovilística hubiera seguido el mismo desarrollo que los ordenadores, un Rolls-Royce costaría hoy 100 dólares, circularía un millón de millas con 3,7 litros y explotaría una vez al año, eliminando a todo el que estuviera dentro en ese momento"&lt;br/&gt;&lt;em&gt;-- Robert X. Cringely&lt;/em&gt;&lt;/li&gt;&lt;br/&gt;&lt;/ol&gt;&lt;br/&gt;&lt;h3&gt;Inteligencia artificial&lt;/h3&gt;&lt;br/&gt;&lt;ol&gt;&lt;br/&gt;	&lt;li&gt;"Los ordenadores se hacen cada vez más inteligentes. Los científicos dicen que pronto ellos serán capaces de hablarnos (y con 'ellos' me refiero a los ordenadores, dudo mucho que los científicos sean capaces de hablarnos)"&lt;br/&gt;&lt;em&gt;-- Dave Barry&lt;br/&gt;&lt;/em&gt;&lt;/li&gt;&lt;br/&gt;	&lt;li&gt;"He notado últimamente que el miedo paranoico hacia ordenadores inteligentes tomando el control del mundo ha desaparecido totalmente. Todo lo que puedo contar es que este hecho coincide con la aparición de MS-DOS"&lt;br/&gt;&lt;em&gt;-- Larry DeLuca&lt;/em&gt;&lt;/li&gt;&lt;br/&gt;	&lt;li&gt;"Preguntarse cuándo los ordenadores podrán pensar es como preguntarse cuándo los submarinos podrán nadar"&lt;br/&gt;&lt;em&gt;-- Edsger W. Dijkstra&lt;br/&gt;&lt;/em&gt;&lt;/li&gt;&lt;br/&gt;	&lt;li&gt;"Es ridículo vivir 100 años y sólo ser capaces de recordar 30 millones de bytes. O sea, menos que un compact disc. La condición humana se hace más obsoleta cada minuto"&lt;br/&gt;&lt;em&gt;-- Marvin Minsky&lt;/em&gt;&lt;/li&gt;&lt;br/&gt;&lt;/ol&gt;&lt;br/&gt;&lt;h3&gt;Confianza&lt;/h3&gt;&lt;br/&gt;&lt;ol&gt;&lt;br/&gt;	&lt;li&gt;"R2D2, ¿te lo dijo la computadora central de la ciudad? ¡R2D2, sabes bien que no debes confiar en una computadora extraña!"&lt;br/&gt;&lt;em&gt;-- C3PO&lt;/em&gt;&lt;/li&gt;&lt;br/&gt;	&lt;li&gt;"Nunca confíes en un ordenador que no puedas lanzar por una ventana"&lt;br/&gt;&lt;em&gt;-- Steve Wozniak&lt;/em&gt;&lt;/li&gt;&lt;br/&gt;&lt;/ol&gt;&lt;br/&gt;&lt;h3&gt;Hardware&lt;/h3&gt;&lt;br/&gt;&lt;ol&gt;&lt;br/&gt;	&lt;li&gt;"Hardware: las partes de un ordenador que pueden ser pateadas"&lt;br/&gt;&lt;em&gt;-- Jeff Pesis&lt;/em&gt;&lt;/li&gt;&lt;br/&gt;&lt;/ol&gt;&lt;br/&gt;&lt;h3&gt;Software&lt;/h3&gt;&lt;br/&gt;&lt;ol&gt;&lt;br/&gt;	&lt;li&gt;"La mayoría del software actual es muy parecido a una pirámide egipcia, con millones de ladrillos puestos unos encima de otros sin una estructura integral, simplemente realizada a base de fuerza bruta y miles de esclavos"&lt;br/&gt;&lt;em&gt;-- Alan Kay&lt;/em&gt;&lt;/li&gt;&lt;br/&gt;	&lt;li&gt;"Por fin he entendido lo que significa 'upward compatible' (compatible hacia arriba). Significa que mantenemos todos nuestros viejos errores"&lt;em&gt;-- Dennie van Tassel&lt;/em&gt;&lt;/li&gt;&lt;br/&gt;&lt;/ol&gt;&lt;br/&gt;&lt;h3&gt;Sistemas operativos&lt;/h3&gt;&lt;br/&gt;&lt;ol&gt;&lt;br/&gt;	&lt;li&gt;"Hay dos grandes productos que salieron de Berkeley: LSD y UNIX. No creemos que esto sea una coincidencia"&lt;br/&gt;&lt;em&gt;-- Jeremy S. Anderson&lt;br/&gt;&lt;/em&gt;&lt;/li&gt;&lt;br/&gt;	&lt;li&gt;"19 de enero de 2038, a las 3:14:07 AM"&lt;br/&gt;&lt;em&gt;(Fin del mundo de acuerdo con la limitación de Unix de 2^32 segundos desde el 1 de enero de 1970)&lt;/em&gt;&lt;/li&gt;&lt;br/&gt;	&lt;li&gt;"Todos los sistemas operativos que hay ahí fuera son más o menos iguales. Todos somos una mierda"&lt;br/&gt;&lt;em&gt;-- Brian Valentine, vicepresidente senior de Microsoft describiendo el estado del arte en seguridad de sistemas operativos en 2003&lt;/em&gt;&lt;/li&gt;&lt;br/&gt;	&lt;li&gt;"Microsoft ha lanzado una nueva versión, Windows XP, que según todo el mundo 'es la versión más fiable de Windows hasta la fecha'. Para mí, esto es como decir que el espárrago es el vegetal más articulado que ha existido nunca"&lt;br/&gt;&lt;em&gt;-- Dave Barry&lt;br/&gt;&lt;/em&gt;&lt;/li&gt;&lt;br/&gt;&lt;/ol&gt;&lt;br/&gt;&lt;h3&gt;Internet&lt;/h3&gt;&lt;br/&gt;&lt;ol&gt;&lt;br/&gt;	&lt;li&gt;"¿Internet? ¿Todavía anda eso por ahí?"&lt;br/&gt;&lt;em&gt;-- Homer Simpson&lt;br/&gt;&lt;/em&gt;&lt;/li&gt;&lt;br/&gt;	&lt;li&gt;"La web es como una dominatriz. En todos los sitios que voy me encuentro pequeños botones ordenándome que me someta"&lt;br/&gt;&lt;em&gt;-- Nytwind&lt;/em&gt;&lt;br/&gt;&lt;em&gt;Nota: el texto 'submit' que solemos ver en los botones de formularios se puede traducir como el verbo "someter".&lt;/em&gt;&lt;/li&gt;&lt;br/&gt;	&lt;li&gt;"Ahora que lo pienso, ya hay un millón de monos con máquinas de escribir y Usenet no es en absoluto como la obra de Shakespeare"&lt;br/&gt;&lt;em&gt;-- Blair Houghton&lt;br/&gt;&lt;/em&gt;&lt;/li&gt;&lt;br/&gt;&lt;/ol&gt;&lt;br/&gt;&lt;h3&gt;Industria del software&lt;/h3&gt;&lt;br/&gt;&lt;ol&gt;&lt;br/&gt;	&lt;li&gt;"El logro más impresionante de la industria del software es su continua anulación de los constantes y asombrosos logros de la industria del hardware"&lt;br/&gt;&lt;em&gt;-- Henry Petroski&lt;/em&gt;&lt;/li&gt;&lt;br/&gt;	&lt;li&gt;"La verdadera innovación a menudo viene de las pequeñas startups que son capaces de crear mercados pero carecen de peso para poseerlos"&lt;br/&gt;&lt;em&gt;-- Timm Martin&lt;/em&gt;&lt;/li&gt;&lt;br/&gt;	&lt;li&gt;"Se dice que las grandes disciplinas científicas son ejemplos de gigantes subidos a los hombros de otros gigantes. También se dice que la industria del software es un ejemplo de enanos subidos a los dedos de los pies de otros enanos"&lt;em&gt;-- Alan Cooper&lt;br/&gt;&lt;/em&gt;&lt;/li&gt;&lt;br/&gt;	&lt;li&gt;"No se trata bits, bytes y protocolos, sino de beneficios, pérdidas y márgenes"&lt;br/&gt;&lt;em&gt;-- Lou Gerstner&lt;/em&gt;&lt;/li&gt;&lt;br/&gt;	&lt;li&gt;"Somos Microsoft. La resistencia es inútil. Serás absorbido"&lt;br/&gt;&lt;em&gt;-- Bumper sticker&lt;br/&gt;&lt;/em&gt;&lt;/li&gt;&lt;br/&gt;&lt;/ol&gt;&lt;br/&gt;&lt;h3&gt;Software Demos&lt;/h3&gt;&lt;br/&gt;&lt;ol&gt;&lt;br/&gt;	&lt;li&gt;"No importa lo estupendamente que haya ido la demo en los ensayos, cuando lo haces frente a tu audiencia la probabilidad de que sea una presentación existosa es inversamente proporcional al número de personas mirando, elevado a la cantidad de dinero que hay en juego"&lt;br/&gt;&lt;em&gt;-- Mark Gibbs&lt;br/&gt;&lt;/em&gt;&lt;/li&gt;&lt;br/&gt;&lt;/ol&gt;&lt;br/&gt;&lt;h3&gt;Patentes software&lt;/h3&gt;&lt;br/&gt;&lt;ol&gt;&lt;br/&gt;	&lt;li&gt;"La mayoría de las patentes son una mierda. Dedicar tiempo a leerlas&lt;br/&gt;es estúpido. Es cosa de los propietarios de las patentes hacerlo y procurar que se respeten"&lt;br/&gt;&lt;em&gt;-- Linus Torvalds&lt;br/&gt;&lt;/em&gt;&lt;/li&gt;&lt;br/&gt;&lt;/ol&gt;&lt;br/&gt;&lt;h3&gt;Complejidad&lt;/h3&gt;&lt;br/&gt;&lt;ol&gt;&lt;br/&gt;	&lt;li&gt;"Controlar la complejidad es la esencia de la programación"&lt;br/&gt;&lt;em&gt;-- Brian Kernigan&lt;/em&gt;&lt;/li&gt;&lt;br/&gt;	&lt;li&gt;"La complejidad es destructiva. Chupa la sangre de los desarrolladores, hace que los productos sean difíciles de planificar, construir y probar, introduce problemas de seguridad y provoca la frustración de usuarios finales y administradores"&lt;br/&gt;&lt;em&gt;-- Ray Ozzie&lt;/em&gt;&lt;/li&gt;&lt;br/&gt;	&lt;li&gt;"Hay dos maneras de diseñar software: una es hacerlo tan simple que sea obvia su falta de deficiencias, y la otra es hacerlo tan complejo que no haya deficiencias obvias"&lt;br/&gt;&lt;em&gt;-- C.A.R. Hoare&lt;br/&gt;&lt;/em&gt;&lt;/li&gt;&lt;br/&gt;	&lt;li&gt;"La función de un buen software es hacer que lo complejo aparente ser simple"&lt;br/&gt;&lt;em&gt;-- Grady Booch&lt;/em&gt;&lt;/li&gt;&lt;br/&gt;&lt;/ol&gt;&lt;br/&gt;&lt;h3&gt;Facilidad de uso&lt;/h3&gt;&lt;br/&gt;&lt;ol&gt;&lt;br/&gt;	&lt;li&gt;"Recuerda: no eres torpe, no importa lo que digan esos libros. Los torpes de verdad son gente que, creyéndose expertos técnicos, no podrían diseñar hardware y software manejable por usuarios normales aunque la vida les fuera en ello"&lt;br/&gt;&lt;em&gt;-- Walter Mossberg&lt;br/&gt;&lt;/em&gt;&lt;/li&gt;&lt;br/&gt;	&lt;li&gt;"Los proveedores de software están intentando hacer sus productos más amigables para el usuario. Su mejor aproximación hasta el momento ha sido tomar sus antiguos folletos y estampar las palabras 'amigable para el usuario' en la portada"&lt;br/&gt;&lt;em&gt;-- Bill Gates&lt;br/&gt;&lt;/em&gt;&lt;/li&gt;&lt;br/&gt;	&lt;li&gt;"Hay una antigua historia sobre una persona que quería que su ordenador fuese tan fácil de utilizar como su teléfono. Estos deseos se han hecho realidad, ya no sé cómo usar mi teléfono"&lt;br/&gt;&lt;em&gt;-- Bjarne Stroustrup&lt;/em&gt;&lt;/li&gt;&lt;br/&gt;&lt;/ol&gt;&lt;br/&gt;&lt;h3&gt;Usuarios&lt;/h3&gt;&lt;br/&gt;&lt;ol&gt;&lt;br/&gt;	&lt;li&gt;"Cualquier idiota puede usar un ordenador. De hecho, muchos lo hacen"&lt;br/&gt;&lt;em&gt;-- Ted Nelson&lt;/em&gt;&lt;/li&gt;&lt;br/&gt;	&lt;li&gt;"Sólo hay dos industrias que se refieren a sus clientes como 'usuarios'"&lt;br/&gt;&lt;em&gt;-- Edward Tufte&lt;/em&gt;&lt;/li&gt;&lt;br/&gt;&lt;/ol&gt;&lt;br/&gt;&lt;h3&gt;Desarrolladores&lt;/h3&gt;&lt;br/&gt;&lt;ol&gt;&lt;br/&gt;	&lt;li&gt;"La programación es una carrera entre los desarrolladores, intentando construir mayores y mejores programas a prueba de idiotas, y el universo, intentanto producir mayores y mejores idiotas. Por ahora va ganando el Universo"&lt;br/&gt;&lt;em&gt;-- Rich Cook&lt;/em&gt;&lt;/li&gt;&lt;br/&gt;	&lt;li&gt;"La mayoría de ustedes están familiarizados con las virtudes del programador. Son tres, por supusto: pereza, impaciencia y orgullo desmedido"&lt;br/&gt;&lt;em&gt;-- Larry Wall&lt;/em&gt;&lt;/li&gt;&lt;br/&gt;	&lt;li&gt;"El problema que hay con los programadores es que nunca puedes contar lo que un programador está haciendo hasta que es demasiado tarde"&lt;br/&gt;&lt;em&gt;-- Seymour Cray&lt;/em&gt;&lt;/li&gt;&lt;br/&gt;	&lt;li&gt;"Esto es lo que ocurre con la gente que piensa que odia los ordenadores. Lo que realmente odia es a los malditos programadores"&lt;br/&gt;&lt;em&gt;-- Larry Niven&lt;/em&gt;&lt;/li&gt;&lt;br/&gt;	&lt;li&gt;"Durante mucho tiempo no entendía cómo algo tan caro y puntero podía ser tan inútil. Y entonces me vino a la mente que un ordenador es una máquina estúpida con la habilidad de hacer cosas increíblemente inteligentes, mientras que los programadores son inteligentes personas con la habilidad de hacer cosas estúpidas. Son, en resumen, una pareja perfecta"&lt;br/&gt;&lt;em&gt;-- Bill Bryson&lt;br/&gt;&lt;/em&gt;&lt;/li&gt;&lt;br/&gt;	&lt;li&gt;"La formación en informática no puede convertir a nadie en experto programador, de la misma forma que estudiar pinceles y pigmentos puede hacer a alguien un experto pintor"&lt;br/&gt;&lt;em&gt;-- Eric Raymond&lt;/em&gt;&lt;/li&gt;&lt;br/&gt;	&lt;li&gt;"Un programador es la persona considerada experta en ser capaz de sacar, después de innumerables tecleos, una serie infinita de respuestas incomprensibles calculadas con precisión micrométrica a partir de vagas asunciones basadas en discutibles cifras tomadas de documentos inconcluyentes y llevados a cabo con instrumentos de escasa precisión, por personas de fiabilidad dudosa y cuestionable mentalidad con el propósito declarado de molestar y confundiar al desesperado e indefenso departamento que tuvo la mala fortuna de pedir la información en primer lugar"&lt;br/&gt;&lt;em&gt;-- IEEE Grid newsmagazine&lt;/em&gt;&lt;/li&gt;&lt;br/&gt;	&lt;li&gt;"Un hacker puede ser capaz de producir, en unos pocos meses, algo que un pequeño grupo de desarrolladores (digamos de 7 u 8 personas) podría tener trabajado duramente juntos más de un año. IBM solía decir que ciertos programadores podían ser 100 veces más productivos que otros trabajadores, o más"&lt;br/&gt;&lt;em&gt;-- Peter Seebach&lt;/em&gt;&lt;/li&gt;&lt;br/&gt;	&lt;li&gt;"Los mejores programadores no son sólo marginalmente mejores que los buenos. Se trata de un orden de magnitud mayor, medida por cualquier estándar: creatividad conceptual, velocidad, ingenio o habilidad para solucionar problemas"&lt;br/&gt;&lt;em&gt;-- Randall E. Stross&lt;br/&gt;&lt;/em&gt;&lt;/li&gt;&lt;br/&gt;	&lt;li&gt;"Un gran operario de tornos vale varias veces más que un operario medio, pero un gran escritor de código vale 10.000 veces el precio de un desarrollador medio"&lt;br/&gt;&lt;em&gt;-- Bill Gates&lt;/em&gt;&lt;/li&gt;&lt;br/&gt;&lt;/ol&gt;&lt;br/&gt;&lt;h3&gt;Programación&lt;/h3&gt;&lt;br/&gt;&lt;ol&gt;&lt;br/&gt;	&lt;li&gt;"No te preocupes si no funciona bien. Si todo estuviera correcto, serías despedido de tu trabajo"&lt;br/&gt;&lt;em&gt;-- Ley de Mosher de la Ingeniería del Software&lt;br/&gt;&lt;/em&gt;&lt;/li&gt;&lt;br/&gt;	&lt;li&gt;"Medir el progreso del desarrollo de software por líneas de código es como medir el progreso de la construcción de un avión por su peso"&lt;br/&gt;&lt;em&gt;-- Bill Gates&lt;/em&gt;&lt;/li&gt;&lt;br/&gt;	&lt;li&gt;"La escritura de código tiene un lugar en la jerarquía humana de valores por encima del saqueo de tumbas y por debajo de la dirección y gestión"&lt;br/&gt;&lt;em&gt;-- Gerald Weinberg&lt;/em&gt;&lt;/li&gt;&lt;br/&gt;	&lt;li&gt;"Primero aprende informática y toda la teoría. Después desarrolla un estilo de programación. Entonces, olvídalo todo y hackea"&lt;br/&gt;&lt;em&gt;-- George Carrette&lt;/em&gt;&lt;/li&gt;&lt;br/&gt;	&lt;li&gt;"Primero resuelve el problema. Entonces, escribe el código"&lt;br/&gt;&lt;em&gt;-- John Johnson&lt;/em&gt;&lt;/li&gt;&lt;br/&gt;	&lt;li&gt;"El optimismo es un riesgo laboral de la programación; el feedback es el tratamiento"&lt;br/&gt;&lt;em&gt;-- Kent Beck&lt;/em&gt;&lt;/li&gt;&lt;br/&gt;	&lt;li&gt;"Iterar es humano, 'recursivar' es divino"&lt;br/&gt;&lt;em&gt;-- L. Peter Deutsch&lt;br/&gt;&lt;/em&gt;&lt;/li&gt;&lt;br/&gt;	&lt;li&gt;"Lo mejor de los booleanos es que si te equivocas estás a un sólo bit de la solución correcta"&lt;br/&gt;&lt;em&gt;-- Anónimo&lt;/em&gt;&lt;/li&gt;&lt;br/&gt;	&lt;li&gt;"¿Los índices de los arrays deberían comenzar en 0 o en 1? Mi propuesta neutral de usar 0.5 fue rechazada, en mi opinión, sin la debida consideración"&lt;br/&gt;&lt;em&gt;-- Stan Kelly-Bootle&lt;br/&gt;&lt;/em&gt;&lt;/li&gt;&lt;br/&gt;&lt;/ol&gt;&lt;br/&gt;&lt;h3&gt;Lenguajes de programación&lt;/h3&gt;&lt;br/&gt;&lt;ol&gt;&lt;br/&gt;	&lt;li&gt;"Hay sólo dos clases de lenguajes de programación: aquellos de los que la gente está siempre quejándose y aquellos que nadie usa"&lt;br/&gt;&lt;em&gt;-- Bjarne Stroustrup&lt;/em&gt;&lt;/li&gt;&lt;br/&gt;	&lt;li&gt;"PHP es un mal menor perpetrado y creado por amaterus incompetentes, mientras que Perl es un gran e insidioso mal perpetrado por hábiles pero pervertidos profesionales"&lt;br/&gt;&lt;em&gt;-- Jon Ribbens&lt;br/&gt;&lt;/em&gt;&lt;/li&gt;&lt;br/&gt;	&lt;li&gt;"El uso de COBOL daña la mente. Su enseñanza debería ser considerada como un ataque criminal"&lt;br/&gt;&lt;em&gt;-- E. W. Dijkstra&lt;br/&gt;&lt;/em&gt;&lt;/li&gt;&lt;br/&gt;	&lt;li&gt;"Es prácticamente imposible enseñar buenos hábitos de programación a estudiantes que hayan sido previamente sometidos a una exposición de BASIC. Como desarrolladores en potencia, están mentalmente mutilados sin esperanza de regeneración"&lt;br/&gt;&lt;em&gt;-- E. W. Dijkstra&lt;br/&gt;&lt;/em&gt;&lt;/li&gt;&lt;br/&gt;	&lt;li&gt;"Pienso que Microsoft eligió el nombre .Net para que no pudiera ser mostrado en un listado de directorio de Unix"&lt;br/&gt;&lt;em&gt;-- Oktal&lt;br/&gt;&lt;/em&gt;&lt;/li&gt;&lt;br/&gt;	&lt;li&gt;"No hay lenguaje de programación, no importa su estructura, que impida que los programadores hagan malos programas"&lt;br/&gt;&lt;em&gt;-- Larry Flon&lt;/em&gt;&lt;/li&gt;&lt;br/&gt;	&lt;li&gt;"El diseño de lenguajes de programación es como pasear en el parque. Bueno, en parque jurásico"&lt;br/&gt;&lt;em&gt;-- Larry Wall&lt;br/&gt;&lt;/em&gt;&lt;/li&gt;&lt;br/&gt;&lt;/ol&gt;&lt;br/&gt;&lt;h3&gt;C/C++&lt;/h3&gt;&lt;br/&gt;&lt;ol&gt;&lt;br/&gt;	&lt;li&gt;"¿Cincuenta años de investigación en lenguajes de programación, y acabamos con C++?"&lt;br/&gt;&lt;em&gt;-- Richard A. O'Keefe&lt;br/&gt;&lt;/em&gt;&lt;/li&gt;&lt;br/&gt;	&lt;li&gt;"Escribir en C o C++ es como utilizar una sierra eléctrica sin ningún tipo de protección"&lt;br/&gt;&lt;em&gt;-- Bob Gray&lt;br/&gt;&lt;/em&gt;&lt;/li&gt;&lt;br/&gt;	&lt;li&gt;"Cuando usas C++ es más difícil que te dispares a tí mismo en el pie, pero cuando lo haces, te vuelas la pierna entera"&lt;br/&gt;&lt;em&gt;-- Bjarne Stroustrup&lt;br/&gt;&lt;/em&gt;&lt;/li&gt;&lt;br/&gt;	&lt;li&gt;"C++ : Donde los amigos tienen acceso a tus miembros privados"&lt;br/&gt;&lt;em&gt;-- Gavin Russell Baker&lt;br/&gt;&lt;/em&gt;&lt;/li&gt;&lt;br/&gt;	&lt;li&gt;"Una de las causas principales de la caída del imperio romano fue que, como no usaban el cero, no tenían forma de saber cuándo sus programas en C terminaban correctamente"&lt;br/&gt;&lt;em&gt;-- Robert Firth&lt;/em&gt;&lt;/li&gt;&lt;br/&gt;&lt;/ol&gt;&lt;br/&gt;&lt;h3&gt;Java&lt;/h3&gt;&lt;br/&gt;&lt;ol&gt;&lt;br/&gt;	&lt;li&gt;"Java es, en muchos sentidos, C++-"&lt;br/&gt;&lt;em&gt;-- Michael Feldman&lt;br/&gt;&lt;/em&gt;&lt;/li&gt;&lt;br/&gt;	&lt;li&gt;"Decir que Java es estupendo porque funciona con todos los sistemas operativos es como decir que el sexo anal es estupendo porque funciona con todos los géneros"&lt;br/&gt;&lt;em&gt;-- Alanna&lt;br/&gt;&lt;/em&gt;&lt;/li&gt;&lt;br/&gt;	&lt;li&gt;"Bien, Java podría ser un buen ejemplo de cómo debería ser un lenguaje de programación. Sin embargo, las aplicaciones Java son buenos ejemplos de cómo las aplicaciones no deberían ser"&lt;br/&gt;&lt;em&gt;-- Pixadel&lt;br/&gt;&lt;/em&gt;&lt;/li&gt;&lt;br/&gt;	&lt;li&gt;"Si Java dispusiera de un mecanismo real de recolección de basura, la mayoría de los programas deberían autoeliminarse al ser ejecutados"&lt;br/&gt;&lt;em&gt;-- Robert Sewell&lt;/em&gt;&lt;/li&gt;&lt;br/&gt;&lt;/ol&gt;&lt;br/&gt;&lt;h3&gt;Software libre&lt;/h3&gt;&lt;br/&gt;&lt;ol&gt;&lt;br/&gt;	&lt;li&gt;"El software es como el sexo: mejor si es libre y gratis"&lt;br/&gt;&lt;em&gt;-- Linus Torvalds&lt;/em&gt;&lt;/li&gt;&lt;br/&gt;	&lt;li&gt;"Las únicas personas que tienen algo que temer de software libre son aquellos cuyos productos tienen un valor aún menor"&lt;br/&gt;&lt;em&gt;-- David Emery&lt;br/&gt;&lt;/em&gt;&lt;/li&gt;&lt;br/&gt;&lt;/ol&gt;&lt;br/&gt;&lt;h3&gt;Código&lt;/h3&gt;&lt;br/&gt;&lt;ol&gt;&lt;br/&gt;	&lt;li&gt;"El buen código es su mejor documentación"&lt;br/&gt;&lt;em&gt;-- Steve McConnell&lt;br/&gt;&lt;/em&gt;&lt;/li&gt;&lt;br/&gt;	&lt;li&gt;"Cualquier código tuyo que no hayas mirado en los últimos seis meses o más es como si lo hubiese escrito otro"&lt;br/&gt;&lt;em&gt;-- Eagleson's Law&lt;/em&gt;&lt;/li&gt;&lt;br/&gt;	&lt;li&gt;"El primer 90% del código corresponde al primer 90% del tiempo de desarrollo. El 10% restante corresponde al otro 90% del desarrollo"&lt;br/&gt;&lt;em&gt;-- Tom Cargill&lt;/em&gt;&lt;/li&gt;&lt;br/&gt;&lt;/ol&gt;&lt;br/&gt;&lt;h3&gt;Desarrollo de software&lt;/h3&gt;&lt;br/&gt;&lt;ol&gt;&lt;br/&gt;	&lt;li&gt;"Los buenos programadores usan sus cerebros, pero unas buenas directrices nos ahorran de tener que hacerlo en cada caso"&lt;br/&gt;&lt;em&gt;-- Francis Glassborow&lt;/em&gt;&lt;/li&gt;&lt;br/&gt;	&lt;li&gt;"En software, muy raramente partimos de requisitos con sentido. Incluso teniéndolos, la única medida del éxito que importa es si nuestra solución resuelve la cambiante idea que el cliente tiene de lo que es su problema"&lt;br/&gt;&lt;em&gt;-- Jeff Atwood&lt;/em&gt;&lt;/li&gt;&lt;br/&gt;	&lt;li&gt;"Considerando el lamentable estado de nuestras aplicaciones informáticas actuales, el desarrollo de software es todavía un arte oscuro, y no puede ser aún considerado una ingeniería"&lt;br/&gt;&lt;em&gt;-- Bill Clinton&lt;/em&gt;&lt;/li&gt;&lt;br/&gt;	&lt;li&gt;"No puedes crear un gran software sin un gran equipo, y la mayoría de los equipos de desarrollo se comportan como familias disfuncionales"&lt;br/&gt;&lt;em&gt;-- Jim McCarthy&lt;br/&gt;&lt;/em&gt;&lt;/li&gt;&lt;br/&gt;&lt;/ol&gt;&lt;br/&gt;&lt;h3&gt;Depuración&lt;/h3&gt;&lt;br/&gt;&lt;ol&gt;&lt;br/&gt;	&lt;li&gt;"Tan pronto como comenzamos a programar encontramos, para nuestra sorpresa, que crear programas correctos no era tan fácil como habíamos pensado. Tuvo que descubrirse la depuración. Puedo recordar el instante exacto en el que me dí cuenta que una gran parte de mi vida desde entonces iba a pasarla encontrando errores en mis propios programas"&lt;br/&gt;&lt;em&gt;-- Maurice Wilkes descubre la depuración, 1949&lt;/em&gt;&lt;/li&gt;&lt;br/&gt;	&lt;li&gt;"Depurar es al menos dos veces más duro que escribir el código por primera vez. Por tanto, si tu escribes el código de la forma más inteligente posible no serás, por definición, lo suficientemente inteligente para depurarlo"&lt;br/&gt;&lt;cite&gt;-- Brian Kernighan&lt;br/&gt;&lt;/cite&gt;&lt;/li&gt;&lt;br/&gt;	&lt;li&gt;"Si la depuración es el proceso de eliminar errores, entonces la programación debe ser el proceso de introducirlos"&lt;br/&gt;&lt;em&gt;-- Edsger W. Dijkstra&lt;/em&gt;&lt;/li&gt;&lt;br/&gt;&lt;/ol&gt;&lt;br/&gt;&lt;h3&gt;Calidad&lt;/h3&gt;&lt;br/&gt;&lt;ol&gt;&lt;br/&gt;	&lt;li&gt;"¡No me importa si funciona en tu máquina! ¡No estamos vendiendo tu máquina!"&lt;br/&gt;&lt;em&gt;-- Vidiu Platon&lt;br/&gt;&lt;/em&gt;&lt;/li&gt;&lt;br/&gt;	&lt;li&gt;"Programar es como el sexo: un único error y tienes que estar soportándolo toda la vida"&lt;br/&gt;&lt;em&gt;-- Michael Sinz&lt;br/&gt;&lt;/em&gt;&lt;/li&gt;&lt;br/&gt;	&lt;li&gt;"Hay dos formas de escribir programas sin errores; sólo la tercera funciona"&lt;br/&gt;&lt;em&gt;-- Alan J. Perlis&lt;br/&gt;&lt;/em&gt;&lt;/li&gt;&lt;br/&gt;	&lt;li&gt;"Puedes tener un software de calidad o puedes tener aritmética de punteros, pero no puedes tener ambas cosas al mismo tiempo"&lt;br/&gt;&lt;em&gt;-- Bertrand Meyer&lt;/em&gt;&lt;/li&gt;&lt;br/&gt;	&lt;li&gt;"Si McDonnalds funcionara como una compañía de software, uno de cada cien Big Macs te envenenarían, y la respuesta sería 'lo sentimos, aquí tiene un cupón para dos más'"&lt;br/&gt;&lt;em&gt;-- Mark Minasi&lt;/em&gt;&lt;/li&gt;&lt;br/&gt;	&lt;li&gt;"Codifica siempre como si la persona que finalmente mantendrá tu código fuera un psicópata violento que sabe dónde vives"&lt;br/&gt;&lt;em&gt;-- Martin Golding&lt;/em&gt;&lt;/li&gt;&lt;br/&gt;	&lt;li&gt;"Cometer errores es humano, pero para estropear realmente las cosas necesitas un ordenador"&lt;br/&gt;&lt;em&gt;-- Paul Ehrlich&lt;/em&gt;&lt;/li&gt;&lt;br/&gt;	&lt;li&gt;"Un ordenador te permite cometer más errores y más rápido que cualquier otra invención en la historia de la humanidad, con las posibles excepciones de las pistolas y el tequila"&lt;br/&gt;&lt;em&gt;-- Mitch Radcliffe&lt;/em&gt;&lt;/li&gt;&lt;br/&gt;&lt;/ol&gt;&lt;br/&gt;&lt;h3&gt;Predicciones&lt;/h3&gt;&lt;br/&gt;&lt;ol&gt;&lt;br/&gt;	&lt;li&gt;"Todo lo que puede ser inventado ha sido ya inventado"&lt;br/&gt;&lt;em&gt;-- Charles H. Duell, Comisario de oficina de Patentes en EEUU, en 1899&lt;/em&gt;&lt;/li&gt;&lt;br/&gt;	&lt;li&gt;"Pienso que hay mercado en el mundo como para unos cinco ordenadores"&lt;br/&gt;&lt;em&gt;-- Thomas J. Watson, Presidente de la Junta Directiva de IBM, sobre 1948&lt;br/&gt;&lt;/em&gt;&lt;/li&gt;&lt;br/&gt;	&lt;li&gt;"Podría parecer que hemos llegado a los límites alcanzables por la tecnología informática, aunque uno debe ser prudente con estas afirmaciones, pues tienden a sonar bastante tontas en cinco años"&lt;br/&gt;&lt;em&gt;-- John Von Neumann, sobre 1949&lt;br/&gt;&lt;/em&gt;&lt;/li&gt;&lt;br/&gt;	&lt;li&gt;"Pero, ¿para qué puede valer eso?"&lt;br/&gt;&lt;em&gt;-- Ingeniero en la división de sistemas informáticos avanzados de IBM, hablando sobre los microchips, en 1968&lt;br/&gt;&lt;/em&gt;&lt;/li&gt;&lt;br/&gt;	&lt;li&gt;"No hay ninguna razón para que un individuo tenga un ordenador en su casa"&lt;br/&gt;&lt;em&gt;-- Ken Olson, Presidente de Digital Equipment Corporation, en 1977&lt;br/&gt;&lt;/em&gt;&lt;/li&gt;&lt;br/&gt;	&lt;li&gt;"640K deberían ser suficientes para todo el mundo"&lt;br/&gt;&lt;em&gt;-- Bill Gates, 1981&lt;/em&gt;&lt;/li&gt;&lt;br/&gt;	&lt;li&gt;"Windows NT podrá direccionar 2GB de RAM, que es más de lo que cualquier aplicación va a necesitar jamás"&lt;br/&gt;&lt;em&gt;-- Microsoft, durante el desarrollo de Windows NT, en 1992&lt;br/&gt;&lt;/em&gt;&lt;/li&gt;&lt;br/&gt;	&lt;li&gt;"Nunca seremos realmente una sociedad sin papeles hasta que la gente de la Palm Pilot creen 'WipeMe 1.0'"&lt;br/&gt;&lt;em&gt;-- Andy Pierson&lt;br/&gt;(Nota: Wipe es la traducción de toallita de papel) &lt;/em&gt;&lt;/li&gt;&lt;br/&gt;	&lt;li&gt;"Si las cosas siguen así, al hombre se le atrofiarán todas sus extremidades excepto los dedos de pulsar los botones"&lt;br/&gt;&lt;em&gt;-- Frank Lloyd Wright&lt;/em&gt;&lt;/li&gt;&lt;br/&gt;&lt;/ol&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8219062580832314459-1531529461953579248?l=www.sqleros.com.ar' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/BlogSqleros/~4/dSN0eZ-wMCg" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.sqleros.com.ar/feeds/1531529461953579248/comments/default" title="Enviar comentarios" /><link rel="replies" type="text/html" href="http://www.sqleros.com.ar/2011/03/101-citas-celebres-del-mundo-de-la.html#comment-form" title="0 comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8219062580832314459/posts/default/1531529461953579248?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8219062580832314459/posts/default/1531529461953579248?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/BlogSqleros/~3/dSN0eZ-wMCg/101-citas-celebres-del-mundo-de-la.html" title="101 citas célebres del mundo de la informática" /><author><name>Ramms ZeñábI</name><uri>http://www.blogger.com/profile/05084493704196673506</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="13715620155140962144" /></author><thr:total>0</thr:total><feedburner:origLink>http://www.sqleros.com.ar/2011/03/101-citas-celebres-del-mundo-de-la.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkUDQnsyeCp7ImA9WhZXEUk.&quot;"><id>tag:blogger.com,1999:blog-8219062580832314459.post-7978043318830640169</id><published>2011-03-17T06:27:00.000-06:00</published><updated>2011-04-30T02:24:33.590-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-04-30T02:24:33.590-05:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Frikadas" /><category scheme="http://www.blogger.com/atom/ns#" term="tips" /><category scheme="http://www.blogger.com/atom/ns#" term="programacion" /><category scheme="http://www.blogger.com/atom/ns#" term="kaizen" /><category scheme="http://www.blogger.com/atom/ns#" term="google" /><title>Tips para ser un mejor programador</title><content type="html">
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/uIySHSUxQkE3nmMmdhrpEQQY5uo/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/uIySHSUxQkE3nmMmdhrpEQQY5uo/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/uIySHSUxQkE3nmMmdhrpEQQY5uo/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/uIySHSUxQkE3nmMmdhrpEQQY5uo/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;p style="text-align: justify;"&gt;&lt;strong&gt;1. Estudia, estudia y estudia&lt;/strong&gt;&lt;br/&gt;El estudiar nos permite perfeccionarnos, cuanto mas estudiemos mas oportunidades de programar mejor tendremos, no solamente estoy hablando de universidades, ni tampoco de cursos, hoy por hoy gracias a internet existen&lt;a name='more'&gt;&lt;/a&gt; infinidad de tutoriales y manuales, sin ir mas lejos el sitio oficial de PHP es realmente muy bueno.&lt;/p&gt;&lt;br/&gt;&lt;p style="text-align: justify;"&gt;&lt;strong&gt;2. Busca antes de preguntar&lt;/strong&gt;&lt;br/&gt;Esto es un mal común del que quiere aprender a programar, es mas fácil preguntarle a alguien que sepa, pero realmente no tiene que ser así por varias razones, primero por que es algo de muy de vago, luego que cuando alguien nos da la respuesta fácil no aprendemos nada, lo interesante cuando se nos presenta un problema es buscar la solución nosotros mismos, sino damos con la respuesta recién ahí preguntar, este ejercicio realmente es muy beneficio, nos permite preparar nuestra cabeza para solucionar futuros problemas.&lt;/p&gt;&lt;br/&gt;&lt;p style="text-align: justify;"&gt;&lt;strong&gt;3. Busca scripts ya desarrollados&lt;/strong&gt;&lt;br/&gt;Por lo general podemos encontrar muchas funciones, scripts listos para utilizar, pero lo interesante es estudiarlos, ver como funcionan, de ahí aprendemos si copiamos y pegamos vamos mal.&lt;/p&gt;&lt;br/&gt;&lt;p style="text-align: justify;"&gt;&lt;strong&gt;4. Lee el código fuente libre&lt;/strong&gt;&lt;br/&gt;Yo muchas veces descargo algunas aplicaciones para ver como están programadas, de verdad que se aprende mucho, a medida que realicemos esta practica cada vez iremos aprendiendo mas, en especial si estas aplicaciones son de uso popular en donde miles de programadores del mundo “meten” mano para mejorarla. Un buen ejemplo de esto es WordPress.&lt;/p&gt;&lt;br/&gt;&lt;p style="text-align: justify;"&gt;&lt;img src="http://www.kabytes.com/wp-content/uploads/2007/11/codigo-php.jpg" alt="" width="490" height="171" /&gt;&lt;/p&gt;&lt;br/&gt;&lt;p style="text-align: justify;"&gt;5. &lt;strong&gt;No copies y pegues&lt;/strong&gt;&lt;br/&gt;Es fácil, entramos a google buscamos una función que sirva para lo estamos necesitando y listo. Pero la realidad es que no siempre lo que descargamos es correcto, y si luego tenemos que solucionar un problema lo mas probable es que no tengamos ni idea por donde empezar. Ni hablar del factor aprendizaje cero que esta practica implica.&lt;/p&gt;&lt;br/&gt;&lt;p style="text-align: justify;"&gt;&lt;strong&gt;6. Buscar el momento para programar&lt;/strong&gt;&lt;br/&gt;Estas sentado delante de tu ordenador, llaman por teléfono, tu compañero de trabajo o familiar te pregunta algo, realmente es lo mas molesto e incomodo que hay, es difícil concentrarse, es preferible hacer algo mas “Light” antes de programar algo mal y después tener que arreglarlo.&lt;/p&gt;&lt;br/&gt;&lt;p style="text-align: justify;"&gt;&lt;strong&gt;7. Ten tu propia Wiki&lt;/strong&gt;&lt;br/&gt;Esto lo recomiendo muchísimo, es muy sencillo instalar una Wiki en nuestra pc, simplemente podemos descargar el Easyphp y tener en nuestro ordenar un servidor funcional, y mejor aun si quieres hacer la instalación “a mano”. La wiki es interesante para poder almacenar rutinas que usamos frecuentemente, en mi caso suelo guardar validaciones, etc. Una vez que aprendimos a hacer algo y lo tenemos lo mejor posible es interesante tenerlo a mano para no perder tiempo escribiendo lo mismo una y otra vez.&lt;/p&gt;&lt;br/&gt;&lt;p style="text-align: justify;"&gt;&lt;strong&gt;8. Comenta todo lo que sea necesario&lt;/strong&gt;&lt;br/&gt;Escribir comentarios en el código suele ser bastante molesto y parecer innecesario, pero comentar las cosas importantes nos puede ahorrar mucho tiempo cuando tengamos que retocar el código meses después.&lt;/p&gt;&lt;br/&gt;&lt;p style="text-align: justify;"&gt;&lt;strong&gt;9. Participa en foros/comunidades&lt;/strong&gt;&lt;br/&gt;Es interesante para interactuar con otras personas que estén en nuestra misma sintonía, muchas veces ayudaremos nosotros y otra vez nos podrán ayudar. En línea general estas comunidades tienen muy buena onda, y la ayuda mutua es lo que abunda, unas líneas de código pueden ser útiles para muchas personas, de ahí que entre todos se puede perfeccionar. Recuerden respetar el punto 2.&lt;/p&gt;&lt;br/&gt;&lt;p style="text-align: justify;"&gt;&lt;strong&gt;10. Habla con otros programadores&lt;/strong&gt;&lt;br/&gt;Mensajería instantánea, en un café, por teléfono, etc. Es interesante tener amigos que están en lo mismo, no solamente por el tema de la ayuda mutua, estos grupos suelen ser también de ayuda “emocional” del programador, unos chistes, algún comentario puede ser una inyección de energía para continuar con un problema que no podemos resolver.&lt;/p&gt;&lt;br/&gt;&lt;p style="text-align: justify;"&gt;&lt;strong&gt;11. Tiempo libre para otras cosas&lt;/strong&gt;&lt;br/&gt;Me encanta programar, pero entendi que no es lo unico en la vida, a veces es bueno una salida, una película, realmente es necesario desenchufarnos.&lt;/p&gt;&lt;br/&gt;&lt;p style="text-align: justify;"&gt;&lt;strong&gt;12. Arma tu bunker&lt;/strong&gt;&lt;br/&gt;Tener un espacio de trabajo acorde con tus gustos es indispensable para programar, un buen sillón que no dañe nuestra columna, un lindo escritorio que nos permita desparramar CDS, libros, etc. También hay que ser organizado, pero siempre a nuestro gusto, es bueno que sea TU espacio y que nadie meta mano, uno a la larga lo termina sintiendo como un refugio.&lt;/p&gt;&lt;br/&gt;&lt;p style="text-align: justify;"&gt;&lt;img src="http://www.kabytes.com/wp-content/uploads/2007/11/bunker-descanso.jpg" alt="" width="490" height="171" /&gt;&lt;/p&gt;&lt;br/&gt;&lt;p style="text-align: justify;"&gt;&lt;strong&gt;13. Tu equipo en condiciones&lt;/strong&gt;&lt;br/&gt;Otro punto importante, una buena computadora, que no tenga problemas, si es necesario un poco mas de RAM, no hace falta tener una supermáquina para programar con PHP pero si algo que no se este colgando cada 2 seg.&lt;/p&gt;&lt;br/&gt;&lt;p style="text-align: justify;"&gt;&lt;strong&gt;14. Usa herramientas gratuitas&lt;/strong&gt;&lt;br/&gt;Si no podes pagar ciertas herramientas realmente ni te gastes en bajar las versiones piratas, en PHP no se necesita mucho y realmente no vale la pena estar trucando programas.&lt;/p&gt;&lt;br/&gt;&lt;p style="text-align: justify;"&gt;&lt;strong&gt;15. Organiza tu propia biblioteca de scripts&lt;/strong&gt;&lt;br/&gt;Relacionado con el punto 7. La wiki es muy buena, pero hay que tenerla organizada, sino encontrar algo puede llevarnos mas tiempo que volverlo a escribir. Yo soy bastante desorganizado, pero con los años aprendí a manejar mi problemita &lt;img src="http://s0.wp.com/wp-includes/images/smilies/icon_biggrin.gif?m=1268502178g" alt=":D" /&gt;&lt;/p&gt;&lt;br/&gt;&lt;p style="text-align: justify;"&gt;&lt;strong&gt;16. Se agradecido con los que te ayudan&lt;/strong&gt;&lt;br/&gt;Si alguien te ayuda, por favor al menos di gracias. Recuerda que las personas que te rodean no son tu soporte técnico (Al menos que les pagues). Si alguien se molesta en responder a tus consultas agradécele, para la próxima esa persona seguirá teniendo buena predisposición.&lt;/p&gt;&lt;br/&gt;&lt;p style="text-align: justify;"&gt;&lt;strong&gt;17. Se humilde (IMPORTANTE)&lt;/strong&gt;&lt;br/&gt;Esencial. Siempre hay alguien que sabe más que uno y mas en este “rubro” en donde hay verdaderos cráneos, Yo hace varios años que programo en PHP y sin embargo siempre aprendo algo nuevo, y en parte eso es lo que me gusta de programar, siempre se puede mejorar.&lt;/p&gt;&lt;br/&gt;&lt;p style="text-align: justify;"&gt;&lt;strong&gt;18. Siempre busca perfeccionarte&lt;/strong&gt;&lt;br/&gt;Relacionado con el punto anterior. Las tecnologías evolucionan y nosotros debemos hacer lo mismo. Una linda practica cuando tenemos un poco de tiempo libre es tratar de optimizar un código nuestro de unos meses anteriores, si aprendimos cosas nuevas de seguro que podemos hacerlo mejor que antes.&lt;/p&gt;&lt;br/&gt;&lt;p style="text-align: justify;"&gt;&lt;strong&gt;19. Intenta ser eficiente y luego inténtalo de nuevo&lt;/strong&gt;&lt;br/&gt;Que funcione no quiere decir que este bien. También una de las cosas más lindas de programar: Siempre se puede hacer una función mas eficiente, que consuma menos recursos, no hay que conformarse que arroje los resultados que queremos, probablemente lo podemos hacer mejor.&lt;/p&gt;&lt;br/&gt;&lt;p style="text-align: justify;"&gt;&lt;strong&gt;20. Programa primero lo que menos te gusta&lt;/strong&gt;&lt;br/&gt;Esto es bastante personal, pero por lo general me da buenos resultados. Cuando me siento a programar algo los primeros minutos son de “ambientación” luego tengo un periodo de concentracion digamos maxima, en ese momento las cosas que parecen o son mas complicadas son cuando mas rápido y mejor salen, luego cuando uno esta mas cansado puede dedicarse a las cosas mas sencillas y rutinarias.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8219062580832314459-7978043318830640169?l=www.sqleros.com.ar' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/BlogSqleros/~4/gDNALtoT8DI" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.sqleros.com.ar/feeds/7978043318830640169/comments/default" title="Enviar comentarios" /><link rel="replies" type="text/html" href="http://www.sqleros.com.ar/2011/03/tips-para-ser-un-mejor-programador.html#comment-form" title="0 comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8219062580832314459/posts/default/7978043318830640169?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8219062580832314459/posts/default/7978043318830640169?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/BlogSqleros/~3/gDNALtoT8DI/tips-para-ser-un-mejor-programador.html" title="Tips para ser un mejor programador" /><author><name>Ramms ZeñábI</name><uri>http://www.blogger.com/profile/05084493704196673506</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="13715620155140962144" /></author><thr:total>0</thr:total><feedburner:origLink>http://www.sqleros.com.ar/2011/03/tips-para-ser-un-mejor-programador.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkUDQnsyeCp7ImA9WhZXEUk.&quot;"><id>tag:blogger.com,1999:blog-8219062580832314459.post-2816668251360659009</id><published>2011-02-15T14:12:00.000-06:00</published><updated>2011-04-30T02:24:33.590-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-04-30T02:24:33.590-05:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term=".net" /><category scheme="http://www.blogger.com/atom/ns#" term="T-SQL" /><category scheme="http://www.blogger.com/atom/ns#" term="programacion" /><category scheme="http://www.blogger.com/atom/ns#" term="C#" /><category scheme="http://www.blogger.com/atom/ns#" term="LINQ" /><title>LINQ: Consulta Maestro-Detalle</title><content type="html">
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/7FQASSEQ_pQ3Ns6d_fDmhcahWsY/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/7FQASSEQ_pQ3Ns6d_fDmhcahWsY/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/7FQASSEQ_pQ3Ns6d_fDmhcahWsY/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/7FQASSEQ_pQ3Ns6d_fDmhcahWsY/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;h4&gt;Problema&lt;/h4&gt;&lt;br/&gt;Lo primero, voy a exponer el problema que me han planteado:&lt;br/&gt;&lt;blockquote&gt;&lt;em&gt;Dada  una tabla, digamos, “Cabecera”, con una tabla relacionada de “Detalle”  con una relación 1 a &lt;a name='more'&gt;&lt;/a&gt;N. Necesitamos mostrar todos los datos del detalle,  asociados a una fila de la cabecera sin repetir los datos de la  cabecera.&lt;/em&gt;&lt;/blockquote&gt;&lt;br/&gt;&lt;em&gt;Digamos que la representación Sería algo así:&lt;/em&gt;&lt;br/&gt;&lt;table border="0" cellspacing="0" cellpadding="0"&gt;&lt;br/&gt;&lt;tbody&gt;&lt;br/&gt;&lt;tr&gt;&lt;br/&gt;&lt;td width="208"&gt;Cabecera&lt;/td&gt;&lt;br/&gt;&lt;td width="104"&gt;&lt;/td&gt;&lt;br/&gt;&lt;td width="104"&gt;&lt;/td&gt;&lt;br/&gt;&lt;/tr&gt;&lt;br/&gt;&lt;tr&gt;&lt;br/&gt;&lt;td&gt;C1&lt;/td&gt;&lt;br/&gt;&lt;td&gt;C2&lt;/td&gt;&lt;br/&gt;&lt;td&gt;C3&lt;/td&gt;&lt;br/&gt;&lt;td&gt;&lt;/td&gt;&lt;br/&gt;&lt;/tr&gt;&lt;br/&gt;&lt;tr&gt;&lt;br/&gt;&lt;td&gt;1&lt;/td&gt;&lt;br/&gt;&lt;td&gt;P1&lt;/td&gt;&lt;br/&gt;&lt;td&gt;01/01/2011&lt;/td&gt;&lt;br/&gt;&lt;td&gt;&lt;/td&gt;&lt;br/&gt;&lt;/tr&gt;&lt;br/&gt;&lt;tr&gt;&lt;br/&gt;&lt;td&gt;2&lt;/td&gt;&lt;br/&gt;&lt;td&gt;P2&lt;/td&gt;&lt;br/&gt;&lt;td&gt;01/02/2011&lt;/td&gt;&lt;br/&gt;&lt;td&gt;&lt;/td&gt;&lt;br/&gt;&lt;/tr&gt;&lt;br/&gt;&lt;tr&gt;&lt;br/&gt;&lt;td&gt;&lt;/td&gt;&lt;br/&gt;&lt;td&gt;&lt;/td&gt;&lt;br/&gt;&lt;td&gt;&lt;/td&gt;&lt;br/&gt;&lt;td&gt;&lt;/td&gt;&lt;br/&gt;&lt;/tr&gt;&lt;br/&gt;&lt;tr&gt;&lt;br/&gt;&lt;td&gt;Detalle&lt;/td&gt;&lt;br/&gt;&lt;td&gt;&lt;/td&gt;&lt;br/&gt;&lt;td&gt;&lt;/td&gt;&lt;br/&gt;&lt;/tr&gt;&lt;br/&gt;&lt;tr&gt;&lt;br/&gt;&lt;td&gt;1&lt;/td&gt;&lt;br/&gt;&lt;td&gt;1&lt;/td&gt;&lt;br/&gt;&lt;td&gt;D1&lt;/td&gt;&lt;br/&gt;&lt;td&gt;&lt;/td&gt;&lt;br/&gt;&lt;/tr&gt;&lt;br/&gt;&lt;tr&gt;&lt;br/&gt;&lt;td&gt;2&lt;/td&gt;&lt;br/&gt;&lt;td&gt;1&lt;/td&gt;&lt;br/&gt;&lt;td&gt;D2&lt;/td&gt;&lt;br/&gt;&lt;td&gt;&lt;/td&gt;&lt;br/&gt;&lt;/tr&gt;&lt;br/&gt;&lt;tr&gt;&lt;br/&gt;&lt;td&gt;3&lt;/td&gt;&lt;br/&gt;&lt;td&gt;1&lt;/td&gt;&lt;br/&gt;&lt;td&gt;D3&lt;/td&gt;&lt;br/&gt;&lt;td&gt;&lt;/td&gt;&lt;br/&gt;&lt;/tr&gt;&lt;br/&gt;&lt;tr&gt;&lt;br/&gt;&lt;td&gt;4&lt;/td&gt;&lt;br/&gt;&lt;td&gt;2&lt;/td&gt;&lt;br/&gt;&lt;td&gt;D1&lt;/td&gt;&lt;br/&gt;&lt;td&gt;&lt;/td&gt;&lt;br/&gt;&lt;/tr&gt;&lt;br/&gt;&lt;tr&gt;&lt;br/&gt;&lt;td&gt;5&lt;/td&gt;&lt;br/&gt;&lt;td&gt;2&lt;/td&gt;&lt;br/&gt;&lt;td&gt;D4&lt;/td&gt;&lt;br/&gt;&lt;td&gt;&lt;/td&gt;&lt;br/&gt;&lt;/tr&gt;&lt;br/&gt;&lt;tr&gt;&lt;br/&gt;&lt;td&gt;&lt;/td&gt;&lt;br/&gt;&lt;td&gt;&lt;/td&gt;&lt;br/&gt;&lt;td&gt;&lt;/td&gt;&lt;br/&gt;&lt;td&gt;&lt;/td&gt;&lt;br/&gt;&lt;/tr&gt;&lt;br/&gt;&lt;tr&gt;&lt;br/&gt;&lt;td&gt;RESULTADO A OBTENER&lt;/td&gt;&lt;br/&gt;&lt;td&gt;&lt;/td&gt;&lt;br/&gt;&lt;td&gt;&lt;/td&gt;&lt;br/&gt;&lt;td&gt;&lt;/td&gt;&lt;br/&gt;&lt;/tr&gt;&lt;br/&gt;&lt;tr&gt;&lt;br/&gt;&lt;td&gt;1&lt;/td&gt;&lt;br/&gt;&lt;td&gt;P1&lt;/td&gt;&lt;br/&gt;&lt;td&gt;01/01/2011&lt;/td&gt;&lt;br/&gt;&lt;td&gt;D1, D2, D3&lt;/td&gt;&lt;br/&gt;&lt;/tr&gt;&lt;br/&gt;&lt;tr&gt;&lt;br/&gt;&lt;td&gt;2&lt;/td&gt;&lt;br/&gt;&lt;td&gt;P2&lt;/td&gt;&lt;br/&gt;&lt;td&gt;01/02/2011&lt;/td&gt;&lt;br/&gt;&lt;td&gt;D1,D4&lt;/td&gt;&lt;br/&gt;&lt;/tr&gt;&lt;br/&gt;&lt;/tbody&gt;&lt;br/&gt;&lt;/table&gt;&lt;br/&gt;&lt;blockquote&gt;&lt;br/&gt;&lt;h4&gt;Enfoques&lt;/h4&gt;&lt;br/&gt;Así a bote pronto, se me ocurren 3 posibles enfoques:&lt;br/&gt;&lt;ol&gt;&lt;br/&gt;	&lt;li&gt;Hacerlo desde la BD.&lt;/li&gt;&lt;br/&gt;	&lt;li&gt;Hacerlo desde Código .NET con bucles…&lt;/li&gt;&lt;br/&gt;	&lt;li&gt;Hacerlo con LINQ&lt;/li&gt;&lt;br/&gt;&lt;/ol&gt;&lt;br/&gt;&lt;strong&gt;¿Hacerlo desde la BD?&lt;/strong&gt;&lt;br/&gt;&lt;br/&gt;La  primera opción que se me ha ocurrido (por eso de que me gustan bastante  las BD), ha sido: Esto se podría resolver creando un SP, Función y a  través de un cursor devolver el dato separado por el carácter indicado.&lt;br/&gt;&lt;br/&gt;Es una opción que he descartado porque no siempre tenemos la opción de modificar la BD a nuestro gusto.&lt;br/&gt;&lt;br/&gt;&lt;strong&gt;¿Hacerlo desde Código .NET?&lt;/strong&gt;&lt;br/&gt;&lt;br/&gt;La  siguiente alternativa sería, obtener los datos desde la BD con una  consulta “JOIN” entre las tablas de Cabecera y Detalle, recorrer las  filas, y generar un “nuevo DataTable”…&lt;br/&gt;&lt;br/&gt;Descartada….&lt;br/&gt;&lt;br/&gt;&lt;strong&gt;¿Hacerlo con  LINQ?&lt;/strong&gt;&lt;br/&gt;&lt;br/&gt;La  opción de LINQ, nos va a permitir que no solamente lo podamos hacer  contra la BD (ya sea con EF o con LINQTOSQL), sino también contra  Objetos o XML…&lt;br/&gt;&lt;br/&gt;Para demostrarlo voy a mostrar un pequeño Ejemplo con una Clase y Listas.&lt;br/&gt;&lt;h4&gt;EJEMPLO&lt;/h4&gt;&lt;br/&gt;Dada una clase Empleado:&lt;br/&gt;&lt;pre&gt;   1: public class Empleado&lt;/pre&gt;&lt;br/&gt;&lt;pre&gt;   2: {&lt;/pre&gt;&lt;br/&gt;&lt;pre&gt;   3:     public Empleado() { }&lt;/pre&gt;&lt;br/&gt;&lt;pre&gt;   4:     public Int32 ID { get; set; }&lt;/pre&gt;&lt;br/&gt;&lt;pre&gt;   5:     public String Nombre { get; set; }&lt;/pre&gt;&lt;br/&gt;&lt;pre&gt;   6:     public String Apellido { get; set; }&lt;/pre&gt;&lt;br/&gt;&lt;pre&gt;   7:     public List&amp;lt;string&amp;gt; Numeros { get; set; }&lt;/pre&gt;&lt;br/&gt;&lt;pre&gt;   8: }&lt;/pre&gt;&lt;br/&gt;La clase Empleado se va a corresponder con la tabla “Cabecera” y la lista Números  se va a corresponder con la tabla “Detalles”.&lt;br/&gt;&lt;br/&gt;A continuación, para obtener el resultado indicado arriba, voy a realizarlo a través de una consulta LINQ:&lt;br/&gt;&lt;pre&gt;   1: List&amp;lt;Empleado&amp;gt; listado = new List&amp;lt;Empleado&amp;gt;();&lt;/pre&gt;&lt;br/&gt;&lt;pre&gt;   2: //Rellenar Listado&lt;/pre&gt;&lt;br/&gt;&lt;pre&gt;   3: var consulta = from Empleado em in listado&lt;/pre&gt;&lt;br/&gt;&lt;pre&gt;   4:     let Numeros = string.Join(";", em.Numeros)&lt;/pre&gt;&lt;br/&gt;&lt;pre&gt;   5:     select new {&lt;/pre&gt;&lt;br/&gt;&lt;pre&gt;   6:     em.Nombre,&lt;/pre&gt;&lt;br/&gt;&lt;pre&gt;   7:     Numeros&lt;/pre&gt;&lt;br/&gt;&lt;pre&gt;   8:     };&lt;/pre&gt;&lt;br/&gt;En la consulta estoy empleado el Operador LET, el cual va a permitir  “almacenar” una expresión, en este caso el resultado de la función &lt;a href="http://msdn.microsoft.com/en-us/library/0h8wc12c.aspx" target="_blank"&gt;Join&lt;/a&gt; de la clase String, la cual se encarga de unir, un conjunto de datos, separándolos por el carácter indicado.&lt;br/&gt;&lt;br/&gt;Os dejo el &lt;a href="http://cid-3f59c33a50c6d482.office.live.com/self.aspx/.Public/LINQ%5E_LET%5E_JOIN.rar" target="_blank"&gt;enlace&lt;/a&gt; al proyecto de ejemplo que he utilizado para que lo comprobéis con vuestros ojos. :D&lt;br/&gt;&lt;br/&gt;¡Saludos!&lt;br/&gt;&lt;br/&gt;&lt;address&gt;&lt;em&gt;Inspirado en este &lt;a href="http://geeks.ms/blogs/jtorrecilla/archive/2011/02/15/linq-maestro-detalle-en-un-mismo-registro.aspx" target="_blank"&gt;post...&lt;/a&gt; (Emn... de hecho es igual... pero me gusto tanto que no podía cambiarlo...) :O&lt;/em&gt;&lt;/address&gt;&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8219062580832314459-2816668251360659009?l=www.sqleros.com.ar' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/BlogSqleros/~4/LvoV7R3MkRk" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.sqleros.com.ar/feeds/2816668251360659009/comments/default" title="Enviar comentarios" /><link rel="replies" type="text/html" href="http://www.sqleros.com.ar/2011/02/linq-consulta-maestro-detalle.html#comment-form" title="0 comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8219062580832314459/posts/default/2816668251360659009?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8219062580832314459/posts/default/2816668251360659009?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/BlogSqleros/~3/LvoV7R3MkRk/linq-consulta-maestro-detalle.html" title="LINQ: Consulta Maestro-Detalle" /><author><name>Ramms ZeñábI</name><uri>http://www.blogger.com/profile/05084493704196673506</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="13715620155140962144" /></author><thr:total>0</thr:total><feedburner:origLink>http://www.sqleros.com.ar/2011/02/linq-consulta-maestro-detalle.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkUDQnsyeCp7ImA9WhZXEUk.&quot;"><id>tag:blogger.com,1999:blog-8219062580832314459.post-7368479360689447857</id><published>2011-02-02T05:29:00.000-06:00</published><updated>2011-04-30T02:24:33.590-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-04-30T02:24:33.590-05:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Java" /><category scheme="http://www.blogger.com/atom/ns#" term="visual basic .net" /><category scheme="http://www.blogger.com/atom/ns#" term=".net" /><category scheme="http://www.blogger.com/atom/ns#" term="Frikadas" /><category scheme="http://www.blogger.com/atom/ns#" term="ASP.NET" /><category scheme="http://www.blogger.com/atom/ns#" term="programacion" /><category scheme="http://www.blogger.com/atom/ns#" term="mono" /><category scheme="http://www.blogger.com/atom/ns#" term="C#" /><title>Diez Años de .Net</title><content type="html">
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/gNQEEtx0iff6wgwfmvPnjQXoeCU/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/gNQEEtx0iff6wgwfmvPnjQXoeCU/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/gNQEEtx0iff6wgwfmvPnjQXoeCU/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/gNQEEtx0iff6wgwfmvPnjQXoeCU/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;p style="text-align: justify;"&gt;En el boletín de Microsoft del MSDN Flash que recibí este día dice que ya son 10 años de .Net y justamente recuerdo cuando inicie mis días de programación con .Net.&lt;/p&gt;&lt;br/&gt;&lt;p style="text-align: justify;"&gt;En aquella época estaba la versión 2002 de Visual Studio&lt;a name='more'&gt;&lt;/a&gt;, Framework 1.0, logicamente ustedes dirán como es que era versión 2002 si estan hablando hace 10 años, pues asi es ya que en el año 2001 Microsoft lanzó la versión beta, la cual utilicé solo para conocer que novedades ofrecía en ventaja de VB6, como dicen aqui en El Salvador, solo por deporte estaba con el .Net.&lt;/p&gt;&lt;br/&gt;&lt;p style="text-align: justify;"&gt;En la actualidad la con la versión 2010 mas el Service Pack 1, que recientemente fue lanzado, las facilidades que se tiene con el IDE eran inimaginables en aquellos días.&lt;/p&gt;&lt;br/&gt;&lt;p style="text-align: justify;"&gt;Por ejemplo:&lt;br/&gt;En la Versión 2002 los controles para Windows y Web de .Net eran bien básicos, introducieron el concepto de los template para el DataGrid en ASP Net. Los conceptos de separación del diseño Web del código era una novedad (bueno únicamente para los que estabamos en VB6 y Interdev, porque para los que estaban en Java eso ya era posible), el uso de controles de usuario web para reutilizarlos en la aplicación.&lt;/p&gt;&lt;br/&gt;&lt;p style="text-align: justify;"&gt;En fin eran varios conceptos nuevos, varios conceptos como los Web Services no eran novedosos en la industria, sino en los lenguajes Microsoft, y debido a la capacidad mercadológica de Microsoft se lograron posicionar frente a las otras opciones del mercado que a la fecha se ha convertido en una opción que todos toman en cuenta a la hora de tomar una decisión de en que plataforma de desarrollo deben de trabajar en una empresa.&lt;/p&gt;&lt;br/&gt;&lt;p style="text-align: justify;"&gt;Ahora en el 2011, tenemos además versiones Express, WebMatrix que el nombre en si, existió antes también ya que fue un proyecto que al final termino en las versiones Express que hoy en día conocemos; hoy tenemos conceptos como ASP Net MVC(antes de esto ya existía en Java, como Struts, Cocoon, etc.) , Silverlight que en un inicio surgió solamente para dar soporte Web a XAML e introducir con mas fuerza WPF, pero que hoy en día es una de las opciones para desarrollo móvil y web al mismo tiempo o las famosas RIA Applications (Aplicaciones vistosas para Internet como que fueran Windows), tenemos ADO Entity Framework y Linq(ORM si lo catalogamos como tal), Communication Foundation(la nueva opción de los Web Services), Workflow Foundation(opción a los flujos de trabajo con SQL y Sharepoint), etc.&lt;/p&gt;&lt;br/&gt;&lt;p style="text-align: justify;"&gt;La verdad es que hoy en día son múltiples las opciones que nos ofrece .Net, desde las versiones Express hasta la versión Ultimate con integración del equipo de desarrollo (ALM-Appication LifeCycle Management) con Team Foundation Server.&lt;/p&gt;&lt;br/&gt;&lt;p style="text-align: justify;"&gt;En aquel entonces la industria se estaba deshaciendo de Windows NT y Novel para entrar al mundo Windows 2000 con Active Directory, cambiando de Office 97 a Office 2000, una infinidad de nuevas tecnologías.&lt;/p&gt;&lt;br/&gt;&lt;p style="text-align: justify;"&gt;Viejos recuerdos, pero la pregunta de rigor es: ¿Y como estaremos en 10 años? ….. bueno un día de estos les platicaré mis ideas sobre la evolución de la tecnología.&lt;/p&gt;&lt;br/&gt;&lt;p style="text-align: justify;"&gt;“El fracaso tiene mil excusas, el éxito no requiere explicación”&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8219062580832314459-7368479360689447857?l=www.sqleros.com.ar' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/BlogSqleros/~4/0hWOeYZvmII" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.sqleros.com.ar/feeds/7368479360689447857/comments/default" title="Enviar comentarios" /><link rel="replies" type="text/html" href="http://www.sqleros.com.ar/2011/02/diez-anos-de-net.html#comment-form" title="0 comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8219062580832314459/posts/default/7368479360689447857?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8219062580832314459/posts/default/7368479360689447857?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/BlogSqleros/~3/0hWOeYZvmII/diez-anos-de-net.html" title="Diez Años de .Net" /><author><name>Ramms ZeñábI</name><uri>http://www.blogger.com/profile/05084493704196673506</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="13715620155140962144" /></author><thr:total>0</thr:total><feedburner:origLink>http://www.sqleros.com.ar/2011/02/diez-anos-de-net.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkUDQnsyeSp7ImA9WhZXEUk.&quot;"><id>tag:blogger.com,1999:blog-8219062580832314459.post-8860640625063777824</id><published>2011-01-22T16:22:00.000-06:00</published><updated>2011-04-30T02:24:33.591-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-04-30T02:24:33.591-05:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="SQL Server 2008" /><category scheme="http://www.blogger.com/atom/ns#" term="MySQL" /><category scheme="http://www.blogger.com/atom/ns#" term="ORACLE" /><category scheme="http://www.blogger.com/atom/ns#" term="SQL *PLUS" /><category scheme="http://www.blogger.com/atom/ns#" term="Open Source" /><category scheme="http://www.blogger.com/atom/ns#" term="SQL Server 2005" /><category scheme="http://www.blogger.com/atom/ns#" term="google" /><category scheme="http://www.blogger.com/atom/ns#" term="SQL" /><category scheme="http://www.blogger.com/atom/ns#" term="Apache" /><category scheme="http://www.blogger.com/atom/ns#" term="noSQL" /><title>Más allá de las bases de datos relacionales</title><content type="html">
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/cKnYTHOdRQjL1N60m6u2wQPG6KQ/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/cKnYTHOdRQjL1N60m6u2wQPG6KQ/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/cKnYTHOdRQjL1N60m6u2wQPG6KQ/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/cKnYTHOdRQjL1N60m6u2wQPG6KQ/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img title="supernova" src="http://javierav.com/wp-content/uploads/2009/08/supernova.jpg" alt="supernova" width="540" height="195" /&gt;&lt;br/&gt;&lt;br/&gt;Las bases de datos relacionales, como &lt;em&gt;MySQL&lt;/em&gt;, &lt;em&gt;PostgreSQL&lt;/em&gt; y varios productos comerciales, nos han servido bien durante muchos años. Últimamente, sin embargo, ha habido mucha discusión sobre si el modelo relacional está llegando al final&lt;a name='more'&gt;&lt;/a&gt; de su vida útil, y qué es lo que viene después de él.&lt;br/&gt;&lt;br/&gt;¿Qué motor de base de datos debería usar?&lt;br/&gt;&lt;br/&gt;Por supuesto, la respuesta es “depende”, pero esto no resulta de mucha ayuda. Déjame hacerte algunas preguntas para ayudarte a averiguar que tecnología es la apropiada para tu aplicación particular. Entonces, podré darte algunos consejos para que puedas conocer más.&lt;br/&gt;&lt;br/&gt;Ante todo, calma. Lo más probable es que la base de datos que uses actualmente funcione perfectamente bien por ahora. Pero es posible que quieras estar atento en caso de que note algunos de los síntomas que avisan que el modelo relacional está trabajando al límite. Algunos síntomas relacionados con la estructura de tus datos:&lt;br/&gt;&lt;ul&gt;&lt;br/&gt;	&lt;li&gt;¿Tienes tablas con varias columnas, y sólo algunas de ellas son actualmente usadas por una fila en particular?&lt;/li&gt;&lt;br/&gt;	&lt;li&gt;¿Tienes tablas atributo donde cada fila es&lt;/li&gt;&lt;br/&gt;&lt;/ul&gt;&lt;br/&gt;&lt;blockquote&gt;(clave foránea a una fila de otra tabla, nombre del atributo, valor del atributo)&lt;/blockquote&gt;&lt;br/&gt;y necesitas hacer feos joins en tus consultas para tratar con esas tablas?&lt;br/&gt;&lt;ul&gt;&lt;br/&gt;	&lt;li&gt;¿Has dejado de utilizar columnas para los datos estructurados, y en su lugar los serializar (a &lt;em&gt;JSON&lt;/em&gt;, &lt;em&gt;YAML&lt;/em&gt;,&lt;em&gt;XML&lt;/em&gt; y otros) y almacenas la cadena resultante en tu base de datos?&lt;/li&gt;&lt;br/&gt;	&lt;li&gt;¿Tiene tu esquema un gran número de tablas de unión muchos-a-muchos o estructuras tipo árbol (una clave foránea que hace referencia a una fila diferente de la misma tabla)?&lt;/li&gt;&lt;br/&gt;	&lt;li&gt;¿Encuentras que con frecuencia tienes que hacer cambios en tu esquema para poder representar adecuadamente los datos de entrada?&lt;/li&gt;&lt;br/&gt;&lt;/ul&gt;&lt;br/&gt;Otros síntomas relacionados con la escalabilidad de tu sistema:&lt;br/&gt;&lt;ul&gt;&lt;br/&gt;	&lt;li&gt;¿Estás alcanzando el límite de la capacidad de escritura con un sólo servidor? (Si tu problema es la capacidad de lectura, deberías establecer una replicación maestro-esclavo. Así mismo, asegurate que primero has puesto la base de datos en el servidor mas potente que puedas pagar, de que has optimizado tus consultas y que tu esquema no pueda dividirse fácilmente en fragmentos.&lt;/li&gt;&lt;br/&gt;	&lt;li&gt;¿Tu cantidad de datos es mayor que la que un sólo servidor puede manejar?&lt;/li&gt;&lt;br/&gt;	&lt;li&gt;¿La carga de tus páginas se ralentizan inaceptablemente por procesamientos en lote en segundo plano sobre la inmensa base de datos?&lt;/li&gt;&lt;br/&gt;&lt;/ul&gt;&lt;br/&gt;En mi opinión, se pone demasiado énfasis en la escalabilidad, a pesar de ser un problema muy lejano en la mayoría de los proyectos. Es comprensible – los sistemas a gran escala son sexis, y a todo el mundo le gusta pensar que están creando un servicio el cual va a ser muy popular – pero en la mayoría de las veces, los desarrolladores deberían centrarse en las necesidades de sus clientes, y resolver los problemas de escalabilidad sólo si realmente estos aparecen.&lt;br/&gt;&lt;br/&gt;Dicho esto, hay una razón más para considerar las bases de datos no relacionales: están de moda. Es una idea tonta basar una decisión técnica en una moda, pero recuerda el aspecto humano de los proyectos de gestión de software. Los desarrolladores en general queremos trabajar con gente guay en un ambiente guay y usando tecnología guay. Eso significa que si quieres contratar desarrolladores y les proporcionas todo este ambiente guay, tendrás una mejor oportunidad de conseguir a los mejores. La moda no debería ser la razón principal, pero si todo lo demás es igual, probablemente puedes tirar por el lado guay. Y ahora voy a dejar de decir guay – no es muy guay.&lt;br/&gt;&lt;h2&gt;Bases de datos documentales y la Big Table&lt;/h2&gt;&lt;br/&gt;Este &lt;a href="http://labs.google.com/papers/bigtable.html" target="_blank"&gt;artículo sobre la &lt;em&gt;BigTable&lt;/em&gt;&lt;/a&gt; describe cómo &lt;em&gt;Google&lt;/em&gt; ha desarrollado su propia base de datos altamente escalable para uso interno, como base de varios de sus servicios. El modelo de datos es un poco diferente del relacional: las columnas no necesitan ser predefinidas, y cada fila se puede agregar con cualquier conjunto de columnas. Las columnas vacías no se almacenan en absoluto.&lt;br/&gt;&lt;br/&gt;La &lt;em&gt;BigTable&lt;/em&gt; ha inspirado a muchos desarrolladores a escribir su propia implementación de este modelo de datos, dónde los más populares son &lt;em&gt;&lt;a title="HBase" href="http://hadoop.apache.org/hbase/" target="_blank"&gt;HBase&lt;/a&gt;&lt;/em&gt;, &lt;em&gt;&lt;a title="HyperTable" href="http://hypertable.org/" target="_blank"&gt;Hypertable&lt;/a&gt;&lt;/em&gt; y &lt;em&gt;&lt;a title="Cassandra" href="http://incubator.apache.org/cassandra/" target="_blank"&gt;Cassandra&lt;/a&gt;&lt;/em&gt;. La falta de un esquema predefinido pueden hacer atractivas estas bases de datos en aplicaciones dónde los atributos de los objectos no son conocidos de antemano, o cambian con frecuencia.&lt;br/&gt;&lt;br/&gt;Las bases de datos documentales poseen un modelo de datos relacionado (aunque la forma en que manejan la concurrencia y los servidores distribuidos puede ser un poco diferente): una fila en la &lt;em&gt;BigTable&lt;/em&gt; con un número arbitrario de columnas/atributos se corresponde a un documento en una base de datos documental, que normalmente es un árbol de objetos conteniendo los valores de los atributos y listas, a menudo mapeadas a&lt;em&gt;JSON&lt;/em&gt; o &lt;em&gt;XML&lt;/em&gt;. Bases de datos documentales de código abierto son &lt;em&gt;&lt;a title="Project Voldemort" href="http://project-voldemort.com/" target="_blank"&gt;Project Voldemort&lt;/a&gt;&lt;/em&gt;, &lt;em&gt;&lt;a title="CouchDB" href="http://couchdb.apache.org/" target="_blank"&gt;CouchDB&lt;/a&gt;&lt;/em&gt;, &lt;em&gt;&lt;a title="MongoDB" href="http://www.mongodb.org/" target="_blank"&gt;MongoDB&lt;/a&gt;&lt;/em&gt;,&lt;em&gt;&lt;a title="ThruDB" href="http://code.google.com/p/thrudb/" target="_blank"&gt;ThruDB&lt;/a&gt;&lt;/em&gt; y &lt;em&gt;&lt;a title="Jackrabbit" href="http://jackrabbit.apache.org/" target="_blank"&gt;Jackrabbit&lt;/a&gt;&lt;/em&gt;.&lt;br/&gt;&lt;br/&gt;¿Y cuál es la diferencia con almacenar cadenas &lt;em&gt;JSON&lt;/em&gt; en &lt;em&gt;MySQL&lt;/em&gt;? Las bases de datos documentales pueden actualmente trabajar con la estructura de los documentos, por ejemplo extrayendo, indexando, añadiendo y filtrando datos basado en el valor de un atributo dentro de los documentos. Alternativamente, tu puedes por supuesto crear la indexación de los atributos por ti mismo, pero yo no lo recomendaría a menos que esto te haga trabajar con tu código antiguo más fácilmente.&lt;br/&gt;&lt;br/&gt;La gran limitación de las bases de datos del tipo &lt;em&gt;BigTable&lt;/em&gt; y las documentales es que la mayoría de las implementaciones no pueden realizar uniones (&lt;em&gt;joins&lt;/em&gt;) u operaciones de expansión entre varias filas o documentos. Esta restricción es deliberada, porque permite a la base de datos el particionado automático, el cual es importante para escalar — véase la sección de almacenamiento distribuido de parejas de clave-valor a continuación. Si la estructura de tus datos es una gran cantidad de documentos independientes, esto no es un problema — pero si tus datos se acojen a un modelo relacional y necesitas hacer uniones, por favor, no intentes forzarlo a un modelo documental.&lt;br/&gt;&lt;h2&gt;Bases de datos de gráfos&lt;/h2&gt;&lt;br/&gt;Las bases de datos de gráfos residen en el extremo contrario del espectro. Mientras las documentales son buenas para almacenar datos estructurados en la forma de muchos documentos independientes, las basadas en gráfos se centran en las relaciones entre los elementos — un mejor ajuste para los modelos de datos altamente conectados.&lt;br/&gt;&lt;br/&gt;El SQL estándar no permite consultar las relaciones transitivas, es decir, un encadenamiento de longitud variable entre varias uniones que continúan hasta que algún tipo de condición se cumple. Las bases de datos de gráfos están optimizadas precisamente para este tipo de datos. Estos síntomas indican que sus datos encajarían mejor en un modelo gráfico:&lt;br/&gt;&lt;ul&gt;&lt;br/&gt;	&lt;li&gt;Escribes grandes cadenas de uniones (unión de la tabla A con la B, B con C, C con D …) en tus consultas.&lt;/li&gt;&lt;br/&gt;	&lt;li&gt;Escribe bucles de consultas en tu aplicación para conseguir una cadena de relaciones (particularmente cuando no sabes de antemano la longitud que tomará el encadenamiento).&lt;/li&gt;&lt;br/&gt;	&lt;li&gt;Tienes varias uniones muchos-a-muchos o estructuras tipo árbol.&lt;/li&gt;&lt;br/&gt;	&lt;li&gt;Tus datos ya están en una forma gráfica (por ejemplo la información sobre quién es amigo de quién en una red social).&lt;/li&gt;&lt;br/&gt;&lt;/ul&gt;&lt;br/&gt;Hay menos opciones en las bases de datos gráficas que documentales: &lt;a title="Neo4j" href="http://neo4j.org/" target="_blank"&gt;&lt;em&gt;Neo4j&lt;/em&gt;&lt;/a&gt;, &lt;a title="AllegroGraph" href="http://www.franz.com/agraph/allegrograph/" target="_blank"&gt;&lt;em&gt;AllegroGraph&lt;/em&gt;&lt;/a&gt; y &lt;a title="Sesame" href="http://www.openrdf.org/" target="_blank"&gt;&lt;em&gt;Sesame&lt;/em&gt;&lt;/a&gt; (que normalmente utiliza &lt;em&gt;MySQL&lt;/em&gt; o &lt;em&gt;PostgreSQL&lt;/em&gt; como &lt;em&gt;back-end&lt;/em&gt;) son las que mirar. &lt;a title="FreeBase" href="http://blog.freebase.com/2008/04/09/a-brief-tour-of-graphd/" target="_blank"&gt;&lt;em&gt;FreeBase&lt;/em&gt;&lt;/a&gt; y &lt;a title="DirectedEdge" href="http://blog.directededge.com/2009/02/27/on-building-a-stupidly-fast-graph-database/" target="_blank"&gt;&lt;em&gt;DirectEdge&lt;/em&gt;&lt;/a&gt; han desarrollado bases de datos gráficas para su uso interno.&lt;br/&gt;&lt;br/&gt;Las bases de datos gráficas se asocian a menudo con la web semántica y almacenes de datos RDF, que es una de las aplicaciones para las que son usadas. Realmente creo que muchos datos de otras aplicaciones estarían bien representados en gráfos. Sin embargo, como ántes, no trates de forzar  los datos en un gráfo si encajan mejor en tablas o documentos.&lt;br/&gt;&lt;h2&gt;MapReduce&lt;/h2&gt;&lt;br/&gt;Muy a la ligera: si el procesamiento por lotes en segundo plano es tu problema y no conoce el &lt;a title="Wikipedia EN MapReduce" href="http://en.wikipedia.org/wiki/MapReduce" target="_blank"&gt;modelo MapReduce&lt;/a&gt;, debería. Popularizado por &lt;a title="Google MapReduce" href="http://labs.google.com/papers/mapreduce.html" target="_blank"&gt;otro artículo de &lt;em&gt;Google&lt;/em&gt;&lt;/a&gt;, &lt;em&gt;MapReduce&lt;/em&gt; es una forma de escribir trabajos de procesamiento por lotes sin preocuparse por la infraestructura. Diferentes bases de datos se prestan mejor o peor al &lt;em&gt;MapReduce&lt;/em&gt; — algo a tener en cuenta al elegir una base de datos para satisfacer nuestras necesidades.&lt;br/&gt;&lt;br/&gt;&lt;a title="Hadoop" href="http://hadoop.apache.org/" target="_blank"&gt;&lt;em&gt;Hadoop&lt;/em&gt;&lt;/a&gt; es el rey entre las implementaciones de código abierto, aunque también merece la pena mirar &lt;a title="Skynet" href="http://skynet.rubyforge.org/" target="_blank"&gt;&lt;em&gt;Skynet&lt;/em&gt;&lt;/a&gt; y&lt;a title="Disco" href="http://discoproject.org/" target="_blank"&gt;&lt;em&gt;Disco&lt;/em&gt;&lt;/a&gt;. &lt;a title="CouchDB" href="http://couchdb.apache.org/" target="_blank"&gt;&lt;em&gt;CouchDB&lt;/em&gt;&lt;/a&gt; también incluye algunas ideas de &lt;em&gt;MapReduce&lt;/em&gt; en una menor escala.&lt;br/&gt;&lt;h2&gt;Almacenamiento distribuido de clave-valor&lt;/h2&gt;&lt;br/&gt;Un almacenamiento de clave-valor es un concepto muy simple, muy similar a una &lt;em&gt;tabla hash&lt;/em&gt;: puedes recuperar un elemento basado en su clave, puedes insertar un par de clave-valor, y puedes borrar un par de clave-valor. El valor puede ser simplemente una lista opaca de bytes, o puede ser un documento estructurado (la mayoría de las implementaciones de bases de datos documentales o basadas en la &lt;em&gt;BigTable&lt;/em&gt; se pueden considerar como almacenamientos clave-valor).&lt;br/&gt;&lt;br/&gt;Las bases de datos documentales, gráficas y &lt;em&gt;MapReduce&lt;/em&gt; introducen nuevos modelos de datos y nuevas formas de pensar que pueden ser útiles incluso en una aplicación de pequeña escala; no necesitas ser&lt;em&gt; Google&lt;/em&gt; o&lt;em&gt;Facebook&lt;/em&gt; para beneficiarte de ellas. El almacenamiento distribuido de clave-valor, por otra parte, va en realidad acorde con la escalabilidad. Pueden escalar cantidades verdaderamente enormes de datos — muchos más de los que un sólo servidor podría soportar.&lt;br/&gt;&lt;br/&gt;Las bases de datos distribuidas pueden transparentemente particionar y replicar tus datos a través de varias máquinas en un clúster. No resulta necesario implementar un &lt;a title="Shard Wikipedia EN" href="http://en.wikipedia.org/wiki/Shard_(database_architecture)" target="_blank"&gt;&lt;em&gt;sistema de fragmentación&lt;/em&gt;&lt;/a&gt; para decidir sobre qué determinado servidor se puede encontrar un determinado fragmento de datos; la base de datos lo hace por usted. Si un servidor muere, no hay problema — otros pueden inmediatamente empezar a funcionar. Si necesita más recursos, sólo tiene que añadir los servidores al clúster, y la base de datos le asignará automáticamente una parte de los datos y de la carga.&lt;br/&gt;&lt;br/&gt;Al elegir un almacenamiento de clave-valor, debes decidir entre si debe estar optimizado para una baja latencia (para un rápido acceso durante el ciclo de petición-respuesta típico de un servidor web) o para un rendimiento alto (usado en los trabajos de procesamiento por lotes).&lt;br/&gt;&lt;br/&gt;Aparte de las basadas en la BigTable y las documentales, &lt;a title="Scalaris" href="http://code.google.com/p/scalaris/" target="_blank"&gt;&lt;em&gt;Scalaris&lt;/em&gt;&lt;/a&gt;, &lt;a title="Dynomite" href="http://github.com/cliffmoon/dynomite/tree/master" target="_blank"&gt;&lt;em&gt;Dynomite&lt;/em&gt;&lt;/a&gt; and &lt;a title="Ringo" href="http://github.com/tuulos/ringo/tree/master" target="_blank"&gt;&lt;em&gt;Ringo&lt;/em&gt;&lt;/a&gt; proporcionan cierta garantía en la consistencia de los datos, mientras que se encargan del particionamiento y la distribución del conjunto de datos. &lt;a title="MemcacheDB" href="http://memcachedb.org/" target="_blank"&gt;&lt;em&gt;MemcacheDB&lt;/em&gt;&lt;/a&gt; y &lt;a title="Tokyo Cabinet" href="http://tokyocabinet.sourceforge.net/" target="_blank"&gt;&lt;em&gt;Tokyo Cabinet&lt;/em&gt;&lt;/a&gt; (con &lt;a title="Tokyo Tyrant" href="http://tokyocabinet.sourceforge.net/tyrantdoc/" target="_blank"&gt;&lt;em&gt;Tokyo Tyrant&lt;/em&gt;&lt;/a&gt; para el servicio en red y &lt;a title="LightCloud" href="http://opensource.plurk.com/LightCloud/" target="_blank"&gt;&lt;em&gt;LightCloud&lt;/em&gt;&lt;/a&gt; para que sea distribuida) se centran en la latencia.&lt;br/&gt;&lt;br/&gt;La advertencia sobre la limitación en las transacciones y las uniones se aplica incluso más fuertemente en las bases de datos distribuidas. Implementaciones diferentes tienen enfoques distintos, pero en general, si necesitas leer varios elementos, manipularlos de alguna manera y luego volver a escribirlos, no existe garantía de que va a terminar en un estado coherente inmediatamente (aunque muchas implementaciones tratan de convertirse eventualmente consistentes resolviendo conflictos de escritura o usando protocolos de transacciones distribuidas; véase el algoritmo de &lt;a title="Amazon Dynamo" href="http://www.allthingsdistributed.com/2007/10/amazons_dynamo.html" target="_blank"&gt;&lt;em&gt;Amazon Dynamo&lt;/em&gt;&lt;/a&gt; para un ejemplo). Por lo tanto, sólo deberías utilizar estas bases de datos si tus datos son elementos independientes, y si la disponibilidad y performancia son más importantes que las &lt;a title="propiedades ACID" href="http://es.wikipedia.org/wiki/ACID" target="_blank"&gt;&lt;em&gt;propiedades ACID&lt;/em&gt;&lt;/a&gt;. Para más información, lea acerca del &lt;a title="Teorema CAP" href="http://www.julianbrowne.com/article/viewer/brewers-cap-theorem" target="_blank"&gt;&lt;em&gt;Teorema CAP de Brewer&lt;/em&gt;&lt;/a&gt;, que establece que entre la consistencia, la disponibilidad y el particionado, sólo podemos elegir dos, y nunca ninguna base de datos podrá saltarse este hecho.&lt;br/&gt;&lt;br/&gt;Richard Jones, co-fundador de Last.fm, ha escrito una excelente &lt;a href="http://www.metabrew.com/article/anti-rdbms-a-list-of-distributed-key-value-stores/" target="_blank"&gt;&lt;em&gt;visión de conjunto de los almacenamientos de clave-valor&lt;/em&gt;&lt;/a&gt;. También, &lt;a href="http://www.readwriteweb.com/archives/is_the_relational_database_doomed.php" target="_blank"&gt;&lt;em&gt;Tony Bain ofrece una introducción&lt;/em&gt;&lt;/a&gt; a las diferencias conceptuales entre las bases de datos relacionales y los almacenamientos de clave-valor, y recientemente hubo un &lt;a href="http://blog.oskarsson.nu/2009/06/nosql-debrief.html" target="_blank"&gt;&lt;em&gt;evento NOSQL en San Francisco&lt;/em&gt;&lt;/a&gt;, donde se presentaron una serie de diferentes bases de datos no relacionales.&lt;br/&gt;&lt;br/&gt;Los sistemas distribuidos son poco amistosos… muy poco amistosos. Sugiero que se usen sólo si realmente necesitamos los aspectos de escalado que ofrecen (o sólo por diversión fuera de un entorno de producción).&lt;br/&gt;&lt;h2&gt;Resumiendo&lt;/h2&gt;&lt;br/&gt;En este artículo me he centrado en proyectos de código abierto. Si usted está dispuesto a usar a un determinado proveedor de alojamiento, vale la pena considerar &lt;a title="Google Datastore" href="http://code.google.com/appengine/docs/python/datastore/" target="_blank"&gt;&lt;em&gt;Google Datastore&lt;/em&gt;&lt;/a&gt;, &lt;a title="Amazon SimpleDB" href="http://aws.amazon.com/simpledb/" target="_blank"&gt;&lt;em&gt;Amazon SimpleDB&lt;/em&gt;&lt;/a&gt;, &lt;a title="Windows Azure Storage Services" href="http://msdn.microsoft.com/en-us/library/dd179355.aspx" target="_blank"&gt;&lt;em&gt;Windows Azure Storage Services&lt;/em&gt;&lt;/a&gt; o &lt;a title="Force.com" href="http://wiki.developerforce.com/index.php/Database_Services" target="_blank"&gt;&lt;em&gt;Force.com&lt;/em&gt;&lt;/a&gt;. Son tecnologías buenas, pero tenga en cuenta el riesgo potencial de los negocios cerrados.&lt;br/&gt;&lt;br/&gt;No puedo hacer juicios sobre la idoneidad de determinados proyectos para fines particulares. Hay varias aplicaciones muy decentes, pero también hay algunas aplicaciones nuevas y muy inestables. Si vas a considerar el uso de alguna de ellas, deberás realizar tu propia investigación:&lt;br/&gt;&lt;ul&gt;&lt;br/&gt;	&lt;li&gt;Buscar en el sitio web del proyecto una lista de sitios que utilizan la base de datos en producción (y en qué aspecto de su servicio lo utilizan).&lt;/li&gt;&lt;br/&gt;	&lt;li&gt;Comprobar si tienen una comunidad de código abierto activa, para el caso que el desarrollador original pierda el interés y deje de mantener el software.&lt;/li&gt;&lt;br/&gt;	&lt;li&gt;Tratar de encontrar algún punto de referencia (aunque ten en cuenta que muchos puntos de referencia publicados en la web usan métodos defectuosos y/o anticuados, por lo que si buscas seriedad deberás ejecutar tus propias pruebas, usando datos que coinciden con las características de tu aplicación).&lt;/li&gt;&lt;br/&gt;&lt;/ul&gt;&lt;br/&gt;Y como pasa con cualquier tema de moda, hay muchas personas con opiniones fuertes, tanto positivas como negativas, no te dejes influenciar por ellos. Espero haberte dado una visión general de los tipos de cosas que puedes hacer con diferentes tipos de bases de datos para que puedas elegir el más adecuado a tu aplicación.&lt;br/&gt;&lt;br/&gt;Fotografía por &lt;a href="http://www.flickr.com/photos/vermininc" target="_blank"&gt;flickr.com/photos/vermininc&lt;/a&gt;&lt;br/&gt;&lt;br/&gt;Traducción libre del texto original &lt;a href="http://carsonified.com/blog/dev/should-you-go-beyond-relational-databases/" target="_blank"&gt;Should you go Beyond Relational Databases? by Martin Kleppmann&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8219062580832314459-8860640625063777824?l=www.sqleros.com.ar' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/BlogSqleros/~4/ioT7fhND15I" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.sqleros.com.ar/feeds/8860640625063777824/comments/default" title="Enviar comentarios" /><link rel="replies" type="text/html" href="http://www.sqleros.com.ar/2011/01/mas-alla-de-las-bases-de-datos.html#comment-form" title="0 comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8219062580832314459/posts/default/8860640625063777824?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8219062580832314459/posts/default/8860640625063777824?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/BlogSqleros/~3/ioT7fhND15I/mas-alla-de-las-bases-de-datos.html" title="Más allá de las bases de datos relacionales" /><author><name>Ramms ZeñábI</name><uri>http://www.blogger.com/profile/05084493704196673506</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="13715620155140962144" /></author><thr:total>0</thr:total><feedburner:origLink>http://www.sqleros.com.ar/2011/01/mas-alla-de-las-bases-de-datos.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkUDQnsyeSp7ImA9WhZXEUk.&quot;"><id>tag:blogger.com,1999:blog-8219062580832314459.post-518085030691340957</id><published>2011-01-04T10:03:00.000-06:00</published><updated>2011-04-30T02:24:33.591-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-04-30T02:24:33.591-05:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="SQL Server 2008" /><category scheme="http://www.blogger.com/atom/ns#" term="Frikadas" /><category scheme="http://www.blogger.com/atom/ns#" term="T-SQL" /><category scheme="http://www.blogger.com/atom/ns#" term="programacion" /><category scheme="http://www.blogger.com/atom/ns#" term="SQL Server 2005" /><category scheme="http://www.blogger.com/atom/ns#" term="SQL" /><title>Cannot resolve the collation conflict between "Modern_Spanish_CI_AS"
and "SQL_Latin1_General_CP1_CI_AS" in the equal to operation.</title><content type="html">
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/2pwXxbF85Usf5HzLqhxbJXnzvkU/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/2pwXxbF85Usf5HzLqhxbJXnzvkU/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/2pwXxbF85Usf5HzLqhxbJXnzvkU/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/2pwXxbF85Usf5HzLqhxbJXnzvkU/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;El día de hoy estaba trabajando con unas tablas de unas bases de datos del servidor en donde trabajo... y al realizar una consulta, me arrojaba un error sobre su COLLATION (intercambio de caracteres entre columnas). Un error así...:&lt;br/&gt;&lt;br/&gt;Cannot resolve the collation conflict between "Modern_Spanish_CI_AS" and "SQL_Latin1_General_CP1_CI_AS" in the equal to operation.&lt;a name='more'&gt;&lt;/a&gt;&lt;br/&gt;&lt;br/&gt;SQL Server puede manejar 4 niveles de COLLATION:&lt;br/&gt;&lt;ul&gt;&lt;br/&gt;	&lt;li&gt;&lt;strong&gt;Nivel de Servidor&lt;br/&gt;&lt;/strong&gt;Personalmente considero que es la principal ya que de aqui hereda toda configuracion de Intercalacion que no se indique de manera explicita.&lt;/li&gt;&lt;br/&gt;	&lt;li&gt;&lt;strong&gt;Nivel de Base de Datos&lt;/strong&gt;&lt;br/&gt;Puede heredar del Servidor o se puede escoger una diferente.&lt;/li&gt;&lt;br/&gt;	&lt;li&gt;&lt;strong&gt;Nivel de Columna&lt;/strong&gt;&lt;br/&gt;Se define al momento de crear la tabla o columna&lt;/li&gt;&lt;br/&gt;	&lt;li&gt;&lt;strong&gt;Nivel de Expresión&lt;/strong&gt;&lt;br/&gt;Son expresiones utilizadas en Transact-SQL&lt;/li&gt;&lt;br/&gt;&lt;/ul&gt;&lt;br/&gt;Y bueno para no hacer largo el asunto tenemos varias formas para solucionar este problemilla.&lt;br/&gt;&lt;ol&gt;&lt;br/&gt;	&lt;li&gt;Puedes cambiar la configuración de COLLATE del servidor... (Util, si quieres usar la misma COLLATE, de forma heredada) , Recontruir la Master, pero esto no es tan sencillo como los anteriores, para SQL Server2000 se puede utilizar la herramienta &lt;em&gt;REBUILDM&lt;/em&gt;, para SQL Server2005 hay que hacerlo desde el setup de instalacion, indicando en el wizard de modificacion (asi dice en la MSDN Library, pero personalmente fue el unico que no encontré).&lt;/li&gt;&lt;br/&gt;	&lt;li&gt;Instalar Nuevamente el Servidor de BD, esta es la que realmente escoges en casos extremos o si quieres asegurarte que funcione bien.&lt;/li&gt;&lt;br/&gt;	&lt;li&gt;Otra forma es que al momento de comparar las cadenas, en este caso... simplemente le indiques que collation necesitas que adopte, es algo así: select campos from latabla where campo collation colación_deseada, ahora un ejemplo...:&lt;br/&gt;&lt;div id="_mcePaste"&gt;select *from archivos ar,catalogs cat where ar.contenidos collate Modern_Spanish_CI_AS = cat.notes. También lo podíamos hacer de esta manera... : select *from archivos ar,catalogs cat where cast(ar.contenidos as varchar) collate Modern_Spanish_CI_AS = cat.notes . Y ya puedes comparar las cadenas, lo mejor de la primera forma que les mostre es que, en caso de tener indices, no te los destruye... ;)&lt;/div&gt;&lt;br/&gt;&lt;div id="_mcePaste"&gt;¡Saludos!&lt;/div&gt;&lt;/li&gt;&lt;br/&gt;&lt;/ol&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8219062580832314459-518085030691340957?l=www.sqleros.com.ar' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/BlogSqleros/~4/7mBuF5M_oGc" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.sqleros.com.ar/feeds/518085030691340957/comments/default" title="Enviar comentarios" /><link rel="replies" type="text/html" href="http://www.sqleros.com.ar/2011/01/cannot-resolve-collation-conflict.html#comment-form" title="0 comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8219062580832314459/posts/default/518085030691340957?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8219062580832314459/posts/default/518085030691340957?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/BlogSqleros/~3/7mBuF5M_oGc/cannot-resolve-collation-conflict.html" title="Cannot resolve the collation conflict between &amp;quot;Modern_Spanish_CI_AS&amp;quot; and &amp;quot;SQL_Latin1_General_CP1_CI_AS&amp;quot; in the equal to operation." /><author><name>Ramms ZeñábI</name><uri>http://www.blogger.com/profile/05084493704196673506</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="13715620155140962144" /></author><thr:total>0</thr:total><feedburner:origLink>http://www.sqleros.com.ar/2011/01/cannot-resolve-collation-conflict.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkUDQnsyeSp7ImA9WhZXEUk.&quot;"><id>tag:blogger.com,1999:blog-8219062580832314459.post-290184612479483800</id><published>2010-12-29T09:25:00.000-06:00</published><updated>2011-04-30T02:24:33.591-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-04-30T02:24:33.591-05:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="web development" /><category scheme="http://www.blogger.com/atom/ns#" term="web design" /><category scheme="http://www.blogger.com/atom/ns#" term="Frikadas" /><category scheme="http://www.blogger.com/atom/ns#" term="programacion" /><category scheme="http://www.blogger.com/atom/ns#" term="CSS" /><category scheme="http://www.blogger.com/atom/ns#" term="styles" /><title>Diez errores comunes de CSS</title><content type="html">
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/xLF04kH6qu4vWk5JE0o6JY7oU1A/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/xLF04kH6qu4vWk5JE0o6JY7oU1A/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/xLF04kH6qu4vWk5JE0o6JY7oU1A/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/xLF04kH6qu4vWk5JE0o6JY7oU1A/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;Recientemente he estado modificando el código en un sitio web diseñado por alguien más, cuando vi a varios errores comunes en la hoja de estilos. Pensé que sería útil&lt;a name='more'&gt;&lt;/a&gt; señalar una lista de estos y otros errores en CSS que he visto antes.&lt;br/&gt;&lt;ol&gt;&lt;br/&gt;	&lt;li&gt;&lt;br/&gt;&lt;h3&gt;Redundantes unidades para los valores nulos&lt;/h3&gt;&lt;br/&gt;El código siguiente no se necesita la unidad especificada si el valor es cero.&lt;br/&gt;&lt;br/&gt;&lt;code&gt;padding:0px 0px 5px 0px;&lt;/code&gt;&lt;br/&gt;&lt;br/&gt;Puede estar escrito en lugar de esta manera:&lt;br/&gt;&lt;br/&gt;&lt;code&gt;padding:0 0 5px 0;&lt;/code&gt;&lt;br/&gt;&lt;br/&gt;Lo mismo ocurre con otros estilos. Por ejemplo:&lt;br/&gt;&lt;br/&gt;&lt;code&gt;margin:0;&lt;/code&gt;&lt;br/&gt;&lt;br/&gt;No pierda bytes mediante la adición de unidades tales como px, pt, em, etc, cuando el valor es cero. La única razón para hacerlo es cuando se quiere cambiar el valor rápidamente más adelante.De lo contrario se declara la unidad no tiene sentido. píxeles cero es lo mismo que cero puntos.&lt;br/&gt;&lt;br/&gt;Sin embargo, la línea de altura puede ser sin unidades. Así que esto es perfectamente válido:&lt;br/&gt;&lt;br/&gt;&lt;code&gt;line-height:1;&lt;/code&gt;&lt;br/&gt;&lt;br/&gt;Además, todavía puedes usar una unidad como em si lo deseas.&lt;/li&gt;&lt;br/&gt;	&lt;li&gt;&lt;br/&gt;&lt;h3&gt;Colores Hexadecimal ¿Necesitas un Hash(#)?&lt;/h3&gt;&lt;br/&gt;Esto es incorrecto:&lt;br/&gt;&lt;br/&gt;&lt;code&gt;color:ea6bc2;&lt;/code&gt;&lt;br/&gt;&lt;br/&gt;Debe ser:&lt;br/&gt;&lt;br/&gt;&lt;code&gt;color:#ea6bc2;&lt;/code&gt;&lt;br/&gt;&lt;br/&gt;O incluso:&lt;br/&gt;&lt;br/&gt;&lt;code&gt;color:rgb(234,107,194);&lt;/code&gt;&lt;br/&gt;&lt;br/&gt;El código anterior podría ser útil para abandonar los estilos en un documento de ColdFusion, que utiliza '#' para indicar el inicio del código para ser analizado. De lo contrario, tendrá que acordarse de añadir otro hash para evitar errores. Por ejemplo:&lt;br/&gt;&lt;br/&gt;&lt;code&gt;color:##ea6bc2;&lt;/code&gt;&lt;/li&gt;&lt;br/&gt;	&lt;li&gt;&lt;br/&gt;&lt;h3&gt;Condensación al Duplicar Códigos de Color&lt;/h3&gt;&lt;br/&gt;No escribas código de la siguiente manera:&lt;br/&gt;&lt;br/&gt;&lt;code&gt;color:#ffffff;&lt;br/&gt;background-color:#000000;&lt;br/&gt;border:1px solid #ee66aa;&lt;/code&gt;&lt;br/&gt;&lt;br/&gt;Los valores duplicados se puede condensar. Escribe el código de esta forma:&lt;br/&gt;&lt;br/&gt;&lt;code&gt;color:#fff;&lt;br/&gt;background-color:#000;&lt;br/&gt;border:1px solid #e6a;&lt;/code&gt;&lt;br/&gt;&lt;br/&gt;Por supuesto que no funciona para un código como este!&lt;br/&gt;&lt;br/&gt;&lt;code&gt;color:#fe69b2;&lt;/code&gt;&lt;/li&gt;&lt;br/&gt;	&lt;li&gt;&lt;br/&gt;&lt;h3&gt;Evita la repetición por condensación de Código&lt;/h3&gt;&lt;br/&gt;A menos que sea probable que cambies mucho tu código, evita el uso de varias líneas en una sola línea es suficiente. Por ejemplo, al establecer los bordes, algunas personas ajustan cada lado por separado:&lt;br/&gt;&lt;br/&gt;&lt;code&gt;border-top:1px solid #00f;&lt;br/&gt;border-right:1px solid #00f;&lt;br/&gt;border-bottom:1px solid #00f;&lt;br/&gt;border-left:1px solid #00f;&lt;/code&gt;&lt;br/&gt;&lt;br/&gt;Pero ¿por qué? Cada borde es el mismo! Así se condensaría:&lt;br/&gt;&lt;br/&gt;&lt;code&gt;border:1px solid #00f;&lt;/code&gt;&lt;/li&gt;&lt;br/&gt;	&lt;li&gt;&lt;br/&gt;&lt;h3&gt;La duplicación es aceptable en uso de cascada&lt;/h3&gt;&lt;br/&gt;No hay que olvidar que los estilos en cascada (de ahí el nombre de "Cascading Style Sheets"). Así que está bien con el estilo de un mismo elemento dos veces, si significa evitar la repetición mencionada en el punto anterior. Por ejemplo, digamos que tiene un elemento en el que sólo el borde izquierdo es diferente. En lugar de escribir cada borde por medio de cuatro líneas, sólo tiene que utilizar dos:&lt;br/&gt;&lt;br/&gt;&lt;code&gt;border:1px solid #00f;&lt;br/&gt;border-left:1px solid #f00;&lt;/code&gt;&lt;br/&gt;&lt;br/&gt;Aquí, todos los estilos de bordes de un solo color, el borde izquierdo es remodelado con un color diferente.&lt;/li&gt;&lt;br/&gt;	&lt;li&gt;&lt;br/&gt;&lt;h3&gt;Estilos No validos no hacen Nada&lt;/h3&gt;&lt;br/&gt;La semana pasada me encontré con el código en un sitio que estaba vomitando errores en un número de comandos. Los errores eran simples: el autor tenía de entrada una serie de estilos que no se aplica al código usado. Es evidente que no habría sido analizado, por lo que el código fue inútil.&lt;br/&gt;&lt;br/&gt;Un ejemplo fue &lt;code&gt;padding:auto&lt;/code&gt; . Ese estilo puede aplicar a la anchura y la altura, pero no con relleno.&lt;/li&gt;&lt;br/&gt;	&lt;li&gt;&lt;br/&gt;&lt;h3&gt;Código específico del explorador&lt;/h3&gt;&lt;br/&gt;Obviamente, esto sólo funcionará en el navegador que lo soporta.A veces lo deseen, como cuando se necesita esquinas redondeadas en Firefox, pero recuerda, nadie más pueda verlas.Tienes que tener como objetivo el diseño de las páginas que los usuarios ven más o menos de la misma manera. Todavía nos encontramos con sitios que utilizan estilos en línea para agregar colores de borde de una manera que sólo funciona en Internet Explorer. No lo hagas!. Tus visitantes te lo agradecerán. O dicho de otra manera, tu sitio así puede parecer un lío en otros navegadores. ;)&lt;/li&gt;&lt;br/&gt;	&lt;li&gt;&lt;br/&gt;&lt;h3&gt;Desperdiciar espacio&lt;/h3&gt;&lt;br/&gt;No estoy seguro de por qué, pero a veces los diseñadores les gusta perder mucho espacio en su código, utilizando un montón de innecesarios saltos de línea o espacios antes y después del código. Recuerda, sólo se va a hacer la hoja de estilos más grande, lo que significa que va a costar más a largo plazo, como el uso de tu ancho de banda será mayor.  Además tu código será más fácil de leer y depurar con menos brechas (habrá menos desplazándose hacia arriba y hacia abajo necesarios para empezar). Por supuesto que es conveniente dejar un espacio en que siga siendo legible, aunque algunas personas les gusta todo lo que se condensan, sin dejar ningún espacio en absoluto.&lt;/li&gt;&lt;br/&gt;	&lt;li&gt;&lt;br/&gt;&lt;h3&gt;Especificar colores sin usar palabras&lt;/h3&gt;&lt;br/&gt;Bueno, todos hemos sido culpables de esto. Es mucho más fácil definir un color como ' &lt;code&gt;white&lt;/code&gt; 'o' &lt;code&gt;red&lt;/code&gt; ', pero no es una buena idea. Si estas confiando en que el navegador debe de saber exactamente que color es al que te refieres. Por ejemplo, ¿qué es rojo? ¿Es &lt;code&gt;#f00&lt;/code&gt; ? O &lt;code&gt;#f33&lt;/code&gt; ? O algo completamente distinto? ¿Y si se utiliza un color como&lt;code&gt;lightgoldenrod&lt;/code&gt; ? He encontrado que a veces un color sólo funciona en algunos navegadores. Así que es una buena práctica especificar siempre el color por su código hexadecimal. Por ejemplo: el uso &lt;code&gt;#fff&lt;/code&gt; en lugar de &lt;code&gt;white&lt;/code&gt; . Yo no solía hacer esto, pero es necesario.&lt;/li&gt;&lt;br/&gt;	&lt;li&gt;&lt;br/&gt;&lt;h3&gt;Agrupación de estilos idénticos&lt;/h3&gt;&lt;br/&gt;Es común ver a un estilo aplicado a muchos elementos diferentes, aunque el estilo es el mismo. Deja el estilo de cada elemento por separado y el estilo que se aplique a todos en una sola declaración algo así:&lt;br/&gt;&lt;br/&gt;&lt;code&gt;h1, p, #footer, .intro {&lt;br/&gt;font-family:Arial,Helvetica,sans-serif;&lt;br/&gt;}&lt;/code&gt;&lt;br/&gt;&lt;br/&gt;También se hará la actualización del estilo mucho más fácil. Saludos!&lt;/li&gt;&lt;br/&gt;&lt;/ol&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8219062580832314459-290184612479483800?l=www.sqleros.com.ar' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/BlogSqleros/~4/U7ayVPB1_0I" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.sqleros.com.ar/feeds/290184612479483800/comments/default" title="Enviar comentarios" /><link rel="replies" type="text/html" href="http://www.sqleros.com.ar/2010/12/diez-errores-comunes-de-css.html#comment-form" title="0 comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8219062580832314459/posts/default/290184612479483800?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8219062580832314459/posts/default/290184612479483800?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/BlogSqleros/~3/U7ayVPB1_0I/diez-errores-comunes-de-css.html" title="Diez errores comunes de CSS" /><author><name>Ramms ZeñábI</name><uri>http://www.blogger.com/profile/05084493704196673506</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="13715620155140962144" /></author><thr:total>0</thr:total><feedburner:origLink>http://www.sqleros.com.ar/2010/12/diez-errores-comunes-de-css.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkUDQnsyeSp7ImA9WhZXEUk.&quot;"><id>tag:blogger.com,1999:blog-8219062580832314459.post-6993794732640803601</id><published>2010-12-14T16:55:00.000-06:00</published><updated>2011-04-30T02:24:33.591-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-04-30T02:24:33.591-05:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term=".net" /><category scheme="http://www.blogger.com/atom/ns#" term="ASP.NET" /><category scheme="http://www.blogger.com/atom/ns#" term="mono" /><category scheme="http://www.blogger.com/atom/ns#" term="C#" /><title>Cómo crear un temporizador global en ASP.NET</title><content type="html">
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/qfo5YEyvaLhyStUzEc2BMTGWdpo/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/qfo5YEyvaLhyStUzEc2BMTGWdpo/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/qfo5YEyvaLhyStUzEc2BMTGWdpo/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/qfo5YEyvaLhyStUzEc2BMTGWdpo/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;Las páginas Web son objetos con un tiempo de vida corto: se llaman&lt;a name='more'&gt;&lt;/a&gt;, se ejecutan en el servidor, se devuelve el resultado y mueren. Por lo tanto no tiene sentido colocar en ellas un objeto como un temporizador (el típico &lt;em&gt;Timer&lt;/em&gt;que sí tenemos en un formulario de Windows).&lt;br/&gt;&lt;br/&gt;&lt;strong&gt;La forma de atar un evento periódico a una página Web&lt;/strong&gt; (por ejemplo para actualizar los contenidos de la misma)&lt;strong&gt;es siempre en en lado cliente&lt;/strong&gt;, es decir, con &lt;strong&gt;JavaScript&lt;/strong&gt;. Para facilitarnos la vida, las extensiones de ASP.NET AJAX incluyen un control Timer que podemos arrastrar sobre el formulario para forzar la actualización periódica de uno o más UpdatePanels que tengamos sobre el mismo.&lt;br/&gt;&lt;br/&gt;Sin embargo, en principio, no tenemos forma de conseguir un &lt;strong&gt;temporizador en el servidor que se ejecute cada cierto tiempo para todos los usuarios de nuestra aplicación&lt;/strong&gt;. ¿O sí?&lt;br/&gt;&lt;h3&gt;Crear un temporizador para una aplicación Web&lt;/h3&gt;&lt;br/&gt;Dentro de las clases base de la plataforma .NET, dentro del espacio de nombres &lt;em&gt;&lt;strong&gt;System.Timers&lt;/strong&gt;&lt;/em&gt;, existe una clase especial llamada &lt;a href="http://msdn.microsoft.com/es-es/library/system.timers.timer.aspx" target="_blank"&gt;&lt;strong&gt;Timer&lt;/strong&gt;&lt;/a&gt; que sirve para crear temporizadores globales y está orientado a entornos de servidor (para requerimientos menos estrictos también existe la clase &lt;a href="http://msdn.microsoft.com/es-es/library/system.threading.timer(v=VS.100).aspx" target="_blank"&gt;System.Threading.Timer&lt;/a&gt;, que es completamente distinta y no se adapta tan bien a nuestro caso).&lt;br/&gt;&lt;br/&gt;Podemos usar esta clase para crear un temporizador global que funcione permanentemente en nuestra aplicación Web. Para ello podemos usar Global.asax para inicializarlo o, mejor aún, &lt;strong&gt;crear un pequeño módulo temporizador&lt;/strong&gt; que podamos añadir a voluntad a nuestra aplicación sin necesidad de cambiar el código. Es lo que vamos a hacer.&lt;br/&gt;&lt;br/&gt;Para el ejemplo vamos a crear un nuevo módulo HTTP con C# que implemente, como ejemplo sencillo, un contador global que se incremente cada segundo por medio de un temporizador.&lt;br/&gt;&lt;br/&gt;El código es el siguiente:&lt;br/&gt;&lt;pre&gt;using System;&lt;br/&gt;using System.Web;&lt;br/&gt;using System.Timers;&lt;br/&gt;&lt;br/&gt;///&lt;br/&gt;/// Summary description for ModuloTemporizador&lt;br/&gt;///&lt;br/&gt;public class ModuloTemporizador : IHttpModule&lt;br/&gt;{&lt;br/&gt;    // Variable que guarda una referencia al Timer (la misma para todas las instancias del módulo)&lt;br/&gt;    static Timer _timerGlobal = null;&lt;br/&gt;    static HttpApplication _App;&lt;br/&gt;&lt;br/&gt;    public void Init(HttpApplication context)&lt;br/&gt;    {&lt;br/&gt;        if (_timerGlobal == null)&lt;br/&gt;        {&lt;br/&gt;            //Inicializo el contador&lt;br/&gt;            context.Application.Lock();&lt;br/&gt;            context.Application["Contador"] = 0L;&lt;br/&gt;            context.Application.UnLock();&lt;br/&gt;&lt;br/&gt;            //Guardo la referencia a Application&lt;br/&gt;            _App = context;&lt;br/&gt;&lt;br/&gt;            //inicializo el Timer&lt;br/&gt;            _timerGlobal = new Timer(1000);&lt;br/&gt;            _timerGlobal.Elapsed += new ElapsedEventHandler(ProcesoPeriodico);&lt;br/&gt;            _timerGlobal.Start();&lt;br/&gt;&lt;br/&gt;        }&lt;br/&gt;    }&lt;br/&gt;&lt;br/&gt;    public void Dispose()&lt;br/&gt;    {&lt;br/&gt;        _timerGlobal = null;&lt;br/&gt;    }&lt;br/&gt;&lt;br/&gt;    ///&lt;br/&gt;    /// Aquí se procesa periódicamente el Timer&lt;br/&gt;    ///&lt;br/&gt;    private static void ProcesoPeriodico(object source, ElapsedEventArgs e)&lt;br/&gt;    {&lt;br/&gt;        _App.Application.Lock();&lt;br/&gt;        long contador = (long)_App.Application["Contador"];&lt;br/&gt;        _App.Application["Contador"] = contador + 1;&lt;br/&gt;        _App.Application.UnLock();&lt;br/&gt;    }&lt;br/&gt;&lt;br/&gt;}&lt;/pre&gt;&lt;br/&gt;Se trata de un modulo HTTP normal, que implementa como todos la interfaz IHttpModule. Declara dos variables estáticas (serían &lt;em&gt;Shared&lt;/em&gt; en VB) que permiten guardar sendas referencias al temporizador y al objeto Application, que nos permitirá acceder a las propiedades del mismo.&lt;br/&gt;&lt;br/&gt;En el evento de inicialización la primera parte es sólo para nuestro ejemplo. Inicializa una variable de aplicación (común a todos los usuarios) que utilizaremos como un contador para verificar que el temporizador funciona. En condiciones normales no haríamos nada similar, pero a efectos de este ejemplo bien nos vale.&lt;br/&gt;&lt;br/&gt;Después se establece la variable estática_App para tener acceso al contexto de aplicación desde toda la clase, y poder manejarlo desde otros métodos.&lt;br/&gt;&lt;br/&gt;La parte interesante es la de inicialización del Timer, aunque no tiene tampoco ninguna dificultad: se declara un Timer pasándole el intervalo en su constructor. En este caso se le pasan 1000 milisegundos, o sea, un segundo, de forma que el temporizador hará "Tick" cada segundo. Se establece un manejador para su evento &lt;strong&gt;Elapsed&lt;/strong&gt;, que se llama automáticamente cada vez que pase el periodo establecido y es donde realmente llevaremos a cabo la tarea periódica. Finalmente Se inicia el temporizador llamando a su método &lt;strong&gt;Start()&lt;/strong&gt;.&lt;br/&gt;&lt;br/&gt;En el manejador del evento podemos llevar a cabo cualquier  tarea periodica que necesitemos: comprobar unos valores y refrescarlos, verificar que haya nuevos datos en una cola, anotar una información de traza interna que necesitemos para la aplicación, etc... Cualquiera que sea tu necesidad. En este ejemplo simplemente aumentamos el valor del contador.&lt;br/&gt;&lt;br/&gt;Es posible detener el temporizador llamando a su método &lt;strong&gt;Stop()&lt;/strong&gt; o cambiar el intervalo de notificación modificando el valor de la propiedad &lt;strong&gt;Interval&lt;/strong&gt;.&lt;br/&gt;&lt;h3&gt;Probando el temporizador&lt;/h3&gt;&lt;br/&gt;Para probar el temporizador y verificar que funciona he creado una pequeña página Default.aspx que el único código que contiene es este:&lt;br/&gt;&lt;pre&gt;&amp;lt;%= Application("Contador") %&amp;gt;&lt;/pre&gt;&lt;br/&gt;Con esto lo que hacemos es mostrar el valor del contador por pantalla.&lt;br/&gt;&lt;br/&gt;Si lanzamos la aplicación y llamamos a Default.aspx, refrescando sus contenidos con F5 en el navegador cada pocos segundos veremos....&lt;strong&gt; ¡que no funciona!&lt;/strong&gt;&lt;br/&gt;&lt;br/&gt;El motivo es que hemos creado el módulo pero no lo hemos registrado con ASP.NET y por lo tanto no se ha usado.&lt;br/&gt;&lt;br/&gt;Para registrar el módulo y que entre en funcionamiento nuestro temporizador sólo es necesario incluir esto en nuestro web.config:&lt;br/&gt;&lt;pre&gt;&amp;lt;configuration&amp;gt;&lt;br/&gt;	&amp;lt;system.web&amp;gt;&lt;br/&gt;           &amp;lt;httpModules&amp;gt;&lt;br/&gt;              &amp;lt;add name="ModuloTemporizador" type="ModuloTemporizador"/&amp;gt;&lt;br/&gt;           &amp;lt;/httpModules&amp;gt;&lt;br/&gt;	&amp;lt;/system.web&amp;gt;&lt;br/&gt;&amp;lt;/configuration&amp;gt;&lt;/pre&gt;&lt;br/&gt;O bien, si estamos trabajando en el modo integrado de IIS 7.x, este equivalente en el web.config del raíz:&lt;br/&gt;&lt;pre&gt;&amp;lt;configuration&amp;gt;&lt;br/&gt;	&amp;lt;system.webServer&amp;gt;&lt;br/&gt;           &amp;lt;modules&amp;gt;&lt;br/&gt;              &amp;lt;add name="ModuloTemporizador" type="ModuloTemporizador"/&amp;gt;&lt;br/&gt;           &amp;lt;/modules&amp;gt;&lt;br/&gt;	&amp;lt;/system.webServer&amp;gt;&lt;br/&gt;&amp;lt;/configuration&amp;gt;&lt;/pre&gt;&lt;br/&gt;Con esto ya podemos lanzar de nuevo la aplicación. Ahora, si refrescamos la página, veremos que el contador va aumentando en una unidad cada segundo. Si se conectaran varios usuarios diferentes 8en diferentes sesiones) veremos que el contador se les actualiza del mismo modo, y que no se detiene aunque cerremos todas las sesiones, ya que sólo parará si llamamos a &lt;em&gt;Stop()&lt;/em&gt; o si la aplicación se cierra.&lt;br/&gt;&lt;br/&gt;Esto último es muy importante: nuestro temporizador sólo funcionará mientras la aplicación Web esté funcionando. Es decir, que no se trata de un temporizador que se ejecuta todo el tiempo, desde que arranca el servidor, sino que mientras no se reciba una primera llamada a la aplicación y por lo tanto esta se inicie tampoco se iniciará el temporizador. Si por cualquier motivo (reciclado del grupo de aplicaciones, descarga de la memoria porque no hay usuarios, etc..) la aplicación se detiene también lo hará el temporizador.&lt;br/&gt;&lt;br/&gt;No obstante este método es muy interesante para ser utilizado con necesidades particulares sobre la disponibilidad de un evento periódico global en nuestras aplicaciones web.&lt;br/&gt;&lt;br/&gt;He dejado el ejemplo para descarga &lt;a href="http://www.jasoft.org/descargas/ModuloTemporizadorASPNET.zip"&gt;aquí&lt;/a&gt;.&lt;br/&gt;&lt;br/&gt;¡Espero que te resulte útil!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8219062580832314459-6993794732640803601?l=www.sqleros.com.ar' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/BlogSqleros/~4/3KB5sEKNMnE" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.sqleros.com.ar/feeds/6993794732640803601/comments/default" title="Enviar comentarios" /><link rel="replies" type="text/html" href="http://www.sqleros.com.ar/2010/12/como-crear-un-temporizador-global-en.html#comment-form" title="0 comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8219062580832314459/posts/default/6993794732640803601?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8219062580832314459/posts/default/6993794732640803601?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/BlogSqleros/~3/3KB5sEKNMnE/como-crear-un-temporizador-global-en.html" title="Cómo crear un temporizador global en ASP.NET" /><author><name>Ramms ZeñábI</name><uri>http://www.blogger.com/profile/05084493704196673506</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="13715620155140962144" /></author><thr:total>0</thr:total><feedburner:origLink>http://www.sqleros.com.ar/2010/12/como-crear-un-temporizador-global-en.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkUNQn47fSp7ImA9WhZXEUk.&quot;"><id>tag:blogger.com,1999:blog-8219062580832314459.post-5363238182555874548</id><published>2010-12-13T10:19:00.000-06:00</published><updated>2011-04-30T02:24:53.005-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-04-30T02:24:53.005-05:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="programacion" /><title>Como incluir jQuery usando los host de google</title><content type="html">Actualmente hay dos maneras de incluir la librería jQuery en nuestras paginas. La primera opción es bajar una copia desde su sitio Web en&lt;a href="http://jquery.com/"&gt;jQuery.com&lt;/a&gt; e incluirla en nuestro código; pero veamos como hacerlo también usando la copia que Google nos hace el favor de tener siempre disponible en su propio servidor web.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8219062580832314459-5363238182555874548?l=www.sqleros.com.ar' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.sqleros.com.ar/feeds/5363238182555874548/comments/default" title="Enviar comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8219062580832314459/posts/default/5363238182555874548?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8219062580832314459/posts/default/5363238182555874548?v=2" /><author><name>Ramms ZeñábI</name><uri>http://www.blogger.com/profile/05084493704196673506</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="13715620155140962144" /></author><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;AkUDQnsyeip7ImA9WhZXEUk.&quot;"><id>tag:blogger.com,1999:blog-8219062580832314459.post-5579598799678840502</id><published>2010-12-07T17:23:00.000-06:00</published><updated>2011-04-30T02:24:33.592-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-04-30T02:24:33.592-05:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="ORACLE" /><category scheme="http://www.blogger.com/atom/ns#" term="access" /><category scheme="http://www.blogger.com/atom/ns#" term="microsoft access" /><category scheme="http://www.blogger.com/atom/ns#" term="ms access" /><title>combinando MS Access con Oracle</title><content type="html">
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/cGK_m6h-x7ciEhc4nGK8gIc6GD0/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/cGK_m6h-x7ciEhc4nGK8gIc6GD0/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/cGK_m6h-x7ciEhc4nGK8gIc6GD0/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/cGK_m6h-x7ciEhc4nGK8gIc6GD0/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;Combinando Microsoft Access y Oracle&lt;br/&gt;En este artículo vamos a ver cómo implementar una sencilla aplicación que trabaje sobre una base de datos Oracle para actualizar datos y generar reportes, usando una herramienta amigable y disponible en la mayoría de los ordenadores como lo es Microsoft Access.&lt;br/&gt;&lt;br/&gt;La idea es, en 5 pasos crear una interfase gráfica con poco esfuerzo y en tiempo récord, que facilite la vida de muchos usuarios no IT, como por ejemplo la del Gerente del Area de Recursos Humanos que necesita ingresar y consultar datos en su base de datos corporativa. No hay necesidad de comprar un caro producto comercial para esa sencilla tarea.&lt;br/&gt;&lt;br/&gt;Qué software necesitamos para desarrollar y ejecutar nuestra aplicación?&lt;br/&gt;&lt;br/&gt;- Microsoft Access, sino nuestro archivo .mdb no será reconocido por Windows.&lt;br/&gt;- Un cliente Oracle, para que podamos conectarnos con la base de datos de destino.&lt;br/&gt;&lt;br/&gt;(Este software debe estar presente ya sea en la máquina que usemos para desarrollar como en la máquina destino donde va a correr el programa. No está en el alcance de este artículo explicar cómo instalar estos dos productos)&lt;br/&gt;&lt;br/&gt;Los 5 pasos para crear la aplicación&lt;br/&gt;&lt;br/&gt;1) Crear una conexión ODBC&lt;br/&gt;2) Vincular en Access las tablas de Oracle&lt;br/&gt;3) Crear las relaciones existentes&lt;br/&gt;4) Crear formularios&lt;br/&gt;5) Crear un reporte&lt;br/&gt;&lt;br/&gt;Nuestra aplicación va a conectarse y trabajar con el usuario Oracle SCOTT. Uso Windows Vista, Access 2003 y un cliente Oracle 10g.&lt;br/&gt;&lt;br/&gt;Disculpas por las pantallas de Access en portugués y Windows en inglés, pero es todo lo que tengo en la vuelta :)&lt;br/&gt;&lt;br/&gt;Paso 1. Crear una conexión ODBC&lt;br/&gt;&lt;br/&gt;- En Windows, vamos al menú Start, Control Panel, Administrative Tools y seleccionamos Data Sources (ODBC)&lt;br/&gt;&lt;br/&gt;- En la lengueta User DNS, presionar sobre el botón Add. Una lista de drivers disponibles aparecerá en un diálogo. Tenemos dos posiblidades para seleccionar, una es elegir el driver de Microsoft para Oracle (Microsoft ODBC for Oracle), y la otra es elegir el driver de Oracle que fue instalado con nuestro cliente (en mi caso Oracle em OraClient10g). Recomiendo usar el driver nativo de Oracle, ya que está optimizado y se corresponde exactamente con la versión de Oracle que acabamos de instalar.&lt;br/&gt;&lt;br/&gt;Nota: En caso que se nos presente un mensaje de error con el título SQORAS32 y el mensaje An unsupported operation was attemped, se trata de un bug conocido cuya solución está en Metalink nota NR.5699495. Será necesario descargar un patch y reemplazar algunos archivos en el cliente Oracle. Es aplicable a los clientes 10.2.0.3.0 a 10.2.0.3.7 y las instrucciones vienen con el propio patch.&lt;br/&gt;&lt;br/&gt;- En el diálogo siguiente, ingresar los datos de la conexión:&lt;br/&gt;&lt;br/&gt;Data Source Name: Un nombre cualquiera describiendo nuestra conexión&lt;br/&gt;Description: Opcional, puede ser nada&lt;br/&gt;TNS Service Name: El mismo nombre de servicio en nuestro tnsnames.ora&lt;br/&gt;User ID: Opcional, puede ser nada&lt;br/&gt;&lt;br/&gt;&lt;a href="http://sqleros.com.ar/wps/wp-content/uploads/2010/12/crear_odbc.png"&gt;&lt;img class="aligncenter size-medium wp-image-513" src="http://sqleros.com.ar/wps/wp-content/uploads/2010/12/crear_odbc-300x196.png" alt="" width="300" height="196" /&gt;&lt;/a&gt;&lt;br/&gt;&lt;br/&gt;- Pulsar Test Connection para ver si nuestra conexión funciona. Aparecerá un diálogo solicitando usuario y password. En mi caso colocaré scott/tiger. El mensaje Connection successfull deberá aparecer para poder continuar. De lo contrario, revisar el tnsnames.ora que está siendo usado, para ver si tiene la entrada correcta.&lt;br/&gt;&lt;br/&gt;Luego de seleccionar OK en el diálogo principal, nuestra conexión ODBC está lista para ser usada.&lt;br/&gt;&lt;br/&gt;Paso 2. Vincular en Access las tablas de Oracle&lt;br/&gt;&lt;br/&gt;- Ingresar a Access y comenzar un nuevo proyecto en blanco.&lt;br/&gt;&lt;br/&gt;- En el menú Insertar, elegir Tabla y Vinculación de tabla.&lt;br/&gt;&lt;br/&gt;&lt;a href="http://sqleros.com.ar/wps/wp-content/uploads/2010/12/select_odbc.png"&gt;&lt;img src="http://sqleros.com.ar/wps/wp-content/uploads/2010/12/select_odbc-300x221.png" alt="" width="300" height="221" class="aligncenter size-medium wp-image-514" /&gt;&lt;/a&gt;&lt;br/&gt;&lt;br/&gt;Aparecerá un diálogo como los de seleccionar archivos, pero tenemos primero que elegir en el combo Tipos de archivos, la opción Bases de datos (ODBC).&lt;br/&gt;&lt;br/&gt;Luego se muestra el diálogo Select Data Source. Ir a la lengueta Machine Data Source y seleccionar la conexión ODBC creada en el paso anterior.&lt;br/&gt;&lt;br/&gt;&lt;a href="http://sqleros.com.ar/wps/wp-content/uploads/2010/12/select_ds.png"&gt;&lt;img src="http://sqleros.com.ar/wps/wp-content/uploads/2010/12/select_ds-300x260.png" alt="" width="300" height="260" class="aligncenter size-medium wp-image-515" /&gt;&lt;/a&gt;&lt;br/&gt;&lt;br/&gt;Somos solicitados para informar el usuario y password de la base de datos Oracle (scott/tiger).&lt;br/&gt;&lt;br/&gt;Observar que se nos presentan todas las tablas y vistas a las que el usuario scott tiene acceso. Buscar aquellas que comienzan con el prefijo SCOTT y marcarlas: BONUS, DEPT, EMP y SALGRADE. Seleccionar OK.&lt;br/&gt;&lt;br/&gt;- Access solicitará indicar para algunas tablas las columnas identificadoras (clave primaria). Eso dependerá si la clave está definida en la tabla original o no. En este caso vamos a ignorar el aviso simplemente seleccionando OK.&lt;br/&gt;&lt;br/&gt;Listo! Las tablas ya están vinculadas en nuestro proyecto. Notar que el nombre de cada tabla asignado automáticamente por Access es [ESQUEMA]_[TABLA].&lt;br/&gt;&lt;br/&gt;Paso 3. Crear las relaciones&lt;br/&gt;&lt;br/&gt;Cuando se vinculan las tablas del esquema Oracle en Access, no se crean los relacionamientos entre ellas. Es necesario hacerlo manualmente, si queremos mantener el esquema de integridad de datos.&lt;br/&gt;&lt;br/&gt;- En el menú Herramientas, ingresar a Relaciones.&lt;br/&gt;&lt;br/&gt;- En el diálogo Mostrar Tabla, en la lengueta Tablas, seleccionar (presionando Control) las tablas SCOTT_EMP y SCOTT_DEPT, y pulsar Agregar. Las tablas se mostrarán en la ventana de relacionamientos, y podremos cerrar el diálogo Mostrar Tabla.&lt;br/&gt;&lt;br/&gt;- Si la tabla SCOTT_EMP no muestra todas las columnas, agrandarla desde el vértice inferior derecho para permitir ver la columna DEPT.&lt;br/&gt;&lt;br/&gt;&lt;a href="http://sqleros.com.ar/wps/wp-content/uploads/2010/12/crear_relacion.png"&gt;&lt;img src="http://sqleros.com.ar/wps/wp-content/uploads/2010/12/crear_relacion-300x155.png" alt="" width="300" height="155" class="aligncenter size-medium wp-image-516" /&gt;&lt;/a&gt;&lt;br/&gt;&lt;br/&gt;- Hacer click (izquierdo) sobre la columna DEPT de SCOTT_EMP, y sin soltar, arrastrar la columna hacia la tabla SCOTT_EMP, soltándola encima de la columna DEPTNO (clave primaria de SCOTT_DEPT). Un nuevo diálogo se abrirá con la definición de la relación.&lt;br/&gt;&lt;br/&gt;- Podemos elegir las propiedades de esta relación, en nuestro caso vamos a dejar todo por defecto, que corresponde a un INNER JOIN entre ambas tablas. Luego de seleccionar Crear, la relación entre las tablas será visible gráficamente en pantalla.&lt;br/&gt;&lt;br/&gt;&lt;a href="http://sqleros.com.ar/wps/wp-content/uploads/2010/12/relacion_empdept.png"&gt;&lt;img src="http://sqleros.com.ar/wps/wp-content/uploads/2010/12/relacion_empdept.png" alt="" width="293" height="208" class="aligncenter size-full wp-image-517" /&gt;&lt;/a&gt;&lt;br/&gt;&lt;br/&gt;- Cerrar la ventana de relacionamientos y elegir Sí para guardar los cambios.&lt;br/&gt;&lt;br/&gt;Paso 4. Crear formularios&lt;br/&gt;&lt;br/&gt;Tenemos las tablas vinculadas en Access con sus relaciones, y de aquí para adelante depende exclusivamente de nuestros conocimientos en Access. Da lo mismo que sean tablas propias de Access o de Oracle con las que estemos trabajando. Podemos inclusive usar este mismo esquema para importar datos desde una tabla Oracle a una local.&lt;br/&gt;&lt;br/&gt;Crearemos un formulario para cada una de las tablas importadas, para facilitar el mantenimiento de los datos a través de la aplicación. Explicaré cómo hacer los formularios de DEPT y EMP; para el resto es el mismo procedimiento.&lt;br/&gt;&lt;br/&gt;- En la ventana principal de Access, ir a Formularios, y elegir la opción Crear formulario usando el asistente.&lt;br/&gt;&lt;br/&gt;- Seleccionar la tabla SCOTT_DEPT en el combo de tablas, y seleccionar todos los campos disponibles (DEPTNO, DNAME, LOC) con el botón &amp;gt;&amp;gt;.&lt;br/&gt;&lt;br/&gt;- Presionar Avanzar, elegir el layout 'Columna', el estilo 'Standard', y escribir el título 'Departamentos'. Seleccionar Concluir.&lt;br/&gt;&lt;br/&gt;&lt;a href="http://sqleros.com.ar/wps/wp-content/uploads/2010/12/mantener_deptos.png"&gt;&lt;img src="http://sqleros.com.ar/wps/wp-content/uploads/2010/12/mantener_deptos-300x130.png" alt="" width="300" height="130" class="aligncenter size-medium wp-image-518" /&gt;&lt;/a&gt;&lt;br/&gt;&lt;br/&gt;Ya está listo nuestro primer formulario donde daremos mantenimiento a los departamentos. Por defecto, todas las operaciones sobre los datos están permitidas. Si se desea, se pueden alterar las propiedades del formulario activando la caja Propiedades con Alt-Enter.&lt;br/&gt;&lt;br/&gt;Ahora vamos al formulario de empleados.&lt;br/&gt;&lt;br/&gt;- En la ventana Formularios, elegir la opción Crear formulario usando el asistente.&lt;br/&gt;&lt;br/&gt;- Seleccionar la tabla SCOTT_EMP en el combo de tablas, y seleccionar todos los campos disponibles con el botón &amp;gt;&amp;gt;.&lt;br/&gt;&lt;br/&gt;- Elegir las mismas opciones que en la tabla anterior, excepto por el título 'Empleados'.&lt;br/&gt;&lt;br/&gt;Nuestro formulario de empleados está listo, pero vamos a introducir una pequeña mejora: que el campo DEPTNO en lugar de un texto numérico sea un combo list con los nombres de los departamentos, para evitar tener que recordar los números.&lt;br/&gt;&lt;br/&gt;- Seleccionar en el menú Exibir, el modo Diseño.&lt;br/&gt;&lt;br/&gt;- Marcar el campo DEPTNO en el formulario y borrarlo (pulsando la tecla DELETE)&lt;br/&gt;&lt;br/&gt;- En la caja de herramientas (lateral izquierda) seleccionar la herramienta Caja de Combinación.&lt;br/&gt;&lt;br/&gt;&lt;a href="http://sqleros.com.ar/wps/wp-content/uploads/2010/12/cajacombinacion.png"&gt;&lt;img src="http://sqleros.com.ar/wps/wp-content/uploads/2010/12/cajacombinacion.png" alt="" width="23" height="22" class="alignleft size-full wp-image-519" /&gt;&lt;/a&gt;&lt;br/&gt;&lt;br/&gt;- Crear el combo en el lugar que eliminamos el campo numérico DEPTNO. Se abrirá automáticamente el asistente para caja de combinación.&lt;br/&gt;&lt;br/&gt;- Seleccionar la primera opción para que el combo busque los datos a partir de una consulta y Avanzar.&lt;br/&gt;&lt;br/&gt;- Elegir la tabla SCOTT_DEPT y Avanzar.&lt;br/&gt;&lt;br/&gt;- Seleccionar los campos DEPTNO y DNAME y Avanzar&lt;br/&gt;&lt;br/&gt;- Definir el orden de ordenamiento por DNAME (creciente) y Avanzar.&lt;br/&gt;&lt;br/&gt;- Dejar seleccionado el checkbox Ocultar llave primaria y Avanzar.&lt;br/&gt;&lt;br/&gt;- Dejar la opción Recordar valor para uso posterior y Avanzar.&lt;br/&gt;&lt;br/&gt;- Si se desea modificar el rótulo, puede alterarse para 'DEPTO'.&lt;br/&gt;&lt;br/&gt;- Concluir la operación.&lt;br/&gt;&lt;br/&gt;&lt;a href="http://sqleros.com.ar/wps/wp-content/uploads/2010/12/mantener_emps.png"&gt;&lt;img src="http://sqleros.com.ar/wps/wp-content/uploads/2010/12/mantener_emps-300x231.png" alt="" width="300" height="231" class="aligncenter size-medium wp-image-520" /&gt;&lt;/a&gt;&lt;br/&gt;&lt;br/&gt;Terminamos nuestro formulario para dar mantenimiento a los empleados.&lt;br/&gt;Ahora nuestro campo de departamentos se actualiza dinámicamente a partir de la tabla SCOTT_DEPT.&lt;br/&gt;&lt;br/&gt;Repetir el proceso de creación de formularios para el resto de las tablas, y estaremos aptos para insertar, borrar y alterar registros completamente a través de nuestra interface gráfica.&lt;br/&gt;&lt;br/&gt;Paso 5. Crear un reporte&lt;br/&gt;&lt;br/&gt;Crearemos un reporte para mostrar un ejemplo más de funcionalidad.&lt;br/&gt;&lt;br/&gt;- En la ventana principal de Access, ir a Consultas, y elegir la opción Crear consulta en modo diseño.&lt;br/&gt;&lt;br/&gt;- Cerrar la ventana Mostrar tabla y en el menú Exibir seleccionar SQL.&lt;br/&gt;&lt;br/&gt;- Escribir la query:&lt;br/&gt;&lt;br/&gt;SELECT e.empno, e.ename, e.job, e.sal, d.dname, s.grade&lt;br/&gt;FROM scott_emp e, scott_dept d, scott_salgrade s&lt;br/&gt;WHERE e.deptno=d.deptno&lt;br/&gt;AND e.sal BETWEEN s.losal AND s.hisal&lt;br/&gt;&lt;br/&gt;- Cerrar la ventana query y elegir Sí para grabar los cambios, asignando un nombre cualquiera para la consulta, por ejemplo 'Salarios de empleados por departamento'.&lt;br/&gt;&lt;br/&gt;- En la ventana principal de Access, ir a Reportes, y elegir la opción Crear reporte usando el asistente.&lt;br/&gt;&lt;br/&gt;&lt;a href="http://sqleros.com.ar/wps/wp-content/uploads/2010/12/crear_reporte.png"&gt;&lt;img src="http://sqleros.com.ar/wps/wp-content/uploads/2010/12/crear_reporte-300x189.png" alt="" width="300" height="189" class="aligncenter size-medium wp-image-521" /&gt;&lt;/a&gt;&lt;br/&gt;&lt;br/&gt;- En el combo Tablas/Consultas elegir la consulta creada anteriormente, junto con todas las columnas disponibles en la consulta, y avanzar.&lt;br/&gt;&lt;br/&gt;- En el nivel de agrupamiento, elegir DNAME (el departamento) y avanzar.&lt;br/&gt;&lt;br/&gt;&lt;a href="http://sqleros.com.ar/wps/wp-content/uploads/2010/12/agrupar_reporte.png"&gt;&lt;img src="http://sqleros.com.ar/wps/wp-content/uploads/2010/12/agrupar_reporte-300x217.png" alt="" width="300" height="217" class="aligncenter size-medium wp-image-522" /&gt;&lt;/a&gt;&lt;br/&gt;&lt;br/&gt;- Elegir el ordenamiento por orden de ENAME creciente.&lt;br/&gt;&lt;br/&gt;- Dejar las opciones de diseño por defecto y avanzar hasta visualizar el reporte.&lt;br/&gt;&lt;br/&gt;&lt;a href="http://sqleros.com.ar/wps/wp-content/uploads/2010/12/reporte_visualizar.png"&gt;&lt;img src="http://sqleros.com.ar/wps/wp-content/uploads/2010/12/reporte_visualizar-300x249.png" alt="" width="300" height="249" class="aligncenter size-medium wp-image-523" /&gt;&lt;/a&gt;&lt;br/&gt;&lt;br/&gt;Nuestro reporte está listo luego de 10 minutos con cero esfuerzo de programación, simplemente usando una sencilla consulta SQL.&lt;br/&gt;&lt;br/&gt;Combinamos la facilidad de uso y versatilidad de una herramienta como Access con el potencial de una base de datos Oracle. Las posibilidades dependen sólo de nuestra voluntad, pudiendo integrar planillas de Excel, gráficos, multimedia y mejorar la lógica de nuestra aplicacion con VBA (Visual Basic for Applications).&lt;br/&gt;&lt;br/&gt;PD: hago mención de que esta tuto no es mio,, es publicad por Ifer de este &lt;a href="http://oraclenotepad.blogspot.com/2008/07/como-combinar-microsoft-access-y-oracle.html"&gt;blog&lt;/a&gt;, solo para que no digan repost o lammer o demas tonterias,, ahi se los dejo,, es bueno hacer este tipo de post xDXDXDXDXD KDSDSDSD&lt;br/&gt;&lt;br/&gt;see u next time&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8219062580832314459-5579598799678840502?l=www.sqleros.com.ar' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/BlogSqleros/~4/6Dxid7BOZZw" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.sqleros.com.ar/feeds/5579598799678840502/comments/default" title="Enviar comentarios" /><link rel="replies" type="text/html" href="http://www.sqleros.com.ar/2010/12/combinando-ms-access-con-oracle.html#comment-form" title="0 comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8219062580832314459/posts/default/5579598799678840502?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8219062580832314459/posts/default/5579598799678840502?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/BlogSqleros/~3/6Dxid7BOZZw/combinando-ms-access-con-oracle.html" title="combinando MS Access con Oracle" /><author><name>Ramms ZeñábI</name><uri>http://www.blogger.com/profile/05084493704196673506</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="13715620155140962144" /></author><thr:total>0</thr:total><feedburner:origLink>http://www.sqleros.com.ar/2010/12/combinando-ms-access-con-oracle.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkUDQnsyeip7ImA9WhZXEUk.&quot;"><id>tag:blogger.com,1999:blog-8219062580832314459.post-4556211892785124066</id><published>2010-12-07T14:39:00.000-06:00</published><updated>2011-04-30T02:24:33.592-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-04-30T02:24:33.592-05:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term=".net" /><category scheme="http://www.blogger.com/atom/ns#" term="Regular Expressions" /><category scheme="http://www.blogger.com/atom/ns#" term="ASP.NET" /><category scheme="http://www.blogger.com/atom/ns#" term="programacion" /><category scheme="http://www.blogger.com/atom/ns#" term="C#" /><category scheme="http://www.blogger.com/atom/ns#" term="Find and Replace" /><title>Convertir campos públicos en propiedades publicas usando Expresiones
Regulares</title><content type="html">
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/r2RdAFWNSfX8BlR1SPphTHMCWJU/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/r2RdAFWNSfX8BlR1SPphTHMCWJU/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/r2RdAFWNSfX8BlR1SPphTHMCWJU/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/r2RdAFWNSfX8BlR1SPphTHMCWJU/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;Buen día lectores ya llevaba algo de tiempo sin presentar nada en el blog, salvo, las intervenciones del Kellogs, que ha sido muy amable al postear varios artículos, ahora me encuentro&lt;a name='more'&gt;&lt;/a&gt; trabajando... Jojojo, por fin!, el día de hoy les pasaré un truco que me sirve mucho y este es el usar el &amp;lt;&amp;lt;Find and Replace&amp;gt;&amp;gt; de Visual Studio 200x, es algo muy cómodo el hecho de cambiar de manera sistemática nuestro código... (Les confieso, soy algo flojo, para eso... de estar cambiando el código a mano ;) )&lt;br/&gt;&lt;br/&gt;En nuestro ejemplo de hoy vamos a convertir campos publicos... en propiedades de clase...  ñ_ñ, esto es util cuando tenemos muchos campos en la clase y se nos paso implementar los &amp;lt;&amp;lt;setters&amp;gt;&amp;gt; y &amp;lt;&amp;lt;getters&amp;gt;&amp;gt; es decir crear propiedades.&lt;br/&gt;&lt;br/&gt;Bueno vamos a la obra... supongamos que tenemos un código parecido a este:&lt;br/&gt;&lt;br/&gt;[sourcecode lang="c#"]&lt;br/&gt;[System.Runtime.Serialization.DataMemberAttribute(EmitDefaultValue = false, Order = 0)]&lt;br/&gt;public string executeSoapV1Result;&lt;br/&gt;[/sourcecode]&lt;br/&gt;y lo queremos convertir en algo así:&lt;br/&gt;[sourcecode lang="c#"]&lt;br/&gt;private string _executeSoapV1Result;&lt;br/&gt;[System.Runtime.Serialization.DataMemberAttribute(EmitDefaultValue = false, Order = 0)]&lt;br/&gt;public string executeSoapV1Result&lt;br/&gt;{&lt;br/&gt;get&lt;br/&gt;{&lt;br/&gt;return _executeSoapV1Result;&lt;br/&gt;}&lt;br/&gt;set&lt;br/&gt;{&lt;br/&gt;_executeSoapV1Result = value;&lt;br/&gt;}&lt;br/&gt;}&lt;br/&gt;[/sourcecode]&lt;br/&gt;Ahora usaremos &amp;lt;&amp;lt;Find and Replace&amp;gt;&amp;gt; pulsando la tecla Ctrol+H, o en &amp;lt;&amp;lt;Edit&amp;gt;&amp;gt;/Find and Replace/Quick Replace.&lt;br/&gt;&lt;br/&gt;en &amp;lt;&amp;lt;Find What&amp;gt;&amp;gt; :&lt;br/&gt;&lt;br/&gt;{\[System\.Runtime\.Serialization\.DataMemberAttribute(.*)\]}\n{(.*)}public {(.*)} {(.*)};$&lt;br/&gt;&lt;br/&gt;en &amp;lt;&amp;lt;Replace With&amp;gt;&amp;gt; :&lt;br/&gt;&lt;br/&gt;private \3 _\4;\n\1\npublic \3 \4\{\nget\{ return _\4;\n\}\nset\{ _\4 = value;\n\}\n\}&lt;br/&gt;&lt;br/&gt;en la parte de &amp;lt;&amp;lt;Find Options&amp;gt;&amp;gt; palomeamos &amp;lt;&amp;lt;Use&amp;gt;&amp;gt; y seleccionamos &amp;lt;&amp;lt;Regular expressions&amp;gt;&amp;gt;.&lt;br/&gt;&lt;br/&gt;Después click en &amp;lt;&amp;lt;Replace all&amp;gt;&amp;gt; y para terminar Ctrl+K, Ctrl+D para formatear la salida correctamente. Espero les sea útil. Les mando&lt;br/&gt;¡Un Saludo!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8219062580832314459-4556211892785124066?l=www.sqleros.com.ar' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/BlogSqleros/~4/ze_bJ2vBvOU" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.sqleros.com.ar/feeds/4556211892785124066/comments/default" title="Enviar comentarios" /><link rel="replies" type="text/html" href="http://www.sqleros.com.ar/2010/12/convertir-campos-publicos-en.html#comment-form" title="0 comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8219062580832314459/posts/default/4556211892785124066?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8219062580832314459/posts/default/4556211892785124066?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/BlogSqleros/~3/ze_bJ2vBvOU/convertir-campos-publicos-en.html" title="Convertir campos públicos en propiedades publicas usando Expresiones Regulares" /><author><name>Ramms ZeñábI</name><uri>http://www.blogger.com/profile/05084493704196673506</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="13715620155140962144" /></author><thr:total>0</thr:total><feedburner:origLink>http://www.sqleros.com.ar/2010/12/convertir-campos-publicos-en.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkUDQnsyeip7ImA9WhZXEUk.&quot;"><id>tag:blogger.com,1999:blog-8219062580832314459.post-7360054168277141880</id><published>2010-12-05T20:07:00.000-06:00</published><updated>2011-04-30T02:24:33.592-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-04-30T02:24:33.592-05:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Java" /><category scheme="http://www.blogger.com/atom/ns#" term="programacion" /><title>Aprendiendo Script en InDesign CS4 - Learning Script in ID CS4</title><content type="html">
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/IaA2QdFbmObtpWLjUGSrfdI-Pmc/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/IaA2QdFbmObtpWLjUGSrfdI-Pmc/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/IaA2QdFbmObtpWLjUGSrfdI-Pmc/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/IaA2QdFbmObtpWLjUGSrfdI-Pmc/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;bueno,, por motivos mas complejos e internos,, deje de postear hace mucho tiempo,, pero no he dejado de ver los post,, ya que me gusta ir aprendiendo cosas nuevas,, aki les traigo un pequeño manual que encontre en la red, con ejemplos muy practicos, para algunos puede ser muy fácil pero puede que vean puntos más claros o comprendan aun más algo que ya sabían.&lt;br/&gt;&lt;br/&gt;Todo es en base a JavaScript,, pero pueden manejar apple o visualscript,, depende de cada uno,, lo cual se le haga más fácil,, de uno a otro no hay mucha diferencia de sintaxis XDXD asi que comenzamos:&lt;br/&gt;&lt;br/&gt;manejando el ejemplo más auditable y común entre los newbies es un "Hola Mundo" jeje,, muchos van  a decir,, "ahh ese es fácil con java o cualquier otro" pues sí, es fácil,, pero lo pongo :@ :P&lt;br/&gt;&lt;br/&gt;&lt;strong&gt;var myWindow =  new Window ("dialog");&lt;/strong&gt; ---&amp;gt; creamos una nueva ventana de tipo dialogo&lt;br/&gt;&lt;strong&gt; var myMessage = myWindow.add ("statictext");&lt;/strong&gt; ---&amp;gt; la cual agregamos un elemento "myMessage" el cual tiene texto&lt;br/&gt;&lt;strong&gt; myMessage = "Hola, Mundo";&lt;/strong&gt; ---&amp;gt; texto&lt;br/&gt;&lt;strong&gt;myWindow.show ();&lt;/strong&gt; ---&amp;gt; mostrando la ventana&lt;br/&gt;&lt;br/&gt;no es necesario hacer una explicación,, ya que esto es fácil de comprender para cada uno de los que lee este post, prosigamos (en las lineas principales coloco un comentario hacer de "que hace" ,,,&lt;br/&gt;&lt;br/&gt;Puedo imaginar que saben que existen los tipos de ventana, los cuales son "dialog" y "palette"&lt;br/&gt;&lt;br/&gt;para crear el ejemplo anterior en una ventana de tipo palette agregamos el siguiente codigo:&lt;br/&gt;&lt;br/&gt;&lt;strong&gt;#targetengine "session";&lt;br/&gt;&lt;br/&gt;var myWindow = new Window ("palette");&lt;br/&gt; var myMessage = myWindow.add ("statictext");&lt;br/&gt; myMessage = "Hola, Mundo";&lt;br/&gt;myWindow.show ();&lt;/strong&gt;&lt;br/&gt;&lt;br/&gt;eeee,,, "no me vengas con tonterías, es muy fácil", jaja pues si,  really easily&lt;br/&gt;&lt;br/&gt;ok,, continuemos,, ahora iremos complementando el pequeño app, agregando controles XDXD:&lt;br/&gt;pues ya lo hemos echo,, jeje,, en la linea var myMessage = myWindow.add ("statictext") esto es el control --&amp;gt; statictext&lt;br/&gt;&lt;br/&gt;complementando lo anterior al código, sería algo como esto:&lt;br/&gt;&lt;br/&gt;&lt;strong&gt;var myWindow = new Window ("dialog", "Form");&lt;br/&gt; myWindow.add ("statictext", undefined, "Name:");&lt;br/&gt; var myText = myWindow.add ("edittext");&lt;br/&gt;myWindow.show ();&lt;/strong&gt;&lt;br/&gt;&lt;br/&gt;si se dan cuenta,, despues de "dialog" agrege "Form", esto hace que le de un nombre visible.&lt;br/&gt;Además,, si ponen atención,, la orientación de los elementos es en columna,, extraño no,, pues no,, por default esta de esta manera en columna, pero podemos cambiarla a fila,, digamos que son un poco mas quisquillosos en este sentido, pues sería algo así:&lt;br/&gt;&lt;br/&gt;&lt;strong&gt;var myWindow = new Window ("dialog", "Form");&lt;br/&gt;myWindow.orientation = "row";&lt;br/&gt;myWindow.add ("statictext", undefined, "Name:");&lt;br/&gt;var myText = myWindow.add ("edittext");&lt;br/&gt;myWindow.show ();&lt;/strong&gt;&lt;br/&gt;&lt;br/&gt;agregamos el control orientation XDXDXD, ahora digamos que debe tener un texto cuando corra la aplicación pero que sea editable, con una longitud limitada, seguimos con el código de esta manera:&lt;br/&gt;&lt;br/&gt;&lt;strong&gt;var myWindow = new Window ("dialog", "Form");&lt;br/&gt;myWindow.orientation = "row";&lt;br/&gt;myWindow.add ("statictext", undefined, "Name:");&lt;br/&gt;var myText = myWindow.add ("edittext", undefined, "Hector F.");&lt;br/&gt;myText.characters = 30;&lt;br/&gt;myWindow.show ();&lt;/strong&gt;&lt;br/&gt;&lt;br/&gt;pueden editar la longitud a su gusto manejando los controles de characters, ahora digamos, que queremos que cuando ejecutemos la aplicación quede activa la parte del texto,, es decir,, cuando este visible el cursor este en la parte del campo de texto, jojo,, :&lt;br/&gt;&lt;br/&gt;&lt;strong&gt;var myWindow = new Window ("dialog", "Form");&lt;br/&gt;myWindow.orientation = "row";&lt;br/&gt;myWindow.add ("statictext", undefined, "Name:");&lt;br/&gt;var myText = myWindow.add ("edittext", undefined, "Hector F.");&lt;br/&gt;myText.characters = 30;&lt;br/&gt;myText.active = true;&lt;br/&gt;myWindow.show ();&lt;/strong&gt;&lt;br/&gt;&lt;br/&gt;mmm, divertido,, interesante y motivador,, agregemos unos botones de acción (asi me gusta nombrarlos XDXD):&lt;br/&gt;&lt;br/&gt;&lt;strong&gt;var myWindow = new Window ("dialog", "Form");&lt;br/&gt;myWindow.orientation = "row";&lt;br/&gt;myWindow.add ("statictext", undefined, "Name:");&lt;br/&gt;var myText = myWindow.add ("edittext", undefined, "Hector F.");&lt;br/&gt;myText.characters = 30;&lt;br/&gt;myText.active = true;&lt;br/&gt;myWindow.add ("button", undefined, "OK");&lt;br/&gt;myWindow.add ("button", undefined, "Cancel");&lt;br/&gt;myWindow.show ();&lt;/strong&gt;&lt;br/&gt;&lt;br/&gt;ejecuten la aplicación, al parecer todos los elementos estan orientados en fila, esto es porque la ventana esta orientada a esa posición, para cambiar la orientación, usaremos unos items,, group y panel, estos dos hacen lo mismo, agrupar los controles, pero difieren de la siguiente manera, group tiene bordos, el panel no, para no afectar a todo lo que concierne a esa ventana en la orientación, agregaremos esto XDXD:&lt;br/&gt;&lt;br/&gt;&lt;strong&gt;var myWindow = new Window ("dialog", "Form");&lt;br/&gt;var myInputGroup = myWindow.add ("group");&lt;br/&gt;myInputGroup.add ("statictext", undefined, "Name:");&lt;br/&gt;var myText = myInputGroup.add ("edittext", undefined, "John");&lt;br/&gt;myText.characters = 20;&lt;br/&gt;myText.active = true;&lt;br/&gt;var myButtonGroup = myWindow.add ("group");&lt;br/&gt;myButtonGroup.alignment = "right";&lt;br/&gt;myButtonGroup.add ("button", undefined, "OK");&lt;br/&gt;myButtonGroup.add ("button", undefined, "Cancel");&lt;br/&gt;myWindow.show ();&lt;/strong&gt;&lt;br/&gt;&lt;br/&gt;he agregado dos grupos, myInputGroup y MyButtonGroup, fijense que he eliminado la linea que setea la orientacion, esto es por que ya no es necesario, por que lo he divido en dos grupos,, digamo que juan es programador,, y botanas es analista, cada quien esta orientado a una funcion diferente aunque esten en la misma empresa, otro punto agregado es ".aligment = right", fácil de deducir :P XDXD, claro esta que si te gusta experimentar más a fondo puedes hacer lo siguiente,, no explicare porque es muy deducible:&lt;br/&gt;&lt;br/&gt;&lt;strong&gt;var myWindow = new Window ("dialog", "Form");&lt;br/&gt;myWindow.orientation = "row";&lt;br/&gt;var myInputGroup = myWindow.add ("group");&lt;br/&gt;myInputGroup.add ("statictext", undefined, "Name:");&lt;br/&gt;var myText = myInputGroup.add ("edittext", undefined, "John");&lt;br/&gt;myText.characters = 20;&lt;br/&gt;myText.active = true;&lt;br/&gt;var myButtonGroup = myWindow.add ("group");&lt;br/&gt;myButtonGroup.orientation = "column";&lt;br/&gt;myButtonGroup.add ("button", undefined, "OK");&lt;br/&gt;myButtonGroup.add ("button", undefined, "Cancel");&lt;br/&gt;myWindow.show ();&lt;/strong&gt;&lt;br/&gt;&lt;br/&gt;un poco de lucides al app, pondremos la ventana hacia arriba, podemos agregar el siguiente código antes o después de la segunda linea,, no importa:&lt;br/&gt;&lt;br/&gt;&lt;strong&gt;var myWindow = new Window ("dialog", "Form");&lt;br/&gt;myWindow.orientation = "row";&lt;br/&gt;myWindow.alignChildren = "top";&lt;br/&gt;var myInputGroup = myWindow.add ("group");&lt;br/&gt;myInputGroup.add ("statictext", undefined, "Name:");&lt;br/&gt;var myText = myInputGroup.add ("edittext", undefined, "John");&lt;br/&gt;myText.characters = 20;&lt;br/&gt;myText.active = true;&lt;br/&gt;var myButtonGroup = myWindow.add ("group");&lt;br/&gt;myButtonGroup.orientation = "column";&lt;br/&gt;myButtonGroup.add ("button", undefined, "OK");&lt;br/&gt;myButtonGroup.add ("button", undefined, "Cancel");&lt;br/&gt;myWindow.show ();&lt;/strong&gt;&lt;br/&gt;&lt;br/&gt;hasta aqui es bueno, pero los botones ok y cancel no hacen nada, pues utilizariamos funciones como if else, si se presiona ok que vuelva a mostrar el app, en caso contrario que salga, algo por el estilo sería asi:&lt;br/&gt;&lt;br/&gt;&lt;strong&gt;if (myWindow.show () == 1)&lt;br/&gt; var myName = myText.text;&lt;br/&gt;else&lt;br/&gt; exit ();&lt;/strong&gt;&lt;br/&gt;&lt;br/&gt;bueno,, seguire en otra ocasión, esto salio por un rato de ocio en la oficina, pero como ya tengo trabajo que hacer, pues hasta aqui le dejo,, ahi cualquier cosa comenten,, no he agregado algo hacia indesign,, pero el punto principal era que tomaran en cuenta que hacer script es dirigido para cualquier cosa que quieras hacer, bla bla,, jaja, k cosas, después pondre scripts dedicados al soft de indesign,, pero son algos complejos,, algo como agregar grids, o posicionar una imagen, hacer un resize de imagens, recolocar texto, cortar texto, y demás, se oye interesante, pero aun no hago algo concreto, he practicado pero necesito mas tiempo para postear un ejemplo práctico funcionable, jeje, suerte nenas, besos.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8219062580832314459-7360054168277141880?l=www.sqleros.com.ar' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/BlogSqleros/~4/ve0qV6N4dlY" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.sqleros.com.ar/feeds/7360054168277141880/comments/default" title="Enviar comentarios" /><link rel="replies" type="text/html" href="http://www.sqleros.com.ar/2010/12/aprendiendo-script-en-indesign-cs4.html#comment-form" title="3 comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8219062580832314459/posts/default/7360054168277141880?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8219062580832314459/posts/default/7360054168277141880?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/BlogSqleros/~3/ve0qV6N4dlY/aprendiendo-script-en-indesign-cs4.html" title="Aprendiendo Script en InDesign CS4 - Learning Script in ID CS4" /><author><name>Ramms ZeñábI</name><uri>http://www.blogger.com/profile/05084493704196673506</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="13715620155140962144" /></author><thr:total>3</thr:total><feedburner:origLink>http://www.sqleros.com.ar/2010/12/aprendiendo-script-en-indesign-cs4.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkUDQnsyeip7ImA9WhZXEUk.&quot;"><id>tag:blogger.com,1999:blog-8219062580832314459.post-8401428692288582706</id><published>2010-11-17T12:40:00.000-06:00</published><updated>2011-04-30T02:24:33.592-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-04-30T02:24:33.592-05:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="OpenSource" /><category scheme="http://www.blogger.com/atom/ns#" term="Open Source" /><category scheme="http://www.blogger.com/atom/ns#" term="Frikadas" /><category scheme="http://www.blogger.com/atom/ns#" term="mod_pagespeed" /><category scheme="http://www.blogger.com/atom/ns#" term="programacion" /><category scheme="http://www.blogger.com/atom/ns#" term="Sistemas Operativos" /><category scheme="http://www.blogger.com/atom/ns#" term="php" /><category scheme="http://www.blogger.com/atom/ns#" term="google" /><category scheme="http://www.blogger.com/atom/ns#" term="Apache" /><title>Google: mod_pagespeed, tus sitios optimizados</title><content type="html">
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/JWP_NThipAJYYppkSBqqJ3xJLbo/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/JWP_NThipAJYYppkSBqqJ3xJLbo/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/JWP_NThipAJYYppkSBqqJ3xJLbo/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/JWP_NThipAJYYppkSBqqJ3xJLbo/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;p style="text-align: justify;"&gt;El modulo, llamado mod_pagespeed, puede ser instalado y configurado en los servidores web Apache, el software más utilizado para el funcionamiento de sitios web. Una vez instalado, mod_pagespeed determina sobre la marcha la manera de optimizar el rendimiento de una web. Por ejemplo, comprime imágenes de manera más eficiente y cambia la configuración para que un mayor número de páginas se almacenen en el caché del navegador del usuario, de modo que los mismos datos no tengan que cargarse en varias ocasiones. El software se actualiza automáticamente, señala Richard Rabbat, gerente de producto para el nuevo proyecto. Afirma que esto significa que a medida que Google y otras terceras partes realicen mejoras, las personas que lo instalen se beneficiarán de dichas mejoras sin tener que realizar ningún cambio.  "Creemos que hacer que toda la red sea más rápida es algo crítico para el éxito de Google", señala Rabbat. Hacer que la red sea más rápida debería animar a la gente a usarla más y aumentar la probabilidad de que usen los servicios y el software de Google. Rabbat señala la frustración que sienten los usuarios cuando hacen clic en un enlace o escriben una dirección URL y observan una página en blanco durante varios segundos. "En muchos casos," afirma, "personalmente abandono esa página cuando algo como eso ocurre".  Google ya ofrece una herramienta llamada Page Speed, encargada de medir la velocidad a la que se carga una página web y sugerir formas de mejorarla. "Nos hicimos la siguiente pregunta: en lugar de simplemente decirle a la gente cuáles son los problemas, ¿podemos arreglarlos de forma&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8219062580832314459-8401428692288582706?l=www.sqleros.com.ar' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/BlogSqleros/~4/sZo_REPOCDM" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.sqleros.com.ar/feeds/8401428692288582706/comments/default" title="Enviar comentarios" /><link rel="replies" type="text/html" href="http://www.sqleros.com.ar/2010/11/google-modpagespeed-tus-sitios.html#comment-form" title="0 comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8219062580832314459/posts/default/8401428692288582706?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8219062580832314459/posts/default/8401428692288582706?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/BlogSqleros/~3/sZo_REPOCDM/google-modpagespeed-tus-sitios.html" title="Google: mod_pagespeed, tus sitios optimizados" /><author><name>Ramms ZeñábI</name><uri>http://www.blogger.com/profile/05084493704196673506</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="13715620155140962144" /></author><thr:total>0</thr:total><feedburner:origLink>http://www.sqleros.com.ar/2010/11/google-modpagespeed-tus-sitios.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkUNQn47fSp7ImA9WhZXEUk.&quot;"><id>tag:blogger.com,1999:blog-8219062580832314459.post-3454617231475750248</id><published>2010-11-10T00:15:00.000-06:00</published><updated>2011-04-30T02:24:53.005-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-04-30T02:24:53.005-05:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="programacion" /><title>Parametros Opcionales en C# 4.0</title><content type="html">Buen día SQLeros después de un buen rato de no poner nada en el blog, les preparé un post que versa sobre los parámetros opcionales en el C# 4.0 y la gran utilidad que estos proporcionan  a la hora de codificar y también un pequeño ejemplo de ellos.&lt;br/&gt;&lt;br/&gt;Ahora empecemos... ¿Que son los parámetros opcionales?&lt;br/&gt;&lt;br/&gt;En la definición de un método, constructor, indizador o delegado se puede especificar si sus parámetros son obligatorios u opcionales. Todas las llamadas deben proporcionar argumentos para todos los parámetros obligatorios, pero pueden omitir los argumentos para los parámetros opcionales.&lt;br/&gt;&lt;br/&gt;Cada parámetro opcional tiene un valor predeterminado como parte de su definición. Si no se envía ningún argumento para ese parámetro, se utiliza el valor predeterminado. Los valores predeterminados deben ser constantes.&lt;br/&gt;&lt;br/&gt;Los parámetros opcionales se definen al final de la lista de parámetros, después de los parámetros obligatorios. Si el llamador proporciona un argumento para cualquiera de los parámetros opcionales de una sucesión de este tipo, debe proporcionar argumentos para todos los parámetros opcionales anteriores. No se admiten los espacios separados por comas en la lista de argumentos.&lt;br/&gt;&lt;br/&gt;Por ejemplo en el siguiente código especificamos parámetros opcionales.&lt;br/&gt;&lt;p style="text-align: center;"&gt;&lt;a href="http://sqleros.com.ar/wps/wp-content/uploads/2010/11/Sin-título.png"&gt;&lt;img class="aligncenter size-medium wp-image-478" title="Parámetros Opcionales" src="http://sqleros.com.ar/wps/wp-content/uploads/2010/11/Sin-título-300x110.png" alt="" width="300" height="110" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8219062580832314459-3454617231475750248?l=www.sqleros.com.ar' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.sqleros.com.ar/feeds/3454617231475750248/comments/default" title="Enviar comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8219062580832314459/posts/default/3454617231475750248?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8219062580832314459/posts/default/3454617231475750248?v=2" /><author><name>Ramms ZeñábI</name><uri>http://www.blogger.com/profile/05084493704196673506</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="13715620155140962144" /></author><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;AkUDQnsyeyp7ImA9WhZXEUk.&quot;"><id>tag:blogger.com,1999:blog-8219062580832314459.post-529713234868077653</id><published>2010-10-13T02:14:00.000-05:00</published><updated>2011-04-30T02:24:33.593-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-04-30T02:24:33.593-05:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="windows 7" /><category scheme="http://www.blogger.com/atom/ns#" term=".net" /><category scheme="http://www.blogger.com/atom/ns#" term="Frikadas" /><category scheme="http://www.blogger.com/atom/ns#" term="accespoint" /><category scheme="http://www.blogger.com/atom/ns#" term="hotspot" /><category scheme="http://www.blogger.com/atom/ns#" term="programacion" /><category scheme="http://www.blogger.com/atom/ns#" term="C#" /><category scheme="http://www.blogger.com/atom/ns#" term="Sistemas Operativos" /><title>SQLeros HotSpot Creator</title><content type="html">
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/EA6s0IvOUOucEp-pPGAYf0VJTZI/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/EA6s0IvOUOucEp-pPGAYf0VJTZI/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/EA6s0IvOUOucEp-pPGAYf0VJTZI/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/EA6s0IvOUOucEp-pPGAYf0VJTZI/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;Bueno mis estimados lectores en este post, les traigo un programa que escribí para darle una &lt;a href="http://www.google.com.mx/url?sa=t&amp;amp;source=web&amp;amp;cd=1&amp;amp;ved=0CBQQFjAA&amp;amp;url=http%3A%2F%2Fes.wikipedia.org%2Fwiki%2FInterfaz_gr%25C3%25A1fica_de_usuario&amp;amp;ei=3Em1TMG_LIX0swO02_HpCA&amp;amp;usg=AFQjCNFH0cDucq0r-WvR9Xym-SvBonXDAw&amp;amp;sig2=PgKFstoT1zVmgw1oiHMSrw" target="_blank"&gt;GUI&lt;/a&gt;, a &lt;a href="http://www.google.com.mx/url?sa=t&amp;amp;source=web&amp;amp;cd=1&amp;amp;ved=0CBcQFjAA&amp;amp;url=http%3A%2F%2Fes.wikipedia.org%2Fwiki%2FNetsh&amp;amp;ei=-Um1TNKUOIWcsQOR4JCWCA&amp;amp;usg=AFQjCNEAXiqaTiW020p3GjkoAoamLqSOTQ&amp;amp;sig2=CS3idb5vL6l83XqPmSbMIA" target="_blank"&gt;netsh&lt;/a&gt;. En este caso para la interface inalambrica.&lt;br/&gt;&lt;br/&gt;Se me ocurrió; por que para mi es tedioso estar haciendo los pasos citados&lt;span style="color: #0000ee;"&gt;&lt;span style="text-decoration: underline;"&gt; aquí&lt;/span&gt;&lt;/span&gt;.&lt;br/&gt;&lt;br/&gt;Ahora les presento unas pantallas:&lt;br/&gt;&lt;br/&gt;[caption id="attachment_468" align="aligncenter" width="279" caption="Pantalla principal"]&lt;a href="http://sqleros.com.ar/wps/wp-content/uploads/2010/10/shcPost.png"&gt;&lt;img class="size-full wp-image-468" title="shcPost" src="http://sqleros.com.ar/wps/wp-content/uploads/2010/10/shcPost.png" alt="" width="279" height="182" /&gt;&lt;/a&gt;[/caption]&lt;br/&gt;&lt;br/&gt;[caption id="attachment_469" align="aligncenter" width="281" caption="Opciones del programa..."]&lt;a href="http://sqleros.com.ar/wps/wp-content/uploads/2010/10/shcPost1.png"&gt;&lt;img class="size-full wp-image-469" title="shcPost1" src="http://sqleros.com.ar/wps/wp-content/uploads/2010/10/shcPost1.png" alt="" width="281" height="210" /&gt;&lt;/a&gt;[/caption]&lt;br/&gt;&lt;br/&gt;[caption id="attachment_470" align="aligncenter" width="300" caption="en la bandeja del sistema"]&lt;a href="http://sqleros.com.ar/wps/wp-content/uploads/2010/10/shcPost2.png"&gt;&lt;img class="size-medium wp-image-470" title="shcPost2" src="http://sqleros.com.ar/wps/wp-content/uploads/2010/10/shcPost2-300x81.png" alt="" width="300" height="81" /&gt;&lt;/a&gt;[/caption]&lt;br/&gt;&lt;br/&gt;[caption id="attachment_471" align="aligncenter" width="300" caption="Opciones del icono de notificación"]&lt;a href="http://sqleros.com.ar/wps/wp-content/uploads/2010/10/shcPost3.png"&gt;&lt;img class="size-medium wp-image-471" title="shcPost3" src="http://sqleros.com.ar/wps/wp-content/uploads/2010/10/shcPost3-300x210.png" alt="" width="300" height="210" /&gt;&lt;/a&gt;[/caption]&lt;br/&gt;&lt;p style="text-align: center;"&gt;&lt;a href="http://sqleros.com.ar/wps/wp-content/uploads/2010/10/shcPost3.png"&gt;&lt;br/&gt;&lt;/a&gt;Como pueden ver es algo sencillo pero funcional...&lt;/p&gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;[caption id="attachment_472" align="aligncenter" width="219" caption="Red creada..."]&lt;a href="http://sqleros.com.ar/wps/wp-content/uploads/2010/10/shcPost4.png"&gt;&lt;img class="size-medium wp-image-472" title="shcPost4" src="http://sqleros.com.ar/wps/wp-content/uploads/2010/10/shcPost4-219x300.png" alt="" width="219" height="300" /&gt;&lt;/a&gt;[/caption]&lt;br/&gt;&lt;p style="text-align: center;"&gt;Bueno mis estimados lectores, les dejo el código del programa &lt;a href="http://www.megaupload.com/?d=TKS5XWBX" target="_blank"&gt;aquí&lt;/a&gt;.&lt;/p&gt;&lt;br/&gt;Y también les mando un caluroso saludo,¡hasta otro post!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8219062580832314459-529713234868077653?l=www.sqleros.com.ar' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/BlogSqleros/~4/EQIYA2-8J50" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.sqleros.com.ar/feeds/529713234868077653/comments/default" title="Enviar comentarios" /><link rel="replies" type="text/html" href="http://www.sqleros.com.ar/2010/10/sqleros-hotspot-creator.html#comment-form" title="0 comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8219062580832314459/posts/default/529713234868077653?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8219062580832314459/posts/default/529713234868077653?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/BlogSqleros/~3/EQIYA2-8J50/sqleros-hotspot-creator.html" title="SQLeros HotSpot Creator" /><author><name>Ramms ZeñábI</name><uri>http://www.blogger.com/profile/05084493704196673506</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="13715620155140962144" /></author><thr:total>0</thr:total><feedburner:origLink>http://www.sqleros.com.ar/2010/10/sqleros-hotspot-creator.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkUDQnsyeyp7ImA9WhZXEUk.&quot;"><id>tag:blogger.com,1999:blog-8219062580832314459.post-3856608994675937575</id><published>2010-09-25T03:22:00.000-05:00</published><updated>2011-04-30T02:24:33.593-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-04-30T02:24:33.593-05:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="bigtable" /><category scheme="http://www.blogger.com/atom/ns#" term="Frikadas" /><category scheme="http://www.blogger.com/atom/ns#" term="azure" /><category scheme="http://www.blogger.com/atom/ns#" term="cassandra" /><category scheme="http://www.blogger.com/atom/ns#" term="programacion" /><category scheme="http://www.blogger.com/atom/ns#" term="appengine" /><title>Open Source y NoSQL</title><content type="html">
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/ZofPfK7EubbdMhvH8D-vnPF6G2Q/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/ZofPfK7EubbdMhvH8D-vnPF6G2Q/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/ZofPfK7EubbdMhvH8D-vnPF6G2Q/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/ZofPfK7EubbdMhvH8D-vnPF6G2Q/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;Ya he escrito en julio de 2009 sobre los novísimos &lt;a href="http://www.versioncero.com/articulo/596/almacenamiento-distribuido-no-relacional"&gt;sistemas de almacenamiento no relacional&lt;/a&gt; y el paradigma&lt;a href="http://en.wikipedia.org/wiki/NoSQL"&gt;NoSQL&lt;/a&gt;, pero me parece interesante volver sobre el asunto desde la perspectiva del Software Libre.&lt;br/&gt;&lt;br/&gt;Resulta que las redes sociales le han dado a pensar a los desarrolladores que un sistema gestor de base de datos relacional (SGBDR) no es la infraestructura óptima para un sitio web con decenas de millones de usuarios registrados. Además, los servicios más importantes han liberado sus sistemas de almacenamiento no relacional. De LinkedIn salió &lt;a href="http://project-voldemort.com/"&gt;Voldemort&lt;/a&gt;, Facebook donó &lt;a href="http://incubator.apache.org/projects/cassandra.html"&gt;Cassandra&lt;/a&gt; a la Apache Software Foundation, VMWare esponsoriza &lt;a href="http://code.google.com/p/redis/"&gt;Redis&lt;/a&gt;(usado por Craigslist), en 2009 Baidu se convirtió en sponsor de Hypertable y se sospecha que &lt;a href="http://hadoop.apache.org/hbase/"&gt;HBase&lt;/a&gt;, la base de datos que corre sobre el framework &lt;a href="http://hadoop.apache.org/"&gt;Hadoop&lt;/a&gt; extensamente usado por Yahoo!, también se usa en Bing tras la compra de &lt;a href="http://www.powerset.com/"&gt;Powerset&lt;/a&gt; por parte de Microsoft en 2008.&lt;br/&gt;&lt;br/&gt;Vale la pena señalar que &lt;strong&gt;en los sistemas de almacenamiento no relacional los substitutivos al Software Libre no son sistemas privativos sino software como servicio&lt;/strong&gt;. La competencia del software de Apache no es mayormente software de Microsoft u Oracle (aunque tengan el veterano &lt;a href="http://www.oracle.com/database/berkeley-db/index.html"&gt;BerkelyDB&lt;/a&gt;) sino Amazon &lt;a href="http://www.allthingsdistributed.com/2007/10/amazons_dynamo.html"&gt;Dynamo&lt;/a&gt; como parte de &lt;a href="http://aws.amazon.com/s3/"&gt;S3&lt;/a&gt; o la implementación de &lt;a href="http://en.wikipedia.org/wiki/BigTable"&gt;BigTable&lt;/a&gt; disponible en &lt;a href="http://code.google.com/intl/es-ES/appengine/"&gt;Google App Engine&lt;/a&gt;.&lt;br/&gt;&lt;br/&gt;&lt;strong&gt;Lo más probable es que los usuarios de almacenamiento no relacional se dividan en dos grupos, los de software Open Source y los de software como servicio&lt;/strong&gt;.&lt;br/&gt;&lt;br/&gt;Una buena porción de la tarta Open Source se la llevará Apache con &lt;a href="http://incubator.apache.org/projects/cassandra.html"&gt;Cassandra&lt;/a&gt;, &lt;a href="http://couchdb.apache.org/"&gt;CouchDB&lt;/a&gt;, &lt;a href="http://hadoop.apache.org/hbase/"&gt;HBase&lt;/a&gt; y &lt;a href="http://jackrabbit.apache.org/"&gt;Jackrabbit&lt;/a&gt;.&lt;br/&gt;&lt;br/&gt;Habrá también proveedores independientes como &lt;a href="http://www.mongodb.org/"&gt;mongoDB&lt;/a&gt; de 10gen o &lt;a href="http://1978th.net/tokyocabinet/"&gt;Tokyo Cabinet&lt;/a&gt;, con unas pocas funcionalidades estrella o especialmente adaptados a algún lenguaje de programación como Ruby o PHP, pero yo dudo que vaya a haber un próximo producto estrella como MySQL o JBoss fuera de Apache que domine el nicho de sistemas almacenamiento no relacional Open Source.&lt;br/&gt;&lt;br/&gt;Otra fracción importe de los desarrolladores se convertirán en usuarios de los sistemas de almacenamiento como servicio de Amazon, Google, Azure, o cualquier otro. Incluso algunas de las ofertas de almacenamiento como servicio estarán basadas en Software Libre.&lt;br/&gt;&lt;br/&gt;&lt;strong&gt;Lo importante es la creación de un API estándar como SQL&lt;/strong&gt;. Si apareciera un API estándar para almacenamiento no relacional con soporte para &lt;a href="http://en.wikipedia.org/wiki/ACID"&gt;ACID&lt;/a&gt;, bloqueos, y replicación, entonces sería posible escribir una aplicación para que corriese en cualquier infraestructura y así eliminar el &lt;em&gt;vendor lock-in&lt;/em&gt; que produce el uso de las soluciones de almacenamiento como servicio. A falta de un estándar yo recomendaría a cada desarrollador que antes de basar su solución an Google App Engine o Amazon S3 o Azure o lo que sea, al menos escriba un &lt;em&gt;wrapper&lt;/em&gt;que permita cambiar el proveedor de infraestructura en caso de que ello fuere conveniente o necesario.&lt;br/&gt;&lt;br/&gt;También habrá un &lt;em&gt;hype&lt;/em&gt; de moda dentro de poco, que pronto pasará. Los sistemas de almacenamiento clave/valor tampoco son la solución perfecta. En realidad son una simplificación extrema de los sistemas gestores de bases de datos relacionales surgida para solucionar los problemas de rendimiento y escalabilidad de sitios web con centenares de millones de usuarios. Los sistemas NoSQL casi siempre se usan en combinación con caches como&lt;a href="http://memcached.org/"&gt;memcached&lt;/a&gt; o &lt;a href="http://www.jboss.org/jbosscache"&gt;JBoss Cache&lt;/a&gt;, con bases de datos relacionales como &lt;a href="http://www.mysql.org/"&gt;MySQL&lt;/a&gt; y con indexadores como &lt;a href="http://lucene.apache.org/"&gt;Lucene&lt;/a&gt;. Y defensores a ultranza del modelo relacional tampoco faltan. Los hay que argumentan que una base de datos relacional paralela es superior en todos los aspectos a un sistema de clave/valor o que simplemente la mayoría de ellos &lt;a href="http://bjclark.me/2009/08/04/nosql-if-only-it-was-that-easy/"&gt;no escalan&lt;/a&gt; como deberían, o incluso que &lt;a href="http://teddziuba.com/2010/03/i-cant-wait-for-nosql-to-die.html"&gt;están impacientes por ver morir el movimiento&lt;/a&gt;.&lt;br/&gt;&lt;br/&gt;El precio de la memoria RAM y la evolución hacia las nuevas tecnologías &lt;a href="http://en.wikipedia.org/wiki/DDR3_SDRAM"&gt;DDR3&lt;/a&gt; y &lt;a href="http://en.wikipedia.org/wiki/DDR4_SDRAM"&gt;DDR4&lt;/a&gt; también será un factor determinante en la evolución de las arquitecturas. Con el precio actual de ~35€ por Gigabyte de memoria DDR2 se puede almacenar una base de datos de 96Gb enteramente en RAM por poco más de 3.000€. Aunque dicho precio es aún 10 veces superior de lo que cuesta la misma cantidad de espacio en disco, empieza a ser económicamente viable para muchos sitios web manejar una gran parte de su información no-multimedia en RAM utilizando la base de datos sólo como copia de respaldo ante caídas.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8219062580832314459-3856608994675937575?l=www.sqleros.com.ar' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/BlogSqleros/~4/rONs1rz5_Go" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.sqleros.com.ar/feeds/3856608994675937575/comments/default" title="Enviar comentarios" /><link rel="replies" type="text/html" href="http://www.sqleros.com.ar/2010/09/open-source-y-nosql.html#comment-form" title="0 comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8219062580832314459/posts/default/3856608994675937575?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8219062580832314459/posts/default/3856608994675937575?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/BlogSqleros/~3/rONs1rz5_Go/open-source-y-nosql.html" title="Open Source y NoSQL" /><author><name>Ramms ZeñábI</name><uri>http://www.blogger.com/profile/05084493704196673506</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="13715620155140962144" /></author><thr:total>0</thr:total><feedburner:origLink>http://www.sqleros.com.ar/2010/09/open-source-y-nosql.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkUDQnsyeyp7ImA9WhZXEUk.&quot;"><id>tag:blogger.com,1999:blog-8219062580832314459.post-7481500258729567637</id><published>2010-09-24T12:21:00.000-05:00</published><updated>2011-04-30T02:24:33.593-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-04-30T02:24:33.593-05:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Social Network" /><category scheme="http://www.blogger.com/atom/ns#" term="Frikadas" /><category scheme="http://www.blogger.com/atom/ns#" term="facebook" /><category scheme="http://www.blogger.com/atom/ns#" term="php" /><title>Mark Zuckerberg donará $100M a educación pública en EEUU</title><content type="html">
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/znpH94IVefcJs-mhSL9LEFTcXms/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/znpH94IVefcJs-mhSL9LEFTcXms/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/znpH94IVefcJs-mhSL9LEFTcXms/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/znpH94IVefcJs-mhSL9LEFTcXms/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;a rel="attachment wp-att-32828" href="http://geeksroom.com/2010/09/mark-zuckerberg-preocupado-por-su-privacidad-pero-no-por-la-nuestra/32827/mark-zuckerberg-2"&gt;&lt;img title="Mark Zuckerberg" src="http://geeksroom.com/wp-content/uploads/2010/09/mark-zuckerberg.jpg" alt="" width="230" height="197" /&gt;&lt;/a&gt;&lt;br/&gt;&lt;br/&gt;El CEO y fundador de Facebook &lt;strong&gt;Mark Zuckerberg&lt;/strong&gt; donará 100 millones de dólares para las escuelas públicas en los EE.UU., y se le informó que se anunciará la donación el viernes en el show de Oprah Winfrey.&lt;br/&gt;&lt;br/&gt;La donación será la primera parte de una fundación que Zuckerberg está creando para mejorar la educación en los EE.UU, y la primera donación 100 millones de dólares se va aNewark.&lt;br/&gt;&lt;br/&gt;Mark Zuckerberg fue elegido recientemente como una de las persona más rica del mundo con una fortuna estimada en alrededor de 6,9 mil millones dólares, lo que lo pondría por delante del consejero y delegado de Apple Steve Jobs.&lt;br/&gt;&lt;br/&gt;Mucha gente llamará a la donación un movimiento calculado, ya que se dará a conocer el mismo día que la película “The social Network” es puesta en marcha en los cines americanos, una película que retrata Zuckerberg de una forma poco favorable como les puede pasar a muchos universitarios(todos fuimos jovenes y alguna tonteria seguro que hicimos).&lt;br/&gt;&lt;br/&gt;Al final del día, independientemente de sus motivaciones para la donación, sigue siendo una donación increíblemente generoso que ayudará al sistema escolar publico. Enhorabuena por ese apoyo a la educación.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8219062580832314459-7481500258729567637?l=www.sqleros.com.ar' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/BlogSqleros/~4/QMY1uOID8fw" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.sqleros.com.ar/feeds/7481500258729567637/comments/default" title="Enviar comentarios" /><link rel="replies" type="text/html" href="http://www.sqleros.com.ar/2010/09/mark-zuckerberg-donara-100m-educacion.html#comment-form" title="0 comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8219062580832314459/posts/default/7481500258729567637?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8219062580832314459/posts/default/7481500258729567637?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/BlogSqleros/~3/QMY1uOID8fw/mark-zuckerberg-donara-100m-educacion.html" title="Mark Zuckerberg donará $100M a educación pública en EEUU" /><author><name>Ramms ZeñábI</name><uri>http://www.blogger.com/profile/05084493704196673506</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="13715620155140962144" /></author><thr:total>0</thr:total><feedburner:origLink>http://www.sqleros.com.ar/2010/09/mark-zuckerberg-donara-100m-educacion.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkUDQnsyeyp7ImA9WhZXEUk.&quot;"><id>tag:blogger.com,1999:blog-8219062580832314459.post-7198695824981993245</id><published>2010-09-21T14:59:00.000-05:00</published><updated>2011-04-30T02:24:33.593-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-04-30T02:24:33.593-05:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="RIA" /><category scheme="http://www.blogger.com/atom/ns#" term="Frikadas" /><category scheme="http://www.blogger.com/atom/ns#" term="Internet" /><category scheme="http://www.blogger.com/atom/ns#" term="Seguridad" /><title>Release del Internet Explorer 9 Beta</title><content type="html">
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/r0mCzufoVYHr4TSMkL8LCltfPi0/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/r0mCzufoVYHr4TSMkL8LCltfPi0/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/r0mCzufoVYHr4TSMkL8LCltfPi0/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/r0mCzufoVYHr4TSMkL8LCltfPi0/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;Buen día SQLeros, Microsoft, lanzó oficialmente la primera Beta Oficial de Internet Explorer 9 &lt;a href="http://view.atdmt.com/action/UMIRF_FY11_IE9_TestDrive"&gt;puede ser descargado desde aquí&lt;/a&gt; (a las 14:00hs es el evento oficial&lt;a href="http://beautyoftheweb.com/"&gt;http://beautyoftheweb.com&lt;/a&gt; vía webcast)&lt;br/&gt;&lt;br/&gt;&lt;a href="http://portalti.com/wp-content/uploads/2010/09/image1.png"&gt;&lt;img title="clip_image001" src="http://portalti.com/wp-content/uploads/2010/09/clip_image001.png" border="0" alt="clip_image001" width="244" height="99" /&gt;&lt;/a&gt;&lt;br/&gt;&lt;br/&gt;Microsoft hizo mucho foco en los estándares, HTML 5, la aceleración asistida por GPU, y otras funcionalidades adicionales como la compatibilidad con Windows 7.&lt;br/&gt;&lt;br/&gt;Si bien se trata del primer beta, el futuro para este navegador se ve muy promisorio.&lt;br/&gt;&lt;br/&gt;Desde el arranque la aplicación es más rápida, así también las diversas demos disponibilizadas en el sitio de el preview.&lt;br/&gt;&lt;br/&gt;Al arrancar el navegador por primera vez se sugiere escoger los Addons o complementos que utilizamos, para mejorar la performance como muestra el gráfico inferior:&lt;br/&gt;&lt;br/&gt;&lt;a href="http://portalti.com/wp-content/uploads/2010/09/image2.png"&gt;&lt;img title="image" src="http://portalti.com/wp-content/uploads/2010/09/image_thumb1.png" border="0" alt="image" width="244" height="19" /&gt;&lt;/a&gt;&lt;br/&gt;&lt;br/&gt;&lt;a href="http://portalti.com/wp-content/uploads/2010/09/image3.png"&gt;&lt;img title="image" src="http://portalti.com/wp-content/uploads/2010/09/image_thumb2.png" border="0" alt="image" width="244" height="197" /&gt;&lt;/a&gt;&lt;br/&gt;&lt;br/&gt;La interface nueva aprovecha el efecto Glass disponibles en Windows Vista y Windows 7, asi también la barra de navegación y tabs están mejor distribuídas y consumen menos espacio.&lt;br/&gt;&lt;br/&gt;&lt;a href="http://portalti.com/wp-content/uploads/2010/09/image4.png"&gt;&lt;img title="image" src="http://portalti.com/wp-content/uploads/2010/09/image_thumb3.png" border="0" alt="image" width="244" height="141" /&gt;&lt;/a&gt;&lt;br/&gt;&lt;br/&gt;La apertura de nuevos Tabs, sugiere sitios populares y la navegación “en privado”&lt;br/&gt;&lt;br/&gt;&lt;a href="http://portalti.com/wp-content/uploads/2010/09/image5.png"&gt;&lt;img title="image" src="http://portalti.com/wp-content/uploads/2010/09/image_thumb4.png" border="0" alt="image" width="244" height="136" /&gt;&lt;/a&gt;&lt;br/&gt;&lt;br/&gt;También se disponibiliza un Download Manager, algo que mucha falta le hacía a Internet Explorer y que otros navegadores ya lo tenían.&lt;br/&gt;&lt;br/&gt;&lt;a href="http://portalti.com/wp-content/uploads/2010/09/image6.png"&gt;&lt;img title="image" src="http://portalti.com/wp-content/uploads/2010/09/image_thumb5.png" border="0" alt="image" width="244" height="184" /&gt;&lt;/a&gt;&lt;br/&gt;&lt;br/&gt;La integración con Windows 7, es más que evidente al hacer clic derecho sobre el icono en la barra de aplicaciones&lt;br/&gt;&lt;br/&gt;&lt;a href="http://portalti.com/wp-content/uploads/2010/09/image7.png"&gt;&lt;img title="image" src="http://portalti.com/wp-content/uploads/2010/09/image_thumb6.png" border="0" alt="image" width="216" height="244" /&gt;&lt;/a&gt;&lt;br/&gt;&lt;br/&gt;Saludos.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8219062580832314459-7198695824981993245?l=www.sqleros.com.ar' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/BlogSqleros/~4/16XF9MAk51I" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.sqleros.com.ar/feeds/7198695824981993245/comments/default" title="Enviar comentarios" /><link rel="replies" type="text/html" href="http://www.sqleros.com.ar/2010/09/release-del-internet-explorer-9-beta.html#comment-form" title="0 comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8219062580832314459/posts/default/7198695824981993245?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8219062580832314459/posts/default/7198695824981993245?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/BlogSqleros/~3/16XF9MAk51I/release-del-internet-explorer-9-beta.html" title="Release del Internet Explorer 9 Beta" /><author><name>Ramms ZeñábI</name><uri>http://www.blogger.com/profile/05084493704196673506</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="13715620155140962144" /></author><thr:total>0</thr:total><feedburner:origLink>http://www.sqleros.com.ar/2010/09/release-del-internet-explorer-9-beta.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkUDQnsyfCp7ImA9WhZXEUk.&quot;"><id>tag:blogger.com,1999:blog-8219062580832314459.post-1386222947432302595</id><published>2010-09-10T05:14:00.000-05:00</published><updated>2011-04-30T02:24:33.594-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-04-30T02:24:33.594-05:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="parallel programming" /><category scheme="http://www.blogger.com/atom/ns#" term="Open Source" /><category scheme="http://www.blogger.com/atom/ns#" term="Apache" /><category scheme="http://www.blogger.com/atom/ns#" term="noSQL" /><title>Qué es NoSQL?</title><content type="html">
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/W1QK0WXfvx_snbs9GHtLuL6jxqY/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/W1QK0WXfvx_snbs9GHtLuL6jxqY/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/W1QK0WXfvx_snbs9GHtLuL6jxqY/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/W1QK0WXfvx_snbs9GHtLuL6jxqY/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;Originalmente el término NoSQL, que fue acuñado en 1998, se refería a una base de datos relacional de código abierto que no usaba un lenguaje de consultas &lt;a href="http://en.wikipedia.org/wiki/SQL"&gt;SQL&lt;/a&gt;(&lt;a href="http://en.wikipedia.org/wiki/SQL"&gt;Structured Query Language&lt;/a&gt;).&lt;br/&gt;&lt;br/&gt;Hasta 2009 estas cinco letras cayeron en el olvido, pero fue &lt;a href="http://blog.oskarsson.nu/"&gt;Johan Oskarsson&lt;/a&gt;, entonces empleado de &lt;a href="http://www.last.fm/"&gt;Last.fm&lt;/a&gt;, quien organizó un evento para tratar las bases de datos distribuidas de código abierto no relacionales, llamándolas “NOSQL”, Not-Only SQL.&lt;br/&gt;&lt;br/&gt;Las características comunes entre todas las implementaciones de bases de datos distribuidas no relacionales, propietarias o no, suelen ser las siguientes:&lt;br/&gt;&lt;ul&gt;&lt;br/&gt;	&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Eventual_consistency"&gt;Consistencia Eventual&lt;/a&gt;: No se implementan mecanismos rígidos de consistencia como los presentes en las bases de datos relacionales, donde la confirmación de un cambio implica una comunicación del mismo a todos los nodos que lo repliquen. Esta flexibilidad hace que la consistencia se dé,&lt;em&gt;eventualmente&lt;/em&gt;, cuando no se hayan modificado los datos durante un periodo de tiempo. Esto se conoce también como BASE (Basically Available Soft-state Eventual Consistency, o coherencia eventual flexible básicamente disponible), en contraposición a &lt;a href="http://en.wikipedia.org/wiki/ACID"&gt;ACID&lt;/a&gt;, su analogía en las bases de datos relacionales.&lt;/li&gt;&lt;br/&gt;	&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Distributed_architecture"&gt;Estructura distribuida&lt;/a&gt;: Generalmente se distribuyen los datos mediante mecanismos de &lt;a href="http://en.wikipedia.org/wiki/Distributed_hash_table"&gt;tablas de hash distribuidas&lt;/a&gt; (&lt;a href="http://en.wikipedia.org/wiki/Distributed_hash_table"&gt;DHT&lt;/a&gt;) ya que realmente se trata, según las distintas implementaciones, de redes p2p.&lt;/li&gt;&lt;br/&gt;	&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Scalability#Scale_horizontally_.28scale_out.29"&gt;Escalabilidad horizontal&lt;/a&gt;: La implementación típica se realiza en muchos nodos de capacidad de procesado limitado, en vez de utilizar grandes Mainframes.&lt;/li&gt;&lt;br/&gt;	&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Fault-tolerant_design"&gt;Tolerancia a fallos&lt;/a&gt; y &lt;a href="http://en.wikipedia.org/wiki/Redundancy_%28engineering%29"&gt;Redundancia&lt;/a&gt;.&lt;/li&gt;&lt;br/&gt;&lt;/ul&gt;&lt;br/&gt;De entre todas las implementaciones de bases de datos NoSQL, hay muchas que no utilizan el lenguaje de consultas &lt;a href="http://en.wikipedia.org/wiki/SQL"&gt;SQL&lt;/a&gt; (por ejemplo, MongoDB usa &lt;a href="http://es.wikipedia.org/wiki/JSON"&gt;JSON&lt;/a&gt;), pero hay algunas que siguen usándolo, como por ejemplo BigTable (&lt;a href="http://code.google.com/intl/es-ES/appengine/docs/python/datastore/gqlreference.html"&gt;GQL&lt;/a&gt;), que lo ha transformado manteniendo su estructura básica.&lt;br/&gt;&lt;br/&gt;Definitivamente, con el término NoSQL nos referimos a una multitud de bases de datos que intentan solventar las limitaciones que el modelo relacional se encuentra en entornos de almacenamiento masivo de datos, y concretamente en las que tiene en el momento de escalar, donde es necesario disponer de servidores muy potentes y de balanceo de carga&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8219062580832314459-1386222947432302595?l=www.sqleros.com.ar' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/BlogSqleros/~4/TvjT5CSmEVA" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.sqleros.com.ar/feeds/1386222947432302595/comments/default" title="Enviar comentarios" /><link rel="replies" type="text/html" href="http://www.sqleros.com.ar/2010/09/que-es-nosql.html#comment-form" title="0 comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8219062580832314459/posts/default/1386222947432302595?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8219062580832314459/posts/default/1386222947432302595?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/BlogSqleros/~3/TvjT5CSmEVA/que-es-nosql.html" title="Qué es NoSQL?" /><author><name>Ramms ZeñábI</name><uri>http://www.blogger.com/profile/05084493704196673506</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="13715620155140962144" /></author><thr:total>0</thr:total><feedburner:origLink>http://www.sqleros.com.ar/2010/09/que-es-nosql.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkUDQnsyfCp7ImA9WhZXEUk.&quot;"><id>tag:blogger.com,1999:blog-8219062580832314459.post-6414591590664059778</id><published>2010-08-24T02:40:00.000-05:00</published><updated>2011-04-30T02:24:33.594-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-04-30T02:24:33.594-05:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="bloggers sqleros" /><category scheme="http://www.blogger.com/atom/ns#" term="programacion" /><title>Colaboradores</title><content type="html">
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/Q0-5m4cx8yuNPGbq4c27D5HspO8/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/Q0-5m4cx8yuNPGbq4c27D5HspO8/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/Q0-5m4cx8yuNPGbq4c27D5HspO8/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/Q0-5m4cx8yuNPGbq4c27D5HspO8/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;Si les gusta el blog y tienen pasión por la programación. SQleros, esta en busca de bloggers.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8219062580832314459-6414591590664059778?l=www.sqleros.com.ar' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/BlogSqleros/~4/7k728dnrCQQ" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.sqleros.com.ar/feeds/6414591590664059778/comments/default" title="Enviar comentarios" /><link rel="replies" type="text/html" href="http://www.sqleros.com.ar/2010/08/colaboradores.html#comment-form" title="3 comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8219062580832314459/posts/default/6414591590664059778?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8219062580832314459/posts/default/6414591590664059778?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/BlogSqleros/~3/7k728dnrCQQ/colaboradores.html" title="Colaboradores" /><author><name>Ramms ZeñábI</name><uri>http://www.blogger.com/profile/05084493704196673506</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="13715620155140962144" /></author><thr:total>3</thr:total><feedburner:origLink>http://www.sqleros.com.ar/2010/08/colaboradores.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkUDQnsyfCp7ImA9WhZXEUk.&quot;"><id>tag:blogger.com,1999:blog-8219062580832314459.post-4729600212926717658</id><published>2010-08-14T10:30:00.000-05:00</published><updated>2011-04-30T02:24:33.594-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-04-30T02:24:33.594-05:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="MySQL" /><category scheme="http://www.blogger.com/atom/ns#" term="failsoop" /><category scheme="http://www.blogger.com/atom/ns#" term="Open Source" /><category scheme="http://www.blogger.com/atom/ns#" term="Ocio" /><category scheme="http://www.blogger.com/atom/ns#" term="programacion" /><category scheme="http://www.blogger.com/atom/ns#" term="php" /><category scheme="http://www.blogger.com/atom/ns#" term="SQL" /><category scheme="http://www.blogger.com/atom/ns#" term="Apache" /><title>Los 10 errores mas comunes al programar orientado a objetos en PHP</title><content type="html">
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/VoXasms9pL8NVOArcvInBYokitc/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/VoXasms9pL8NVOArcvInBYokitc/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/VoXasms9pL8NVOArcvInBYokitc/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/VoXasms9pL8NVOArcvInBYokitc/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;El dominio de la programación orientada a objetos es, sin duda, uno de los paradigmas más codiciado por los programadores. Sin embargo, muchas veces estos cometen "atrocidades" al intentar implementarlo solo por decir a sus amigos, empresas u otros "Yo sé programar orientado a objetos".&lt;a name='more'&gt;&lt;/a&gt;&lt;br/&gt;&lt;br/&gt;A continuación verán una lista de 10 cosas que no se deben hacer al implementar programación orientada a objetos enfocándonos en el lenguaje PHP. Esta lista acompaña al post de &lt;a href="http://sqleros.com.ar/wps/PoST/2010/08/los-21-errores-mas-comunes-al-programar-con-php.sql" target="_blank"&gt;21 errores comunes programando en PHP&lt;/a&gt;.&lt;br/&gt;&lt;ol type="1"&gt;&lt;br/&gt;	&lt;li&gt;&lt;strong&gt;Usar variables globales dentro las clases:&lt;/strong&gt; una de las ventajas más importantes de la programación orientada a objetos es la reusabilidad de los códigos. Al usar variables globales ($_GET, $_SESSION, $_POST, $_COOKIE, global) dentro de las clases, esta se ve comprometida considerablemente. La razón es que todos los proyectos &lt;strong&gt;no&lt;/strong&gt; tienen las mismas variables globales.&lt;/li&gt;&lt;br/&gt;	&lt;li&gt;&lt;strong&gt;Mezclar código HTML en la definición de las clases:&lt;/strong&gt; es una de las cosas que me sorprenden cada vez que la veo. Es inaceptable que esto se le haya ocurrido a &lt;a href="http://wordpress.com/"&gt;algunos&lt;/a&gt;. Al mezclar HTML en el código PHP se compromete la reusabilidad de la clase, no todos los proyectos tienen el mismo código HTML.&lt;/li&gt;&lt;br/&gt;	&lt;li&gt;&lt;strong&gt;Imprimir salida (echo) dentro de las clases:&lt;/strong&gt; aunque esto se parece a la anterior, me refiero a los echo o similares dentro de los métodos. Si una clase no está destinada para emitir salida no lo debe hacer. Para eso muchos utilizamos&lt;a href="http://www.cristalab.com/tutoriales/160/galeria-de-imagenes-con-templates-en-php"&gt;sistemas de plantillas&lt;/a&gt;.&lt;/li&gt;&lt;br/&gt;	&lt;li&gt;&lt;strong&gt;Identificadores de clases, métodos y propiedades sin sentido:&lt;/strong&gt; un identificador siempre debe ser lo más descriptivo posible. A muchos le gusta usar identificadores increíblemente irrelacionados con su propósito. Esto compromete enormemente la lectura de un código. (Mira las &lt;a href="http://www.cristalab.com/tutoriales/190/reglas--de-codificacion-y-lineamientos-de-codigo-php"&gt;reglas de codificación en PHP&lt;/a&gt; via Cristal Lab)&lt;/li&gt;&lt;br/&gt;	&lt;li&gt;&lt;strong&gt;Mezclar uso de versiones de php en una misma clase:&lt;/strong&gt; a partir de la versión 5 de PHP, la programación orientada a objetos se puede implementar de una manera más formal, pues se introdujo los modificadores de visibilidad public, private, protected. Aparte de que se pueden crear clases de alto nivel (clase Abstractas) y métodos abstractos con la palabra reservada abstract. También se pueden definir los métodos y propiedades estáticas formalmente con la palabra reservada static. Mezclar la programación orientada a objetos en PHP 4 (donde todo era publico) con la de PHP 5 hace un código “sucio”. Consejo: elige una de las versiones y programa para ella.&lt;/li&gt;&lt;br/&gt;	&lt;li&gt;&lt;strong&gt;Más de una clase en un mismo archivo:&lt;/strong&gt; definir distintas clases en un mismo archivo es otra de las cosas que no se debe hacer. Las clase se han de componer lo más reusables posible y si puedes nombrar al archivo con el nombre de la clase muchísimo mejor. Sigue el camino de los grandes lenguajes como: Actionscript, Asp.net, Java entre otros.&lt;/li&gt;&lt;br/&gt;	&lt;li&gt;&lt;strong&gt;No hacer pruebas unitarias a las clases:&lt;/strong&gt; al terminar de codificar una clase recuerda de hacer pruebas unitarias para asegurar el correcto funcionamiento de clase. Esto es simplemente probar todos los posibles caminos que pueda tomar un estado (propiedad), parámetro de método, etc para que la clase no “explote”.&lt;/li&gt;&lt;br/&gt;	&lt;li&gt;&lt;strong&gt;Todos los métodos y las propiedades publicas en una clase de PHP 5:&lt;/strong&gt; los programadores novatos cometen el error de definir todos los métodos y propiedades como públicos, por desconocer las ventajas de los modificadores visibilidad. En PHP este es un problema grave porque no hay tipeado de datos. El problema de las propiedades públicas es que no podemos controlar de manera fácil el tipo de datos que contiene por lo que nuestra clase pudiera explotar por un tipo de dato inesperado. Si no estas seguro de que visibilidad le debes poner a una propiedad hazla privada. Valida los tipos de datos de las propiedades al menos de una manera básica.&lt;/li&gt;&lt;br/&gt;	&lt;li&gt;&lt;strong&gt;Duplicación de métodos para ocultar falla de lógica:&lt;/strong&gt; A diferencia de otros lenguajes como Java y C++, PHP no admite la sobrecarga de métodos. Al menos no de la manera tradicional. Esto, sin embargo, no es excusa para duplicar métodos sólo porque un dato cambia para la operación que éste realiza.&lt;/li&gt;&lt;br/&gt;	&lt;li&gt;&lt;strong&gt;Variables de configuración dentro de las clases: &lt;/strong&gt;Los datos de configuración de base de datos, web services y otros deben ir en un archivo de configuración aparte, &lt;strong&gt;NO&lt;/strong&gt; dentro de la clases que hacen uso de estas. Aunque se admite en clases que sea exclusivamente para ello.&lt;/li&gt;&lt;br/&gt;&lt;/ol&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8219062580832314459-4729600212926717658?l=www.sqleros.com.ar' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/BlogSqleros/~4/bWlcCMeNr9g" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.sqleros.com.ar/feeds/4729600212926717658/comments/default" title="Enviar comentarios" /><link rel="replies" type="text/html" href="http://www.sqleros.com.ar/2010/08/los-10-errores-mas-comunes-al-programar.html#comment-form" title="2 comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8219062580832314459/posts/default/4729600212926717658?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8219062580832314459/posts/default/4729600212926717658?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/BlogSqleros/~3/bWlcCMeNr9g/los-10-errores-mas-comunes-al-programar.html" title="Los 10 errores mas comunes al programar orientado a objetos en PHP" /><author><name>Ramms ZeñábI</name><uri>http://www.blogger.com/profile/05084493704196673506</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="13715620155140962144" /></author><thr:total>2</thr:total><feedburner:origLink>http://www.sqleros.com.ar/2010/08/los-10-errores-mas-comunes-al-programar.html</feedburner:origLink></entry></feed>

