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

<channel>
	<title>nemediano &#187; Mis demonios</title>
	<atom:link href="http://www.nemediano.com.mx/category/mis-demonios/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.nemediano.com.mx</link>
	<description>Reflexiones de un espiritu curioso</description>
	<lastBuildDate>Fri, 16 Jul 2010 22:07:36 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<item>
		<title>Organizando fotos con ImageMagick</title>
		<link>http://www.nemediano.com.mx/2010/organizando-fotos-con-imagemagick/</link>
		<comments>http://www.nemediano.com.mx/2010/organizando-fotos-con-imagemagick/#comments</comments>
		<pubDate>Fri, 16 Jul 2010 22:07:36 +0000</pubDate>
		<dc:creator>nemediano</dc:creator>
				<category><![CDATA[Computación]]></category>
		<category><![CDATA[General]]></category>

		<guid isPermaLink="false">http://www.nemediano.com.mx/?p=317</guid>
		<description><![CDATA[El semestre antepasado lleve la clase de tratamiento de imágenes multiespectrales con el Dr jorge Lira. Fue un curso muy pesado tareas y practicas a diestra y siniestra, además incluían manejar imágenes en un formato RAW para evitar la pedida de información, (esto se traducía en que cada practica o tarea que queríamos hacer, involucraba [...]]]></description>
			<content:encoded><![CDATA[<p>El semestre antepasado lleve la clase de tratamiento de imágenes multiespectrales con el <a href="http://turing.iimas.unam.mx/~siav/Gente/jorgelira.htm">Dr jorge Lira</a>. Fue un curso muy pesado tareas y practicas a diestra y siniestra, además incluían manejar imágenes en un formato RAW para evitar la pedida de información, (esto se traducía en que cada practica o tarea que queríamos hacer, involucraba de 500MB a 1GB en 10 o 15 imágenes).  Lo mas feo del asunto es que las imágenes en RAW no son interpretables en casi ningún programa, para poder transformarlas en lindos png o jpg (o tiff) que pudiéramos usar en los reportes y tareas (Documentos de <a href="http://www.latex-project.org/">LaTeX</a> o de <a href="www.openoffice.org">Open Office</a>).</p>
<p>Prácticamente dependíamos de un programa comercial (privativo) que el Dr tenia en su laboratorio para guardar una copia de la imagen en algún formato mas universal. No contentos con llevar nuestro GB de imágenes en raw con los datos de la practica, teníamos que viajar con una copia de la imagen en jpg para poder escribir nuestro reporte.</p>
<p>Fue entonces cuando mi amiga Etna, me presento con <a href="http://www.imagemagick.org/script/index.php">ImageMagick</a>.<br />
<span id="more-317"></span></p>
<h2>Y que es ImageMagick&#8230;</h2>
<p>Es un conjunto de programas libres que sirven para convertir, transformar, y procesar imágenes en casi cualquier formato (y lo digo en serio). Lo que lo hace tan poderoso y flexible es que su interfaz es en linea de comandos, por lo que es ideal para desarrollar programas que ocupen ImageMagick y procesen imágenes (de hecho hay bindings para varios lenguajes de programación).</p>
<p>Una de las chucherias de ImageMagick es convertir de formato raw a cualquier formato.</p>
<h2>Por que lo querría usar uno normalmente.</h2>
<p>La segunda vez que me encontré con la necesidad de procesar un montón de imágenes y que me motivo a escribir este post fue regresando de las vacaciones en Oaxaca. Yo no llevaba mi cámara, pero Erika y Mag me pasaron sus fotos.</p>
<p>Ya saben tenia cientos de imágenes con títulos bien descriptivos como IMG_2379.JPG que pesaban algo así como 600Kb y median como 3072&#215;2304 píxeles. Lo cual si hubiera querido subir en mi blog, conllevan un montón de trafico de red, y además seria un desperdicio, por que quien tiene un monitor con esa resolución (Vamos los que las vieran las tendrían que rescalar antes de verlas).</p>
<p>La solución de nuevo es ImageMagick</p>
<h2>Como se usa ImageMagik</h2>
<p>Pues el comando convert (que no es el único que conforma ImageMagick), nos da toda la versatilidad que queremos.</p>
<h3>Escalando una imagen</h3>
<p>Al escalar una imagen debemos de tener cuidado de hacerlo de una manera de que conserve su proporción (su aspect ratio), la mayoría del SW nos deja hacerlo si le decimos que no queremos deformaciones, también se puede hacer en ImageMagick</p>
<pre>convert -resize 50% input.jpg output.jpg</pre>
<p>Al darle en porcentaje el tamaño, Imagemagick sabe que no debe modificar el aspect ratio.</p>
<h3>Reduciendo la calidad de la imagen</h3>
<p>Hay dos tipos de compresión una donde no se pierde información llamada lossless, y otra llamada lossy compresión que es cuando un imagen pierde parte de su información al comprimirse. Cuando guardamos una imagen en formato jpg se esta haciendo una compresión con pérdida (lossy). El algoritmo del jpg es lo suficientemente flexible para dejarnos controlar la perdida con un parámetro de calidad. Mientras menos sea la calidad menor sera la perdida y mayor el tamaño de la imagen.</p>
<p>Sin embargo el algoritmo es tan bueno que bajar un poco la calidad de la imagen, suele bajar en mucho el tamaño (en bytes) de la misma, aproximadamente una imagen al 90% de calidad mide una cuarta parte que la imagen original. El estándar para publicar en una web es del 85%.</p>
<p>Para hacerlo en ImageMagick se ocupa el siguiente comando</p>
<pre>convert -quality 85% input.jpg output.jpg</pre>
<h3>Corrigiendo la orientación</h3>
<p>Otra cosa interesante es que ImageMagick puede corregir la orientación de una imagen de una cámara si los metadatos de la foto tienen esa orientación con el comando</p>
<pre>convert -auto-orient input.jpg output.jpg</pre>
<p>Ojo esto no siempre funciona (a veces los metadatos de la cámara no están bien), por lo que siempre es bueno darle una checada a la imagen de salida. También recuerda que en muchos navegadores de archivos se aplica esta corrección, pero eso no quiere decir que la imagen este volteada, si no que el visor de imágenes la esta transformando para que la veas.</p>
<p>Eso puede provocar que en tu máquina tu veas la imagen al derecho y cuando la subas a un sitio web, la veas al revés. La única forma de saberlo es viendo el tamaño de la imagen y ver si es mas alta que ancha o viceversa.</p>
<p>Y desde luego todos estos pasos se pueden llevar a cabo al mismo tiempo. Por ejemplo:</p>
<pre>convert -auto-orient -quality 85% -resize 50% input.jpg output.jpg</pre>
<h2>Y poniendo todo en un script</h2>
<p>Aprovechando que tuve que aprender un poco de bash, para un programa de la tesis, escribí el siguiente scrip en bash, para hacer las operaciones antes descritas sobre una carpeta con muchas imágenes.</p>
<p>El script tiene las siguientes características:</p>
<ul>
<li>Siempre trata de hacer la corrección de orientación</li>
<li>Acepta opcionalmente los siguientes parámetros</li>
<li><strong>-q quality</strong> Para reducir de calidad las imágenes, el parámetro debe ser entero y estar en el intervalo (0, 100)</li>
<li><strong>-s size</strong> Para reducir el tamaño en un porcentaje, (en ImageMagick esto no necesariamente tiene que especificarse así, pero en el scrip valido que solo se pueda cambiar el tamaño en un porcentaje) que acepta enteros en el intervalo (0, 100)</li>
<li><strong>-n name</strong> Para especificar un patrón de nombre de la imagen de salida, en caso de que este parámetro no se le proporcione, las imágenes de salida tendrán el mismo nombre que las de salida (puede que las sobrescriban), con la única excepción que valido que en la imagen de salida la extensión siempre sea en minúsculas (odio que en la mayoría de las cámaras, las extensiones de las imágenes estén en mayúsculas DSC_001.JPG)</li>
</ul>
<p>En resumen el scrip corrido en su forma completa por ejemplo:</p>
<pre>photo2wp.sh -q 85 -s 50  –name Vacaciones</pre>
<p>Tomara todas las imágenes con extensión jpg ó JPG que haya en el directorio actual. A cada una de ellas las escalará al 50% respetando su aspect ratio, las comprimirá en jpg, con el 85% de calidad y las imágenes de salida tendrán el nombre VacacionesXXX.jpg. Donde XXX es un numero progresivo que depende de la cantidad de imágenes que haya en la carpeta.</p>
<p>Es posible pasar mas de una palabra en el nombre pero entonces hay que encerrarlo en comillas:</p>
<pre>photo2wp.sh -q 85 -s 50  –name “Mis Vacaciones”</pre>
<p>Todos los argumentos son opcionales:</p>
<pre>photo2wp.sh -q 85  –name Vacaciones</pre>
<p>Por ejemplo comprime todas las imágenes al 85% y las renombra como VacacionesXXX.jpg, sin escalar su tamaño.</p>
<p>En un abuso de las opciones, puede usarse sin argumentos</p>
<pre>photo2wp.sh</pre>
<p>Que toma todas las imágenes, trata de corregir su orientación, y las guarda con el mismo nombre pero asegurándose que la extensión sea en minúsculas (si las imágenes originales tienen su extensión en minúsculas, las va a sobrescribir)</p>
<p>Por ultimo algunas recomendaciones:</p>
<ul>
<li><strong>No he testeado el script al 100%</strong>, así que siempre ten una copia de tus imágenes originales. (Aún cuando no uses mi script esto es buena practica)</li>
<li>Recuerda que el script solo funciona cuando <strong>ya tienes instalado</strong> el ImageMagick en tu maquina.</li>
<li>Si quieres usar el script, recuerda que antes que nada debes darle permisos de ejecución.</li>
<li>Recuerda que el script solo actúa sobre el directorio en el que esta siendo ejecutado. <strong>No se mete recursivamente</strong> en carpetas.</li>
</ul>
<p>Finalmente el script esta aqui (copia y pega en un archivo de texto yo lo llame photo2wp.sh, pero pon el nombre que quieras):</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
</pre></td><td class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">#!/bin/bash</span>
&nbsp;
<span style="color: #666666; font-style: italic;">#Este scrip toma todas las fotos de la carpeta donde se ejecute y las</span>
<span style="color: #666666; font-style: italic;">#procesa. Primero la pone al derecho dependiendo de los metadatos, </span>
<span style="color: #666666; font-style: italic;">#les cambia de nombre y las guarda con un tamaño y una calidad </span>
<span style="color: #666666; font-style: italic;">#determinadas por las opciones</span>
&nbsp;
&nbsp;
<span style="color: #000000; font-weight: bold;">function</span> dameNumero <span style="color: #7a0874; font-weight: bold;">&#123;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">if</span> <span style="color: #7a0874; font-weight: bold;">&#91;</span> <span style="color: #007800;">$total</span> <span style="color: #660033;">-lt</span> <span style="color: #000000;">100</span> <span style="color: #7a0874; font-weight: bold;">&#93;</span>; <span style="color: #000000; font-weight: bold;">then</span>
&nbsp;
		<span style="color: #000000; font-weight: bold;">if</span> <span style="color: #7a0874; font-weight: bold;">&#91;</span> <span style="color: #007800;">$cont</span> <span style="color: #660033;">-lt</span> <span style="color: #000000;">10</span> <span style="color: #7a0874; font-weight: bold;">&#93;</span>; <span style="color: #000000; font-weight: bold;">then</span>
			<span style="color: #007800;">number</span>=<span style="color: #ff0000;">&quot;0<span style="color: #007800;">$cont</span>&quot;</span>
		<span style="color: #000000; font-weight: bold;">else</span>
			<span style="color: #007800;">number</span>=<span style="color: #ff0000;">&quot;<span style="color: #007800;">$cont</span>&quot;</span>
		<span style="color: #000000; font-weight: bold;">fi</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">elif</span> <span style="color: #7a0874; font-weight: bold;">&#91;</span> <span style="color: #007800;">$total</span> <span style="color: #660033;">-lt</span> <span style="color: #000000;">1000</span> <span style="color: #7a0874; font-weight: bold;">&#93;</span>; <span style="color: #000000; font-weight: bold;">then</span>
&nbsp;
		<span style="color: #000000; font-weight: bold;">if</span> <span style="color: #7a0874; font-weight: bold;">&#91;</span> <span style="color: #007800;">$cont</span> <span style="color: #660033;">-lt</span> <span style="color: #000000;">10</span> <span style="color: #7a0874; font-weight: bold;">&#93;</span>; <span style="color: #000000; font-weight: bold;">then</span>
			<span style="color: #007800;">number</span>=<span style="color: #ff0000;">&quot;00<span style="color: #007800;">$cont</span>&quot;</span>
		<span style="color: #000000; font-weight: bold;">elif</span> <span style="color: #7a0874; font-weight: bold;">&#91;</span> <span style="color: #007800;">$cont</span> <span style="color: #660033;">-lt</span> <span style="color: #000000;">100</span> <span style="color: #7a0874; font-weight: bold;">&#93;</span>; <span style="color: #000000; font-weight: bold;">then</span>
			<span style="color: #007800;">number</span>=<span style="color: #ff0000;">&quot;0<span style="color: #007800;">$cont</span>&quot;</span>
		<span style="color: #000000; font-weight: bold;">else</span>
			<span style="color: #007800;">number</span>=<span style="color: #ff0000;">&quot;<span style="color: #007800;">$cont</span>&quot;</span>
		<span style="color: #000000; font-weight: bold;">fi</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">else</span>
&nbsp;
		<span style="color: #000000; font-weight: bold;">if</span> <span style="color: #7a0874; font-weight: bold;">&#91;</span> <span style="color: #007800;">$cont</span> <span style="color: #660033;">-lt</span> <span style="color: #000000;">10</span> <span style="color: #7a0874; font-weight: bold;">&#93;</span>; <span style="color: #000000; font-weight: bold;">then</span>
			<span style="color: #007800;">number</span>=<span style="color: #ff0000;">&quot;000<span style="color: #007800;">$cont</span>&quot;</span>
		<span style="color: #000000; font-weight: bold;">elif</span> <span style="color: #7a0874; font-weight: bold;">&#91;</span> <span style="color: #007800;">$cont</span> <span style="color: #660033;">-lt</span> <span style="color: #000000;">100</span> <span style="color: #7a0874; font-weight: bold;">&#93;</span>; <span style="color: #000000; font-weight: bold;">then</span>
			<span style="color: #007800;">number</span>=<span style="color: #ff0000;">&quot;00<span style="color: #007800;">$cont</span>&quot;</span>
		<span style="color: #000000; font-weight: bold;">elif</span> <span style="color: #7a0874; font-weight: bold;">&#91;</span> <span style="color: #007800;">$cont</span> <span style="color: #660033;">-lt</span> <span style="color: #000000;">1000</span> <span style="color: #7a0874; font-weight: bold;">&#93;</span>; <span style="color: #000000; font-weight: bold;">then</span>
			<span style="color: #007800;">number</span>=<span style="color: #ff0000;">&quot;0<span style="color: #007800;">$cont</span>&quot;</span>
		<span style="color: #000000; font-weight: bold;">else</span>
			<span style="color: #007800;">number</span>=<span style="color: #ff0000;">&quot;<span style="color: #007800;">$cont</span>&quot;</span>
		<span style="color: #000000; font-weight: bold;">fi</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">fi</span> 
&nbsp;
<span style="color: #7a0874; font-weight: bold;">&#125;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">#Aqui parseamos las opciones</span>
<span style="color: #007800;">qflag</span>=<span style="color: #000000;">0</span>
<span style="color: #007800;">sflag</span>=<span style="color: #000000;">0</span>
<span style="color: #007800;">nflag</span>=<span style="color: #000000;">0</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">while</span> <span style="color: #7a0874; font-weight: bold;">getopts</span> <span style="color: #ff0000;">'q:s:n:'</span> OPTION
<span style="color: #000000; font-weight: bold;">do</span>
  <span style="color: #000000; font-weight: bold;">case</span> <span style="color: #007800;">$OPTION</span> <span style="color: #000000; font-weight: bold;">in</span>
  q<span style="color: #7a0874; font-weight: bold;">&#41;</span>	<span style="color: #007800;">qflag</span>=<span style="color: #000000;">1</span>
		<span style="color: #007800;">quality</span>=<span style="color: #ff0000;">&quot;<span style="color: #007800;">$OPTARG</span>&quot;</span>
		<span style="color: #000000; font-weight: bold;">;;</span>
  s<span style="color: #7a0874; font-weight: bold;">&#41;</span>	<span style="color: #007800;">sflag</span>=<span style="color: #000000;">1</span>
		<span style="color: #007800;"><span style="color: #c20cb9; font-weight: bold;">size</span></span>=<span style="color: #ff0000;">&quot;<span style="color: #007800;">$OPTARG</span>&quot;</span>
		<span style="color: #000000; font-weight: bold;">;;</span>
  n<span style="color: #7a0874; font-weight: bold;">&#41;</span>	<span style="color: #007800;">nflag</span>=<span style="color: #000000;">1</span>
		<span style="color: #007800;">nameBase</span>=<span style="color: #ff0000;">&quot;<span style="color: #007800;">$OPTARG</span>&quot;</span>
		<span style="color: #000000; font-weight: bold;">;;</span>
  <span style="color: #000000; font-weight: bold;">*</span><span style="color: #7a0874; font-weight: bold;">&#41;</span>	<span style="color: #7a0874; font-weight: bold;">printf</span> <span style="color: #ff0000;">&quot;Usage: photo2wp.sh [-q &lt;quality&gt;] [-s &lt;size&gt;] [-n &lt;name&gt;]&quot;</span> <span style="color: #000000; font-weight: bold;">&gt;&amp;</span><span style="color: #000000;">2</span>
		<span style="color: #7a0874; font-weight: bold;">exit</span> <span style="color: #000000;">2</span>
		<span style="color: #000000; font-weight: bold;">;;</span>
  <span style="color: #000000; font-weight: bold;">esac</span>
<span style="color: #000000; font-weight: bold;">done</span>
&nbsp;
<span style="color: #666666; font-style: italic;">#Si no nos dieron quality asume el 100</span>
<span style="color: #000000; font-weight: bold;">if</span> <span style="color: #7a0874; font-weight: bold;">&#91;</span> <span style="color: #007800;">$qflag</span> <span style="color: #660033;">-ne</span> <span style="color: #000000;">1</span> <span style="color: #7a0874; font-weight: bold;">&#93;</span>; <span style="color: #000000; font-weight: bold;">then</span>
	<span style="color: #007800;">quality</span>=<span style="color: #000000;">100</span>
<span style="color: #000000; font-weight: bold;">fi</span>
&nbsp;
<span style="color: #666666; font-style: italic;">#Si no nos dieron size asume el 100</span>
<span style="color: #000000; font-weight: bold;">if</span> <span style="color: #7a0874; font-weight: bold;">&#91;</span> <span style="color: #007800;">$sflag</span> <span style="color: #660033;">-ne</span> <span style="color: #000000;">1</span> <span style="color: #7a0874; font-weight: bold;">&#93;</span>; <span style="color: #000000; font-weight: bold;">then</span>
	<span style="color: #007800;"><span style="color: #c20cb9; font-weight: bold;">size</span></span>=<span style="color: #000000;">100</span>
<span style="color: #000000; font-weight: bold;">fi</span>
&nbsp;
&nbsp;
<span style="color: #666666; font-style: italic;">#Checamos que quality sea valido</span>
<span style="color: #000000; font-weight: bold;">if</span> <span style="color: #7a0874; font-weight: bold;">&#91;</span><span style="color: #7a0874; font-weight: bold;">&#91;</span> <span style="color: #007800;">$quality</span> =~ ^<span style="color: #7a0874; font-weight: bold;">&#91;</span><span style="color: #000000;">0</span>-<span style="color: #000000;">9</span><span style="color: #7a0874; font-weight: bold;">&#93;</span>+$ <span style="color: #7a0874; font-weight: bold;">&#93;</span><span style="color: #7a0874; font-weight: bold;">&#93;</span>; <span style="color: #000000; font-weight: bold;">then</span>
    <span style="color: #000000; font-weight: bold;">if</span> <span style="color: #7a0874; font-weight: bold;">&#91;</span> <span style="color: #007800;">$quality</span> <span style="color: #660033;">-gt</span> <span style="color: #000000;">100</span> <span style="color: #660033;">-o</span> <span style="color: #007800;">$quality</span> <span style="color: #660033;">-lt</span> <span style="color: #000000;">0</span> <span style="color: #7a0874; font-weight: bold;">&#93;</span>
    <span style="color: #000000; font-weight: bold;">then</span>
		<span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #ff0000;">&quot;El parámetro quality debe se un número entero en el intervalo [0, 100]&quot;</span> <span style="color: #000000; font-weight: bold;">&gt;&amp;</span><span style="color: #000000;">2</span>
		<span style="color: #7a0874; font-weight: bold;">exit</span> <span style="color: #000000;">3</span>
    <span style="color: #000000; font-weight: bold;">fi</span>
<span style="color: #000000; font-weight: bold;">else</span> 
	<span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #ff0000;">&quot;El parámetro quality debe se numérico y entero&quot;</span> <span style="color: #000000; font-weight: bold;">&gt;&amp;</span><span style="color: #000000;">2</span>
    <span style="color: #7a0874; font-weight: bold;">exit</span> <span style="color: #000000;">3</span>
<span style="color: #000000; font-weight: bold;">fi</span>
&nbsp;
<span style="color: #666666; font-style: italic;">#Ahora validamos el valor de size</span>
<span style="color: #000000; font-weight: bold;">if</span> <span style="color: #7a0874; font-weight: bold;">&#91;</span><span style="color: #7a0874; font-weight: bold;">&#91;</span> <span style="color: #007800;">$size</span> =~ ^<span style="color: #7a0874; font-weight: bold;">&#91;</span><span style="color: #000000;">0</span>-<span style="color: #000000;">9</span><span style="color: #7a0874; font-weight: bold;">&#93;</span>+$ <span style="color: #7a0874; font-weight: bold;">&#93;</span><span style="color: #7a0874; font-weight: bold;">&#93;</span>; <span style="color: #000000; font-weight: bold;">then</span>
    <span style="color: #000000; font-weight: bold;">if</span> <span style="color: #7a0874; font-weight: bold;">&#91;</span> <span style="color: #007800;">$size</span> <span style="color: #660033;">-gt</span> <span style="color: #000000;">100</span> <span style="color: #660033;">-o</span> <span style="color: #007800;">$size</span> <span style="color: #660033;">-lt</span> <span style="color: #000000;">0</span> <span style="color: #7a0874; font-weight: bold;">&#93;</span>
    <span style="color: #000000; font-weight: bold;">then</span>
		<span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #ff0000;">&quot;El parámetro size debe se un número entero en el intervalo [0, 100]&quot;</span> <span style="color: #000000; font-weight: bold;">&gt;&amp;</span><span style="color: #000000;">2</span>
		<span style="color: #7a0874; font-weight: bold;">exit</span> <span style="color: #000000;">3</span>
    <span style="color: #000000; font-weight: bold;">fi</span>
<span style="color: #000000; font-weight: bold;">else</span> 
	<span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #ff0000;">&quot;El parámetro size debe se numérico y entero&quot;</span> <span style="color: #000000; font-weight: bold;">&gt;&amp;</span><span style="color: #000000;">2</span>
    <span style="color: #7a0874; font-weight: bold;">exit</span> <span style="color: #000000;">3</span>
<span style="color: #000000; font-weight: bold;">fi</span>
&nbsp;
<span style="color: #666666; font-style: italic;">#Contamos cuantas imagenes hay</span>
<span style="color: #007800;">total</span>=<span style="color: #000000; font-weight: bold;">`</span><span style="color: #c20cb9; font-weight: bold;">ls</span> <span style="color: #000000; font-weight: bold;">*</span>.<span style="color: #7a0874; font-weight: bold;">&#91;</span>jJ<span style="color: #7a0874; font-weight: bold;">&#93;</span><span style="color: #7a0874; font-weight: bold;">&#91;</span>pP<span style="color: #7a0874; font-weight: bold;">&#93;</span><span style="color: #7a0874; font-weight: bold;">&#91;</span>gG<span style="color: #7a0874; font-weight: bold;">&#93;</span> <span style="color: #000000;">2</span><span style="color: #000000; font-weight: bold;">&gt;/</span>dev<span style="color: #000000; font-weight: bold;">/</span>null <span style="color: #000000; font-weight: bold;">|</span> <span style="color: #c20cb9; font-weight: bold;">wc</span> -l<span style="color: #000000; font-weight: bold;">`</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">if</span> <span style="color: #7a0874; font-weight: bold;">&#91;</span> <span style="color: #007800;">$total</span> <span style="color: #660033;">-eq</span> <span style="color: #000000;">0</span> <span style="color: #7a0874; font-weight: bold;">&#93;</span>; <span style="color: #000000; font-weight: bold;">then</span>
	<span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #ff0000;">&quot;No hay imagenes que procesar en esta carpeta&quot;</span>
	<span style="color: #7a0874; font-weight: bold;">exit</span> <span style="color: #000000;">1</span>
<span style="color: #000000; font-weight: bold;">fi</span>
&nbsp;
<span style="color: #666666; font-style: italic;">#Calculemos las opciones y avisemos al usuario que vamos a hacer</span>
<span style="color: #007800;">opciones</span>=<span style="color: #ff0000;">&quot;-auto-orient&quot;</span>
&nbsp;
<span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #ff0000;">&quot;Hay <span style="color: #007800;">$total</span> fotos&quot;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">if</span> <span style="color: #7a0874; font-weight: bold;">&#91;</span> <span style="color: #007800;">$sflag</span> <span style="color: #660033;">-eq</span> <span style="color: #000000;">1</span> <span style="color: #7a0874; font-weight: bold;">&#93;</span>; <span style="color: #000000; font-weight: bold;">then</span>
	<span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #ff0000;">&quot;Se van a escalar a un tamaño de: <span style="color: #007800;">$size</span>%&quot;</span>
	<span style="color: #007800;">opciones</span>=<span style="color: #ff0000;">&quot;<span style="color: #007800;">$opciones</span> -resize <span style="color: #007800;">$size</span>%&quot;</span>
<span style="color: #000000; font-weight: bold;">fi</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">if</span> <span style="color: #7a0874; font-weight: bold;">&#91;</span> <span style="color: #007800;">$qflag</span> <span style="color: #660033;">-eq</span> <span style="color: #000000;">1</span> <span style="color: #7a0874; font-weight: bold;">&#93;</span>; <span style="color: #000000; font-weight: bold;">then</span>
	<span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #ff0000;">&quot;Se van a comprimir con una calidad de: <span style="color: #007800;">$quality</span>%&quot;</span>
	<span style="color: #007800;">opciones</span>=<span style="color: #ff0000;">&quot;<span style="color: #007800;">$opciones</span> -quality <span style="color: #007800;">$quality</span>%&quot;</span>
<span style="color: #000000; font-weight: bold;">fi</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">if</span> <span style="color: #7a0874; font-weight: bold;">&#91;</span> <span style="color: #007800;">$nflag</span> <span style="color: #660033;">-eq</span> <span style="color: #000000;">1</span> <span style="color: #7a0874; font-weight: bold;">&#93;</span>; <span style="color: #000000; font-weight: bold;">then</span>
	<span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #ff0000;">&quot;Se guardaran con el nombre: <span style="color: #007800;">$nameBase</span>[XXX].jpg&quot;</span>
<span style="color: #000000; font-weight: bold;">fi</span>
&nbsp;
<span style="color: #666666; font-style: italic;">#Todo correcto empezamos a procesar</span>
<span style="color: #007800;">cont</span>=<span style="color: #000000;">0</span>
<span style="color: #007800;">number</span>=<span style="color: #ff0000;">&quot;&quot;</span>
<span style="color: #007800;">output_file</span>=<span style="color: #ff0000;">&quot;&quot;</span>
<span style="color: #007800;">images</span>=<span style="color: #000000; font-weight: bold;">*</span>.<span style="color: #7a0874; font-weight: bold;">&#91;</span>jJ<span style="color: #7a0874; font-weight: bold;">&#93;</span><span style="color: #7a0874; font-weight: bold;">&#91;</span>pP<span style="color: #7a0874; font-weight: bold;">&#93;</span><span style="color: #7a0874; font-weight: bold;">&#91;</span>gG<span style="color: #7a0874; font-weight: bold;">&#93;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">#Ciclo principal sobre todas las imagenes de entrada</span>
<span style="color: #000000; font-weight: bold;">for</span> input_file <span style="color: #000000; font-weight: bold;">in</span> <span style="color: #007800;">$images</span>
<span style="color: #000000; font-weight: bold;">do</span>
	<span style="color: #666666; font-style: italic;">#Calculamos el nombre de la imagen de salida</span>
	<span style="color: #007800;">cont</span>=<span style="color: #000000; font-weight: bold;">`</span><span style="color: #c20cb9; font-weight: bold;">expr</span> <span style="color: #007800;">$cont</span> + <span style="color: #000000;">1</span><span style="color: #000000; font-weight: bold;">`</span>
	dameNumero
	<span style="color: #000000; font-weight: bold;">if</span> <span style="color: #7a0874; font-weight: bold;">&#91;</span> <span style="color: #007800;">$nflag</span> <span style="color: #660033;">-eq</span> <span style="color: #000000;">1</span> <span style="color: #7a0874; font-weight: bold;">&#93;</span>; <span style="color: #000000; font-weight: bold;">then</span>
		<span style="color: #007800;">output_file</span>=<span style="color: #ff0000;">&quot;<span style="color: #007800;">$nameBase</span><span style="color: #007800;">$number</span>&quot;</span>
	<span style="color: #000000; font-weight: bold;">else</span>
		<span style="color: #007800;">output_file</span>=<span style="color: #800000;">${input_file%%.*}</span>
	<span style="color: #000000; font-weight: bold;">fi</span>
&nbsp;
	<span style="color: #666666; font-style: italic;">#Realizamos la conversion</span>
	<span style="color: #000000; font-weight: bold;">if</span> convert <span style="color: #007800;">$opciones</span> <span style="color: #ff0000;">&quot;<span style="color: #007800;">$input_file</span>&quot;</span> <span style="color: #ff0000;">&quot;<span style="color: #007800;">$output_file</span>.jpg&quot;</span> <span style="color: #000000;">2</span><span style="color: #000000; font-weight: bold;">&gt;/</span>dev<span style="color: #000000; font-weight: bold;">/</span>null ; <span style="color: #000000; font-weight: bold;">then</span>
		<span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #ff0000;">&quot;Imagen <span style="color: #007800;">$cont</span> de <span style="color: #007800;">$total</span>&quot;</span>
	<span style="color: #000000; font-weight: bold;">else</span>
		<span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #ff0000;">&quot;<span style="color: #007800;">$input_file</span> no pudo ser procesada...&quot;</span> <span style="color: #000000; font-weight: bold;">&gt;&amp;</span><span style="color: #000000;">2</span>
	<span style="color: #000000; font-weight: bold;">fi</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">done</span>
&nbsp;
<span style="color: #7a0874; font-weight: bold;">exit</span> <span style="color: #000000;">0</span></pre></td></tr></table></div>

<a href="http://www.facebook.com/share.php?u=http%3A%2F%2Fwww.nemediano.com.mx%2F2010%2Forganizando-fotos-con-imagemagick%2F&amp;t=Organizando%20fotos%20con%20ImageMagick" id="facebook_share_icon_317" style="font-size:11px; line-height:13px; font-family:'lucida grande',tahoma,verdana,arial,sans-serif; text-decoration:none;"><img src="http://b.static.ak.fbcdn.net/images/share/facebook_share_icon.gif" alt="Share on Facebook" /></a>
	<script type="text/javascript">
	var button = document.getElementById('facebook_share_link_317') || document.getElementById('facebook_share_icon_317') || document.getElementById('facebook_share_both_317') || document.getElementById('facebook_share_button_317');
	if (button) {
		button.onclick = function(e) {
			var url = this.href.replace(/share\.php/, 'sharer.php');
			window.open(url,'sharer','toolbar=0,status=0,width=626,height=436');
			return false;
		}
	
		if (button.id === 'facebook_share_button_317') {
			button.onmouseover = function(){
				this.style.color='#fff';
				this.style.borderColor = '#295582';
				this.style.backgroundColor = '#3b5998';
			}
			button.onmouseout = function(){
				this.style.color = '#3b5998';
				this.style.borderColor = '#d8dfea';
				this.style.backgroundColor = '#fff';
			}
		}
	}
	</script>
	]]></content:encoded>
			<wfw:commentRss>http://www.nemediano.com.mx/2010/organizando-fotos-con-imagemagick/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Un lenguaje extraño, y un error mas extraño.</title>
		<link>http://www.nemediano.com.mx/2010/un-lenguaje-extrano-y-un-error-mas-extrano/</link>
		<comments>http://www.nemediano.com.mx/2010/un-lenguaje-extrano-y-un-error-mas-extrano/#comments</comments>
		<pubDate>Wed, 10 Mar 2010 00:01:45 +0000</pubDate>
		<dc:creator>nemediano</dc:creator>
				<category><![CDATA[Acerca de mi]]></category>
		<category><![CDATA[Computación]]></category>
		<category><![CDATA[Mis demonios]]></category>

		<guid isPermaLink="false">http://www.nemediano.com.mx/?p=282</guid>
		<description><![CDATA[Hoy ha estado el día muy extraño, un error de aritmética entera del procesador intel de mi laptop, no me dejaba en paz, hasta que por fin se me ocurrió compilar el mismo programa en otra maquina y ahí si me funciona. Me castra, me castra, ¡¿Como es posible que ni en la aritmética entera [...]]]></description>
			<content:encoded><![CDATA[<p>Hoy ha estado el día muy extraño, un error de aritmética entera del procesador intel de mi laptop, no me dejaba en paz, hasta que por fin se me ocurrió compilar el mismo programa en otra maquina y ahí si me funciona. Me castra, me castra, ¡¿Como es posible que ni en la aritmética entera de un procesador podamos confiar?!</p>
<p>Eso no fue todo, <strong>Fatima</strong> me hizo la corrección y me sorprende tanto, es un código que a todas luces es equivalente al mio (o debería de ser para cualquier programador) y pues resulta que lo es en una maquina que no tenga procesador intel (o bueno al menos es mi conjetura).</p>
<p>El caso es que Pixie, solo lo acepta de una forma y que en Ometochtli (la maquina servidor en la que trabajamos), con un procesador AMD chorrocientas veces mas poderoso funciona a la perfección de ambas maneras).<br />
<span id="more-282"></span><br />
Para no enojarme mas reduzco mi programa mas grande a un caso de prueba, para que vean de lo que hablo:</p>

<div class="wp_syntax"><div class="code"><pre class="cpp" style="font-family:monospace;"><span style="color: #0000ff;">int</span> factor <span style="color: #000080;">=</span> <span style="color: #0000dd;">1000</span><span style="color: #008080;">;</span>
&nbsp;
<span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #FF0000;">&quot;factor * 1.345 = &quot;</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#40;</span>factor <span style="color: #000040;">*</span> <span style="color:#800080;">1.345</span><span style="color: #008000;">&#41;</span> <span style="color: #000080;">&lt;&lt;</span> endl<span style="color: #008080;">;</span>
<span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #FF0000;">&quot;factor * 2.344 = &quot;</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#40;</span>factor <span style="color: #000040;">*</span> <span style="color:#800080;">2.344</span><span style="color: #008000;">&#41;</span> <span style="color: #000080;">&lt;&lt;</span> endl<span style="color: #008080;">;</span>
&nbsp;
<span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #FF0000;">&quot;1000 * 1.345 = &quot;</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#40;</span><span style="color: #0000dd;">1000</span> <span style="color: #000040;">*</span> <span style="color:#800080;">1.345</span><span style="color: #008000;">&#41;</span> <span style="color: #000080;">&lt;&lt;</span> endl<span style="color: #008080;">;</span>
<span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #FF0000;">&quot;1000 * 2.344 = &quot;</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#40;</span><span style="color: #0000dd;">1000</span> <span style="color: #000040;">*</span> <span style="color:#800080;">2.344</span><span style="color: #008000;">&#41;</span> <span style="color: #000080;">&lt;&lt;</span> endl<span style="color: #008080;">;</span></pre></div></div>

<p>La cosa es que las primeras lineas escriben:<br />
<code><br />
factor * 1.345 = 1344<br />
factor * 2.344 = 2343<br />
</code><br />
Mientras que las segundas escriben:<br />
<code><br />
1000 * 1.345 = 1345<br />
1000 * 2.344 = 2344<br />
</code><br />
Este error parece que solo esta presenta cuando los números en cuestión tienen en su parte decimal y 3 seguido de un cuatro. Es increíble pero si cambian el numero por 1.253, todo funciona perfectamente. Desde luego con cualquier caso en un procesador AMD parece que funciona bien.</p>
<p>!!!Es cierto!!! se que no me lo van a creer así que pongo el pantallazo, se que con todo y eso algunos no me van a creer. Pero ya no hay mas que pueda hacer.<br />
<a href="http://www.nemediano.com.mx/wp-content/uploads/2010/03/HorrorDeIntel.png"><img src="http://www.nemediano.com.mx/wp-content/uploads/2010/03/HorrorDeIntel-300x175.png" alt="Si es cierto!!" title="HorrorDeIntel" width="300" height="175" class="aligncenter size-medium wp-image-283" /></a><br />
Y eso no es lo mas triste del asunto, lo mas triste es la manera como lo corrigió <strong>Fatima</strong>:</p>

<div class="wp_syntax"><div class="code"><pre class="cpp" style="font-family:monospace;"><span style="color: #0000ff;">double</span> aux<span style="color: #008080;">;</span>
aux <span style="color: #000080;">=</span> <span style="color: #008000;">&#40;</span><span style="color: #0000ff;">double</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#40;</span>factor <span style="color: #000040;">*</span> <span style="color:#800080;">1.345</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
<span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #FF0000;">&quot;factor * 1.345 = &quot;</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#40;</span>aux<span style="color: #008000;">&#41;</span> <span style="color: #000080;">&lt;&lt;</span> endl<span style="color: #008080;">;</span></pre></div></div>

<p>¡¡¡Y así si funciona!!!, Aun cuando el código es equivalente al mio. Desde luego el programa que queremos hacer es mucho mas extenso que esto, pero no me deja de molestar, que cosas así pasen, me pone muy nervioso.</p>
<p>Ya para seguir en el tono pongo un poema que vi en mi clase de ingles, que escribió Lord Cromer, que seguro en su momento se sintió como yo ahora. </p>
<h2>Our Queer Language</h2>
<blockquote><p>
When the English tongue we speak,<br />
Why is &#8220;break&#8221; not rhymed with &#8220;freak&#8221;?<br />
Will you tell me why it’s true<br />
We say &#8220;sew&#8221; but likewise &#8220;few&#8221;;</p>
<p>And the maker of a verse<br />
Cannot cap his &#8220;horse&#8221; with &#8220;worse&#8221;?<br />
&#8220;Beard&#8221; sounds not the same as &#8220;heard&#8221;;<br />
&#8220;Cord&#8221; is different from &#8220;word&#8221;;<br />
Cow is &#8220;cow,&#8221; but low is &#8220;low&#8221;;<br />
&#8220;Shoe&#8221; is never rhymed with &#8220;foe.&#8221;</p>
<p>Think of &#8220;hose&#8221; and &#8220;dose&#8221; and &#8220;lose&#8221;;<br />
&#8220;Doll&#8221; and &#8220;roll&#8221; and &#8220;home&#8221; and &#8220;some.&#8221;<br />
And since &#8220;pay&#8221; is rhymed with &#8220;say,&#8221;<br />
Why not &#8220;paid&#8221; with &#8220;said,&#8221; I pray?</p>
<p>We have &#8220;blood&#8221; and &#8220;food&#8221; and &#8220;goo d&#8221;;<br />
&#8220;Mould&#8221; is not pronounced as &#8220;could.&#8221;<br />
Wherefore &#8220;done&#8221; but &#8220;gone&#8221; and &#8220;lone&#8221;?<br />
Is there any reason known?<br />
And, in short, it seems to me,<br />
Sounds and letters disagree.
</p></blockquote>
<a href="http://www.facebook.com/share.php?u=http%3A%2F%2Fwww.nemediano.com.mx%2F2010%2Fun-lenguaje-extrano-y-un-error-mas-extrano%2F&amp;t=Un%20lenguaje%20extra%C3%B1o%2C%20y%20un%20error%20mas%20extra%C3%B1o." id="facebook_share_icon_282" style="font-size:11px; line-height:13px; font-family:'lucida grande',tahoma,verdana,arial,sans-serif; text-decoration:none;"><img src="http://b.static.ak.fbcdn.net/images/share/facebook_share_icon.gif" alt="Share on Facebook" /></a>
	<script type="text/javascript">
	var button = document.getElementById('facebook_share_link_282') || document.getElementById('facebook_share_icon_282') || document.getElementById('facebook_share_both_282') || document.getElementById('facebook_share_button_282');
	if (button) {
		button.onclick = function(e) {
			var url = this.href.replace(/share\.php/, 'sharer.php');
			window.open(url,'sharer','toolbar=0,status=0,width=626,height=436');
			return false;
		}
	
		if (button.id === 'facebook_share_button_282') {
			button.onmouseover = function(){
				this.style.color='#fff';
				this.style.borderColor = '#295582';
				this.style.backgroundColor = '#3b5998';
			}
			button.onmouseout = function(){
				this.style.color = '#3b5998';
				this.style.borderColor = '#d8dfea';
				this.style.backgroundColor = '#fff';
			}
		}
	}
	</script>
	]]></content:encoded>
			<wfw:commentRss>http://www.nemediano.com.mx/2010/un-lenguaje-extrano-y-un-error-mas-extrano/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>De interpretes y canciones</title>
		<link>http://www.nemediano.com.mx/2010/de-interpretes-y-canciones/</link>
		<comments>http://www.nemediano.com.mx/2010/de-interpretes-y-canciones/#comments</comments>
		<pubDate>Fri, 12 Feb 2010 18:12:46 +0000</pubDate>
		<dc:creator>nemediano</dc:creator>
				<category><![CDATA[Acerca de mi]]></category>
		<category><![CDATA[Mis demonios]]></category>
		<category><![CDATA[Janice joplin]]></category>
		<category><![CDATA[Me and Bobby McGee]]></category>
		<category><![CDATA[Whatchmen]]></category>

		<guid isPermaLink="false">http://www.nemediano.com.mx/?p=273</guid>
		<description><![CDATA[Ayer estaba escuchando una canción del soundtrack de la película Watchmen. Y me dio por leer un poco acerca de ella, resulto ser una canción con una historia muy particular La canción es: Me and Bobby McGee, y fue escrita por Kris Kristofferson y Fred Foster. Al primer interprete en hacerla famosa fue Roger Miller. [...]]]></description>
			<content:encoded><![CDATA[<p>Ayer estaba escuchando una canción del soundtrack de la película <a href="http://en.wikipedia.org/wiki/Watchmen_(film)">Watchmen</a>. Y me dio por leer un poco acerca de ella, resulto ser una canción con una historia muy particular</p>
<p>La canción es: <a href="http://en.wikipedia.org/wiki/Me_and_Bobby_McGee">Me and Bobby McGee</a>, y fue escrita por <a href="http://en.wikipedia.org/wiki/Kris_Kristofferson">Kris Kristofferson</a> y<em> Fred Foster</em>. Al primer interprete en hacerla famosa fue <em>Roger Miller</em>.</p>
<p><span id="more-273"></span></p>
<p>En la versión original <em>Bobby</em> es una chica, que cantaba el blues. Sin embargo a nosotros nos ha llegado una versión interpretada por la <a href="http://en.wikipedia.org/wiki/Janis_Joplin">bruja blanca</a> donde Bobby es hombre (que tiene también mucho sentido). Lo curioso es que aunque <em>Janice</em> y <em>Kris Kristofferson</em>, fueron amigos y amantes, el dijo que la canción no se la escribió a ella, aunque en la parte de <em>Somewhere near Salinas, Lord, I let her slip away.</em> si esta asociada de alguna manera a <em>Janice</em>.</p>
<p>Lo que convierte esta canción en una leyenda es que <em>Janice</em> escucho de <em>Kris</em> la canción y decidió grabarla en su álbum <a href="http://en.wikipedia.org/wiki/Pearl_(album)">Perl</a>, pero no le dijo nunca a <em>Kris</em> que lo había hecho. <em>Janice</em> murió como toda una leyenda del rock (por una sobredosis) unos días antes de que el álbum saliera a la venta y el sencillo se convirtió en la segunda canción póstuma en entrar a las listas de popularidad en EU.</p>
<p><em>Janice</em> adapto la canción cambiando un poco de la letra, para que <em>Bobby</em> fuera hombre. Y ésta versión interpretada por <em>Janice</em> estuvo en las lista del 2004 de las 500 mejores canciones en la historia. En la película de Watchmen, la canción se escucha en el fondo en la escena donde al terminar la guerra de Vietnam, <a href="http://en.wikipedia.org/wiki/Characters_of_Watchmen#The_Comedian_.28Edward_Morgan_Blake.29">The comedian</a> y <a href="http://en.wikipedia.org/wiki/Characters_of_Watchmen#Doctor_Manhattan_.28Dr._Jon_Osterman.29">Dr. Manhatan</a> están en un bar y una mujer se acerca al The Comedian y le dice que es momento que reconozca al hijo que tuvo con ella, la mujer lo ataca dejándole una cicatriz y este la mata ante la mirada del Dr Manhatan, sin que este ultimo oponga ninguna acción.</p>
<p>A mi me gustaba mucho esta canción por la letra y siempre pensé en <em>Bobby</em> como hombre. Ahora que se la historia me preguntó como no me dí cuenta antes, es tan obvio. Que sea una chica la que hace el <em>auto stop</em>, que sea una chica la que canta mientras <em>Kirs</em> toca la guitarra y que este último extrañe tanto a <em>Bobby</em> que cambiara todas sus mañanas por un solo ayer.</p>
<blockquote><p>Busted flat in Baton Rouge, waiting for a train<br />
And I&#8217;s feeling nearly as faded as my jeans.<br />
Bobby thumbed a diesel down just before it rained,<br />
It rode us all the way to New Orleans.</p>
<p>I pulled my harpoon out of my dirty red bandanna,<br />
I was playing soft while Bobby sang the blues.<br />
Windshield wipers slapping time, I was holding Bobby&#8217;s hand in mine,<br />
We sang every song that driver knew.</p>
<p>Freedom&#8217;s just another word for nothing left to lose,<br />
Nothing don&#8217;t mean nothing honey if it ain&#8217;t free, now now.<br />
And feeling good was easy, Lord, when he sang the blues,<br />
You know feeling good was good enough for me,<br />
Good enough for me and my Bobby McGee.</p>
<p>From the Kentucky coal mines to the California sun,<br />
Hey, Bobby shared the secrets of my soul.<br />
Through all kinds of weather, through everything we done,<br />
Hey Bobby baby? kept me from the cold.</p>
<p>One day up near Salinas,I let him slip away,<br />
He&#8217;s looking for that home and I hope he finds it,<br />
But I&#8217;d trade all of my tomorrows for just one yesterday<br />
To be holding Bobby&#8217;s body next to mine.</p>
<p>Freedom is just another word for nothing left to lose,<br />
Nothing, that&#8217;s all that Bobby left me, yeah,<br />
But feeling good was easy, Lord, when he sang the blues,<br />
Hey, feeling good was good enough for me, hmm hmm,<br />
Good enough for me and my Bobby McGee.</p>
<p>La la la, la la la la, la la la, la la la la<br />
La la la la la Bobby McGee.<br />
La la la la la, la la la la la<br />
La la la la la, Bobby McGee, la.</p>
<p>La La la, la la la la la la,<br />
La La la la la la la la la, ain`t no bumb on my bobby McGee yeah.<br />
Na na na na na na na na, na na na na na na na na na na na<br />
Hey now Bobby now, Bobby McGee, yeah.</p>
<p>Lord, I&#8217;m calling my lover, calling my man,<br />
I said I&#8217;m calling my lover just the best I can,<br />
C&#8217;mon, hey now Bobby yeah, hey now Bobby McGee, yeah,<br />
Lordy Lordy Lordy Lordy Lordy Lordy Lordy Lord<br />
Hey, hey, hey, Bobby McGee, Lord!</p>
<p>Yeah! Whew!</p>
<p>Lordy Lordy Lordy Lordy Lordy Lordy Lordy Lord<br />
Hey, hey, hey, Bobby McGee.</p></blockquote>
<p><a class="wpaudio" href="http://www.nemediano.com.mx/wp-content/uploads/2010/02/05-Me-And-Bobby-McGee.mp3">Me And Bobby McGee</a></p>
<a href="http://www.facebook.com/share.php?u=http%3A%2F%2Fwww.nemediano.com.mx%2F2010%2Fde-interpretes-y-canciones%2F&amp;t=De%20interpretes%20y%20canciones" id="facebook_share_icon_273" style="font-size:11px; line-height:13px; font-family:'lucida grande',tahoma,verdana,arial,sans-serif; text-decoration:none;"><img src="http://b.static.ak.fbcdn.net/images/share/facebook_share_icon.gif" alt="Share on Facebook" /></a>
	<script type="text/javascript">
	var button = document.getElementById('facebook_share_link_273') || document.getElementById('facebook_share_icon_273') || document.getElementById('facebook_share_both_273') || document.getElementById('facebook_share_button_273');
	if (button) {
		button.onclick = function(e) {
			var url = this.href.replace(/share\.php/, 'sharer.php');
			window.open(url,'sharer','toolbar=0,status=0,width=626,height=436');
			return false;
		}
	
		if (button.id === 'facebook_share_button_273') {
			button.onmouseover = function(){
				this.style.color='#fff';
				this.style.borderColor = '#295582';
				this.style.backgroundColor = '#3b5998';
			}
			button.onmouseout = function(){
				this.style.color = '#3b5998';
				this.style.borderColor = '#d8dfea';
				this.style.backgroundColor = '#fff';
			}
		}
	}
	</script>
	]]></content:encoded>
			<wfw:commentRss>http://www.nemediano.com.mx/2010/de-interpretes-y-canciones/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
<enclosure url="http://www.nemediano.com.mx/wp-content/uploads/2010/02/05-Me-And-Bobby-McGee.mp3" length="8710082" type="audio/mpeg" />
		</item>
		<item>
		<title>A brief history of Maths</title>
		<link>http://www.nemediano.com.mx/2009/a-brief-history-of-maths/</link>
		<comments>http://www.nemediano.com.mx/2009/a-brief-history-of-maths/#comments</comments>
		<pubDate>Tue, 06 Oct 2009 19:29:38 +0000</pubDate>
		<dc:creator>nemediano</dc:creator>
				<category><![CDATA[Matematicas]]></category>
		<category><![CDATA[Mis demonios]]></category>
		<category><![CDATA[clase]]></category>
		<category><![CDATA[historia]]></category>
		<category><![CDATA[matematicas]]></category>
		<category><![CDATA[presentacion]]></category>

		<guid isPermaLink="false">http://www.nemediano.com.mx/?p=256</guid>
		<description><![CDATA[Ayer presente para mi midterm exam, de mi clase de Producción Oral en ingles, una charla acerca de la historia de las matemáticas. Por un lado fue muy divertido para mi, la misma maestra nos había dicho que escogiéramos un tema de nuestro agrado. Sin embargo teníamos la limitante del tiempo: una presentación de 5 [...]]]></description>
			<content:encoded><![CDATA[<p>Ayer presente para mi <em>midterm exam</em>, de mi clase de Producción Oral en ingles, una charla acerca de la historia de las matemáticas.</p>
<p>Por un lado fue muy divertido para mi, la misma maestra nos había dicho que escogiéramos un tema de nuestro agrado. Sin embargo teníamos la limitante del tiempo: una presentación de 5 minutos. Al principio no me preocupo, finalmente uno dice muchas cosas muy rápido al hablar. Pero ayer que estaba haciendo la presentación me empecé a poner nervioso.</p>
<p><span id="more-256"></span></p>
<p>La cantidad de material que yo tenia era enorme; después de todo, al ser uno de mis temas favorito había consultado mas de 7 libros diferentes del tema. (si lo se, es mas de los que usualmente consulto para un trabajo de a de veras de la maestría) y la presentación que el principio pensé en hacer en <img style="border:0px;vertical-align:middle;" src='http://l.wordpress.com/latex.php?latex=%5CLaTeX&bg=FFFFFF&fg=000000'  alt="\LaTeX" /> beamer. Pero después de ver la enorme cantidad de información no me quedo mas remedio que usar Open Office Presentation.</p>
<p>Al terminar la presentación, decidí exportarla a pdf y ppt. Uno nunca sabe en que maquina va a presentar. Pero cuando me quedaron 25 diapositivas me <em>frikie</em> un poco.</p>
<p>Llego el lunes del examen, yo tenia mucho sueño pues no había dormido bien, y no había tenido tiempo de bañarme (estúpido posgrado que me deja sin tiempo <img src='http://www.nemediano.com.mx/wp-includes/images/smilies/icon_sad.gif' alt=':(' class='wp-smiley' />  ). Se me olvidaron mis notas en casa y como de costumbre no tenia tiempo de regresar por ellas. Llegando al auditorio la maestra llego tarde y tardaron muchísimo en conectar el proyector y anexos. Finalmente la maestra pregunto si hacíamos un sorteo para determinar el orden de las presentaciones. Antes (o en vez) de hacer el sorteo nos pusimos de acuerdo: yo pedí el <strong>primer turno</strong>.</p>
<p>A principio <em>panique</em> un poco por que algunas palabras se me olvidaron y la verdad es que al improvisar tome mucho mas tiempo, creo que la presentación duro casi 10 minutos. Al momento de las preguntas ya estaba muy relajado y me tomo otro tanto contestar. Pero al final creo que la presentación salio bien, no se aburrieron mucho y <strong>Majo</strong> y <strong>Marco</strong> me dijeron después que había estado bien.</p>
<p>Durante la presentación deje muchos cabos sueltos con la esperanza de que me preguntaran de eso, pero no sucedió y al final las preguntas que me hicieron fueron sorpresivas. Pero pude contestar mas o menos bien. Por ejemplo deje en el aire la historia de <a title="Wikipedia" href="http://en.wikipedia.org/wiki/Galois" target="_blank">Galois</a>, la de <a title="Wikipedia" href="http://en.wikipedia.org/wiki/Ramanujan" target="_blank">Ramanujan</a>, la de <a title="Wikipedia" href="http://en.wikipedia.org/wiki/Paul_Erd%C5%91s" target="_blank">Erdos</a> y la de <a title="Wikipedia" href="http://en.wikipedia.org/wiki/Bourbaki" target="_blank">Nicolas Burbaki</a> (nadie me preguntó por que no existió).</p>
<p>Aquí esta la <a title="Mi presentacion en pdf" href="http://www.nemediano.com.mx/wp-content/uploads/2009/10/presentacion.pdf">presntacion</a> en pdf, por si a alguien le sirviera de algo. La maestra quedo de dar DVD con las presentaciones grabadas; si lo hace, quizás me anime a subir el vídeo.</p>
<a href="http://www.facebook.com/share.php?u=http%3A%2F%2Fwww.nemediano.com.mx%2F2009%2Fa-brief-history-of-maths%2F&amp;t=A%20brief%20history%20of%20Maths" id="facebook_share_icon_256" style="font-size:11px; line-height:13px; font-family:'lucida grande',tahoma,verdana,arial,sans-serif; text-decoration:none;"><img src="http://b.static.ak.fbcdn.net/images/share/facebook_share_icon.gif" alt="Share on Facebook" /></a>
	<script type="text/javascript">
	var button = document.getElementById('facebook_share_link_256') || document.getElementById('facebook_share_icon_256') || document.getElementById('facebook_share_both_256') || document.getElementById('facebook_share_button_256');
	if (button) {
		button.onclick = function(e) {
			var url = this.href.replace(/share\.php/, 'sharer.php');
			window.open(url,'sharer','toolbar=0,status=0,width=626,height=436');
			return false;
		}
	
		if (button.id === 'facebook_share_button_256') {
			button.onmouseover = function(){
				this.style.color='#fff';
				this.style.borderColor = '#295582';
				this.style.backgroundColor = '#3b5998';
			}
			button.onmouseout = function(){
				this.style.color = '#3b5998';
				this.style.borderColor = '#d8dfea';
				this.style.backgroundColor = '#fff';
			}
		}
	}
	</script>
	]]></content:encoded>
			<wfw:commentRss>http://www.nemediano.com.mx/2009/a-brief-history-of-maths/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Lectura recomendada: El amante de Janis Joplin.</title>
		<link>http://www.nemediano.com.mx/2009/lectura-recomendada-el-amante-de-janis-joplin/</link>
		<comments>http://www.nemediano.com.mx/2009/lectura-recomendada-el-amante-de-janis-joplin/#comments</comments>
		<pubDate>Tue, 21 Jul 2009 23:21:16 +0000</pubDate>
		<dc:creator>nemediano</dc:creator>
				<category><![CDATA[Libros]]></category>
		<category><![CDATA[Mis demonios]]></category>
		<category><![CDATA[el amante de janice joplin]]></category>
		<category><![CDATA[elmer mendoza]]></category>
		<category><![CDATA[libro]]></category>

		<guid isPermaLink="false">http://www.nemediano.com.mx/?p=251</guid>
		<description><![CDATA[Acabo de terminar el magnifico libro que me recomendó Erika. Se trata de: &#8220;El amante de Janice Joplin&#8221; de Elmer Mendoza. El libro, situado en un México de los principio de los 70s trata de la historia de David Valenzuela, un autentico tipo X, que vive en un pueblito del norte de México. Que si [...]]]></description>
			<content:encoded><![CDATA[<p>Acabo de terminar el magnifico <a title="El amante de Janice Joplin en Gandhi" href="http://www.gandhi.com.mx/index.cfm/id/Producto/dept/libros/pid/60587" target="_blank">libro</a> que me recomendó Erika. Se trata de: &#8220;<em>El amante de Janice Joplin</em>&#8221; de <strong>Elmer Mendoza</strong>.</p>
<p>El libro, situado en un México de los principio de los 70s trata de la historia de David Valenzuela, un autentico tipo X, que vive en un pueblito del norte de México. Que si querer mata a un narcotraficante. De ahí en adelante vive una serie de aventuras, relacionadas con el narco, la guerrilla, y el beisbol.</p>
<p>El personaje principal es en toda la extensión de la palabra un tonto con suerte, de esos que de entrada te caen bien, es inocente y de pensamientos simples. aunque durante todo el libro es manipulado por mucha gente termina teniendo un no se que que que se yo, que le permite salir vivo de muchas situaciones peligrosas. Es algo así como un <strong>Forres Gump</strong>, pero a la mexicana.</p>
<p>Los demas personajes son memorables y pintorescos, sobre todo sus amigos <em>el Chato</em> y <em>el Cholo</em>. La lectura es simple y entre una mezcla de literatura trash, con nueva narrativa mexicana. Es segun mi opinion como leer las aevnturas de <a href="http://vivirmexico.com/2006/12/la-serie-belascoaran-shayne" target="_blank">Belascorane Shane</a>, con el plus que el personaje es mucho mas agradable.</p>
<p>Erika lo leyo como parte de una clase que tomo en su facultad, donde conocio tambien al autor. Espero no perjudicar a nadie en el intento, pero precisamente documentandome para al post, me encontre cn que el pdf es ridiculamente sencillo de conseguir <a href="http://sucecoti.files.wordpress.com/2008/09/mendoza-elmer-el-amante-de-janis-joplin.pdf" target="_blank">aqui</a>.</p>
<p>Sin duda alguna esta es una lectura muy recomendada.</p>
<a href="http://www.facebook.com/share.php?u=http%3A%2F%2Fwww.nemediano.com.mx%2F2009%2Flectura-recomendada-el-amante-de-janis-joplin%2F&amp;t=Lectura%20recomendada%3A%20El%20amante%20de%20Janis%20Joplin." id="facebook_share_icon_251" style="font-size:11px; line-height:13px; font-family:'lucida grande',tahoma,verdana,arial,sans-serif; text-decoration:none;"><img src="http://b.static.ak.fbcdn.net/images/share/facebook_share_icon.gif" alt="Share on Facebook" /></a>
	<script type="text/javascript">
	var button = document.getElementById('facebook_share_link_251') || document.getElementById('facebook_share_icon_251') || document.getElementById('facebook_share_both_251') || document.getElementById('facebook_share_button_251');
	if (button) {
		button.onclick = function(e) {
			var url = this.href.replace(/share\.php/, 'sharer.php');
			window.open(url,'sharer','toolbar=0,status=0,width=626,height=436');
			return false;
		}
	
		if (button.id === 'facebook_share_button_251') {
			button.onmouseover = function(){
				this.style.color='#fff';
				this.style.borderColor = '#295582';
				this.style.backgroundColor = '#3b5998';
			}
			button.onmouseout = function(){
				this.style.color = '#3b5998';
				this.style.borderColor = '#d8dfea';
				this.style.backgroundColor = '#fff';
			}
		}
	}
	</script>
	]]></content:encoded>
			<wfw:commentRss>http://www.nemediano.com.mx/2009/lectura-recomendada-el-amante-de-janis-joplin/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>LaTeX hasta que te salga por las orejas!!!</title>
		<link>http://www.nemediano.com.mx/2009/latex-hasta-que-te-salga-por-las-orejas/</link>
		<comments>http://www.nemediano.com.mx/2009/latex-hasta-que-te-salga-por-las-orejas/#comments</comments>
		<pubDate>Thu, 16 Jul 2009 21:58:08 +0000</pubDate>
		<dc:creator>nemediano</dc:creator>
				<category><![CDATA[Mis demonios]]></category>
		<category><![CDATA[Recetario de Ubuntu]]></category>
		<category><![CDATA[gnome]]></category>
		<category><![CDATA[kile]]></category>
		<category><![CDATA[LaTeX]]></category>
		<category><![CDATA[pidgin]]></category>
		<category><![CDATA[ubuntu]]></category>
		<category><![CDATA[wordpress]]></category>

		<guid isPermaLink="false">http://www.nemediano.com.mx/?p=247</guid>
		<description><![CDATA[Pues estoy muy contento con mi nueva costumbre de usar , para todo lo que se pueda. Costumbre obtenida un poco por obligaciones del posgrado y también por influencia de las roomies. Mi siguiente proyecto es contagiar a quien se deje de usar para todo lo que puedan. Que es LaTeX Es un lenguaje de [...]]]></description>
			<content:encoded><![CDATA[<p>Pues estoy muy contento con mi nueva costumbre de usar <img style="border:0px;vertical-align:middle;" src='http://l.wordpress.com/latex.php?latex=%5CLaTeX&bg=FFFFFF&fg=000000'  alt="\LaTeX" />, para todo lo que se pueda. Costumbre obtenida un poco por obligaciones del posgrado y también por influencia de las <em>roomies</em>. Mi siguiente proyecto es contagiar a quien se deje de usar <img style="border:0px;vertical-align:middle;" src='http://l.wordpress.com/latex.php?latex=%5CLaTeX&bg=FFFFFF&fg=000000'  alt="\LaTeX" /> para todo lo que puedan.</p>
<p><span id="more-247"></span></p>
<h2>Que es LaTeX</h2>
<p>Es un lenguaje de marcado y de preparación de textos. Creado por <a href="http://en.wikipedia.org/wiki/Donald_Knuth">Donal Knuth</a>, el lenguaje TeX, fue después extendido, es decir se la añadieron un conjunto de macros, para hacer el TeX, mas fácil de usar para el usuario común. Estas fueron introducidas por <a href="http://en.wikipedia.org/wiki/Leslie_Lamport">Leslie Lamport</a> y de ahí que ahora el lenguaje Tex extendido con las macros se llama <img style="border:0px;vertical-align:middle;" src='http://l.wordpress.com/latex.php?latex=%5CLaTeX&bg=FFFFFF&fg=000000'  alt="\LaTeX" />.</p>
<p>LaTex es un lenguaje ampliamente usado en la comunidad científica, sobre todo para preparar documentos donde hay muchas formulas matemáticas. sin embargo aun cuando queramos hacer un escrito donde no haya matemáticas LaTeX es una muy buena opción pues podemos beneficiarnos de su gran calidad en el formato y en la facilidad con la que se pueden hacer documentos académicos, por ejemplo con un montón de citas bibliográficas.</p>
<h2>Latex en GNU/Linux</h2>
<p>Primero pretendía escribir una guía de como instalar y configurar correctamente LaTeX en Ubuntu. Pero me encontré que ya hay una excelente referencia en <a href="http://enfoquevirtual.wordpress.com/2009/05/10/configurando-latex-y-kile-en-ubuntu/">este blog</a>, así que mejor pongo la cita. Y algunos tips</p>
<ul>
<li>Es ampliamente recomendable usar codificación utf-8, para todos tus documentos en LaTeX.</li>
<li>En conjunto con el utf-8, e uso del paquete inputec y del paquete babel, para hacer los documentos en español de manera mas simple.</li>
<li>En Linux no hay nada mejor que usar Kile (conste que lo digo yo, que no me gusta KDE), y ahora es muy fácil configurarlo para usarlo con GNOME.</li>
<li>Nada mejor que tener correctamente configurado el KIle, es decir, sustituir los programas de KDE de visualización por sus respectivos en GNOME y el corrector ortográfico.</li>
<li>Ampliamente recomendado instalar los extras, para que tengamos beamer.</li>
</ul>
<h2>Cosas extras</h2>
<p>Una cosa bastante interesante es instalar el plugin para poder escribir <a href="http://wordpress.org/extend/plugins/wp-latex/">LateX en wordpress</a>, como comenté en un <a href="http://www.nemediano.com.mx/2009/hay-latex-en-wordpress/">post pasado</a>.<br />
Nada mejor que poder instalar el <a href="http://tapas.affenbande.org/wordpress/?page_id=70">plugin de LaTeX para Pidgin</a> y así poder escribir y chatear a gusto con tus compas con un montón de matemáticas. (vaya que se oyo geek).<br />
la instalación me fue mas o menos sencilla, <strong>make</strong> , <strong>sudo make install</strong>, ojo que debemos de tener instalado, tanto el Latex, como el <a href="http://www.imagemagick.org/script/index.php">Image Magick</a>. Después de la instalación tuve problemas pues al parecer mi Image Magick se reusaba a convertir un .dvi en un .png, pero lo pude seleccionar agregando una linea al archivo de confguración de image magic como dice <a href="http://bugs.archlinux.org/task/8914">este</a> post.</p>
<h2>Bibliografía recomendada</h2>
<p>Yo aprendí con <a href="http://books.google.com.mx/books?id=0gKwF41cSVcC&amp;dq=composicion+de+textos+cientificos+con+latex&amp;printsec=frontcover&amp;source=bn&amp;hl=es&amp;ei=oKFfSq7EB4K6MIDWgcAC&amp;sa=X&amp;oi=book_result&amp;ct=result&amp;resnum=4">este</a> libro, pero honestamente creo que ya esta un poco pasado de moda, <em>Laura</em> me recomendó éste otro <a href="http://www.amazon.com/Guide-LaTeX-Techniques-Computer-Typesetting/dp/0321173856">libro excelente</a>, y además recuerden que la documentación oficial de LaTeX así como excelentes manuales-tutoriales, viene en los repositorios en los paquetes <em>texlive-doc-base</em> y <em>texlive-doc-es</em>. Así que no hay excusa además hay un montón de documentación en la red.</p>
<a href="http://www.facebook.com/share.php?u=http%3A%2F%2Fwww.nemediano.com.mx%2F2009%2Flatex-hasta-que-te-salga-por-las-orejas%2F&amp;t=LaTeX%20hasta%20que%20te%20salga%20por%20las%20orejas%21%21%21" id="facebook_share_icon_247" style="font-size:11px; line-height:13px; font-family:'lucida grande',tahoma,verdana,arial,sans-serif; text-decoration:none;"><img src="http://b.static.ak.fbcdn.net/images/share/facebook_share_icon.gif" alt="Share on Facebook" /></a>
	<script type="text/javascript">
	var button = document.getElementById('facebook_share_link_247') || document.getElementById('facebook_share_icon_247') || document.getElementById('facebook_share_both_247') || document.getElementById('facebook_share_button_247');
	if (button) {
		button.onclick = function(e) {
			var url = this.href.replace(/share\.php/, 'sharer.php');
			window.open(url,'sharer','toolbar=0,status=0,width=626,height=436');
			return false;
		}
	
		if (button.id === 'facebook_share_button_247') {
			button.onmouseover = function(){
				this.style.color='#fff';
				this.style.borderColor = '#295582';
				this.style.backgroundColor = '#3b5998';
			}
			button.onmouseout = function(){
				this.style.color = '#3b5998';
				this.style.borderColor = '#d8dfea';
				this.style.backgroundColor = '#fff';
			}
		}
	}
	</script>
	]]></content:encoded>
			<wfw:commentRss>http://www.nemediano.com.mx/2009/latex-hasta-que-te-salga-por-las-orejas/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Top 5 de webcomics</title>
		<link>http://www.nemediano.com.mx/2009/top-5-de-webcomics/</link>
		<comments>http://www.nemediano.com.mx/2009/top-5-de-webcomics/#comments</comments>
		<pubDate>Mon, 06 Jul 2009 23:17:58 +0000</pubDate>
		<dc:creator>nemediano</dc:creator>
				<category><![CDATA[Comics]]></category>
		<category><![CDATA[Mis demonios]]></category>
		<category><![CDATA[bunsen]]></category>
		<category><![CDATA[cindy la regia]]></category>
		<category><![CDATA[ecol]]></category>
		<category><![CDATA[phd comics]]></category>
		<category><![CDATA[webcomics]]></category>
		<category><![CDATA[xkcd]]></category>

		<guid isPermaLink="false">http://www.nemediano.com.mx/?p=221</guid>
		<description><![CDATA[Con la convivencia con las niñas y los demás compas de la maestría, he ampliado mis gustos musicales, de literatura, de lenguajes de programación, de distros de Linux y de matemáticas. Una de las cosas que también expandí fueron mis horizontes de las tiras comicas en internet, entiéndase webcomics. Estas publicaciones periódicas en formato de [...]]]></description>
			<content:encoded><![CDATA[<p>Con la convivencia con las niñas y los demás compas de la maestría, he ampliado mis gustos musicales, de literatura, de lenguajes de programación, de distros de Linux y de matemáticas.</p>
<p>Una de las cosas que también expandí fueron mis horizontes de las tiras comicas en internet, entiéndase webcomics. Estas publicaciones periódicas en formato de strips, al parecer son de vital importancia para cualquiera que estudie un posgrado XD. Así que aquí esta mi top 5. (disculpa a los compas que me recomendaron alguna que no este aquí, por que el único criterio es mi mera apreciación personal)</p>
<p><span id="more-221"></span></p>
<h2>1.- <a title="xkcd web comic" href="http://www.xkcd.com/" target="_blank">XKCD</a></h2>
<p><a href="http://xkcd.com/337/"><img class="aligncenter" src="http://imgs.xkcd.com/comics/post_office_showdown.png" alt="" width="485" height="392" /></a></p>
<p>Es el cómic geek por antonomasia, en palabras de su propio autor es un web cómic de romance, sarcasmo, matemáticas y lenguaje. Se publica cada lunes, miércoles y viernes. Y tiene hasta una tienda de artículos geeks basados en el cómic. Es punto de encuentro de los geeks a nivel mundial y ha causado una que otra revuelta en la vida real, si no me creen miren la entrada <a title="XKCD en wikipedia" href="http://en.wikipedia.org/wiki/Xkcd" target="_blank">wikipedia</a>.</p>
<h2>2.- <a title="Bunsen" href="http://www.heroeslocales.com/bunsen/" target="_self">Bunsen</a></h2>
<p>Narra las aventuras de unos científicos mexicanos y sus animales de laboratorio. Su personaje principal, el Dr Adel Ortega es una leyenda viviente entre nuestro clan. es simplemente genial. Sale también cada lunes, miércoles y viernes.</p>
<h2>3.- <a title="Cindy la regia" href="http://www.cindylaregia.com/">Cindy la regia</a></h2>
<p>Las aventuras de Cindy Garza una chica bien, de San Pedro Garza Monterrey. Cindy es el estereotipo de toda chica rubia, adinerada, fresa, racista, ignorante y sobre todo muy cool. Sale cada lunes ha tenido tanto éxito que ahora también se publica en cierto periódico del norte del país.</p>
<h2>4.- <a title="PHD comics" href="http://www.phdcomics.com/comics.php" target="_blank">PHD Comics</a></h2>
<p>Las situaciones que viven un grupo de estudiantes de doctorado en un laboratorio de cierta universidad gringa. Llena de sarcasmo y de geekesmo, lo peor de todo es que muchas de estas situaciones se antojan tan reales&#8230; hasta me da miedo XD. Se publica religiosamente</p>
<h2>5.- <a href="http://www.tiraecol.net/modules/comic/">Ecol</a></h2>
<p>Mi primer web comic, las aventuras de un trio de geeks Ecol, Nano, y Bilo. Creada en la madre patria y emblema del foro oficial de Ubuntu en español. Solía ser una de las mas grandes, pero su autor la ha estado dejando caer un poco. Ahora también se publica religiosamente.</p>
<p><strong>Para la trivia:</strong> tanto Bunsen como Cindy la regia, se publican en <a title="WordPress" href="http://es.wordpress.com/" target="_blank">wordpress</a>, con un plugin para hacer web comics, llamado <a title="Comic press" href="http://comicpress.org/">comicpress</a>.</p>
<a href="http://www.facebook.com/share.php?u=http%3A%2F%2Fwww.nemediano.com.mx%2F2009%2Ftop-5-de-webcomics%2F&amp;t=Top%205%20de%20webcomics" id="facebook_share_icon_221" style="font-size:11px; line-height:13px; font-family:'lucida grande',tahoma,verdana,arial,sans-serif; text-decoration:none;"><img src="http://b.static.ak.fbcdn.net/images/share/facebook_share_icon.gif" alt="Share on Facebook" /></a>
	<script type="text/javascript">
	var button = document.getElementById('facebook_share_link_221') || document.getElementById('facebook_share_icon_221') || document.getElementById('facebook_share_both_221') || document.getElementById('facebook_share_button_221');
	if (button) {
		button.onclick = function(e) {
			var url = this.href.replace(/share\.php/, 'sharer.php');
			window.open(url,'sharer','toolbar=0,status=0,width=626,height=436');
			return false;
		}
	
		if (button.id === 'facebook_share_button_221') {
			button.onmouseover = function(){
				this.style.color='#fff';
				this.style.borderColor = '#295582';
				this.style.backgroundColor = '#3b5998';
			}
			button.onmouseout = function(){
				this.style.color = '#3b5998';
				this.style.borderColor = '#d8dfea';
				this.style.backgroundColor = '#fff';
			}
		}
	}
	</script>
	]]></content:encoded>
			<wfw:commentRss>http://www.nemediano.com.mx/2009/top-5-de-webcomics/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Estoy Triste</title>
		<link>http://www.nemediano.com.mx/2009/estoy-triste/</link>
		<comments>http://www.nemediano.com.mx/2009/estoy-triste/#comments</comments>
		<pubDate>Tue, 05 May 2009 02:11:59 +0000</pubDate>
		<dc:creator>nemediano</dc:creator>
				<category><![CDATA[Acerca de mi]]></category>
		<category><![CDATA[Mis demonios]]></category>
		<category><![CDATA[a dream]]></category>
		<category><![CDATA[poema]]></category>
		<category><![CDATA[william blake]]></category>

		<guid isPermaLink="false">http://www.nemediano.com.mx/?p=211</guid>
		<description><![CDATA[¿Han sentido alguna vez que la tristeza los envuelve, pero que al mismo tiempo no pueden desahogarse?. Como si de alguna manera todo pareciera ocurrir dentro de uno y no hubiera manera de exteriorizarlo. Vaya entonces este poema, por todas las veces que lo hemos necesitado. A dream Once a dream did weave a shade [...]]]></description>
			<content:encoded><![CDATA[<p>¿Han sentido alguna vez que la tristeza los envuelve, pero que al mismo tiempo no pueden desahogarse?. </p>
<p>Como si de alguna manera todo pareciera ocurrir dentro de uno y no hubiera manera de exteriorizarlo.<br />
<span id="more-211"></span><br />
Vaya entonces este poema, por todas las veces que lo hemos necesitado.</p>
<h3>A dream</h3>
<blockquote><p>
Once a dream did weave a shade<br />
O&#8217;er my Angel-guarded bed,<br />
That an Emmet lost its way<br />
Where on grass methought I lay.</p>
<p>Troubled, wildered, and forlorn,<br />
Dark, benighted, travel-worn,<br />
Over many a tangle spray,<br />
All heart-broke, I heard her say:</p>
<p>&#8220;Oh my children! do they cry,<br />
Do they hear their father sigh?<br />
Now they look abroad to see,<br />
Now return and weep for me.&#8221;</p>
<p>Pitying, I dropped a tear;<br />
But I saw a glow-worm near,<br />
Who replied, &#8220;What wailing wight<br />
Calls the watchman of the night?</p>
<p>&#8220;I am set to light the ground,<br />
While the beetle goes his round:<br />
Follow now the beetle&#8217;s hum;<br />
Little wanderer, hie thee home.&#8221;
</p></blockquote>
<p>Escrito por <a href="http://en.wikipedia.org/wiki/William_Blake">William Blake</a>, aquí hay una traducción que no es mía, pero no encontré crédito alguno en el sitio de donde la saque.</p>
<blockquote><p>
Cierta vez un sueño tejió una sombra<br />
sobre mi cama que un ángel protegía:<br />
era una hormiga que se había perdido<br />
por la hierba donde yo creía que estaba.</p>
<p>Confundida, perpleja y desesperada,<br />
oscura, cercada por tinieblas, exhausta,<br />
tropezaba entre la extendida maraña,<br />
toda desconsolada, y le escuché decir:</p>
<p>&#8220;¡Oh, hijos míos! ¿Acaso lloran?<br />
¿Oirán cómo suspira su padre?<br />
¿Acaso rondan por ahí para buscarme?<br />
¿Acaso regresan y sollozan por mí?&#8221;</p>
<p>Compadecido, solté una lágrima;<br />
pero cerca vi una luciérnaga,<br />
que respondió: &#8220;¿Qué quejido humano<br />
convoca al guardián de la noche?&#8221;</p>
<p>&#8220;Me corresponde iluminar la arboleda<br />
mientras el escarabajo hace su ronda:<br />
sigue ahora el zumbido del escarabajo;<br />
pequeña vagabunda, vuelve pronto a casa.&#8221;
</p></blockquote>
<a href="http://www.facebook.com/share.php?u=http%3A%2F%2Fwww.nemediano.com.mx%2F2009%2Festoy-triste%2F&amp;t=Estoy%20Triste" id="facebook_share_icon_211" style="font-size:11px; line-height:13px; font-family:'lucida grande',tahoma,verdana,arial,sans-serif; text-decoration:none;"><img src="http://b.static.ak.fbcdn.net/images/share/facebook_share_icon.gif" alt="Share on Facebook" /></a>
	<script type="text/javascript">
	var button = document.getElementById('facebook_share_link_211') || document.getElementById('facebook_share_icon_211') || document.getElementById('facebook_share_both_211') || document.getElementById('facebook_share_button_211');
	if (button) {
		button.onclick = function(e) {
			var url = this.href.replace(/share\.php/, 'sharer.php');
			window.open(url,'sharer','toolbar=0,status=0,width=626,height=436');
			return false;
		}
	
		if (button.id === 'facebook_share_button_211') {
			button.onmouseover = function(){
				this.style.color='#fff';
				this.style.borderColor = '#295582';
				this.style.backgroundColor = '#3b5998';
			}
			button.onmouseout = function(){
				this.style.color = '#3b5998';
				this.style.borderColor = '#d8dfea';
				this.style.backgroundColor = '#fff';
			}
		}
	}
	</script>
	]]></content:encoded>
			<wfw:commentRss>http://www.nemediano.com.mx/2009/estoy-triste/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>La bruja.</title>
		<link>http://www.nemediano.com.mx/2009/la-bruja/</link>
		<comments>http://www.nemediano.com.mx/2009/la-bruja/#comments</comments>
		<pubDate>Sat, 21 Feb 2009 18:53:04 +0000</pubDate>
		<dc:creator>nemediano</dc:creator>
				<category><![CDATA[Mis demonios]]></category>
		<category><![CDATA[conjunto jardin]]></category>
		<category><![CDATA[la buja]]></category>
		<category><![CDATA[lyrics]]></category>
		<category><![CDATA[putamayo]]></category>

		<guid isPermaLink="false">http://www.nemediano.com.mx/?p=204</guid>
		<description><![CDATA[Ahora que he estado escuchando un montón de musica al dia gracias a mis angeles, me dieron ganas de postear esta canción que viene en un disco de Putamayo. La cancion se llama la bruja y al ser del folklor mexicano hay muchas versiones, parace que al menos hay una de Lila Downs y otra [...]]]></description>
			<content:encoded><![CDATA[<p>Ahora que he estado escuchando un montón de musica al dia gracias a mis angeles, me dieron ganas de postear esta canción que viene en un disco de <a href="http://www.putumayo.com/">Putamayo</a>. La cancion se llama la bruja y al ser del folklor mexicano hay muchas versiones, parace que al menos hay una de <a href="http://www.liladowns.com/liladaSite/Lila_Downs.html">Lila Downs</a> y otra de <a href="http://www.eugenialeon.com/">Eugenia Leon</a> aparte de la que pongo aquí.<br />
La versión que pongo aquí es de <a href="http://www.conjuntojardin.com/thegroup/about/">Conjunto Jardin</a> y viene en el disco de:<br />
<a href="http://www.putumayo.com/en/catalog_item.php?album_id=28">México</a> de Putamayo</p>
<p><span id="more-204"></span></p>
<h2>La bruja</h2>
<blockquote><p>Ay que bonito es volar,<br />
a las once de la noche.<br />
A las once de la noche,<br />
Ay que bonito es volar.</p>
<p>Ay mamá</p>
<p>Subirse y dejarse caer,<br />
en los tirantes de un coche.<br />
En los tirantes de un coche,<br />
que hasta quisiera llorar.</p>
<p>Ay mamá</p>
<p>Me agarra la bruja,<br />
me lleva a su casa,<br />
me vuelve maceta y una calabaza.<br />
Me agarra la bruja,<br />
me lleva a al cuartel,<br />
me vuelve maceta y me da de comer.</p>
<p>Y digame, digame usted<br />
¿Cuantas criaturitas se ha chupado usted?<br />
Señora ninguna, ninguna no se<br />
Ando en pretenciones de chuparme a usted.</p>
<p>A una bruja me encontré<br />
por el aire va volando.<br />
Por el aire va volando<br />
a una bruja me encontré.</p>
<p>Ay mamá.</p>
<p>Entonces le pregunte<br />
A quien andaba buscando&#8230;<br />
Me dice: ¿Quien es usted?<br />
Soy cantador del huapango</p>
<p>Ay mamá.</p>
<p>Levantate Chucha, levantate Juana<br />
Que viene la bruja detras de hermana.<br />
Levantate Pepa, levantate Adela<br />
Que viene la bruja detras de Abuela.</p>
<p>Y digame, digame usted<br />
¿Cuantas criaturitas se ha chupado usted?<br />
Señora ninguna, ninguna no se,<br />
Ando en pretenciones de chuparme a usted.</p>
<p>Ahora si maldita bruja,<br />
ya te chupaste a mi hijo.<br />
Ya te chupaste a mi hijo,<br />
ahora si maldita bruja</p>
<p>Ay mamá</p>
<p>Ahora le vas a chupar<br />
a tu marido el ombligo<br />
a tu marido el ombligo<br />
y hasta quisiera llorar.</p>
<p>Cuando a tu marido le encuentro durmiendo,<br />
le arranco las piernas y me voy corriendo.<br />
Cuando a tu marido le encuentro dormido,<br />
le arranco las piernas y me voy contigo.</p>
<p>Y digame, digame usted<br />
¿Cuantas criaturitas se ha chupado usted?<br />
Señora ninguna, ninguna no se,<br />
Ando en pretenciones de chuparme a usted.</p></blockquote>
<p>Y como siempre aqui esta la descarga <a href="http://www.nemediano.com.mx/wp-content/uploads/2009/02/conjunto-jardin-la-bruja.ogg">conjunto-jardin-la-bruja</a> en formato ogg vorvis.</p>
<a href="http://www.facebook.com/share.php?u=http%3A%2F%2Fwww.nemediano.com.mx%2F2009%2Fla-bruja%2F&amp;t=La%20bruja." id="facebook_share_icon_204" style="font-size:11px; line-height:13px; font-family:'lucida grande',tahoma,verdana,arial,sans-serif; text-decoration:none;"><img src="http://b.static.ak.fbcdn.net/images/share/facebook_share_icon.gif" alt="Share on Facebook" /></a>
	<script type="text/javascript">
	var button = document.getElementById('facebook_share_link_204') || document.getElementById('facebook_share_icon_204') || document.getElementById('facebook_share_both_204') || document.getElementById('facebook_share_button_204');
	if (button) {
		button.onclick = function(e) {
			var url = this.href.replace(/share\.php/, 'sharer.php');
			window.open(url,'sharer','toolbar=0,status=0,width=626,height=436');
			return false;
		}
	
		if (button.id === 'facebook_share_button_204') {
			button.onmouseover = function(){
				this.style.color='#fff';
				this.style.borderColor = '#295582';
				this.style.backgroundColor = '#3b5998';
			}
			button.onmouseout = function(){
				this.style.color = '#3b5998';
				this.style.borderColor = '#d8dfea';
				this.style.backgroundColor = '#fff';
			}
		}
	}
	</script>
	]]></content:encoded>
			<wfw:commentRss>http://www.nemediano.com.mx/2009/la-bruja/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Programa del copo de Koch en OpenGL</title>
		<link>http://www.nemediano.com.mx/2009/programa-del-copo-de-koch-en-opengl/</link>
		<comments>http://www.nemediano.com.mx/2009/programa-del-copo-de-koch-en-opengl/#comments</comments>
		<pubDate>Tue, 20 Jan 2009 20:54:49 +0000</pubDate>
		<dc:creator>nemediano</dc:creator>
				<category><![CDATA[Computación]]></category>
		<category><![CDATA[Mis demonios]]></category>
		<category><![CDATA[copo]]></category>
		<category><![CDATA[fractal]]></category>
		<category><![CDATA[glut]]></category>
		<category><![CDATA[koch]]></category>
		<category><![CDATA[opengl]]></category>
		<category><![CDATA[programa]]></category>
		<category><![CDATA[ubuntu]]></category>

		<guid isPermaLink="false">http://www.nemediano.com.mx/?p=153</guid>
		<description><![CDATA[El semestre pasado, que me toco dar clase de Graficación por computadora, en la FESA, un amigo mio (que no tomaba clase conmigo) me pidió que le ayudara en una tarea para su clase de Sistemas Dinámicos, como la verdad no tenia mucho tiempo, hice todo lo posible por zafarme, cuando ya no pude, le [...]]]></description>
			<content:encoded><![CDATA[<p>El semestre pasado, que me toco dar clase de Graficación por computadora, en la FESA, un amigo mio (que no tomaba clase conmigo) me pidió que le ayudara en una tarea para su clase de Sistemas Dinámicos, como la verdad no tenia mucho tiempo, hice todo lo posible por zafarme, cuando ya no pude, le pregunte de que se trataba y me dijo que quería hacer un programa gráfico de un fractal, para ilustrar una exposición, que en concreto quería hacer el <a href="http://es.wikipedia.org/wiki/Copo_de_nieve_de_Koch">copo de Koch</a>.</p>
<p><span id="more-153"></span></p>
<p>Al principio me gustó la idea, después de todo, traía fresco lo de la graficada y el programa parecía ser muy sencillo, le dije que solo preparara la recurrencia matemática y que después pasaría a ayudarle, después de una semana pase a verlo y como suele suceder no había hecho nada ni yo ni el, sin embargo el programa resulto ser lo bastante simple para que solo me llevara un par de horas terminarlo.</p>
<p>Pueden descargar el código <a title="Copo koch en OpenGL" href="http://www.nemediano.com.mx/wp-content/uploads/2009/01/copokoch.c">aquí</a>. Y para probar mis últimos dos plugines agregados al blog me decidí a escribir este post. los dos plugines de los que hablo son el <a href="http://wordpress.org/extend/plugins/wp-syntax/">WP-sintax</a> que permite poner código de algún lenguaje de programación en tus post y el <a href="http://gaussianos.com/wp-latex-plugin-para-mostrar-formulas-matematicas-escritas-con-latex-en-wordpress/">WP-LaTeX</a> que agregar una fórmula escrita en LaTeX, (en forma de imagen) a tus post.</p>
<h2>Copo de Koch</h2>
<p>La primeras lineas solo incluyen las dos bibliotecas que vamos a usar, la primera es la <a href="http://es.wikipedia.org/wiki/GLUT">glut estandar</a> para levantar OpenGL y la otra es math.h, para hacer cálculos.</p>
<p>Veamos después de eso que hay:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>6
7
8
</pre></td><td class="code"><pre class="c" style="font-family:monospace;"><span style="color: #993333;">typedef</span> <span style="color: #993333;">struct</span> <span style="color: #009900;">&#123;</span>
	<span style="color: #993333;">float</span> x<span style="color: #339933;">,</span> y<span style="color: #339933;">,</span> z<span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>Punto<span style="color: #339933;">;</span></pre></td></tr></table></div>

<p>Con estas lineas definimos un nuevo tipo de dato, lo bautizamos como <strong>Punto</strong> y tiene adentro tres flotantes, para representar coordenadas, aunque el programa es en esencia bidimensional, como el OpenGL trabaja en 3D, me gusta declarar todo como si estuviera dibujando en 3D.</p>
<p>Después se declaran algunas variables globales, y el prototipo de las funciones, las variables globales son:</p>
<ul>
<li><strong>xMax, yMax:</strong> Guardan el tope de las coordenadas del mundo, es decir de donde a donde corre la parte visible de la ventana en X y en Y, con respecto al origen (situada al centro de la ventana)</li>
<li><strong>vertices:</strong> Es un arreglo de tres puntos, que guardara la única información que necesitamos para empezar a generar el copo de nieve, la posición de tres vértices.</li>
<li><strong>numPtos:</strong> Este guarda el número de vértices proporcionados por el usuario, es un contador para poner la siguiente lógica: &#8220;Si ya tienes tres puntos, empieza a hacer el fractal, si tienes menos de tres puntos, continua esperando&#8230;&#8221;</li>
<li><strong>fondo:</strong> Otro entero que guardará la profundidad máxima para hacer el fractal, donde un cero, pinta un triangulo, un uno la estrella de David y así en adelante. Es si lo quieren ver así el numero de veces que se manda a llamar recursivamente el fractal.</li>
</ul>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
</pre></td><td class="code"><pre class="c" style="font-family:monospace;"><span style="color: #993333;">int</span> main<span style="color: #009900;">&#40;</span><span style="color: #993333;">int</span> argc<span style="color: #339933;">,</span> <span style="color: #993333;">char</span><span style="color: #339933;">**</span> argv<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
&nbsp;
   glutInit<span style="color: #009900;">&#40;</span><span style="color: #339933;">&amp;</span>argc<span style="color: #339933;">,</span> argv<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
   glutInitDisplayMode <span style="color: #009900;">&#40;</span>GLUT_SINGLE <span style="color: #339933;">|</span> GLUT_RGBA<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
   glutInitWindowSize <span style="color: #009900;">&#40;</span><span style="color: #0000dd;">640</span><span style="color: #339933;">,</span> <span style="color: #0000dd;">480</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
   glutInitWindowPosition <span style="color: #009900;">&#40;</span><span style="color: #0000dd;">100</span><span style="color: #339933;">,</span> <span style="color: #0000dd;">105</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
   glutCreateWindow <span style="color: #009900;">&#40;</span>argv<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">0</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
   inicializar<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
   glutDisplayFunc<span style="color: #009900;">&#40;</span>dibuja<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
   glutReshapeFunc<span style="color: #009900;">&#40;</span>redimensiona<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
   glutKeyboardFunc<span style="color: #009900;">&#40;</span>teclado<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
   glutSpecialFunc<span style="color: #009900;">&#40;</span>tecladoEspecial<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
   glutMouseFunc<span style="color: #009900;">&#40;</span>raton<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
   glutMainLoop<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
   <span style="color: #b1b100;">return</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>La función main, no mucho que decir, es muy estándar en el estilo glut, pone la maquina de estados en el estado adecuado, manda llamar a inicializar, registra cinco funciones de callback y por ultimo manda al loop principal de glut. Utilizo un solo buffer por que no voy a hacer animación, y ocupo el nombre del programa para el titulo de la ventana.</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>47
48
49
50
51
52
</pre></td><td class="code"><pre class="c" style="font-family:monospace;"><span style="color: #993333;">void</span> inicializar <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
   glClearColor<span style="color: #009900;">&#40;</span><span style="color:#800080;">0.0f</span><span style="color: #339933;">,</span> <span style="color:#800080;">0.0f</span><span style="color: #339933;">,</span> <span style="color:#800080;">0.0f</span><span style="color: #339933;">,</span> <span style="color:#800080;">0.0f</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
   glPointSize<span style="color: #009900;">&#40;</span><span style="color:#800080;">5.0</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
   numPtos <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
   fondo <span style="color: #339933;">=</span> <span style="color: #0000dd;">1</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>La primer función en ser ejecutada, pone el color del fondo en negro, a los puntos les da tamaño 5, inicializa el contador de puntos y a profundidad.</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
</pre></td><td class="code"><pre class="c" style="font-family:monospace;"><span style="color: #993333;">void</span> redimensiona <span style="color: #009900;">&#40;</span><span style="color: #993333;">int</span> ancho<span style="color: #339933;">,</span> <span style="color: #993333;">int</span> alto<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
   <span style="color: #993333;">float</span> aspect<span style="color: #339933;">;</span>
&nbsp;
   glViewport <span style="color: #009900;">&#40;</span><span style="color: #0000dd;">0</span><span style="color: #339933;">,</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">,</span> ancho<span style="color: #339933;">,</span> alto<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
   glMatrixMode <span style="color: #009900;">&#40;</span>GL_PROJECTION<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
   glLoadIdentity <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
   <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>alto <span style="color: #339933;">==</span> <span style="color: #0000dd;">0</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
   	  alto <span style="color: #339933;">=</span> <span style="color: #0000dd;">1</span><span style="color: #339933;">;</span>
   <span style="color: #009900;">&#125;</span>
&nbsp;
   aspect <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span><span style="color: #993333;">float</span><span style="color: #009900;">&#41;</span> ancho <span style="color: #339933;">/</span> <span style="color: #009900;">&#40;</span><span style="color: #993333;">float</span><span style="color: #009900;">&#41;</span> alto<span style="color: #339933;">;</span>
&nbsp;
   <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>ancho <span style="color: #339933;">&lt;=</span> alto<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
   	  glOrtho<span style="color: #009900;">&#40;</span><span style="color: #339933;">-</span>MUNDO<span style="color: #339933;">,</span> MUNDO<span style="color: #339933;">,</span> <span style="color: #339933;">-</span>MUNDO<span style="color: #339933;">/</span>aspect<span style="color: #339933;">,</span> MUNDO<span style="color: #339933;">/</span>aspect<span style="color: #339933;">,</span> <span style="color: #339933;">-</span>MUNDO<span style="color: #339933;">,</span> MUNDO<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
   	  xMax <span style="color: #339933;">=</span> MUNDO<span style="color: #339933;">;</span>
   	  yMax <span style="color: #339933;">=</span> MUNDO <span style="color: #339933;">/</span> aspect<span style="color: #339933;">;</span>
&nbsp;
   <span style="color: #009900;">&#125;</span> <span style="color: #b1b100;">else</span> <span style="color: #009900;">&#123;</span>
   	  glOrtho<span style="color: #009900;">&#40;</span><span style="color: #339933;">-</span>MUNDO <span style="color: #339933;">*</span> aspect<span style="color: #339933;">,</span> MUNDO <span style="color: #339933;">*</span> aspect<span style="color: #339933;">,</span> <span style="color: #339933;">-</span>MUNDO<span style="color: #339933;">,</span> MUNDO<span style="color: #339933;">,</span> <span style="color: #339933;">-</span>MUNDO<span style="color: #339933;">,</span> MUNDO<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
   	  xMax <span style="color: #339933;">=</span> MUNDO <span style="color: #339933;">*</span> aspect<span style="color: #339933;">;</span>
   	  yMax <span style="color: #339933;">=</span> MUNDO<span style="color: #339933;">;</span>
   <span style="color: #009900;">&#125;</span>
&nbsp;
   glMatrixMode<span style="color: #009900;">&#40;</span>GL_MODELVIEW<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
   glLoadIdentity<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>La función redimensiona, es llamada al inicio del programa, (el estándar de glut así lo indica) y cada vez que hay un evento de resize a la ventana. es una función muy común en estilo glut, lo único raro, quizás es que guarda en variables globales el valor de la máxima coordenada Y y la máxima coordenada X. Por lo demás es muy normal, da una proyección ortogonal, i.e: pone el sistema de referencia.</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>82
83
84
85
86
87
88
89
90
91
92
93
</pre></td><td class="code"><pre class="c" style="font-family:monospace;"><span style="color: #993333;">void</span> teclado <span style="color: #009900;">&#40;</span><span style="color: #993333;">unsigned</span> <span style="color: #993333;">char</span> key<span style="color: #339933;">,</span> <span style="color: #993333;">int</span> cx<span style="color: #339933;">,</span> <span style="color: #993333;">int</span> cy<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
&nbsp;
	<span style="color: #b1b100;">switch</span> <span style="color: #009900;">&#40;</span>key<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #b1b100;">case</span> <span style="color: #0000dd;">27</span><span style="color: #339933;">:</span>
		   exit<span style="color: #009900;">&#40;</span><span style="color: #0000dd;">0</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #000000; font-weight: bold;">break</span><span style="color: #339933;">;</span>
&nbsp;
		<span style="color: #b1b100;">default</span><span style="color: #339933;">:</span> <span style="color: #000000; font-weight: bold;">break</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	glutPostRedisplay<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>La función teclado es muy simple, si detecta un evento de la tecla &#8220;Esc&#8221;, termina el programa con codigo 0.</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
</pre></td><td class="code"><pre class="c" style="font-family:monospace;"><span style="color: #993333;">void</span> tecladoEspecial <span style="color: #009900;">&#40;</span><span style="color: #993333;">int</span> key<span style="color: #339933;">,</span> <span style="color: #993333;">int</span> cy<span style="color: #339933;">,</span> <span style="color: #993333;">int</span> cx<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
&nbsp;
	<span style="color: #b1b100;">switch</span> <span style="color: #009900;">&#40;</span>key<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #b1b100;">case</span> GLUT_KEY_PAGE_UP<span style="color: #339933;">:</span>
		   fondo<span style="color: #339933;">++;</span>
		<span style="color: #000000; font-weight: bold;">break</span><span style="color: #339933;">;</span>
&nbsp;
		<span style="color: #b1b100;">case</span> GLUT_KEY_PAGE_DOWN<span style="color: #339933;">:</span>
		   <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>fondo <span style="color: #339933;">&gt;</span> <span style="color: #0000dd;">1</span><span style="color: #009900;">&#41;</span> fondo<span style="color: #339933;">--;</span>
		<span style="color: #000000; font-weight: bold;">break</span><span style="color: #339933;">;</span>
&nbsp;
		<span style="color: #b1b100;">default</span><span style="color: #339933;">:</span> <span style="color: #000000; font-weight: bold;">break</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	glutPostRedisplay<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>Está función sirve para cachar eventos de las teclas PgUp y PgDn, y en respuesta aumenta el valor de la variable global fondo, es decir hace que el fractal itere mas o menos veces, después de poner el nuevo valor en fondo, avisa a la ventana que necesita volver a dibujarse.</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
</pre></td><td class="code"><pre class="c" style="font-family:monospace;"><span style="color: #993333;">void</span> raton <span style="color: #009900;">&#40;</span><span style="color: #993333;">int</span> boton<span style="color: #339933;">,</span> <span style="color: #993333;">int</span> estado<span style="color: #339933;">,</span> <span style="color: #993333;">int</span> cx<span style="color: #339933;">,</span> <span style="color: #993333;">int</span> cy<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
	<span style="color: #993333;">float</span> x<span style="color: #339933;">,</span> y<span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #808080; font-style: italic;">/* Calculamos las coordenadas de mundo (relativas) apartir de 
	 * las de ventana (absolutas) */</span>
&nbsp;
	x <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span>GLfloat<span style="color: #009900;">&#41;</span>cx <span style="color: #339933;">*</span> <span style="color:#800080;">2.0</span> <span style="color: #339933;">*</span> xMax<span style="color: #009900;">&#41;</span> <span style="color: #339933;">/</span> glutGet<span style="color: #009900;">&#40;</span>GLUT_WINDOW_WIDTH<span style="color: #009900;">&#41;</span> <span style="color: #339933;">-</span> xMax<span style="color: #339933;">;</span>
	y <span style="color: #339933;">=</span> yMax <span style="color: #339933;">-</span> <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span>GLfloat<span style="color: #009900;">&#41;</span>cy <span style="color: #339933;">*</span> <span style="color:#800080;">2.0</span> <span style="color: #339933;">*</span> yMax<span style="color: #009900;">&#41;</span> <span style="color: #339933;">/</span> glutGet<span style="color: #009900;">&#40;</span>GLUT_WINDOW_HEIGHT<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>boton <span style="color: #339933;">==</span> GLUT_LEFT_BUTTON <span style="color: #339933;">&amp;&amp;</span> estado <span style="color: #339933;">==</span> GLUT_DOWN<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
&nbsp;
		<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>numPtos <span style="color: #339933;">&lt;</span> <span style="color: #0000dd;">3</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		   vertices<span style="color: #009900;">&#91;</span>numPtos<span style="color: #009900;">&#93;</span>.<span style="color: #202020;">x</span> <span style="color: #339933;">=</span> x<span style="color: #339933;">;</span>
		   vertices<span style="color: #009900;">&#91;</span>numPtos<span style="color: #009900;">&#93;</span>.<span style="color: #202020;">y</span> <span style="color: #339933;">=</span> y<span style="color: #339933;">;</span>
		   vertices<span style="color: #009900;">&#91;</span>numPtos<span style="color: #009900;">&#93;</span>.<span style="color: #202020;">z</span> <span style="color: #339933;">=</span> <span style="color:#800080;">0.0</span><span style="color: #339933;">;</span>
		   <span style="color: #339933;">++</span>numPtos<span style="color: #339933;">;</span>
	    <span style="color: #009900;">&#125;</span>
	    <span style="color: #b1b100;">else</span> <span style="color: #009900;">&#123;</span>
	       numPtos <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
	       vertices<span style="color: #009900;">&#91;</span>numPtos<span style="color: #009900;">&#93;</span>.<span style="color: #202020;">x</span> <span style="color: #339933;">=</span> x<span style="color: #339933;">;</span>
		   vertices<span style="color: #009900;">&#91;</span>numPtos<span style="color: #009900;">&#93;</span>.<span style="color: #202020;">y</span> <span style="color: #339933;">=</span> y<span style="color: #339933;">;</span>
		   vertices<span style="color: #009900;">&#91;</span>numPtos<span style="color: #009900;">&#93;</span>.<span style="color: #202020;">z</span> <span style="color: #339933;">=</span> <span style="color:#800080;">0.0</span><span style="color: #339933;">;</span>
		   numPtos<span style="color: #339933;">++;</span>
	    <span style="color: #009900;">&#125;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	glutPostRedisplay<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>Este código cacha las acciones del ratón, las lineas 118 y 119, calculan la posicion en x y en y en donde el usuario realizo el click, recordemos que el glut, nos pasa como parámetros dos enteros que representan el pixel en el que se hizo el click, pero para la lógica de nuestro programa lo queremos en coordenadas de mundo.</p>
<p>En las lineas siguientes, se pregunta si el mouse dio click izquierdo de ser así, preguntamos cuantos puntos llevamos, si son menos de tres, seguimos esperando si no que este sea el primero, de esta manera cada cuarto punto se <em>resetea</em>, el estado del programa, así que si después de pintar un fractal queremos pintar otro simplemente damos un nuevo click y ese es el primer punto de un nuevo fractal.</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
</pre></td><td class="code"><pre class="c" style="font-family:monospace;"><span style="color: #993333;">void</span> dibuja <span style="color: #009900;">&#40;</span><span style="color: #993333;">void</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
	<span style="color: #993333;">int</span> i<span style="color: #339933;">;</span>
&nbsp;
	glClear<span style="color: #009900;">&#40;</span>GL_COLOR_BUFFER_BIT<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
	glMatrixMode<span style="color: #009900;">&#40;</span>GL_MODELVIEW<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	glLoadIdentity<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
&nbsp;
	<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>numPtos <span style="color: #339933;">!=</span> <span style="color: #0000dd;">3</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
	   glColor3f<span style="color: #009900;">&#40;</span><span style="color:#800080;">1.0</span><span style="color: #339933;">,</span> <span style="color:#800080;">1.0</span><span style="color: #339933;">,</span> <span style="color:#800080;">1.0</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	   glBegin<span style="color: #009900;">&#40;</span>GL_POINTS<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	      <span style="color: #b1b100;">for</span> <span style="color: #009900;">&#40;</span>i <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span> i <span style="color: #339933;">&lt;</span>numPtos<span style="color: #339933;">;</span> i<span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
	   	     glVertex3f<span style="color: #009900;">&#40;</span>vertices<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span>.<span style="color: #202020;">x</span><span style="color: #339933;">,</span> vertices<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span>.<span style="color: #202020;">y</span><span style="color: #339933;">,</span> vertices<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span>.<span style="color: #202020;">z</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	      <span style="color: #009900;">&#125;</span>
	   glEnd<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>numPtos <span style="color: #339933;">==</span> <span style="color: #0000dd;">3</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
	   glColor3f<span style="color: #009900;">&#40;</span><span style="color:#800080;">1.0</span><span style="color: #339933;">,</span> <span style="color:#800080;">1.0</span><span style="color: #339933;">,</span> <span style="color:#800080;">0.0</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	   glBegin<span style="color: #009900;">&#40;</span>GL_LINE_STRIP<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	      koch<span style="color: #009900;">&#40;</span>vertices<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">0</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> vertices<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">1</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> <span style="color: #0000dd;">0</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	      koch<span style="color: #009900;">&#40;</span>vertices<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">1</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> vertices<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">2</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> <span style="color: #0000dd;">0</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	      koch<span style="color: #009900;">&#40;</span>vertices<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">2</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> vertices<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">0</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> <span style="color: #0000dd;">0</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	   glEnd<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>	
&nbsp;
	glFlush<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>Esta función se encarga de dibujar el fractal, primero limpia la pantalla, luego pone el estado de dibujar y pregunta si tenemos algún numero de puntos que no sea tres (por la lógica de la función anterior esto solo puede pasar cuando son menos que tres) de ser así solo pone los puntos que llevamos. En caso contrario se prepara a dibujar el fractal, para esto hace uso de la función auxiliar koch, que da los vértices de una curva de koch, así que para hacer el copo de koch, pinta tres curvas de koch: Una del vértice 0, al vértice 1, otra del vértice 1 al vértice 2 y por ultimo una que cierra el copo del vértice 2 al vértice 0.</p>
<h2>Dibujando la curva de Koch</h2>
<p>Ahora viene la parte mas interesante:  ¿Como se dibuja la curva de Koch?<br />
La función encargada de hacerlo es la función <strong>koch</strong>, pide como argumento dos puntos y un entero, que es el nivel de profundidad en la recursividad del algoritmo, es decir: la primera vez que se llame tendrá valor 0, la segunda vez que se llame tendrá valor 1 y así sucesivamente. Aquí esta el código de la función:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
</pre></td><td class="code"><pre class="c" style="font-family:monospace;"><span style="color: #993333;">void</span> koch <span style="color: #009900;">&#40;</span>Punto p0<span style="color: #339933;">,</span> Punto p1<span style="color: #339933;">,</span> <span style="color: #993333;">int</span> profundidad<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
	Punto a<span style="color: #339933;">,</span> b<span style="color: #339933;">,</span> p2<span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>profundidad <span style="color: #339933;">&lt;</span> fondo<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		a.<span style="color: #202020;">x</span> <span style="color: #339933;">=</span> <span style="color:#800080;">2.0</span> <span style="color: #339933;">/</span> <span style="color:#800080;">3.0</span> <span style="color: #339933;">*</span> p0.<span style="color: #202020;">x</span> <span style="color: #339933;">+</span> <span style="color:#800080;">1.0</span> <span style="color: #339933;">/</span> <span style="color:#800080;">3.0</span> <span style="color: #339933;">*</span> p1.<span style="color: #202020;">x</span><span style="color: #339933;">;</span>
		a.<span style="color: #202020;">y</span> <span style="color: #339933;">=</span> <span style="color:#800080;">2.0</span> <span style="color: #339933;">/</span> <span style="color:#800080;">3.0</span> <span style="color: #339933;">*</span> p0.<span style="color: #202020;">y</span> <span style="color: #339933;">+</span> <span style="color:#800080;">1.0</span> <span style="color: #339933;">/</span> <span style="color:#800080;">3.0</span> <span style="color: #339933;">*</span> p1.<span style="color: #202020;">y</span><span style="color: #339933;">;</span>
		a.<span style="color: #202020;">z</span> <span style="color: #339933;">=</span> <span style="color:#800080;">0.0</span><span style="color: #339933;">;</span>
&nbsp;
		b.<span style="color: #202020;">x</span> <span style="color: #339933;">=</span> <span style="color:#800080;">1.0</span> <span style="color: #339933;">/</span> <span style="color:#800080;">3.0</span> <span style="color: #339933;">*</span> p0.<span style="color: #202020;">x</span> <span style="color: #339933;">+</span> <span style="color:#800080;">2.0</span> <span style="color: #339933;">/</span> <span style="color:#800080;">3.0</span> <span style="color: #339933;">*</span> p1.<span style="color: #202020;">x</span><span style="color: #339933;">;</span>
		b.<span style="color: #202020;">y</span> <span style="color: #339933;">=</span> <span style="color:#800080;">1.0</span> <span style="color: #339933;">/</span> <span style="color:#800080;">3.0</span> <span style="color: #339933;">*</span> p0.<span style="color: #202020;">y</span> <span style="color: #339933;">+</span> <span style="color:#800080;">2.0</span> <span style="color: #339933;">/</span> <span style="color:#800080;">3.0</span> <span style="color: #339933;">*</span> p1.<span style="color: #202020;">y</span><span style="color: #339933;">;</span>
		b.<span style="color: #202020;">z</span> <span style="color: #339933;">=</span> <span style="color:#800080;">0.0</span><span style="color: #339933;">;</span>
&nbsp;
		p2.<span style="color: #202020;">x</span> <span style="color: #339933;">=</span> <span style="color:#800080;">0.5</span> <span style="color: #339933;">*</span> p0.<span style="color: #202020;">x</span> <span style="color: #339933;">+</span> <span style="color:#800080;">0.5</span> <span style="color: #339933;">*</span> p1.<span style="color: #202020;">x</span> <span style="color: #339933;">+</span> a.<span style="color: #202020;">y</span> <span style="color: #339933;">-</span> b.<span style="color: #202020;">y</span><span style="color: #339933;">;</span>
		p2.<span style="color: #202020;">y</span> <span style="color: #339933;">=</span> <span style="color:#800080;">0.5</span> <span style="color: #339933;">*</span> p0.<span style="color: #202020;">y</span> <span style="color: #339933;">+</span> <span style="color:#800080;">0.5</span> <span style="color: #339933;">*</span> p1.<span style="color: #202020;">y</span> <span style="color: #339933;">+</span> b.<span style="color: #202020;">x</span> <span style="color: #339933;">-</span> a.<span style="color: #202020;">x</span><span style="color: #339933;">;</span>
		p2.<span style="color: #202020;">z</span> <span style="color: #339933;">=</span> <span style="color:#800080;">0.0</span><span style="color: #339933;">;</span>
&nbsp;
		glVertex3f<span style="color: #009900;">&#40;</span>p0.<span style="color: #202020;">x</span><span style="color: #339933;">,</span> p0.<span style="color: #202020;">y</span><span style="color: #339933;">,</span> p0.<span style="color: #202020;">z</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		koch<span style="color: #009900;">&#40;</span>p0<span style="color: #339933;">,</span> a<span style="color: #339933;">,</span> profundidad <span style="color: #339933;">+</span> <span style="color: #0000dd;">1</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		glVertex3f<span style="color: #009900;">&#40;</span>a.<span style="color: #202020;">x</span><span style="color: #339933;">,</span> a.<span style="color: #202020;">y</span><span style="color: #339933;">,</span> a.<span style="color: #202020;">z</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		koch<span style="color: #009900;">&#40;</span>a<span style="color: #339933;">,</span> p2<span style="color: #339933;">,</span> profundidad <span style="color: #339933;">+</span> <span style="color: #0000dd;">1</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		glVertex3f<span style="color: #009900;">&#40;</span>p2.<span style="color: #202020;">x</span><span style="color: #339933;">,</span> p2.<span style="color: #202020;">y</span><span style="color: #339933;">,</span> p2.<span style="color: #202020;">z</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		koch<span style="color: #009900;">&#40;</span>p2<span style="color: #339933;">,</span> b<span style="color: #339933;">,</span> profundidad <span style="color: #339933;">+</span> <span style="color: #0000dd;">1</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		glVertex3f<span style="color: #009900;">&#40;</span>b.<span style="color: #202020;">x</span><span style="color: #339933;">,</span> b.<span style="color: #202020;">y</span><span style="color: #339933;">,</span> b.<span style="color: #202020;">z</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		koch<span style="color: #009900;">&#40;</span>b<span style="color: #339933;">,</span> p1<span style="color: #339933;">,</span> profundidad <span style="color: #339933;">+</span> <span style="color: #0000dd;">1</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		glVertex3f<span style="color: #009900;">&#40;</span>p1.<span style="color: #202020;">x</span><span style="color: #339933;">,</span> p1.<span style="color: #202020;">y</span><span style="color: #339933;">,</span> p1.<span style="color: #202020;">z</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #009900;">&#125;</span> 
&nbsp;
	<span style="color: #b1b100;">return</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>En la linea 176, se pregunta cuantas veces se ha ejecutado esta función en la recursión, si es mas que lo que vale la variable <strong>fondo</strong>, regresa sin hacer ninguna operación, poniendo fin a la recursión. Sin embargo si aun es menor, se ejecutan los cálculos necesarios (se hace otra iteración) y dentro del procedimiento se llama recursivamente la función koch aumentando el nivel de profundidad.</p>
<p>La lógica de la función koch se explica a continuación:</p>
<p>La idea principal es que como entrada tenemos dos puntos (<strong>p0</strong> y <strong>p1</strong>), los cuales representan un segmento y queremos a partir de ellos calcular tres puntos mas (<strong>a</strong>, <strong>b</strong> y <strong>p2</strong>). Como se ve en la figura:</p>
<div id="attachment_180" class="wp-caption alignnone" style="width: 310px"><a href="http://www.nemediano.com.mx/wp-content/uploads/2009/01/koch1.png"><img src="http://www.nemediano.com.mx/wp-content/uploads/2009/01/koch1-300x62.png" alt="Segmento de recta" title="koch1" width="300" height="62" class="size-medium wp-image-180" /></a><p class="wp-caption-text">Segmento de recta</p></div>
<p>Para calcular cada uno de estos puntos, se hace uso de la ecuación paramétrica de un segmento de recta. Si tenemos dos puntos <strong>p</strong> y <strong>q</strong> entonces la ecuación paramétrica en <strong>t</strong>, del semento de recta entre <strong>p</strong> y <strong>q</strong> es: <img style="border:0px;vertical-align:middle;" src='http://l.wordpress.com/latex.php?latex=s%28t%29+%3D+%281-t%29%5Cvec%7Bp%7D+%2B+t%5Cvec%7Bq%7D&bg=FFFFFF&fg=000000'  alt="s(t) = (1-t)\vec{p} + t\vec{q}" /> con <img style="border:0px;vertical-align:middle;" src='http://l.wordpress.com/latex.php?latex=0+%5Cleq+t+%5Cleq+1&bg=FFFFFF&fg=000000'  alt="0 \leq t \leq 1" /> con esta ecuación podemos calcular fácilmente tanto <strong>a</strong>, como <strong>b</strong>. Sin embargo para calcular <strong>p2</strong> tendremos que hacer algunas cosas mas.</p>
<div id="attachment_181" class="wp-caption alignnone" style="width: 310px"><a href="http://www.nemediano.com.mx/wp-content/uploads/2009/01/koch2.png"><img src="http://www.nemediano.com.mx/wp-content/uploads/2009/01/koch2-300x126.png" alt="Puntos a calcular en el nuevo segmento de koch" title="koch2" width="300" height="126" class="size-medium wp-image-181" /></a><p class="wp-caption-text">Puntos a calcular en el nuevo segmento de koch</p></div>
<p>Primero calculamos el punto medio del segmento, a ese vector hay que sumarle la <em>elevación</em> del nuevo punto, para calcularla necesitamos sumarle un nuevo vector que sea perpendicular al segmento, para esto utilizamos el hecho de que el producto punto de dos vectores perpendiculares entre si, siempre es cero. Así que construimos el vector que va de a a b y de ahí lo volteamos es decir:</p>
<p>Dado un vector:</p>
<p><img style="border:0px;vertical-align:middle;" src='http://l.wordpress.com/latex.php?latex=%5Cleft%28+%5Cbegin%7Barray%7D%7Bc%7D+x++%5C%5C+y+%5Cend%7Barray%7D+%5Cright%29&bg=FFFFFF&fg=000000'  alt="\left( \begin{array}{c} x  \\ y \end{array} \right)" /></p>
<p>Es perpendicular a el vector <strong>v</strong> dado por:</p>
<p><img style="border:0px;vertical-align:middle;" src='http://l.wordpress.com/latex.php?latex=%5Cvec%7Bv%7D+%3D+%5Cleft%28+%5Cbegin%7Barray%7D%7Bc%7D+-y+%5C%5C+x+%5Cend%7Barray%7D+%5Cright%29&bg=FFFFFF&fg=000000'  alt="\vec{v} = \left( \begin{array}{c} -y \\ x \end{array} \right)" /></p>
<p>Por lo que podemos encontrar el punto <strong>p2</strong> de la siguiente manera:</p>
<p><img style="border:0px;vertical-align:middle;" src='http://l.wordpress.com/latex.php?latex=%5Cvec%7Bp_2%7D+%3D+%5Cdfrac%7B1%7D%7B2%7D%5Cvec%7Bp_0%7D+%2B+%5Cdfrac%7B1%7D%7B2%7D%5Cvec%7Bp_1%7D+%2B+%5Cleft%28+%5Cbegin%7Barray%7D%7Bc%7D+a_%7By%7D-b_%7By%7D+%5C%5C+b_%7Bx%7D-a_%7Bx%7D+%5Cend%7Barray%7D+%5Cright%29&bg=FFFFFF&fg=000000'  alt="\vec{p_2} = \dfrac{1}{2}\vec{p_0} + \dfrac{1}{2}\vec{p_1} + \left( \begin{array}{c} a_{y}-b_{y} \\ b_{x}-a_{x} \end{array} \right)" /></p>
<p>Recordemos que el vector que va de <strong>a</strong> a <strong>b</strong> se puede ver como <strong>b-a</strong>.</p>
<h2>Descargas</h2>
<ul>
<li><a title="Copo koch en OpenGL" href="http://www.nemediano.com.mx/wp-content/uploads/2009/01/copokoch.c">Código fuente el programa</a></li>
<li><a href="http://www.nemediano.com.mx/wp-content/uploads/2009/01/copo-de-koch.exe">Ejecutable de win32</a></li>
</ul>
<p>¿Por que solo pongo el ejecutable para Windows, si yo siempre uso GNU/Linux?, por que los usuarios del lado luminoso de la fuerza les conviene mas compilar el fuente, que al cabo es solo uno, recuerden que deberán tener instalado OpenGL y glut.</p>
<h2>Pantallazos</h2>
<div class="ngg-galleryoverview" id="ngg-gallery-12-153">

	<!-- Slideshow link -->
	<div class="slideshowlink">
		<a class="slideshowlink" href="http://www.nemediano.com.mx/2009/programa-del-copo-de-koch-en-opengl/?show=slide">
			[Show as slideshow]		</a>
	</div>

	
	<!-- Thumbnails -->
		
	<div id="ngg-image-87" class="ngg-gallery-thumbnail-box"  >
		<div class="ngg-gallery-thumbnail" >
			<a href="http://www.nemediano.com.mx/wp-content/gallery/kochopengl/Pantallazo-.-copoKoch-1.png" title="Un copo de Koch, chueco por la forma en que se crearon sus vértices iniciales" class="thickbox" rel="set_12" >
								<img title="Pantallazo-.-copoKoch-1.png" alt="Pantallazo-.-copoKoch-1.png" src="http://www.nemediano.com.mx/wp-content/gallery/kochopengl/thumbs/thumbs_Pantallazo-.-copoKoch-1.png" width="100" height="75" />
							</a>
		</div>
	</div>
	
		
 		
	<div id="ngg-image-88" class="ngg-gallery-thumbnail-box"  >
		<div class="ngg-gallery-thumbnail" >
			<a href="http://www.nemediano.com.mx/wp-content/gallery/kochopengl/Pantallazo-.-copoKoch-2.png" title="Un anticopo de koch simétrico, en el programa se produce dando los click en sentido contrario a las manecillas del reloj" class="thickbox" rel="set_12" >
								<img title="Pantallazo-.-copoKoch-2.png" alt="Pantallazo-.-copoKoch-2.png" src="http://www.nemediano.com.mx/wp-content/gallery/kochopengl/thumbs/thumbs_Pantallazo-.-copoKoch-2.png" width="100" height="75" />
							</a>
		</div>
	</div>
	
		
 		
	<div id="ngg-image-89" class="ngg-gallery-thumbnail-box"  >
		<div class="ngg-gallery-thumbnail" >
			<a href="http://www.nemediano.com.mx/wp-content/gallery/kochopengl/Pantallazo-.-copoKoch-3.png" title="Una instancias un poco rara del copo de Koch, es en realidad un anticopo de Koch" class="thickbox" rel="set_12" >
								<img title="Pantallazo-.-copoKoch-3.png" alt="Pantallazo-.-copoKoch-3.png" src="http://www.nemediano.com.mx/wp-content/gallery/kochopengl/thumbs/thumbs_Pantallazo-.-copoKoch-3.png" width="100" height="75" />
							</a>
		</div>
	</div>
	
		
 		
	<div id="ngg-image-90" class="ngg-gallery-thumbnail-box"  >
		<div class="ngg-gallery-thumbnail" >
			<a href="http://www.nemediano.com.mx/wp-content/gallery/kochopengl/Pantallazo-.-copoKoch-4.png" title="Una instancia con solo tres iteraciones del copo de Koch" class="thickbox" rel="set_12" >
								<img title="Pantallazo-.-copoKoch-4.png" alt="Pantallazo-.-copoKoch-4.png" src="http://www.nemediano.com.mx/wp-content/gallery/kochopengl/thumbs/thumbs_Pantallazo-.-copoKoch-4.png" width="100" height="75" />
							</a>
		</div>
	</div>
	
		
 		
	<div id="ngg-image-91" class="ngg-gallery-thumbnail-box"  >
		<div class="ngg-gallery-thumbnail" >
			<a href="http://www.nemediano.com.mx/wp-content/gallery/kochopengl/Pantallazo-.-copoKoch.png" title="Una instancia con cinco iteraciones del copo de Koch" class="thickbox" rel="set_12" >
								<img title="Pantallazo-.-copoKoch.png" alt="Pantallazo-.-copoKoch.png" src="http://www.nemediano.com.mx/wp-content/gallery/kochopengl/thumbs/thumbs_Pantallazo-.-copoKoch.png" width="100" height="75" />
							</a>
		</div>
	</div>
	
		
 	 	
	<!-- Pagination -->
 	<div class='ngg-clear'></div>
 	
</div>

<a href="http://www.facebook.com/share.php?u=http%3A%2F%2Fwww.nemediano.com.mx%2F2009%2Fprograma-del-copo-de-koch-en-opengl%2F&amp;t=Programa%20del%20copo%20de%20Koch%20en%20OpenGL" id="facebook_share_icon_153" style="font-size:11px; line-height:13px; font-family:'lucida grande',tahoma,verdana,arial,sans-serif; text-decoration:none;"><img src="http://b.static.ak.fbcdn.net/images/share/facebook_share_icon.gif" alt="Share on Facebook" /></a>
	<script type="text/javascript">
	var button = document.getElementById('facebook_share_link_153') || document.getElementById('facebook_share_icon_153') || document.getElementById('facebook_share_both_153') || document.getElementById('facebook_share_button_153');
	if (button) {
		button.onclick = function(e) {
			var url = this.href.replace(/share\.php/, 'sharer.php');
			window.open(url,'sharer','toolbar=0,status=0,width=626,height=436');
			return false;
		}
	
		if (button.id === 'facebook_share_button_153') {
			button.onmouseover = function(){
				this.style.color='#fff';
				this.style.borderColor = '#295582';
				this.style.backgroundColor = '#3b5998';
			}
			button.onmouseout = function(){
				this.style.color = '#3b5998';
				this.style.borderColor = '#d8dfea';
				this.style.backgroundColor = '#fff';
			}
		}
	}
	</script>
	]]></content:encoded>
			<wfw:commentRss>http://www.nemediano.com.mx/2009/programa-del-copo-de-koch-en-opengl/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
	</channel>
</rss>
