<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	xmlns:georss="http://www.georss.org/georss" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:media="http://search.yahoo.com/mrss/"
	>

<channel>
	<title>Uno y uno = diez</title>
	<atom:link href="http://unoyunodiez.wordpress.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://unoyunodiez.wordpress.com</link>
	<description>Informática paso a paso</description>
	<lastBuildDate>Tue, 29 Nov 2011 03:35:31 +0000</lastBuildDate>
	<language>es</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.com/</generator>
<cloud domain='unoyunodiez.wordpress.com' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
<image>
		<url>http://s2.wp.com/i/buttonw-com.png</url>
		<title>Uno y uno = diez</title>
		<link>http://unoyunodiez.wordpress.com</link>
	</image>
	<atom:link rel="search" type="application/opensearchdescription+xml" href="http://unoyunodiez.wordpress.com/osd.xml" title="Uno y uno = diez" />
	<atom:link rel='hub' href='http://unoyunodiez.wordpress.com/?pushpress=hub'/>
		<item>
		<title>&#8220;Server Error&#8221; de Youtube</title>
		<link>http://unoyunodiez.wordpress.com/2011/11/28/error-de-youtube/</link>
		<comments>http://unoyunodiez.wordpress.com/2011/11/28/error-de-youtube/#comments</comments>
		<pubDate>Mon, 28 Nov 2011 20:31:00 +0000</pubDate>
		<dc:creator>lodr</dc:creator>
				<category><![CDATA[Geekfail]]></category>
		<category><![CDATA[Procrastinación]]></category>
		<category><![CDATA[500 error]]></category>
		<category><![CDATA[geekfail]]></category>
		<category><![CDATA[server error]]></category>
		<category><![CDATA[YouTube]]></category>

		<guid isPermaLink="false">http://unoyunodiez.wordpress.com/?p=801</guid>
		<description><![CDATA[Esto es un error que he recibido desde YouTube. Me ha hecho bastante gracia y he decidido postearlo para compartilo con vosotros. Creo que voy a hacer una categoría llamada geekfail para estas cosas. Jojojo. 500 Internal Server Error Sorry, something went wrong. A team of highly trained monkeys has been dispatched to deal with <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=unoyunodiez.wordpress.com&amp;blog=15323300&amp;post=801&amp;subd=unoyunodiez&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Esto es un error que he recibido desde YouTube. Me ha hecho bastante gracia y he decidido postearlo para compartilo con vosotros. Creo que voy a hacer una categoría llamada geekfail para estas cosas. Jojojo.</p>
<blockquote>
<h1>500 Internal Server Error</h1>
<p>Sorry, something went wrong.</p>
<p>A team of highly trained monkeys has been dispatched to deal with this situation.</p>
<p>If you see them, show them this information:</p>
<pre>oS5k8ddl4_mhnwSf3tpqJoNjWFPbPwB1xXHt8_5xSI7Nu6fKv2ghgtVD-rYF
VjiyL6NrcvQclc-0aGySc_Y_OKKClCZ6E-RcXYZBQEBjOYEgaGixOnp19Irc
Cpj-ZURpqed4kysfmU7_5AgFw5-R_Il1g7bNl0di3i7laoE4UgLgoyqyNMZm
iwts6EPlk8FyTqmqKINhH4wHOEvFdJ2U4S_aX_cjpRnpmme1ez3O52VswgO6
HdokcFud9SKKWUQa6Sgqueb99ZnHRSYOqiJ6URp1Sh9HbhYm76B7KHCB90gf
UH6j4sTwaLodfFF6GYEbuyjgtT0aykaAnepdH4liFfRQJAyJw-ETfUp3qSgl
yjUq-LPqFaDZ5sAerdqIRBuDcBWgsHK2blSswoKWDCdzZJ-6WvAs54J4Yw6w
NzJ7Dgip5uy7MWm8vkTWyseDptQXco5W8IDV08xP98oakJ0feHT9fYEwJxE8
3qW-ijnOWebpAMcm5eZNKlmUnm2l5dB6Sw7HkwbmbpuZc6BXn7tS8uzXJBVP
p4EAnfutd4qXz_LEyiXcEXn0R0u2g08ez_wNIPxcyzEWaG3SGl3SpW9ajxQB
tROABWoHBAsSMLnF-SQCRWG-C18kRg-XCuVAitvcLihwBjeOHlkioQ4uXDDJ
-Km6-ExcE9h6d8tjUoS7JFULClYb92kPG6JSuNJ8ZvdUJd-v00p5MOKA78F_
Lz0fD2OfI8c2_qbvdQM6yofJoK6rRQU9_EFGQ7E5Xtjbd9uKw_GcQeDDwzPm
uUaZmIzLi3S2HVVtQQObZnxmn_Pg2zUcn3AEEWs-2OPRnoa6C311o2OID-3J
7yYT_h76AWI02TdH5m1BBqjRiQImAwJ10w04vvrRegZMX7CrmfmzBU7Ax2ZF
s1e36icCyGPE3kBMtnZ3c7N4B0hM2zty9mTMoAQt6mSt4sk3x2pi6ZaBgUnV
v2uL4c-ERAcDRY5A3pGbckbotLKhfnE1Z4-t3t_8E9_kEuex9NC_dVgeMKYB
NKaNnPDpYPwI_PnMV_sZnSZ1jthrjplqBb8xs9KCy7m-Lt7h7UH-NAFPwY9n
KdrXdEnn3MdCkMfoo_FeVMOWuZUMGxqJztzxgp4kfxjMO7eke7CEYxiEiI8t
ew6t4fnX2hdDqaVj-3nyPlJ7JLDqb0Cn6gzff-diBUHcSIcUcR1v5soWSCPO
936_dMBqii3zi_czqFglg0ZNtEo_1_sfF3bI-i2dX1ozyQ8P_hpTArn1xAz8
rK0UUuUnda5RqgLcrPMj5u94BVj3rTGEsM-GawqjdS2DpQknEbKgcLbTHoTq
LPQkwFWKaEkNThYUo2kHbVtHKmmNqIWkFo7VAQfoGZXwGyxx9M-7pQuza7OR
UJOqFNcNykk6gJaFk7U601kgG6W7t_eg1uOCks4rKaEgv0h6ZL6KMDIvOnAe
USh3TzZXHlUbMAQRPBdIAAigZspRR6UW0H5zOnNCl3Kjp7y1X_oDSiEiP8-T
epiNn2wFDf6BKkdpQVm_tTeyrDsCVeK-cac6OVg19HXSA6YaGFQhW0ghJaLH
4SGs6HkMZxqH6d2CGJLXJc-8XfyplJ6xH4HC7b3UdshPj1XoLCepNrdfP22f
Cm06dXfvfRHOHMvCww56qOcENgrDPkSMRpIN36KvaXD_i232Jc357zBUsjPA
EzqdsfptTke7s--JORs1me0LtmdfSmNgP2Jv6W0SGxXuf343hw0fwMP6L6W_
oagTJYPrBwOdZ93ncl8pASJSTmI8dssW_U87M9Zx-6SFzuQdCdqEoqhtcxNy
EHfzb53Fec8jrfIeAUUVNK0ZBzJpBVHIF_VWGeRZv_U7VyRHLUi7fYZVqRjs
lYl6c6EuLNNt2L4NS1zrCqHckH9amNSJBS8-2bSYSxoVhXn36fPVJq3oRKHy
DKpIzu3GfeVhuIdpqwQZKo3KmbuozfXQbxkQJjWsoaeUxab_GiRyICumXJ35
xNw1QsAUZ_XKfRJgHdij44Bdi3GXx5xRk3oshw4AiEm0BBprl3yxBZ1HaTX6
IgppcYCeaKjmUpk47tpRDMlLH068gvMwwnr6lkHuXnykXxgFiKyfc-VZeiIe
Lsrgetwpq-Uc5uvMDAEdOeqYg6AYMEfiU_Or22MmqDCUxiz6x42evNQKjDPf
yLXnbXKOLttDWpDN-9oXXm41MjrLUDeB0QvJPKImlO5szdQjzi_GgDc9qM3G
e62uVZRZvRD8awL2h7U8Oe6cGycD-hsBNRaE5BttTy2JaKvOqsSvmsUgxW_k
-3XLwqWbQOQUFqwES3VloYswjZebgBc_pLM0dUjUUMau8F7JNf2XK2_wIxFJ
1gRPjBValiXPTLaBdCs-gOqn9_nNhrwH1LfNsUBHD3EZEqzebpt4ZI5E2sIH
1tH_LUcuXFkt_xpSJfYs2CpVAtZesVMScowkTawiDpHYOWPutLhyoO98DIk5
CD7P2gLir2gUkPoRkbjj-i8sSHD0dNoJMAb1Co4AYobA0t0c25N1F819K5ou
7tdnuSxoq3MTdwbJWJeO9bwPpp_weyzOyi-6TLO0dKF2VL2eRI_AERmg6Tjd
MXVdzL_Ri9O71bBxEH6eZmH0bT1BKS_guMNdGSRuX5ZjMbqL0gnmXkrrCxTj
bm7A-mjSOHKl6fVudDYXpIhg2Nd_endbSpoUfLmASxaZYgVVKDojrbu4RsgW
yvu4tkeLSFQdy3ertiGevJQ7Ra61RStmAhXcl0Q_MgqcMxHu-hXyEFFFv5J0
hSAAH5XhkqQA9eHHQiCU6ZaEY50v3fkAYG2d9064ITv_nRtEVequk2SPnrWl
x2TrYjpr7IbmPHaBa5yIxnqL-fj_6a7lAd1Ekb2v104GQfXHwmHrEEeLSq6m
OvENOAg5N28ArKV0Qc969MFkfnsiwH389dl0P-EBdjlAXeItIQJFe0c3rkEF
bAGm193TgfJUCUjEVFGffBHe77B0IBNcodBAtO6M2A8Xit4oWVBUFrLCsTdx
2G7CXOkW-0uFfV1LSznF2KuQegYRDqvHpw3CiHIYb3qqtDzp_iWTp32rE-F4
moiFgFK0PPmMGY6XnH5eLvOhhZBLEwPsdcNN1fP1r7MMmyNBNQGOQ-EQ8gLZ
ehTNkYfnWuiwciLHksVNXybnu7snOBnKy_jQ9k8QW_QkKeUn7mZCPQwDAMlo
t_LBgbuDNmnv8dnIR5Qn1XFAkTJOR8iKCAT2uI3HT9XBDfJy1NGPjbixYOB6
x6OGFCGZsOdxrUCuTey9XUjf1n6oQuQE7XSMKxL6stFCF9VUPh19Pe0T7lT0
79PWoQzgioRDPumuhWxMsnVc3tSyV9J_AinWyGdDB3zJ5y_MIePDXg_ZaMrE
OKDK7GM1cYrgyqdcxovDXjP8Hylyiw5aWZVotYGpbtqcmkTh8oInLID9FQhu
qnKO6rjUamuMZEQEOz98oMx9iZv_RAJNgUgPD5IC3Be2EOE_CdbxVdGiv1FZ
TNyDyNBbIrNgbSi9KwvzOiyHd1GenBNuhkieumPqGYLaCXkO6lmb7sRFQx1d
Zx0bPq1rGznY_jjUeeUDI_ZZqX5ZqYK8m1mgkmYVPE-PeJOAqIXfDH5Qfe5e
ukbvimtGRffHBQUJnQ0LKcEm74cLwJmnU-1ACkSNveYaqNnC2W807YMy8Axo
5vR9hI3OyOnK4TYdoPfn3o_T2yPebyKuyrAR0fmwrtMVixfVXxhNcAE0anx2
jxhofzFK_agCWajED9BjCEXuLRPENcVAfuHCiAQry9RbnkjoEuRkDVz6I0kz
hEj8UkTuw7USDBGIyff_KmyZ0TrgxC6uJ8t1W5-PH0RLTwyoIQyjppPKy0uf
aw-eFfBzJGIyj9r2V0TL7EPgvMczIvbU4d8j0FyfrWsk9DG95HpdAOwgVoCf
VT7l8kwBzGSMlD4161w95ijTFA_oNowh8i2rPuSYk37Zme7VYlzKuFHP5PF4
VnEjw1QbMxkk22BE9WeMc_G7RSk4qkyi9LOCG_b9Zi1vcwoWCBDpIxiypbkK
BONDYhqPew8cwOKBIHXu_JL2c_xj5kDRg2xl0cv2_rySScE50XJ1dlU_7pha
MHrbr02MnT4_Bc9X9-9H6-5i9_pJzmGb8Q6MQTJBM5aiXTBlN07bVxJbZeBS
5UQxQrI5OQxmo-3ajg98qkG61fGzKh2l7Y6s_eGNrCgiXlLJPh_ZtxBPjipo
Z0lc3P4ChuuECqxCb9RwhNhmcMzIip2ttIbTHN-3gP8OlbonqDCEkQU5LqCf
PuoeZ7FKpKOGLotuBttyGEgll-SNB97murpo8Mmx9endQHHRJGTPuyLBl_iZ
8N4iWXGNLImMJaDBscLLuxtt0i7QvC5rwq2IZbNTNXDCeYu1yNvdcMVaba0e
9sZN9Fm3Fi2EW7PWEejAz-XdjIQWh2ufxwf-BoEdofL5C5MixNNhTQjiF7_0
s9qqDhJwrkvFtKT05QzAKzF43wOV81t0Um5Akra6eECxRqMUOH1BsB4HJzQ2
ZFgMNlhkZmNyhTfwmj5o3CDeVVJnttd1MvlnNnLdZuvM1K6wcfwg0xshQwOt
wYAngs9J3VTlVJR4AT4kFr7iM-AxMQwQyDnuQq2h_jzsUxbvrv704yrfzMUz
JrT5EJZgE_-dcISs-A9hKVs_RX2eCVYpltBxj3BgKR_PH9zZ7rB9Of6IhVT6
HekYWNSMi_AQIYtyvOEdi7W2M2cBmC1GhuZ6oZCCPqYizeuk9hPgQWo3dJKV
E4hR5s9s1dPMAj_u2wDSbNs9SGEjB9ALEfY0aRAfJ449BTw55nIdTYpWwd8F
Y-6GLJY5dT5AaDPV-X3JKT6JanvgPSNp5xebjwi_hH9fo9_JmgdUIKjZ7l9T
Px8p6P19WT7cKzN64xeYWKS2qwvnM7hxbuxW31Sttp0yed1X6yHaRBmw4JQ5
45sPARx9</pre>
</blockquote>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/unoyunodiez.wordpress.com/801/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/unoyunodiez.wordpress.com/801/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/unoyunodiez.wordpress.com/801/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/unoyunodiez.wordpress.com/801/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/unoyunodiez.wordpress.com/801/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/unoyunodiez.wordpress.com/801/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/unoyunodiez.wordpress.com/801/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/unoyunodiez.wordpress.com/801/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/unoyunodiez.wordpress.com/801/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/unoyunodiez.wordpress.com/801/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/unoyunodiez.wordpress.com/801/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/unoyunodiez.wordpress.com/801/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/unoyunodiez.wordpress.com/801/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/unoyunodiez.wordpress.com/801/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=unoyunodiez.wordpress.com&amp;blog=15323300&amp;post=801&amp;subd=unoyunodiez&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://unoyunodiez.wordpress.com/2011/11/28/error-de-youtube/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/284a643007ef8adc480a171b0a663e86?s=96&#38;d=retro&#38;r=G" medium="image">
			<media:title type="html">lodr</media:title>
		</media:content>
	</item>
		<item>
		<title>ETA: fin del &#8220;conflicto armado&#8221;</title>
		<link>http://unoyunodiez.wordpress.com/2011/10/21/eta-fin-del-conflicto-armado/</link>
		<comments>http://unoyunodiez.wordpress.com/2011/10/21/eta-fin-del-conflicto-armado/#comments</comments>
		<pubDate>Fri, 21 Oct 2011 08:48:50 +0000</pubDate>
		<dc:creator>lodr</dc:creator>
				<category><![CDATA[Opinión]]></category>
		<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[cese]]></category>
		<category><![CDATA[conflicto armado]]></category>
		<category><![CDATA[elecciones]]></category>
		<category><![CDATA[ETA]]></category>
		<category><![CDATA[opinión]]></category>
		<category><![CDATA[política]]></category>

		<guid isPermaLink="false">http://unoyunodiez.wordpress.com/?p=792</guid>
		<description><![CDATA[Yo no suelo opinar de política en medios como este que va a leer mucha gente. Porque me considero un ignorante de cuidado. Por supuesto, me alegro del &#8220;cese del conflicto armado&#8221; pero a qué precio, me pregunto yo. Algo tendré que decir dado que tengo mi propia opinión. Y esto es lo único que <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=unoyunodiez.wordpress.com&amp;blog=15323300&amp;post=792&amp;subd=unoyunodiez&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Yo no suelo opinar de política en medios como este que va a leer mucha gente. Porque me considero un ignorante de cuidado.</p>
<p>Por supuesto, me alegro del &#8220;cese del conflicto armado&#8221; pero a qué precio, me pregunto yo. Algo tendré que decir dado que tengo mi propia opinión. Y esto es lo único que diré:</p>
<p>Espero que no afecte a las elecciones. Espero que la gente indiferente no piense &#8220;¡anda!, pues esta clase política no será tan mala después de todo&#8221;. Porque lo es.</p>
<p>De todas formas, las posibilidades de una reestructuración importante del gobierno han pasado de bajas a escasas.</p>
<p>Eso es todo.</p>
<p>BOLA EXTRA: ver el <a href="http://www.youtube.com/watch?v=kJVe19mhReo">comunicado de ETA</a> me ha puesto nervioso (estrictamente, casi me hace hervir la sangre), pero claro, qué van a decir, no van a soltar &#8220;lo sentimos mucho, somos unos asesinos y los nuestros están bien entre rejas, ¡colgadnos!&#8221;. Esto es propaganda. Espero que la estrategia de nuestros políticos esté a la altura de las futuras negociaciones y, por lo que más respeten, espero que se les siga dando caña.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/unoyunodiez.wordpress.com/792/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/unoyunodiez.wordpress.com/792/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/unoyunodiez.wordpress.com/792/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/unoyunodiez.wordpress.com/792/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/unoyunodiez.wordpress.com/792/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/unoyunodiez.wordpress.com/792/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/unoyunodiez.wordpress.com/792/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/unoyunodiez.wordpress.com/792/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/unoyunodiez.wordpress.com/792/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/unoyunodiez.wordpress.com/792/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/unoyunodiez.wordpress.com/792/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/unoyunodiez.wordpress.com/792/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/unoyunodiez.wordpress.com/792/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/unoyunodiez.wordpress.com/792/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=unoyunodiez.wordpress.com&amp;blog=15323300&amp;post=792&amp;subd=unoyunodiez&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://unoyunodiez.wordpress.com/2011/10/21/eta-fin-del-conflicto-armado/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/284a643007ef8adc480a171b0a663e86?s=96&#38;d=retro&#38;r=G" medium="image">
			<media:title type="html">lodr</media:title>
		</media:content>
	</item>
		<item>
		<title>La línea más larga que he visto en mi vida</title>
		<link>http://unoyunodiez.wordpress.com/2011/09/27/la-linea-mas-larga-que-he-visto-en-mi-vida/</link>
		<comments>http://unoyunodiez.wordpress.com/2011/09/27/la-linea-mas-larga-que-he-visto-en-mi-vida/#comments</comments>
		<pubDate>Tue, 27 Sep 2011 20:16:00 +0000</pubDate>
		<dc:creator>lodr</dc:creator>
				<category><![CDATA[Programación]]></category>
		<category><![CDATA[Trabajo]]></category>
		<category><![CDATA[furia]]></category>
		<category><![CDATA[trabajo]]></category>

		<guid isPermaLink="false">http://unoyunodiez.wordpress.com/?p=784</guid>
		<description><![CDATA[¿Os acordais de cuándo comentaba se era ético / profesional modificar el código de otros? Bien, y si me encuentro algo como esto:                             var newLine = $("&#60;div&#62;").addClass("menuWindow").html('&#60;ul id="topWindowMenu"&#62;' + addLi('search' + incidenceId, 'Search', 'opMenuWindow search') + addLi('mine' + incidenceId, 'Assign to me', 'opMenuWindow mine')  +  addLi('delegate' + incidenceId, <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=unoyunodiez.wordpress.com&amp;blog=15323300&amp;post=784&amp;subd=unoyunodiez&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>¿Os acordais de cuándo comentaba se era ético / profesional <a title="Del amor propio a la obsesión por lo que es mío" href="http://unoyunodiez.wordpress.com/2011/08/01/del-amor-propio-a-la-obsesion-por-lo-que-es-mio/">modificar el código de otros</a>?</p>
<p>Bien, y si me encuentro algo como esto:</p>
<pre>                            var newLine = $("&lt;div&gt;").addClass("menuWindow").html('&lt;ul id="topWindowMenu"&gt;' + addLi('search' + incidenceId, 'Search', 'opMenuWindow search') + addLi('mine' + incidenceId, 'Assign to me', 'opMenuWindow mine')  +  addLi('delegate' + incidenceId, 'Delegate', 'opMenuWindow delegate') + addLi('transfer' + incidenceId, 'Transfer', 'opMenuWindow transfer') + addLi('task' + incidenceId, 'Task', 'opMenuWindow tasks') + addLi('print_incidence' + incidenceId, 'Print', 'opMenuWindow print') + addLi('save_incidence' + incidenceId, 'Save', 'opMenuWindow save') + addLi('refresh' + incidenceId, 'Refresh', 'opMenuWindow refresh') + '&lt;/ul&gt;');</pre>
<p>¿Ahora qué hago? Son <strong>664 caracteres</strong>. Más de 8 folios, uno al lado del otro.</p>
<p>EDIT: Una apreciación paterna. De 664 caracteres, los 7 primeros son tabuladores destinados a mejorar la claridad del código. Es decir, el <strong>1.05% de la línea está destinada a mejorar la legibilidad</strong>.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/unoyunodiez.wordpress.com/784/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/unoyunodiez.wordpress.com/784/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/unoyunodiez.wordpress.com/784/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/unoyunodiez.wordpress.com/784/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/unoyunodiez.wordpress.com/784/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/unoyunodiez.wordpress.com/784/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/unoyunodiez.wordpress.com/784/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/unoyunodiez.wordpress.com/784/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/unoyunodiez.wordpress.com/784/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/unoyunodiez.wordpress.com/784/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/unoyunodiez.wordpress.com/784/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/unoyunodiez.wordpress.com/784/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/unoyunodiez.wordpress.com/784/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/unoyunodiez.wordpress.com/784/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=unoyunodiez.wordpress.com&amp;blog=15323300&amp;post=784&amp;subd=unoyunodiez&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://unoyunodiez.wordpress.com/2011/09/27/la-linea-mas-larga-que-he-visto-en-mi-vida/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/284a643007ef8adc480a171b0a663e86?s=96&#38;d=retro&#38;r=G" medium="image">
			<media:title type="html">lodr</media:title>
		</media:content>
	</item>
		<item>
		<title>Diferencias entre null y undefined en Javascript</title>
		<link>http://unoyunodiez.wordpress.com/2011/09/07/diferencias-entre-null-y-undefined-en-javascript/</link>
		<comments>http://unoyunodiez.wordpress.com/2011/09/07/diferencias-entre-null-y-undefined-en-javascript/#comments</comments>
		<pubDate>Wed, 07 Sep 2011 07:43:26 +0000</pubDate>
		<dc:creator>lodr</dc:creator>
				<category><![CDATA[Javascript]]></category>
		<category><![CDATA[Programación]]></category>
		<category><![CDATA[comprobar]]></category>
		<category><![CDATA[diferencia]]></category>
		<category><![CDATA[existencia]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[null]]></category>
		<category><![CDATA[undefined]]></category>
		<category><![CDATA[vs]]></category>

		<guid isPermaLink="false">http://unoyunodiez.wordpress.com/?p=785</guid>
		<description><![CDATA[¡Uy! Cuánto tiempo sin pasar por aquí&#8230; Resulta que últimamente, en el trabajo, dedico mucho tiempo a Javascript. Es un lenguaje que cada vez me gusta más: flexible, simple y ortogonal. Es increíble a dónde se llega con 4 reglas bien aplicadas. Eso sí, se enseña MUY mal. Por ello, recomiendo encarecidamente leer la (re)introducción <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=unoyunodiez.wordpress.com&amp;blog=15323300&amp;post=785&amp;subd=unoyunodiez&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>¡Uy! Cuánto tiempo sin pasar por aquí&#8230;</p>
<p>Resulta que últimamente, en el trabajo, dedico mucho tiempo a Javascript. Es un lenguaje que cada vez me gusta más: flexible, simple y ortogonal. Es increíble a dónde se llega con 4 reglas bien aplicadas. Eso sí, se enseña MUY mal. Por ello, recomiendo encarecidamente leer la <a href="https://developer.mozilla.org/en/a_re-introduction_to_javascript" target="_blank">(re)introducción a Javascript por parte de Mozilla</a>:</p>
<blockquote><p>(&#8230;) Javascript probablemente sea el lengauje más incomprendido del mundo.</p></blockquote>
<p>Volviendo al tema de este post, en Javascript hay dos &#8220;valores&#8221; especiales: null y undefined. ¿Pero qué significan exactamente y cuándo usar uno u otro? La <a href="http://stackoverflow.com/questions/801032/null-object-in-javascript" target="_blank">mejor respuesta la he encontrado en StackOverflow</a>. Traduzco la parte más divertida:</p>
<blockquote><p>(<em>nombre</em> es undefined)</p>
<p><strong>Programador</strong>: ¿qué es <em>nombre</em>?<br />
<strong>Javascript</strong>: ¿<em>nombre</em>? ¿qué es un  <em>nombre</em>? No sé de qué hablas, ni siquiera has mencionado nombre antes. ¿No te referirás a otro lenguaje?</p>
<p>(<em>nombre</em> = null)</p>
<p><strong>Programador</strong>: ¿qué es <em>nombre</em>?<br />
<strong>Javascript</strong>: no lo sé</p>
<p>(&#8230;)</p></blockquote>
<p>La clave para entender la diferencia radica en la noción de <strong>existencia</strong>. Si una variable es:</p>
<ul>
<li>undefined: para Javascript, <strong>no existe</strong>. O bien no ha sido declarada o jamás se le asignó un valor.</li>
<li>null: para Javascript, <strong>la variable existe</strong>. En algún momento, explícitamente, la variable se estableció a null.</li>
</ul>
<p>Las principales confusiones vienen de que, en Javascript, las expresión:</p>
<p><pre class="brush: jscript;">
undefined == null
</pre></p>
<p>es <strong>verdadera</strong> por efecto del &#8220;<a href="http://webreflection.blogspot.com/2010/10/javascript-coercion-demystified.html" target="_blank">type coercion</a>&#8221; (otro día hablamos más de ello).</p>
<p>No obstante os recuerdo que el operador == no funciona en JS cómo están acostumbrados la mayoría de los programadores. El operador de comparación al uso en JS es <strong>===</strong> y la expresión:</p>
<p><pre class="brush: jscript;">
undefined === null
</pre></p>
<p>es <strong>falsa</strong> como cabía esperar.</p>
<p>Así que, a la hora de usar uno u otro debemos ver si estamos preguntando por la <strong>existencia</strong> de una variable. Si es el caso, usaremos <strong>undefined</strong>. En caso de que preguntemos por si la variable contiene un<strong> valor seguro</strong> o no, como ocurriría en Java, C++ o C# usaremos <strong>null</strong>.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/unoyunodiez.wordpress.com/785/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/unoyunodiez.wordpress.com/785/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/unoyunodiez.wordpress.com/785/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/unoyunodiez.wordpress.com/785/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/unoyunodiez.wordpress.com/785/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/unoyunodiez.wordpress.com/785/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/unoyunodiez.wordpress.com/785/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/unoyunodiez.wordpress.com/785/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/unoyunodiez.wordpress.com/785/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/unoyunodiez.wordpress.com/785/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/unoyunodiez.wordpress.com/785/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/unoyunodiez.wordpress.com/785/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/unoyunodiez.wordpress.com/785/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/unoyunodiez.wordpress.com/785/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=unoyunodiez.wordpress.com&amp;blog=15323300&amp;post=785&amp;subd=unoyunodiez&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://unoyunodiez.wordpress.com/2011/09/07/diferencias-entre-null-y-undefined-en-javascript/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/284a643007ef8adc480a171b0a663e86?s=96&#38;d=retro&#38;r=G" medium="image">
			<media:title type="html">lodr</media:title>
		</media:content>
	</item>
		<item>
		<title>jsperf: aplicación web para comprobar el rendimiento de Javascript</title>
		<link>http://unoyunodiez.wordpress.com/2011/08/02/jsperf-aplicacion-web-para-comprobar-el-rendimiento-de-javascript/</link>
		<comments>http://unoyunodiez.wordpress.com/2011/08/02/jsperf-aplicacion-web-para-comprobar-el-rendimiento-de-javascript/#comments</comments>
		<pubDate>Tue, 02 Aug 2011 11:00:50 +0000</pubDate>
		<dc:creator>lodr</dc:creator>
				<category><![CDATA[Algoritmia]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[Programación]]></category>
		<category><![CDATA[jperf.com]]></category>
		<category><![CDATA[jquery]]></category>
		<category><![CDATA[prototype]]></category>
		<category><![CDATA[rendimiento]]></category>
		<category><![CDATA[testing]]></category>

		<guid isPermaLink="false">http://unoyunodiez.wordpress.com/?p=782</guid>
		<description><![CDATA[Me gustaría enseñaros una utilísima herramienta que he encontrado por la Red. Se trata de http://jsperf.com que resulta ser una web para medir el rendimiento de fragmentos de código Javascript. Lo mejor es que permite incluir librerías externas tales como jQuery o Protoype por lo que podemos crear test para poner a prueba estos frameworks. <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=unoyunodiez.wordpress.com&amp;blog=15323300&amp;post=782&amp;subd=unoyunodiez&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Me gustaría enseñaros una utilísima herramienta que he encontrado por la Red. Se trata de <a href="http://jsperf.com" target="_blank">http://jsperf.com</a> que resulta ser una web para <strong>medir el rendimiento</strong> de fragmentos de código Javascript. Lo mejor es que permite incluir librerías externas tales como jQuery o Protoype por lo que podemos crear test para poner a prueba estos frameworks. Yo he creado este test que comparto con vosotros y que compara distintas técnicas de crear elementos HTML y añadirlos a un documento:</p>
<p><a href="http://jsperf.com/jquery-dom-creation-techniques" target="_blank">http://jsperf.com/jquery-dom-creation-techniques</a></p>
<p>Su ventana de resultados no sólo muestra la mejor y peor ejecución sino una muestra de la desviación típica y una comparativa entre los distintos fragmentos. Además, antes de publicar un test, si nuestro código lanza excepciones, se nos avisará convenientemente. El único fallo que le he visto es que si nuestro código no es gramaticalmente correcto, la página de testing se cuelga en vez de avisarnos. Pero bueno, siempre podemos usar <a href="https://addons.mozilla.org/es-es/firefox/addon/firebug/" target="_blank">Firebug</a>.</p>
<p>¡No dejeis de echarle un vistazo!</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/unoyunodiez.wordpress.com/782/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/unoyunodiez.wordpress.com/782/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/unoyunodiez.wordpress.com/782/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/unoyunodiez.wordpress.com/782/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/unoyunodiez.wordpress.com/782/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/unoyunodiez.wordpress.com/782/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/unoyunodiez.wordpress.com/782/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/unoyunodiez.wordpress.com/782/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/unoyunodiez.wordpress.com/782/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/unoyunodiez.wordpress.com/782/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/unoyunodiez.wordpress.com/782/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/unoyunodiez.wordpress.com/782/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/unoyunodiez.wordpress.com/782/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/unoyunodiez.wordpress.com/782/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=unoyunodiez.wordpress.com&amp;blog=15323300&amp;post=782&amp;subd=unoyunodiez&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://unoyunodiez.wordpress.com/2011/08/02/jsperf-aplicacion-web-para-comprobar-el-rendimiento-de-javascript/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/284a643007ef8adc480a171b0a663e86?s=96&#38;d=retro&#38;r=G" medium="image">
			<media:title type="html">lodr</media:title>
		</media:content>
	</item>
		<item>
		<title>Del amor propio a la obsesión por lo que es mío</title>
		<link>http://unoyunodiez.wordpress.com/2011/08/01/del-amor-propio-a-la-obsesion-por-lo-que-es-mio/</link>
		<comments>http://unoyunodiez.wordpress.com/2011/08/01/del-amor-propio-a-la-obsesion-por-lo-que-es-mio/#comments</comments>
		<pubDate>Mon, 01 Aug 2011 18:44:48 +0000</pubDate>
		<dc:creator>lodr</dc:creator>
				<category><![CDATA[Trabajo]]></category>
		<category><![CDATA[compañerismo]]></category>
		<category><![CDATA[discusiones]]></category>
		<category><![CDATA[feedback]]></category>
		<category><![CDATA[moral]]></category>
		<category><![CDATA[reflexiones]]></category>
		<category><![CDATA[repositorios]]></category>
		<category><![CDATA[scrum]]></category>
		<category><![CDATA[trabajo]]></category>

		<guid isPermaLink="false">http://unoyunodiez.wordpress.com/?p=777</guid>
		<description><![CDATA[El viernes tuve un día realmente malo en el trabajo pero creo haberlo resuelto correctamente. El caso es que aun hoy sigo dándole vueltas a lo acontecido y reflexiono sobre lo que pasó. Resulta que el viernes a última hora, un compañero de trabajo y yo modificábamos el mismo archivo pero realizando tareas completamente distintas. <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=unoyunodiez.wordpress.com&amp;blog=15323300&amp;post=777&amp;subd=unoyunodiez&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p style="text-align:justify;">El viernes tuve un día realmente malo en el trabajo pero creo haberlo resuelto correctamente. El caso es que aun hoy sigo dándole vueltas a lo acontecido y reflexiono sobre lo que pasó.</p>
<p style="text-align:justify;">Resulta que el viernes a última hora, un compañero de trabajo y yo modificábamos el mismo archivo pero realizando tareas completamente distintas. Mientra él ajustaba ciertos detalles de apariencia, yo trataba de mejorar algunos aspectos del comportamiento. Mi compañero tiene la costumbre (para mí, arriesgada) de realizar un sólo envío (al finalizar la jornada) al repositorio de versiones mientras que yo suelo subir versiones estables cada menos tiempo (un par de horas o así). El caso que a eso de las 12.00h del viernes mi jefe nos pide mezclar los archivos. Para ello primero subiría los cambios mi compañero y luego yo.</p>
<p style="text-align:justify;">Cual es mi sorpresa cuando mi compañero, abrumado y enfurecido, me pregunta que por qué he subido yo primero y me acusa de haber realizado un montón de cambios. A esto le sigue una sucesión de frases que, sin faltar al respeto en ningún momento, me tachan de soberbio, afirmando que sólo tolero el código que yo creo, que <em>&#8220;lo de los demás no vale&#8221;</em> y que <em>&#8220;por eso tengo encontronazos con todo el mundo&#8221;</em> amén de que tengo la mala costumbre de pisar el trabajo de los demás*.</p>
<p style="text-align:justify;"><em>(*) Este asterisco viene de una vez en la que sí metí la pata y me cargué sus cambios al desestimar un conflicto. Volver a una versión anterior y resolver la mezcla me llevó 10 minutos. Es lo bueno de los repositorios de versiones, <strong>nada se pierde</strong>.</em></p>
<p style="text-align:justify;">Mi respuesta es invitarlo a comprobar que no he realizado ningún cambio reciente, que el último es de las 10.00h de la mañana y que mi trabajo también incluye la modificación de esos archivos. También le propongo mezclar yo los archivos dado que estimo que no me llevará más de 15 minutos pero él insiste en que ha cambiado demasiado y que la mezcla llevará al menos una hora. Trato de que considere que tales cambios sólo son producto de que mi editor de texto ha reemplazado los tabuladores por espacios y que por eso parece mucho más de lo que hay&#8230;</p>
<p style="text-align:justify;">En este momento llegan mis jefes que preguntan que qué pasa. Mi compañero insiste en que he realizado un montón de cambios, que subí los cambios si cerciorame de que nadie estuviera tocando el archivo y que la mezcla durará una hora. De nuevo indico mi intención de asumir la responsabilidad y de mezclar yo dado que reconozco que no pregunté si alguien estaba usando el archivo porque, para mí, el proceso de mezcla es <strong>parte del ciclo de desarrollo</strong>. Finalmente tomo la siguiente decisión: que se desestimen mis cambios y se reemplace mi versión por la suya. Una vez hecho esto afirmo que podré reconstruir los cambios en unos 15 minutos que es lo que me llevará mezclar el código con mi versión local.</p>
<p style="text-align:justify;">Primeramente indico al visor de diferencias que no tenga en cuenta los espacios en blanco lo que convierte los dos grandes bloques de modificaciones en algunas líneas sueltas. A continuación resuelvo la mezcla en 20 minutos. Ni más ni menos. Compruebo que mis cambios en ese archivo a penas llegan al 10% de los totales. Pero la verdad, esto ya lo sabía.</p>
<p style="text-align:justify;"><span id="more-777"></span>Lo que me dejó preocupado y es fuente de esta reflexión fueron las acusaciones respecto a lo de que &#8220;sólo lo mío vale&#8221;. Reconozco que llevaba un cabreo mayúsculo, me dolía la cabeza y apenas podía concentrarme pero me armé de valor, me tragué el orgullo y decidí hablar con mi compañero para decirle en qué no estaba de acuerdo asi como para pedirle disculpas por el estado de preocupación al que le había llevado y dilucidar aquello referente a mi soberbia. Le dije que no era quien para juzgar mi relación con mis compañeros (dado que no he tenido ningún encontronazo con ellos) y que no entendía a qué venía eso de que &#8220;sólo lo mío vale&#8221; cuando en muchas ocasiones no sólo he estado de acuerdo con él sino que he defendido su posición.</p>
<p style="text-align:justify;">Esto llevó al <strong>quid de la cuestión</strong>. Reveló que ya se las llevaba guardando un tiempo porque encontraba código que él había escrito, cambiado a algo que hacía lo mismo pero escrito de una manera distinta y he de reconocer que esto es totalmente cierto. Hay código que él escribía con el que yo no me sentía cómodo y cambiaba mientras trabajaba en él. Así, la pregunta es <strong>¿tengo derecho a cambiar el código con el que estoy trabajando?</strong></p>
<p style="text-align:justify;">Quizá a respuesta dependa del escenario y, principalmente, de la metodología de trabajo. Con una división clara de responsabilidades, la situación no debería producirse. La representación estaría diferenciada de la funcionalidad y dado que nuestras tareas serían distintas, el código de cada cual debería presentarse invisible de cara al otro.</p>
<p style="text-align:justify;">Ahora bien, aquí seguimos la metodología <a href="http://es.wikipedia.org/wiki/Scrum">scrum</a> y se anima a la existencia un <a href="http://www.methodsandtools.com/archive/archive.php?id=17">equipo multidisciplinar</a>: no debe haber un sentimiendo de &#8220;su trabajo y mi trabajo&#8221; sino de &#8220;nuestro trabajo&#8221;. Entiendo que para esto un ideal es contar con &#8220;miembros polivalentes&#8221;: cada uno quizá experto en algo en particular pero con voluntad para asumir otro tipo de tareas no relacionadas con sus áreas directas o para identificarse con los objetivos del proyecto. Con el proyecto en sí</p>
<p style="text-align:justify;">Esto significa que si sé de todo, no puedo tener preferencias manifiestas. No puedo rechazar un trabajo porque no es mi área o no me interese: un día toco representación, otro día comportamiento y otro algoritmia o diseño del sistema. Ahora, ¿puedo refactorizar el código que resulta ser mi trabajo en un momento dado? Parece que la respuesta obvia es <strong>&#8220;si funciona, no lo toques&#8221;</strong> pero ¿y si no estoy a gusto con mi entorno de trabajo? ¿Si me cuesta leerlo o encontrar alguna funcionalidad es obtuso?, ¿si hay redundancia innecesaria o tramos muertos de código?, ¿nombres desafortunados?, ¿fallos de concepto? No estoy diciendo que en el código de mi compañero haya nada de esto, tan sólo lo cuestiono a un nivel general. Si el código, en definitiva, está mal escrito y me resulta un engorro&#8230; ¿entonces qué? Y lo que es peor, si eso va a hacer que produzca un código del que no me siento orgulloso, <strong>¿debería bajar mis estándares por respetar la metodología de otro?</strong></p>
<p style="text-align:justify;">Y para ser del todo franco, a veces sí he pensado que mis refactorizaciones resultan en un mejor código y aquí la pregunta muta y adquiere un aspecto más social y problemático: ¿estoy despreciano el trabajo de otro por llevar a cabo la refactorización? <strong>¿Es un acto de soberbia por mi parte?</strong></p>
<p style="text-align:justify;">La respuesta es muy personal, toma forma analizando la intención tras nuestros actos. No os voy a mentir, a veces, al ver código de mis compañeros he pensado &#8220;¿qué m**rd* es esto?&#8221; y me he apresurado a cambiarlo convencido de que mi código era &#8220;mejor&#8221;. Sin embargo, pocas veces hay nada personal en mi proceso de crítica. No pienso que fulano sea peor profesional por escribir peor código&#8230; a lo mejor no es lo suyo, cada cual tiene sus fuertes. Creo que la respuesta definitiva tiene que ver también con la predisposición personal a asumir el mismo tipo de situación. ¿Y si fuera mi código el cuestionado? ¿Cómo me sentiría al verlo cambiado por otro haciendo lo mismo?</p>
<p style="text-align:justify;">El trabajo de uno es una cuestión muy personal, un reflejo de los ideales personales, de los mínimos de calidad, una especie de espejo del alma. <strong>Valorar el trabajo es tener amor propio</strong>. Sus autores, antes de irse a la cama y en privado, saben cuándo un trabajo les representa más o menos, cuándo han puesto más o menos esfuerzo en la labor; sin embargo, ante la crítica externa, el trabajo se convierte en una especie de hijo al que hay que proteger a toda costa. Nuestro carácter se torna defensivo, consideramos el cambio como un insulto a nuestra capacidad, como una ofensa a nuestra inteligencia y a nosotros mismos. Continuando con la metáfora, nos comportamos como esos padres que regañan al profesor por exigir a sus hijos unos cuadernos libre de faltas de ortografía.</p>
<p style="text-align:justify;">Al término de la charla con mi compañero recibí unas disculpas también. He obtenido dos buenos resultados de mantener esa conversación y escribir todo esto:</p>
<p style="text-align:justify;">La primera es que los problemas deben hablarse inmediatamente. Lo he puesto en práctica con mi novia durante 6 años (gracias <a href="http://beatrizalonso.wordpress.com/">Bea</a> por escucharme en los buenos y malos momentos), con mi familia, con mis amigos (gracias también a todos por el apoyo prestado) y ahora, profesionalmente. Tengo la certeza de que es lo correcto.</p>
<p style="text-align:justify;">La segunda es que, para mantenerme coherente a mis ideas, debo mostrarme abierto a la crítica y humilde en el talante. Desde que trabajo, me voy a la cama con la sensación del deber cumplido y bien cumplido, eso debería ser suficiente. Si encuentro mi código cambiado preguntaré por qué y esperaré una respuesta convincente.</p>
<p style="text-align:justify;">El efecto colateral que encuentro es que he perdido parte de la confianza a la hora de trabajar y mezclar archivos, no quiero pisar el trabajo de nadie pero tampoco quiero demorar el mío. No me parece justo. Si le toca mezclar a otro, que lo haga, yo estoy dispuesto a ayudar cuanot esté en mi mano&#8230; Pero como no hay mal que por bien no venga, ahora me fijo muchísimo más en las mezclas. x)</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/unoyunodiez.wordpress.com/777/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/unoyunodiez.wordpress.com/777/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/unoyunodiez.wordpress.com/777/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/unoyunodiez.wordpress.com/777/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/unoyunodiez.wordpress.com/777/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/unoyunodiez.wordpress.com/777/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/unoyunodiez.wordpress.com/777/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/unoyunodiez.wordpress.com/777/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/unoyunodiez.wordpress.com/777/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/unoyunodiez.wordpress.com/777/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/unoyunodiez.wordpress.com/777/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/unoyunodiez.wordpress.com/777/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/unoyunodiez.wordpress.com/777/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/unoyunodiez.wordpress.com/777/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=unoyunodiez.wordpress.com&amp;blog=15323300&amp;post=777&amp;subd=unoyunodiez&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://unoyunodiez.wordpress.com/2011/08/01/del-amor-propio-a-la-obsesion-por-lo-que-es-mio/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/284a643007ef8adc480a171b0a663e86?s=96&#38;d=retro&#38;r=G" medium="image">
			<media:title type="html">lodr</media:title>
		</media:content>
	</item>
		<item>
		<title>Mi segunda entrevista con Google</title>
		<link>http://unoyunodiez.wordpress.com/2011/07/04/mi-segunda-entrevista-con-google/</link>
		<comments>http://unoyunodiez.wordpress.com/2011/07/04/mi-segunda-entrevista-con-google/#comments</comments>
		<pubDate>Mon, 04 Jul 2011 20:12:49 +0000</pubDate>
		<dc:creator>lodr</dc:creator>
				<category><![CDATA[Algoritmia]]></category>
		<category><![CDATA[criba de eratóstenes]]></category>
		<category><![CDATA[digest]]></category>
		<category><![CDATA[experiencias]]></category>
		<category><![CDATA[factorización]]></category>
		<category><![CDATA[google]]></category>
		<category><![CDATA[hash]]></category>
		<category><![CDATA[mediana]]></category>
		<category><![CDATA[orden]]></category>
		<category><![CDATA[primos]]></category>
		<category><![CDATA[tiempo polinómico]]></category>
		<category><![CDATA[trabajo]]></category>

		<guid isPermaLink="false">http://unoyunodiez.wordpress.com/?p=768</guid>
		<description><![CDATA[Bueno, antes de nada decir que no la he pasado, pero que no hay nada que lamentar. Estoy trabajando en Telefónica I+D desde hace tres semanas y me gusta mucho el puesto en el que estoy (sólo tengo que conseguir que me contraten ellos y no andar de subcontratado, jejeje). Esta vez fueron otros 45 <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=unoyunodiez.wordpress.com&amp;blog=15323300&amp;post=768&amp;subd=unoyunodiez&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p style="text-align:justify;">Bueno, antes de nada decir que <strong>no la he pasado</strong>, pero que no hay nada que lamentar. Estoy trabajando en Telefónica I+D desde hace tres semanas y me gusta mucho el puesto en el que estoy (sólo tengo que conseguir que me contraten ellos y no andar de subcontratado, jejeje).</p>
<p style="text-align:justify;">Esta vez fueron otros 45 minutos; me puse muy nervioso y me trababa cada dos por tres. Es lo más negativo que observé de mi actuación: que me faltaban las palabras. De nuevo se dividió en dos partes: durante la primera tuve que describir mis experiencias trabajando y durante la segunda hacer algo de programación y analizar mis propios algoritmos. Salí muy convencido de que esta parte la había hecho bien pero, mira tú por dónde, hoy mismo me di cuenta de que hubo un par de problemas en mis respuestas.</p>
<p style="text-align:justify;">En fin, espero que mis errores ayuden a otros. Vamos con el contenido de la entrevista.</p>
<h2 style="text-align:justify;"><span id="more-768"></span>Tienes 6 minutos para describir tus mejores experiencias de trabajo, qué aspectos te gustaron y cuáles no.</h2>
<p style="text-align:justify;">Iba a contar tres de mis experiencias y sólo me dio tiempo a dos: mi trabajo como investigador para el <a href="http://nil.fdi.ucm.es/" target="_blank">grupo NIL</a> y mi trabajo como <em>autónomo</em> para Kurma y Buroges. El primero porque me introdujo en el mundo de la investigación y este me gustó mucho. Además derivó en una arquitectura reutilizable y práctica. El segundo porque me enseñó a administra mi tiempo, a gestionar mi propio trabajo y a responder de cara a mis jefes directamente.</p>
<p style="text-align:justify;">Lo que no me gusta de mis trabajos es no encontrar el por qué de un fallo. No encontrar la solución no es muy problemático pero no encontrar la causa de una fallo es muy frustrante y lo mejor es dejarlo un rato y volver a ello un poco más tarde.</p>
<h2 style="text-align:justify;">Escribe una función que imprima los números primos hasta un máximo dado. ¿Cómo justificarías que la solución es correcta? ¿Qué complejidad tiene?</h2>
<p style="text-align:justify;">Bueno, el algoritmo que implementé fue la criba de Eratóstenes con la mejora de avanzar sólo hasta la raíz del máximo. Cuando dije que iba a implementar esa solución me quedé atrancado con la palabra criba porque no tenía ni idea de <a href="http://www.google.es/search?q=translate+%22criba+de+erat%C3%B3stenes%22+to+english&amp;ie=utf-8&amp;oe=utf-8&amp;aq=t&amp;rls=org.mozilla:es-ES:official&amp;client=firefox-a" target="_blank">cómo era en inglés</a>.</p>
<p style="text-align:justify;">Este es el código que dí*:</p>
<p><pre class="brush: python;">
def primes(max):
    limit = int(max **.5)
    sieve = [(n, True] for n in range(1,max+1)]
    sieve[0][1] = False # 1 is not prime
    i = 1
    while i&lt;=limit:
        n = sieve[i]

        # Mark multiplies
        m = 2
        r = m * n
        while r &lt;= max:
            sieve[r][1] = False
            m += 1
            r = m * n

        # Skip already marked
        i += 1
        while i&lt;=limit and not sieve[i][1]:
            i += 1

    for n, is_prime in sieve:
        if is_prime: print n

</pre></p>
<p style="text-align:justify;">* Miento, creo que no es el código que  di exactamente y probablemente ahí estuviera uno de mis errores. Es muy probable que me colara en la inicialización de i por tratar de hacer las cosas mejor de lo que debiera en vez de fáciles. Ya veis, primer consejo: <strong>primero fácil</strong>.</p>
<p style="text-align:justify;">El caso es que ese código obtiene los números primos así que vayamos con las siguientes preguntas.</p>
<p style="text-align:justify;">Justificar que la respuesta es correcta no es fácil: lo que tienes que justificar es que la criba de Eratóstenes no puede imprimir otra cosa que no sean números primos porque todos los múltiplos han sido marcados. Comprobar si la salida son primos viendo si pueden factorizarse, desde luego, no es una opción dado que la factorización no es un problema resoluble en tiempo polinómico.</p>
<p style="text-align:justify;">Por otro lado, la complejidad de la solución, que yo dije, fue O(n). Lo cual, pa empezar, ya está mal. El entrevistador me hizo darme cuenta de que esto no es así porque dependen de la distribución de los primos en el segmento. Todo se debe a este bucle:</p>
<p><pre class="brush: plain;">
        # Skip already marked
        i += 1
        while i&lt;=limit and not sieve[i][1]:
            i += 1
</pre></p>
<p style="text-align:justify;">Tal es el que hace que sea impredecible cuándo parará. De no existir el bucle, la complejidad se encontraría en <strong>O(n · sqr(n)) no obstante</strong>. ¿Por qué? Porque el bucle exterior opera sqr(n) veces mientras que el interios, como mucho, opera n/2 veces (al tachar todos los pares, por ejemplo). Luego el número de iteraciones es sqr(n) · n/2 que pertenece a O(n · sqr(n)). Primer fallo.</p>
<h2 style="text-align:justify;">Escribe una función que obtenga la mediana de 3 números enteros. ¿Cuántas comparaciones son necesarias? ¿Cuál es la complejidad del problema de la mediana?</h2>
<p style="text-align:justify;">Creo que este lo hice bien. Para evitar el follón de ponerme a hacer comparaciones decidí resolver el problema así:</p>
<p><pre class="brush: python;">
def mediana(a, b, c):
    return sorted([a, b, c])[1]
</pre></p>
<p style="text-align:justify;">El entrevistador dijo que era una solución muy elegante pero que quería saber cuántas comparaciones eran necesarias. Le dije que si el problema era equivalente ordenar el vector, el número de comparaciones debía ser 3 poruqe el método de ordenación por selección sólo necesitaba 3 comparaciones.</p>
<p style="text-align:justify;">En cuanto a la complejidad, dado que el problema de la mediana es equivalente a ordenar el vector, tenemos que con un buen algoritmo de ordenación como quicksort o mergesort, la complejidad se va a <strong>O(n·log n)</strong>.</p>
<p style="text-align:justify;">Sabía que lo del número de comparaciones era cierto, pero para demostrároslo en este artículo quería implementar la solución sólo con comparaciones. Ha costado pero aquí está:</p>
<p><pre class="brush: python;">
def mediana(a, b, c):
    min = a
    med = b
    max = c
    if med &lt; min:
        min, med = med, min
    if max &lt; med:
        med, max = max, med
    if med &lt; min:
        min, med = med, min
    return med
</pre></p>
<p style="text-align:justify;">Pensada del tirón no es fácil. Lo mejor es desarrollar el bucle de la ordenación por selección. La idea radica en mantener las relaciones entre min, med y max, a saber: <strong>min &lt;= med &lt;= max</strong>. Esto puede determinarse en dos comparaciones: <strong>min &lt;= med and med &lt;= min</strong> que es precisamente el efecto obtenido al no entrar por ninguno de las dos primeros <em>if</em>. El tercero está ahí para comprobar que, tras el cambio del segundo <em>if</em> el valor en min sigue siendo menor que el medio, y corregirlo en caso contrario.</p>
<h2 style="text-align:justify;">Tienes muchos archivos en tu disco duro y necesitas saber si están repetidos. Describe cómo lo harías. Complejidad.</h2>
<p style="text-align:justify;">Se refiere a repetición del contenido. Se trata del problema de ver si dos archivos son iguales. Esto se puede hacer utilizando algoritmos de <a href="http://en.wikipedia.org/wiki/Message_digest" target="_blank">digest y hashes</a>. Si las claves resultantes no son iguales, seguro que los archivos no son iguales. En caso contrario, si quisiéramos asegurarnos al 100% compararíamos los archivos bien restándolos en memoria, bien poco a poco si no cupiesen enteros. Si no necesitamos el 100% de certeza, podemos aplicar otros algoritmos de hash.</p>
<p style="text-align:justify;">Aquí la fastidié en la complejidad. Pensé: &#8220;para tener todas las comprobaciones necesitas el productos cartesiano de los archivos&#8221;. Y lo pensé convencido de que así no habría repeticiones por el orden. Convencido porque en el trabajo me había enfrentado a una cosa similar en la que el producto cartesiano sí era la respuesta&#8230; pero no aquí. Evidentemente si tienes el conjunto de ficheros {F1, F2} y haces el producto cartesiano consigo mismo, resulta que el conjunto resultante es { (F1, F1), (F1,F2), (F2.F1), (F2, F2)}. Resultando que, donde sólo necesitabas una comparación, te salen 4. La respuesta correcta es la misma que el problema de los apretones de manos. Es decir, ¿en una fiesta de N personas, si todo el mundo se dé la mano con todo el mundo, cuántos apretones hay?.</p>
<p style="text-align:justify;">Bueno pues habrá 1 + 2 + 3 + 4 + &#8230; + N-1. Lo cual supone <strong>N(N-1)/2</strong> por lo que sí, la función pertenece al O(N^2) pero no siguiendo el razonamiento que yo había hecho. Además, esto es suponiendo un tamaño de archivo pequeño en comparación con el número de archivos en el disco duro. El bucle encargado de lanzar las comparaciones iteraría N(N-1)/2 veces y dentro realizaría una (o varias) operaciones de hash con complejidad en (seamos buenos) O(l) donde l es el tamaño medio del archivo. Mi <a href="http://es.wikipedia.org/wiki/Scrum#Roles_.22Cerdo.22" target="_blank">scrummaster</a> y estudioso de la narrativa interactiva, <a href="http://mel-hython.blogspot.com/" target="_blank">Mel Hython</a>, me hizo ver que todo dependía de la relación entre l y N. Considerando l como la media del tamaño del archivo tendríamos L = l · N con L el tamaño total de todos los archivos. Así, despejando l tendríamos que l = L/N y por tanto la complejidad quedaría como N(N-1)·L/N·2 = <strong>L(N-1)/2</strong>. Como N puede variar entre 1 (muy pocos archivos muy grandes) a L (muchos archivos muy pequeños), la complejidad <strong>varía entre O(L) (cuando N=1) y O(L^2 ) (cuando N=L)</strong>.</p>
<p style="text-align:justify;">Y bueno, eso es todo. Como veis, el último fallo bastante tonto. Lo podría haber sacado de haber pensado un poquito pero me traicionaron los nervios y razoné de forma equivocada&#8230; Me alegro no obstante de haberme dado cuenta de mis fallos y sé que he aprendido de ellos. También he aprendido que no trabajo bien bajo tanta presión&#8230; Ay.</p>
<p style="text-align:justify;">Una anécdota antes de terminar es que recibí el último correo, avisándome de que estaba fuera del proceso, a nombre de otro. Así, viendo la estructura del mismo parecía el típico correo genérico así que supuse que no era el único en recibir malas noticias hoy <img src='http://s1.wp.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' />  De todas formas escribí a mi contacto en recursos humanos para que me lo aclarara y, no habrían pasado ni cinco minutos, me llamó al móvil para decirme que, desafortunadamente, el mail sí que era para mi: que según el entrevistador, lo había hecho bien &#8220;pero no lo suficiente&#8221; y que lo volviese a intentar en 12 meses. Le contesté pidiendo que si podía echar un vistazo a los informes sobre mí, que esp me ayudaría a mejorar. Los estoy esperando, pero no creo que reciba nada.</p>
<p style="text-align:justify;">Y esa ha sido mi corta historia con Google. No me preocupa demasiado, no es malo para nada e, insisto, ando muy contento donde estoy y seguro que más de uno hasta se alegra de que no me vaya.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/unoyunodiez.wordpress.com/768/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/unoyunodiez.wordpress.com/768/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/unoyunodiez.wordpress.com/768/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/unoyunodiez.wordpress.com/768/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/unoyunodiez.wordpress.com/768/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/unoyunodiez.wordpress.com/768/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/unoyunodiez.wordpress.com/768/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/unoyunodiez.wordpress.com/768/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/unoyunodiez.wordpress.com/768/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/unoyunodiez.wordpress.com/768/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/unoyunodiez.wordpress.com/768/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/unoyunodiez.wordpress.com/768/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/unoyunodiez.wordpress.com/768/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/unoyunodiez.wordpress.com/768/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=unoyunodiez.wordpress.com&amp;blog=15323300&amp;post=768&amp;subd=unoyunodiez&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://unoyunodiez.wordpress.com/2011/07/04/mi-segunda-entrevista-con-google/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/284a643007ef8adc480a171b0a663e86?s=96&#38;d=retro&#38;r=G" medium="image">
			<media:title type="html">lodr</media:title>
		</media:content>
	</item>
		<item>
		<title>Pretty-Print: Imprimiento de forma &#8220;bonita&#8221; datos complejos en python</title>
		<link>http://unoyunodiez.wordpress.com/2011/06/30/pretty-print-imprimiento-de-forma-bonita-datos-complejos-en-python/</link>
		<comments>http://unoyunodiez.wordpress.com/2011/06/30/pretty-print-imprimiento-de-forma-bonita-datos-complejos-en-python/#comments</comments>
		<pubDate>Thu, 30 Jun 2011 09:37:27 +0000</pubDate>
		<dc:creator>lodr</dc:creator>
				<category><![CDATA[Python]]></category>
		<category><![CDATA[debug]]></category>
		<category><![CDATA[depurar]]></category>
		<category><![CDATA[humanizar]]></category>
		<category><![CDATA[imprimir]]></category>
		<category><![CDATA[indentación]]></category>
		<category><![CDATA[modulos]]></category>
		<category><![CDATA[niveles]]></category>
		<category><![CDATA[pprint]]></category>
		<category><![CDATA[print]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[sangrado]]></category>
		<category><![CDATA[trucos]]></category>

		<guid isPermaLink="false">http://unoyunodiez.wordpress.com/?p=761</guid>
		<description><![CDATA[Hoy en el trabajo, tenía que cargar a mano un diccionario de Python que, en su forma canónica, ocupaba un churro de 7000 caracteres, que se dice pronto. Buscando cosas que no tenían nada que ver, descubro el módulo pprint que seguro que, a la hora de depurar, os resuelve la vida a más de <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=unoyunodiez.wordpress.com&amp;blog=15323300&amp;post=761&amp;subd=unoyunodiez&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p style="text-align:justify;">Hoy en el trabajo, tenía que cargar a mano un diccionario de Python que, en su forma canónica, ocupaba un churro de <strong>7000 caracteres</strong>, que se dice pronto.</p>
<p style="text-align:justify;">Buscando cosas que no tenían nada que ver, descubro el módulo <a href="http://docs.python.org/library/pprint.html#module-pprint" target="_blank">pprint</a> que seguro que, a la hora de depurar, os resuelve la vida a más de uno. Se trata de un módulo que aúna funcionalidad para representar tipos de datos arbitrariamente complejos de manera &#8220;bonita&#8221; (el módulo se llama <em>pretty-print</em>).</p>
<p style="text-align:justify;">La funcionalidad más básica la proporciona la función <a href="http://docs.python.org/library/pprint.html#module-pprint" target="_blank">pprint()</a> del módulo. La función toma los siguientes parámetros:</p>
<ul>
<li><strong>object</strong>, el objeto que quieres imprimir.</li>
<li><strong>stream</strong>, opcional, dónde lo quieres imprimir. Por defecto en la salida estándar.</li>
<li><strong>indent</strong>, opcional, cuántas sangrías (<em>indentaciones</em>) por nivel. Por defecto 1.</li>
<li><strong>depth</strong>, opcional, nivel máximo a partir del cual los objetos más profundos se reemplazan por &#8216;&#8230;&#8217;. Por defecto, desactivado.</li>
<li><strong>width</strong>, opcional, anchura máxima antes de romper una línea. Por defecto 80.</li>
</ul>
<p style="text-align:justify;">Os dejo una comparación para que veais a qué me refiero:</p>
<p style="text-align:justify;"><pre class="brush: python;">
import pprint

a = {'nombre completo':{'nombre':'Salvador', 'apellidos':'de la Puente'}, 'edad':25, 'puestos':[('programador .NET',2006),('administrador de sistemas', 2008),('investigador', 2010)]}
print a
pprint.pprint(a)
</pre></p>
<p style="text-align:justify;">Y su salida:</p>
<pre style="text-align:justify;">&gt;&gt;&gt; print a
{'edad': 25, 'nombre completo': {'apellidos': 'de la Puente', 'nombre': 'Salvador'}, 'puestos': [('programador .NET', 2006), ('administrador de sistemas', 2008), ('investigador', 2010)]}
&gt;&gt;&gt; pprint.pprint(a)
{'edad': 25,
 'nombre completo': {'apellidos': 'de la Puente', 'nombre': 'Salvador'},
 'puestos': [('programador .NET', 2006),
             ('administrador de sistemas', 2008),
             ('investigador', 2010)]}</pre>
<p style="text-align:justify;">¿Veis qué útil?</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/unoyunodiez.wordpress.com/761/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/unoyunodiez.wordpress.com/761/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/unoyunodiez.wordpress.com/761/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/unoyunodiez.wordpress.com/761/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/unoyunodiez.wordpress.com/761/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/unoyunodiez.wordpress.com/761/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/unoyunodiez.wordpress.com/761/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/unoyunodiez.wordpress.com/761/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/unoyunodiez.wordpress.com/761/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/unoyunodiez.wordpress.com/761/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/unoyunodiez.wordpress.com/761/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/unoyunodiez.wordpress.com/761/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/unoyunodiez.wordpress.com/761/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/unoyunodiez.wordpress.com/761/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=unoyunodiez.wordpress.com&amp;blog=15323300&amp;post=761&amp;subd=unoyunodiez&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://unoyunodiez.wordpress.com/2011/06/30/pretty-print-imprimiento-de-forma-bonita-datos-complejos-en-python/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/284a643007ef8adc480a171b0a663e86?s=96&#38;d=retro&#38;r=G" medium="image">
			<media:title type="html">lodr</media:title>
		</media:content>
	</item>
		<item>
		<title>Mi primera entrevista con Google</title>
		<link>http://unoyunodiez.wordpress.com/2011/06/27/mi-primera-entrevista-con-google/</link>
		<comments>http://unoyunodiez.wordpress.com/2011/06/27/mi-primera-entrevista-con-google/#comments</comments>
		<pubDate>Mon, 27 Jun 2011 21:18:48 +0000</pubDate>
		<dc:creator>lodr</dc:creator>
				<category><![CDATA[Información]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[ajedrez]]></category>
		<category><![CDATA[caso medio]]></category>
		<category><![CDATA[eficiencia]]></category>
		<category><![CDATA[funciones]]></category>
		<category><![CDATA[hash]]></category>
		<category><![CDATA[hash set]]></category>
		<category><![CDATA[lambda cálculo]]></category>
		<category><![CDATA[listas]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[rotaciones]]></category>
		<category><![CDATA[segundo orden]]></category>
		<category><![CDATA[set]]></category>
		<category><![CDATA[STL]]></category>
		<category><![CDATA[tuplas]]></category>

		<guid isPermaLink="false">http://unoyunodiez.wordpress.com/?p=756</guid>
		<description><![CDATA[Bueno, el pasado Jueves pasé mi primera entrevista con Google y el Viernes me dijeron que la había hecho satisfactoriamente y que a la semana siguiente me pasarían otra. ¡Algo es algo! Fueron unos 45-50min de entrevista en Inglés con uno de los ingenieros de Google. Para mi el tiempo se me hizo eterno y <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=unoyunodiez.wordpress.com&amp;blog=15323300&amp;post=756&amp;subd=unoyunodiez&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p style="text-align:justify;">Bueno, el pasado Jueves pasé mi primera entrevista con Google y el Viernes me dijeron que la había hecho satisfactoriamente y que a la semana siguiente me pasarían otra. ¡Algo es algo!</p>
<p style="text-align:justify;">Fueron unos 45-50min de entrevista en Inglés con uno de los ingenieros de Google. Para mi el tiempo se me hizo eterno y entre los nervios, el calor, el teléfono y mi dicción inglesa, me dio la impresión de que lo había hecho fatal aunque reconocía que era fácil. De hecho la sensación era &#8220;avergonzado de lo mal que lo había hecho para lo fácil que era&#8221;. Afortunadamente no fue así.</p>
<p style="text-align:justify;">La entrevista se dividión en tres partes: una parte de teoría y dos problemas. Aunque me habían pedido Java o C++, me pude defender perfectamente en Python y a continuación os cuento un poco la entrevista, cómo respondí y cómo me hubiera gustado responder&#8230;</p>
<h2 style="text-align:justify;"><span id="more-756"></span>En Python ¿Qué diferencia existe entre una tupla y una lista?</h2>
<p style="text-align:justify;">Lo primero que respondí fue que la tupla es inmutable mientras que la lista no. Sin embargo el entrevistador estaba más interesado en las diferencias a nivel semántico. No entendí lo que quiso decir hasta que me dijo &#8220;Si tuvieras que devolver un entero, una cadena y un objeto de una función&#8230; ¿qué usarías?&#8221; Aquí &#8211;dije&#8211; usaría sin duda una tupla.</p>
<p style="text-align:justify;">Sí, la diferencia a la que se refería era a la del concepto matemático detrás de la tupla. La tupla es la forma de representar los elementos del producto cartesiano de dos conjuntos. Los conjuntos pueden no tener nada que ver entre sí. Visto de otr forma, como leí una vez por ahí, una &#8220;<strong>tupla es una estructura de C ligera</strong>&#8220;. Cuando trabajas con listas, se supone que los tipos de los elementos son el mismo o están relacionados.</p>
<h2 style="text-align:justify;">¿Por qué en Java no hay que liberar la memoria de un objeto?</h2>
<p style="text-align:justify;">Bueno, pues porque Java tiene un mecanismo llamado <a href="http://es.wikipedia.org/wiki/Recolector_de_basura">recolector de basura</a> (garbage collector) encargado de contabilizar qué objetos están siendo referenciados y cuáles no y liberar el espacio de los que no.</p>
<h2 style="text-align:justify;">¿Qué implicaciones en rendimiento tiene el recolector de basura?</h2>
<p style="text-align:justify;">A esta no supe responder. Por supuesto, las hay, pero no sabía cuantificarlas. No obstante, mi coleg Adri me pasó este <a href="http://www.ibm.com/developerworks/java/library/j-jtp01274/index.html" target="_blank">artículo de IBM sobre el recolector de basura</a> que afirma que la sobrecarga inducida por el recolector de Java apenas sobrecarga el rendimiento e incluso hace que la reserva de memoria sea más rápida de lo que es en C.</p>
<h2 style="text-align:justify;">¿Qué es una función lambda y para qué se utilizan?</h2>
<p style="text-align:justify;">La primera vez que dijo <em>lambda</em> no lo entendí así que le pedí si podía escribir la palabra en el Google Doc que compartíamos. Cuando vi escrito <em>lambda</em> afirmé y contesté.</p>
<p style="text-align:justify;">Las funciones lambda son funciones sin nombre que devuelven una sola expresión. En python una función lambda tiene la siguiente pinta:</p>
<p><pre class="brush: python;">
&gt;&gt;&gt; (lambda x:x**2)(9) # Esta función sin nombre, aplicada sobre 9, devuelve el cuadrado de 9
81
</pre></p>
<p style="text-align:justify;">Las <a href="http://en.wikipedia.org/wiki/Lambda_calculus" target="_blank">funciones lambda</a> son útiles en el contexto de uso junto con <a href="http://en.wikipedia.org/wiki/Higher-order_function" target="_blank">funciones de segundo orden</a>. Esto es, funciones capaces de acepta otra funciones o devolver nuevas funciones. Algunas funciones de segundo orden son map, filter, sort&#8230; Os dejo un ejemplo de utilidad:</p>
<p><pre class="brush: python;">
def elevado_a (exponente):
return lambda x : x**exponente # Devuelve una nueva función que eleva al exponente dado

cuadrado = elevado_a(2) # Ahora cuadrado es una función que eleva a 2
cubo = elevado_a(3) # Ahora cubo es una función que eleva a 3

print cuadrado(5) # Imprimirá 25
print cubo(3) # Imprimirá 27
print elevado_a(4)(2) # Imprimirá 16 (2 elevado a 4)
</pre></p>
<h2 style="text-align:justify;">¿Diferencias entre un set y un hash set en la STL?</h2>
<p style="text-align:justify;">Creo que esta pregunta me salió muy bien. La <strong>STL</strong> es la <a href="http://en.cppreference.com/w/cpp/container" target="_blank">Standard Template Library</a> de C++. Primero le dije que hacía mucho tiempo que no tocaba la STL aunque estaba acostumbrado a tratar con los tipos de datos que formaban la librería. De esta forma me preguntó la diferencia entre un set (un conjunto) y un hash set (un conjunto hash).</p>
<p style="text-align:justify;">La diferencia radica en el rendimiento de acceso e inserción. Normalmente, los conjuntos se implementan utilizando un árbol de búsqueda por lo que tanto la inserción como la recuperación de un elemento se realizan en <strong>O(log n)</strong> para el caso medio.</p>
<p style="text-align:justify;">Con un hash set, el conjunto se implementa como una <a title="Hash tables, diccionarios o la memoria del futuro" href="http://unoyunodiez.wordpress.com/2011/06/19/hash-tables-diccionarios-o-la-memoria-del-futuro/">tabla hash</a> por lo que los accesos e inserciones se realizan en <strong>O(1)</strong> para el caso medio. En el caso peor, si se producen un montón de colisiones y todos los elementos se encuentran en el mismo bucket de la tabla hash, si estos buckets están bien implementados es posible que sean árboles de búsqueda por lo que a las malas, tendrá el mismo rendimiento que un set normal.</p>
<h2 style="text-align:justify;">Haz una función que, tomando una lista de listas que representa los píxeles de una imagen, rote la imagen 90º a la derecha.</h2>
<p style="text-align:justify;">Este fue el primero de los problemas. Lo primero que respondí es que el problema se resolvía con cuaterniones pero que para 90º seguro que podía obtener otra solución más sencilla.</p>
<p style="text-align:justify;">La clave estaba en darse cuenta de que la rotación a la derecha era como obtener la traspuesta del array bidimensional y luego tomar cada fila al reves. La refleja de la traspuesta. Así, dada la sigiuente imagen:</p>
<pre style="text-align:justify;">[
  [1, 2, 3],
  [4, 5, 6]
]</pre>
<p style="text-align:justify;">El objetivo era obtener:</p>
<pre style="text-align:justify;">[
  [4, 1],
  [5, 2],
  [6, 3]
[</pre>
<p style="text-align:justify;">La solución que implemente fue:</p>
<p><pre class="brush: python;">
def rotate(image):
l = len(image[0])
new_image = []
for pixel in range(l):
aux = reverse([subelement[pixel] for subelement in image])
new_image.append(aux)

return new_image
</pre></p>
<pre style="text-align:justify;">Podría haber recorrido los píxeles directamente al revés, pero bueno, así queda claro que es la refleja de la traspuesta y me curo en salud.</pre>
<h2 style="text-align:justify;">Considera un tablero de ajedrez, un alfil en una casilla y una casilla objetivo a la que tiene que llegar el alfil. Crea una función que devuelva en cuántos movimientos llega el alfil a la casilla.</h2>
<p style="text-align:justify;">Esta es la última pregunta y la que peor creía que me había saludo. No obstante, bien pensado, tampoco destiné más de 15  minutos (que no es mucho) a cada probelma por lo que imagino que eso, sumado a que el entrevistador no hacía más que repetir la frase "make sense" eran indicadores de que iba por el buen camino. Mi desconcierto vino de la representación del tablero de ejemplo (donde SS y TT son origen y destino respectivamente:</p>
<pre style="text-align:justify;">00 SS 02 TT 04 05 06 07
08 09 10 11 12 13 14 15
16 17 ...</pre>
<p style="text-align:justify;">El caso es que mi cerebro se dividió entre una solución numérica, que trabajara con los números de las casillas buscando alguna relación entre ellos y otra algoritmica, calculando las diagonales y demás. Tenía claro que si no se llegaba en 1 movimiento, se llegaba en 2 (siempre que estuviera en el mismo color, claro). Pero no lo dije.</p>
<p style="text-align:justify;">En un rato el entrevistador me preguntó si no había localizado una cota y le dije que sí, que la cota era evidentemente 2. Entonces, al decirlo en alto me di cuenta de que era siempre 2 a menos que ya estuvieran alineados.</p>
<p style="text-align:justify;">Para ver si estaban alineados podría calcular la diagonal pero la iluminación me vino justo antes del fin de la entrevista, cuando me di cuenta de que si estaban alineados por la diagonal entonces, entre el origen y el destino debía haber un cuadrado, por lo que bastaba con ver si la distancia entre las coordenadas X e Y del origen y el destino eran iguales. Así de tonto:</p>
<p><pre class="brush: python;">
def movements(source, target):
ss = (source % 8, int(source / 8))
    tt = (target % 8, int(target / 8))
if abs(ss[0]-tt[0]) == abs(ss[1]-tt[1]):
        return 1
return 2
</pre></p>
<p style="text-align:justify;">Y eso fue todo, la próxima entrevista la tendré este Viernes, ya os contaré (qué nervios).</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/unoyunodiez.wordpress.com/756/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/unoyunodiez.wordpress.com/756/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/unoyunodiez.wordpress.com/756/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/unoyunodiez.wordpress.com/756/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/unoyunodiez.wordpress.com/756/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/unoyunodiez.wordpress.com/756/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/unoyunodiez.wordpress.com/756/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/unoyunodiez.wordpress.com/756/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/unoyunodiez.wordpress.com/756/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/unoyunodiez.wordpress.com/756/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/unoyunodiez.wordpress.com/756/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/unoyunodiez.wordpress.com/756/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/unoyunodiez.wordpress.com/756/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/unoyunodiez.wordpress.com/756/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=unoyunodiez.wordpress.com&amp;blog=15323300&amp;post=756&amp;subd=unoyunodiez&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://unoyunodiez.wordpress.com/2011/06/27/mi-primera-entrevista-con-google/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/284a643007ef8adc480a171b0a663e86?s=96&#38;d=retro&#38;r=G" medium="image">
			<media:title type="html">lodr</media:title>
		</media:content>
	</item>
		<item>
		<title>Hash tables, diccionarios o la memoria del futuro</title>
		<link>http://unoyunodiez.wordpress.com/2011/06/19/hash-tables-diccionarios-o-la-memoria-del-futuro/</link>
		<comments>http://unoyunodiez.wordpress.com/2011/06/19/hash-tables-diccionarios-o-la-memoria-del-futuro/#comments</comments>
		<pubDate>Sun, 19 Jun 2011 20:08:16 +0000</pubDate>
		<dc:creator>lodr</dc:creator>
				<category><![CDATA[Estructuras de datos]]></category>
		<category><![CDATA[bucket]]></category>
		<category><![CDATA[clave-valor]]></category>
		<category><![CDATA[colisiones]]></category>
		<category><![CDATA[continuidad]]></category>
		<category><![CDATA[función hash]]></category>
		<category><![CDATA[tabla hash]]></category>

		<guid isPermaLink="false">http://unoyunodiez.wordpress.com/?p=730</guid>
		<description><![CDATA[El ordenador, siguiendo el modelo actual, posee una memoria dividida en celdas que puede referenciarse palabra a palabra para obtener contenido de manera inmediata.  Los ingenieros decimos que el acceso a una celda de memoria tiene coste en O(1) o constante. No hay que buscar nada tan sólo pedir lo que haya en la celda <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=unoyunodiez.wordpress.com&amp;blog=15323300&amp;post=730&amp;subd=unoyunodiez&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p style="text-align:justify;">El ordenador, siguiendo el modelo actual, posee una memoria dividida en celdas que puede referenciarse palabra a palabra para obtener contenido <strong>de manera inmediata</strong>.  Los ingenieros decimos que el acceso a una celda de memoria tiene coste en <strong>O(1)</strong> o <strong>constante</strong>. No hay que buscar nada tan sólo pedir lo que haya en la celda número 42 y ¡presto! ahí está.</p>
<p style="text-align:justify;">Este esquema de memoria es muy versátil porque representa listas de elementos. Casi cualquier estructura de datos puede representarse en una lista y, utilizando punteros, las listas no tienen por qué ser homogeneas. Podemos guardar en ellas de todo e identificar cada objeto guardado por el índice dentro de la lista. En otras palabras, por su posición.</p>
<p style="text-align:justify;">Traducir una lista de objetos a un segmento de la memoria es tan simple como conocer el número de elementos, el tamaño de los mismos y la posición del primero.</p>
<p style="text-align:justify;">Sobra decir que al concepto de lista está unido, muy fuertemente, el concepto de <strong>orden</strong> y <strong>posición</strong>.</p>
<p style="text-align:justify;">Si hablamos de colecciones de elementos sin orden, como por ejemplo un conjunto, dónde no nos interesa en qué posición está un objeto, tan sólo <strong>si está o no está</strong>, encontramos que las listas dejan de resolver el problema elegantemente. Sin duda añadir un objeto a una lista es tan sencillo como añadir un nuevo elemento a una lista&#8230; ¿o no? Es un conjunto y en los conjuntos, formalmente descritos, no hay dos elementos iguales por lo que nos convendría <strong>no tener repeticiones</strong>. Así que antes de insertar un objeto habrá que buscarlo en la lista lo que en el mejor de los casos, tiene una complejidad de <strong>O(log n)</strong> y en el caso medio, de <strong>O(n)</strong>. En palabras sencillas, buscar es una <strong>tarea sencilla pero cara</strong> en colecciones muy grandes.</p>
<p style="text-align:justify;">Además, encontrar un objeto del conjunto, al no tener un orden predeterminado (nadie nos asegura que siempre metamos A primero, B segundo,  C tercero&#8230;), requiere una búsqueda también. Y eliminarlo, por definición requiere primero encontrarlo, así que tres cuartos de lo mismo.</p>
<p style="text-align:justify;">Con esto en mente, un pedazo de ingeniero eléctrico, <a href="http://en.wikipedia.org/wiki/Dudley_Allen_Buck" target="_blank">Dudley Allen Buck</a>, describió un nuevo tipo de memoria llamada asociativa o <a href="http://en.wikipedia.org/wiki/Content-addressable_memory" target="_blank">direccionada por contenido</a>. Esta memoria toma un objeto entero y lo busca en su interior pero esta búsqueda está hecha de tal forma que el acceso sigue siendo constante. ¿Magia? Nop, ¡ingenio!</p>
<p style="text-align:justify;"><span id="more-730"></span></p>
<p style="text-align:justify;">La solución por hardware es muy simple aunque el diseño final de la memoria resulta más complicado que las memorias RAM corrientes. Consiste en, mediante circuitería, comparar el elemento que se desea recuperar con <strong>toda</strong> la memoria. Evidentemente, un circuito de comparación por cada bit en la memoria son muchos miles de millones de circuitos de comparación lo que encarece notablemente el coste.</p>
<p style="text-align:justify;">La solución por software es más complicada pero mucho más barata y consiste en utilizar una tabla hash. La idea, no obstante, es muy sencilla: tomamos un objeto, le hacemos alguna transformación y lo convertimos en un número y tomamos el numero como la posición en una lista donde debería ir el objeto.</p>
<p style="text-align:justify;">Ahora, si queremos comprobar si  un objeto está en el conjunto, basta con realizar la transformación e ir a mirar justo a ese lugar de la lista.</p>
<p style="text-align:justify;">A esa transformación se la llama <strong>función hash </strong>y a la lista de elementos, <strong>tabla hash</strong>.</p>
<h2 style="text-align:justify;">Funciones hash</h2>
<p style="text-align:justify;">Las funciones hash son procedimientos matemáticos que <em>condensan</em> información. Toman un objeto complejo y devuelven por lo general un número entero que lo representa de alguna manera llamado <strong>valor, código o clave hash</strong>.</p>
<p style="text-align:justify;">Tienen muchos usos y se espera de ellas que cumplan una serie de propiedades:</p>
<ul style="text-align:justify;">
<li><strong>Bajo coste</strong>. Si el procedimiento de cómputo del valor es costoso, entonces lo que ganamos evitando la búsqueda, lo perdemos realizando la transformación.</li>
<li><strong>Determinista</strong>. La función no puede depender de un estado o involucrar un procedimiento aleatorio o el valor obtenido para un objeto podría no ser siempre el mismo con lo que perderíamos la ventaja de la búsqueda.</li>
<li><strong>Continuidad</strong>. Objetos similares deberían producir números cercanos. Es como funciona la corrección automática de términos de búsqueda de Google, por ejemplo. Quiere decir que &#8220;complejo&#8221; y &#8220;conplego&#8221; deberían convertirse en números muy parecidos.</li>
<li><strong>Rango variable</strong>. El rango es el conjunto de todos los posibles valores de salida de una función. El rango de una función hash es, por lo general, finito. Esto significa que puede producir hasta un número fijo de resultados y no más. Aun así, existen generadores de  funciones hash que, indicando el tamaño del nuevo rango, producen una nueva función hash que puede ser:</li>
<ul>
<li><strong>D</strong><strong>iferente</strong> a la función para el rango anterior por lo que aplicar la nueva función a un objeto devendrá en un valor hash distinto del que se hubiese obtenido con la función vieja.</li>
<li><strong>P</strong><strong>arecida</strong> a la función para el rango anterior por lo que es muy probable que al aplicar la nueva función a un objeto, el resultado sea el mismo o muy similar al que se hubiese obtenido previamente.</li>
</ul>
<li><strong>Minimización de colisiones</strong> o <strong>uniformidad</strong>. Llegamos al cogollo del asunto. Hemos dicho que el rango de una función hash es finito por lo que si el conjunto de datos de entrada es más grande que el rango, lógicamente algún valor se tendrá que repetir (intenta empaquetar 90 libros en 20 cajas, a ver cómo lo haces). Pues bien, cada vez que la función produce el mismo valor para un par de objetos se dice que ha habido una colisión. Es deseable que las funciones hash minimizen el número de colisiones y que distribuyan los datos de entrada uniformemente sobre el rango (en el ejemplo de los libros, es deseable que haya como mucho, 5 libros por caja).</li>
</ul>
<h2 style="text-align:justify;">Tablas hash</h2>
<p style="text-align:justify;">Las tablas hash también reciven el nombre de <strong>diccionarios</strong> porque son conjuntos de pares clave-valor donde la clave es el resultado de aplicar la función hash sobre el valor. Se dice que la búsqueda se realiza por clave para recuperar un valor.</p>
<p style="text-align:justify;">Ahora que sabemos qué es una función hash, basta con pensar que una tabla hash es una lista con un número de posiciones disponibles igual al rango de la función hash. Como hemos comentado anteriormente, la función hash puede producir que dos objetos distintos nos lleven a la misma posición, por ello una tabla hash no guarda directamente los elementos sino una lista de los mismos.</p>
<p style="text-align:justify;">Así, cada posición de la tabla hash se denomina <strong>bucket</strong> o cubo porque almacena los objetos con el mismo valor hash.</p>
<p style="text-align:justify;">Algunas tablas guardan el elementos más accedido primero y luego los demás de manera que cuando se trata de buscar un elemento en concreto, se le aplica la función, se obtiene el valor, se visit la posición correspondiente y se compara con el primer elemento. Es muy probable que se trate de este pero, si no lo es, sencillamente se busca en la lista del bucket.</p>
<p style="text-align:justify;">Las tablas hash poseen un determinado umbral de llenado. Una vez rebasado, la tabla se <strong>expande</strong> para poder albergar más elementos. La nueva tabla puede requerir una función hash distinta así que le toca extraer todos los elementos, pasarles la nueva función y volverlos a incluir en la nueva. Otro procedimiento consiste en crear una nueva tabla y conservar la vieja, buscar en ambas, insertar sólo en la nueva y cuando la vieja quede vacía, eliminarla.</p>
<p style="text-align:justify;">La principal ventaja de una tabla hash es, sin duda, la velocidad. La desventaja principal es que elegir una función de hash que funcione bien de forma general es prácticamente imposible y escoger una para un tipo de datos dado es más una cuestión de arte e intuición. Si no se escoge la función hash cuidadosamente, el número de colisiones podría dispararse y el rendimiento decaer considerablemente.</p>
<h2 style="text-align:justify;">Usos y aplicaciones</h2>
<p style="text-align:justify;">Muchos lenguajes de programación modernos incluyen las tablas hash como tipo de dato básico. El uso de tablas hash tiene sus máximos exponentes en:</p>
<ol style="text-align:justify;">
<li><strong>Arrays asociativos. </strong>Listas cuyos índices suelen ser cadenas de texto, aunque también podrían ser cualquier cosa. Por ejemplo, el número de teléfono de 555-666-777 está en un array asociativo indexado bajo el nombre de &#8220;John&#8221;.</li>
<li><strong>Indexación de bases de datos. </strong>Si sabemos de antemano que en una base de datos vamos a realizar búsquedas de un determinado campo, podemos usar una tabla hash aplicada sobre este campo para recuperar la información rápidamente.</li>
<li><strong>Conjuntos. </strong>Un conjunto es, directamente, una tabla hash. El orden no importa y (dejando a parte o resolviendo las colisiones como hemos visto) la función hash nos permite ver si el elemento está contenido o no en tiempo constante.</li>
<li><strong>Representación de objetos. </strong>Muchos lenguajes de programación modernos como <a href="http://perldoc.perl.org/perldata.html" target="_blank">Perl</a>, <a href="http://docs.python.org/tutorial/datastructures.html#dictionaries" target="_blank">Python</a>, <a href="http://lua-users.org/wiki/TablesTutorial" target="_blank">Lua</a> o <a href="https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Object" target="_blank">Javascript</a> usan tablas hash para representar sus objetos. Las claves suelen ser los nombres de sus miembros o métodos (sean funciones, tipos simples o tipos compuestos) mientras que los valores son punteros a los respectivos miembros o métodos.</li>
</ol>
<h2 style="text-align:justify;">Conclusiones</h2>
<p style="text-align:justify;">De todos sus usos, la representación de objetos es la más interesante. Los lenguajes verdaderamente orientados a objetos, los cuales definen su entorno de ejecución en base a sí mismos, gozan de un dinamismo y versatilidad extremas.<em> Practicamente cualquier cosa</em> puede representarse como un conjunto de propiedades con nombre y valor, esto es, un diccionario. Además, la inclusión de tipos ejecutables (es decir, variables que pueden contener programas) permiten todo tipo de transformaciones en los objetos: añadir métodos, quitarlos, redefinirlos&#8230;<em></em></p>
<p style="text-align:justify;">Desde mi punto de vista, me parece la memoria del futuro, una especie de <strong>estructura de datos universal</strong>.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/unoyunodiez.wordpress.com/730/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/unoyunodiez.wordpress.com/730/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/unoyunodiez.wordpress.com/730/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/unoyunodiez.wordpress.com/730/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/unoyunodiez.wordpress.com/730/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/unoyunodiez.wordpress.com/730/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/unoyunodiez.wordpress.com/730/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/unoyunodiez.wordpress.com/730/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/unoyunodiez.wordpress.com/730/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/unoyunodiez.wordpress.com/730/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/unoyunodiez.wordpress.com/730/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/unoyunodiez.wordpress.com/730/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/unoyunodiez.wordpress.com/730/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/unoyunodiez.wordpress.com/730/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=unoyunodiez.wordpress.com&amp;blog=15323300&amp;post=730&amp;subd=unoyunodiez&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://unoyunodiez.wordpress.com/2011/06/19/hash-tables-diccionarios-o-la-memoria-del-futuro/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/284a643007ef8adc480a171b0a663e86?s=96&#38;d=retro&#38;r=G" medium="image">
			<media:title type="html">lodr</media:title>
		</media:content>
	</item>
	</channel>
</rss>
