<?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; ubuntu</title>
	<atom:link href="http://www.nemediano.com.mx/tag/ubuntu/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>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>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>
		<item>
		<title>Jugando MAME en Ubuntu</title>
		<link>http://www.nemediano.com.mx/2008/jugando-mame-en-ubuntu/</link>
		<comments>http://www.nemediano.com.mx/2008/jugando-mame-en-ubuntu/#comments</comments>
		<pubDate>Thu, 17 Jul 2008 02:25:43 +0000</pubDate>
		<dc:creator>nemediano</dc:creator>
				<category><![CDATA[Recetario de Ubuntu]]></category>
		<category><![CDATA[alien vs predator]]></category>
		<category><![CDATA[arcade]]></category>
		<category><![CDATA[avsp.zip]]></category>
		<category><![CDATA[game]]></category>
		<category><![CDATA[gxmame]]></category>
		<category><![CDATA[instalar]]></category>
		<category><![CDATA[MAME]]></category>
		<category><![CDATA[rom]]></category>
		<category><![CDATA[ubuntu]]></category>
		<category><![CDATA[xmame]]></category>

		<guid isPermaLink="false">http://www.nemediano.com.mx/?p=45</guid>
		<description><![CDATA[Siempre me han gustado los videojuegos, en particular recuerdo que me gustaba mucho ir a las maquinitas (los arcades para los españoles) a jugar. Como que de alguna manera era mejor que jugar solo con tu consola en aquellos tiempos. Un cierto genero de juegos que me gustaba mucho era el denominado Bet &#8216;em Up, [...]]]></description>
			<content:encoded><![CDATA[<p>Siempre me han gustado los videojuegos, en particular recuerdo que me gustaba mucho ir a las maquinitas (los arcades para los españoles) a jugar. Como que de alguna manera era mejor que jugar solo con tu consola en aquellos tiempos.</p>
<p>Un cierto genero de juegos que me gustaba mucho era el denominado <a href="http://en.wikipedia.org/wiki/Beat_%27em_up" target="_blank">Bet &#8216;em Up</a>, tambien llamado <a href="http://en.wikipedia.org/wiki/Hack_and_slash" target="_blank">hack and slash</a>. Básicamente son los juegos de pelea de <em>uno contra muchos</em>. Un juego que era de mi particular agrado es el de <a href="http://en.wikipedia.org/wiki/Alien_vs._Predator_(arcade_game)" target="_blank">alien v.s. predator</a>.</p>
<p><span id="more-45"></span></p>
<p>Cuando era un usuario del lado obscuro de la fuerza, conocí un proyecto libre llamado <a href="http://en.wikipedia.org/wiki/MAME" target="_blank">MAME</a>, que por cierto es desarrollado en C. MAME es un emulador de maquinitas es decir que nos permite usar nuestra computadora como si de una de estas se tratara.</p>
<p>Dentro de la filosofía de MAME se debe de emular el hardware independientemente del juego en cuestión. Los juegos de las arcades eran chips es decir también hardware. De ahí que para jugar un juego de arcade en nuestra computadora debemos tener <strong>dos</strong> cosas un el <strong>juego o rom</strong> y un emulador. MAME es <strong>solamente el emulador</strong>.</p>
<h2>Instalando MAME en Ubuntu</h2>
<p>Lo primero que tenemos que hacer es instalar MAME, para esto instalamos los siguientes dos paquetes ya sea vía sinaptic, o aptitude. No recomiendo usar la utilería de quitar y añadir programas.</p>
<ul>
<li>xmame-common</li>
<li>xmame-sdl</li>
</ul>
<p>¿Que por que estos? Bueno el paquete <span style="text-decoration: underline;">xmame-common</span> contiene las utilerías necesarias para usar MAME y el paquete <span style="text-decoration: underline;">xmame-sdl</span> contiene los binarios de MAME. Los binarios de SDL no son los únicos binarios, también hay binarios de svga (<span style="text-decoration: underline;">xmame-svga</span>) y de x11 (<span style="text-decoration: underline;">xmame-x</span>). Cualquiera de ellos hace lo mismo y solo necesitamos tener <strong>uno</strong>, mi recomendación personal son los de SDL que en mi maquina fueron los únicos que funcionaron.</p>
<h2>Bajamos un rom para jugar.</h2>
<p>Hay muchos lugares en la red donde conseguir ROMS, a mi en lo personal me gustan mucho dos sitios: <a href="http://www.planetemu.net/" target="_blank">planet emu</a> y <a href="http://www.rom-world.com/" target="_blank">rom world</a>. ahora que si de veras queremos tener un montón de juegos podemos ver <a href="http://www.demonoid.com/files/details/1495688/10963416/" target="_blank">esta otra opción</a> :p</p>
<p>Bajemos el juego de Alien vs Predator de romworld, al buscarlo podemos ver que hay muchos roms que parecen ser el mismo juego.</p>
<p><a href="http://www.nemediano.com.mx/wp-content/uploads/2008/07/romdescarga.png"><img class="alignnone size-thumbnail wp-image-46" title="romdescarga" src="http://www.nemediano.com.mx/wp-content/uploads/2008/07/romdescarga.png" alt="Ejemplo de descarga de Rom" width="150" height="39" /></a></p>
<p>Generalmente un juego que salio en muchos países haya cambiado un poco de un país a otro, por eso hay as de un ROM, sin embargo casi siempre hay un ROM maestro con el juego y los demás solo contienen los cambios.</p>
<p>Para jugar necesitamos al menos el rom maestro, si queremos además alguna versión en especial también la bajamos. No hay manera segura de saber cual es el maestro, aunque casi siempre es el que mide mas, así que para seguir con el ejemplo anterior bajamos el de Europa. También notamos que nos avisan que este juego <strong>necesita de los ROMS de Neo Geo</strong> para poder jugarlo, algunos fabricantes como NEO GEO le cargaban un bios a las maquinas, estos bios eran necesarios para jugar juegos de esa compañía) así que los bajamos también.</p>
<p><a href="http://www.nemediano.com.mx/wp-content/uploads/2008/07/romejemplo.png"><img class="alignnone size-thumbnail wp-image-47" title="romejemplo" src="http://www.nemediano.com.mx/wp-content/uploads/2008/07/romejemplo.png" alt="Ejemplo de ROM de Alien vs Predator" width="150" height="131" /></a></p>
<h2>Instalamos los ROMS.</h2>
<p>Si estamos siguiendo el ejemplo debemos haber descargado al menos dos archivos: <span style="text-decoration: underline;">avsp.zip</span> y <span style="text-decoration: underline;">neogeo.zip</span>. Los ROM solo funcionan estando comprimidos así que no se les vaya a ocurrir descomprimirlos. La manera como le decimos a xmame que tenemos nuevos ROMS es moviéndolos a la carpeta donde el busca ROMS al arrancar, si estamos haciendo la instalación de default de Ubuntu eso es en <em>/usr/share/games/xmame/rom</em> que usualmente es una carpeta <strong>protegida de escritura</strong> así que para mover los ROMS podemos hacer lo siguiente:</p>
<p><code>sudo mv avsp.zip neogeo.zip /usr/share/games/xmame/rom/</code></p>
<h2>Probando que funcione el juego</h2>
<p>Para jugar un juego simplemente corremos el MAME desde la linea de comandos así:</p>
<p><code>xmame NOMBREROM</code><br />
Si queremos ser mas específicos le podemos decir el binario que queremos que ocupe (solo si tenemos mas de uno instalado), en el caso de mi ejemplo seria algo así:<br />
<code>xmame.SDL avsp.zip</code></p>
<p>No importa en donde estemos parados ya que xmame buscara el ROM en la carpeta de ROMS.</p>
<p>Ahora es posible que tengamos una bronca es decir que veamos que el juego corre en una <strong>ventanita chiquita</strong> que no podemos maximizar ni darle resize.</p>
<h2>Creando un archivo de configuración</h2>
<p>Xmame por default busca la configuración en un archivo de sistema, luego la busca en otro archivo <em>dentro de nuestro home</em>, así que para decirle que corre en pantalla completa vamos a usar ese archivo de configuración.</p>
<p>Primero necesitamos crearlo, para no tener problemas de sintaxis, lo podemos hacer todo en un paso con el siguiente comando:</p>
<p><code>xmame --showconfig &gt; ~/.xmame/xmamerc</code></p>
<p>Que manda la configuración actual al archivo xmamerc dentro de un directorio oculto de nuestro home. Luego nos ponemos a editar el archivo</p>
<p><code>gedit ~/.xmame/xmamerc</code></p>
<p>Y buscamos la linea:</p>
<pre>fullscreen              0</pre>
<p>Donde <strong>cambiamos</strong> el 0 por un 1, salvamos y listo podemos volver a correr el juego para ver el resultado.</p>
<h2>Poniendo un front end gráfico</h2>
<p>Alternativamente podemos usar un frontend, para usar mame. Hay algunos en los repositorios, a mi en lo personal no me gusto ninguno de ellos, así que mi humilde recomendación es usar uno que no viene en el repositorio gxmame.</p>
<p>Entramos a al <a href="http://gxmame.sourceforge.net/" target="_blank">sitio de gxmame</a> y bajamos la versión <span style="text-decoration: underline;">0.35beta2</span>, es <strong>importante</strong> señalar dos cosas. Uno, que la versión que ofrecen directamente de la pagina <strong>no es la que queremos</strong>, para bajar la <span style="text-decoration: underline;">0.35beta2</span> tenemos que irnos a la pagina de proyecto en surceforge, de ahí a donde dice download y de ahí buscar la ultima que es la <strong>0.35beta2</strong>, es importante por que la <span style="text-decoration: underline;">0.34</span> tiene un <strong>bug</strong> que le impide encontrar los ROMS. Dos, bajemos la <span style="text-decoration: underline;">gxmame_0.35beta2-1_i386.deb</span> por que es un binario que funciona en Debian/Ubuntu y nos hará mas sencilla la instalación. Luego simplemente instalamos el deb, como acostumbremos, una manera es:</p>
<p><code>sudo dpkg -i gxmame_0.35beta2-1_i386.deb</code></p>
<p>Y listo ahora vamos al menú <strong>Juegos</strong> y vemos que ya tenemos el <strong>gxmame</strong>, al ejecutarlo vemos una pantalla como esta:</p>
<p><a href="http://www.nemediano.com.mx/wp-content/uploads/2008/07/pantallazo-gxmame-arcade-machine-emulator.png"><img class="alignnone size-medium wp-image-48" title="pantallazo-gxmame-arcade-machine-emulator" src="http://www.nemediano.com.mx/wp-content/uploads/2008/07/pantallazo-gxmame-arcade-machine-emulator.png" alt="Pantallazo de gxmame" width="300" height="166" /></a></p>
<p>Antes de que vemos los juegos debemos hacer dos cosas, ir al menú <strong>Archivo</strong> y darle<strong> Audit all games</strong>. Con esto checa la integridad de nuestros roms para ver que sean compatibles y que esten completos. Cuando termine, debemos ir al menú <strong>Opciones</strong> y le damos <strong>reconstruir lista de juegos</strong>, cuando termine, podemos navegar con la barra lateral a donde dice Disponibles, y ahora si debemos de ver nuestro juego listo para usarse, simplemente lo seleccionamos y le damos <strong>Play Game</strong>.</p>
<h2>Algunos tips</h2>
<p>Una ves corriendo el juego, lo minimo que necesitan saber es los siguiente:</p>
<ul>
<li>Con el botón de <span style="text-decoration: underline;">Tab</span>, pueden ver la opciones, Y en<strong> Input this game</strong>, pueden configurar los botones a usar.</li>
<li>Con el botón de <span style="text-decoration: underline;">Esc</span> salen del juego.</li>
</ul>
<a href="http://www.facebook.com/share.php?u=http%3A%2F%2Fwww.nemediano.com.mx%2F2008%2Fjugando-mame-en-ubuntu%2F&amp;t=Jugando%20MAME%20en%20Ubuntu" id="facebook_share_icon_45" 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_45') || document.getElementById('facebook_share_icon_45') || document.getElementById('facebook_share_both_45') || document.getElementById('facebook_share_button_45');
	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_45') {
			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/2008/jugando-mame-en-ubuntu/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Instalar SVN como modulo de Apache, con SSL y autentificación básica, en Ubuntu</title>
		<link>http://www.nemediano.com.mx/2007/instalar-svn-como-modulo-de-apache-con-ssl-y-autentificacion-basica-en-ubuntu/</link>
		<comments>http://www.nemediano.com.mx/2007/instalar-svn-como-modulo-de-apache-con-ssl-y-autentificacion-basica-en-ubuntu/#comments</comments>
		<pubDate>Wed, 19 Dec 2007 22:04:04 +0000</pubDate>
		<dc:creator>nemediano</dc:creator>
				<category><![CDATA[Computación]]></category>
		<category><![CDATA[Mis demonios]]></category>
		<category><![CDATA[Recetario de Ubuntu]]></category>
		<category><![CDATA[apache]]></category>
		<category><![CDATA[instalar]]></category>
		<category><![CDATA[modulo]]></category>
		<category><![CDATA[ssl]]></category>
		<category><![CDATA[subversion]]></category>
		<category><![CDATA[svn]]></category>
		<category><![CDATA[ubuntu]]></category>

		<guid isPermaLink="false">http://nemediano.wordpress.com/2007/12/19/instalar-svn-como-modulo-de-apache-con-ssl-y-autentificacion-basica-en-ubuntu/</guid>
		<description><![CDATA[Pues hace un rato que aprendimos a hacer este tipo de instalación en la Unidad y como se me hace algo útil, muy practico, y que a veces no es trivial de hacer, me decidí a escribir este tutorial. Estoy muy basado en el tutorial que escribió Viktor Zigo Suponemos que la instalación se va [...]]]></description>
			<content:encoded><![CDATA[<p style="margin-bottom:0;">Pues hace un rato que aprendimos a hacer este tipo de instalación en la Unidad y como se me hace algo útil, muy practico, y que a veces no es trivial de hacer, me decidí a escribir este tutorial. Estoy muy basado en el <a title="alephzarro" href="http://alephzarro.com/blog/2007/01/07/installation-of-subversion-on-ubuntu-with-apache-ssl-and-basicauth/" target="_blank">tutorial</a> que escribió <em><span style="font-style:normal;">Viktor Zigo</span></em></p>
<ul>
<li> Suponemos que la instalación se va a realizar en Ubuntu, esto significa que el servidor va a  vivir en Ubuntu.</li>
<li> Que queremos que los repositorios  sean visibles vía web, que el servidor web sea Apache de la 	rama 2.x (Subversión tiene su propio servidor, nosotros mejor 	ocuparemos Apache).</li>
<li> Que el protocolo para comunicarse  sea SSL, la información viaje encriptada (es decir que el URL  sea https://algo).</li>
<li> Que se podría hospedar mas de un repositorio.</li>
<li> Que para conectarse un usuario 	tenga que proporcionar un password.</li>
<li> Que tengamos políticas de acceso, es decir que no todos los usuarios puedan ver todas las carpetas, habrá algunos que puedan ver, otros que puedan escribir, y a cada carpeta le podemos poner diferentes atributos (permisos).</li>
</ul>
<p><span id="more-30"></span></p>
<p style="margin-bottom:0;">Cuando aprendimos a hacer esta instalación leímos el tutorial de Viktor Zigo, que esta libre bajo una licencia Creative Commons, sin embargo me decido a aumentar algunas cosas como la política de acceso, además dado que no hay mucha documentación en español sobre este tema, me imagino que este documento le ayudara a alguien.</p>
<h2 class="western">Paquetes necesarios</h2>
<p style="margin-bottom:0;">Hay que instalar, o verificar que estén instalados los siguientes paquetes:</p>
<ul>
<li> subversion</li>
<li> libapache2-svn</li>
<li> libapache-mod-dav</li>
<li> apache2</li>
</ul>
<p>En ubuntu 7.10 el paquete  libapache-mod-dav, no existe simplemente continuamos sin el pues mod-dav ya esta incluido en apache2</p>
<h2 class="western">Habilitar el modulo de SSL en apache</h2>
<p style="margin-bottom:0;">Para hacer este paso primero hay que habilitar el modulo de apache que deja comunicarse via SSL, luego hay que editar un archivo de configuración de apache para decirle que escuche por el puerto 443, que es el default de SSL</p>
<h3 class="western">Habilitar el modulo de apache2 de SVN</h3>
<p><code>sudo a2enmod ssl</code></p>
<h3 class="western">Editar el archivo de configuración /etc/apache2/ports.conf del apache.</h3>
<p style="margin-bottom:0;">Agregando al final la linea: “Listen 443”. Es decir deben haber dos lineas, la del 80 y la del 443</p>
<p style="margin-bottom:0;"><strong>Nota</strong> me acabo de dar cuenta de que en Ubuntu 7.10, no es necesaria la edición del archivo, pues el comando anterior a2enmod, <strong>ya edita</strong> el archivo por nosotros, lo que se debe de hacer es fijarnos en este archivo y que escuche el 443.</p>
<h2 class="western">Generar un certificado</h2>
<p style="margin-bottom:0;">Para hacer un certificado hay que ocupar una herramienta, desde Ubuntu Festy en adelante esta herramienta es: <strong>make-ssl-cert</strong>, antes de eso la herramienta era: apache2-ssl-certificate.</p>
<p style="margin-bottom:0;">Sea cual sea el caso, hay que hacer un certificado, el certificado es un archivo .pes y una llave, que es un archivo con números raros de nombre.</p>
<p style="margin-bottom:0;">Para hacer el certificado la herramienta nos hace algunas preguntas, como quienes somos, donde se ubica el servidor físicamente, a que organización pertenecemos, etc.</p>
<p style="margin-bottom:0;">Es importante usar el nombre real de nuestro servidor, cuando lo pida, por que de lo contrario cada vez que un usuario quiera acceder al repositorio, su cliente le marcara un warning diciendo que el servidor y el emisor del certificado no corresponden.</p>
<p style="margin-bottom:0;">Si el servidor va a ser accesible por un dominio, el dominio es el nombre del servidor, si va a ser accedido por una IP fija, la IP es el nombre del servidor, si va a ser accedido dentro de una red interna el nombre en la red de la maquina es el nombre del servidor.</p>
<p style="margin-bottom:0;">La herramienta debe generar ambos archivos el <em>apache.pem</em> y el de la llave, lo mas recomendable es que estos se encuentren en la carpeta ssl, dentro de la carpeta de apache. Puede que sea necesario que nosotros tengamos que mover los archivos manualmente.</p>
<p style="margin-bottom:0;">La herramienta antes de Festy 7.04 se usaba asi:</p>
<p><code>sudo apache2-ssl-certificate</code></p>
<p style="margin-bottom:0;">Desde Festy en adelante se usa así:</p>
<p><code>sudo /usr/sbin/make-ssl-cert /usr/share/ssl-cert/ssleay.cnf /etc/apache2/ssl/apache.pem</code></p>
<p style="margin-bottom:0;">En donde el primer argumento es el comando a invocar en este caso <em>make-ssl-cert</em>, el segundo es una plantilla de certificado en este caso se ubica en  /<em>usr/share/ssl-cert/ssleay.cnf</em>, y el tercero el lugar donde se pone el certificado /<em>etc/apache2/ssl/apache.pem</em>. Es decir que lo único que podría cambiar es el tercer argumento aunque no se recomienda. Es importante que <strong>antes</strong> se cree la carpeta donde va a vivir el certificado</p>
<h2 class="western">Crear un host virtual</h2>
<p style="margin-bottom:0;">En apache2 hay posibilidad de que un solo servidor maneje muchos sitios, lo mas recomendable es hacer un sitio aparte para nuestros repositorios de SVN.</p>
<p style="margin-bottom:0;">Copiamos el sitio de default, para ocuparlo de plantilla</p>
<p><code>sudo cp /etc/apache2/sites-available/default /etc/apache2/sites-available/$NOMBRESITIO</code></p>
<p style="margin-bottom:0;">En donde $NOMBRESITIO, es el nombre que queremos que tenga nuestro sitio que maneja los repositorios. por ejemplo podemos ponerle repos.</p>
<h3>Editamos configuración del sitio</h3>
<p style="margin-bottom:0;">Abrimos con nuestro editor de textos plano favorito el recién creado archivo de configuración del sitio y lo editamos:</p>
<p style="margin-bottom:0;">Cambiamos la parte que dice:</p>
<p><code>NameVirtualHost *<br />
&lt;VirtualHost *&gt;</code></p>
<p style="margin-bottom:0;">Por:</p>
<p><code>NameVirtualHost *:443<br />
&lt;VirtualHost *:443&gt;</code></p>
<p style="margin-bottom:0;">Y añadimos las siguientes lineas:</p>
<p><code><br />
SSLEngine on<br />
SSLCertificateFile /etc/apache2/ssl/apache.pem<br />
SSLProtocol all<br />
SSLCipherSuite HIGH:MEDIUM</code></p>
<p style="margin-bottom:0;">Dentro de las etiquetas <em>VirtualHost</em>, pero fuera de cualquier etiqueta <em>Directory</em></p>
<p style="margin-bottom:0;">Habilitamos el nuevo host virtual</p>
<p style="margin-bottom:0;">Primero le decimos a apache que ya hay un nuevo sitio</p>
<p><code>sudo a2ensite $NOMBRESITIO</code></p>
<p style="margin-bottom:0;">Y reiniciamos apache</p>
<p><code>sudo /etc/init.d/apache2 restart</code></p>
<p style="margin-bottom:0;">Si hubo errores al editar el archivo, ahora se quejara, corregimos hasta que apache arranque, si hay un warning de que no puede determinar el nombre de dominio calificado, es normal.</p>
<p style="margin-bottom:0;">Y se puede arreglar añadiendo ServerName $NOMBREDELSERVIDOR al archivo de configuración principal de apache: <em>/etc/apache2/apache2.conf</em> (el nombre del servidor es el nombre de la maquina que lo hospeda)</p>
<h2 class="western">Creando los repositorios:</h2>
<p style="margin-bottom:0;">Suponemos que queremos tener varios repositorios, creamos una carpeta donde ponerlos todos, un buen lugar para hacerlo es en: <em>/var/svn</em>, luego hacemos los repositorios y le cambiamos los permisos a los repositorios para que el usuario de apache (<em>www-data</em>), tenga total control sobre ellos.</p>
<p style="margin-bottom:0;">Por ejemplo:</p>
<p><code>sudo mkdir /var/svn<br />
sudo svnadmin create /var/svn/$REPOS<br />
sudo chown -R www-data:www-data /var/svn/$REPOS<br />
sudo chmod -R g+ws /var/svn/$REPOS</code></p>
<p style="margin-bottom:0;">Donde $REPOS, es el nombre del repositorio a crear, se pueden hacer varios repositorios. Que deberían vivir bajo la mima carpeta, en este caso <em>/var/svn</em>.</p>
<h2 class="western">Agregar usuarios al repositorio</h2>
<p style="margin-bottom:0;">Para que un usuario pueda consultar el repositorio, debe de tener un password, el encargado de hacer la validación sera Apache, y la manera como lo hará sera verificando que el usuario y el password, estén en un archivo de texto plano.</p>
<h3>Creando el archivo de password</h3>
<p style="margin-bottom:0;">Hay que ocupar la herramienta <strong>htpasswd</strong>, en versiones de Ubuntu anteriores a 7.04, la herramienta se llama htpasswd2, ambas son la misma herramienta, solo le quitaron el 2, en el nombre, así que es cuestión de usar el que nos corresponda.</p>
<p style="margin-bottom:0;">Ejemplo:</p>
<p><code>sudo htpasswd -c -m /etc/apache2/svn-auth-file $NOMBREUSUARIO</code></p>
<p style="margin-bottom:0;">En este momento nos preguntara cual va a ser el password del para el usuario $NOMBREDEUSUARIO y se crea el archivo de nombre <em>svn-auth-file</em>. El nombre del archivo puede ser cualquiera pero se sugiere algo que nos recuerde que son los passwords del svn, y puede vivir en cualquier lado, pero se recomienda que viva donde el apache lo hace.</p>
<p style="margin-bottom:0;">El modificador -c, es para que cree el archivo de passwords y el modificador -m para que encripte el password.</p>
<p style="margin-bottom:0;"><strong>Importante:</strong> Si queremos agregar un nuevo usuario usamos el comando <strong>sin</strong> el modificador -c y lo apuntamos al archivo que ya creamos, de esta manera los passwords de ambos usuarios están guardados en el mismo archivo. En nuestro ejemplo seria:</p>
<p><code>sudo htpasswd -m /etc/apache2/svn-auth-file $NOMBRENUEVOUSUARIO</code></p>
<h2 class="western">Agregando políticas de acceso</h2>
<p style="margin-bottom:0;">Vamos a hacer una archivo de control de acceso, lo mas simple es usar como plantilla alguno de los que viene en cualquier repositorio. Por ejemplo podemos ir al repositorio que acabamos de hacer y dentro de su directorio <em>conf</em>, hay un archivo de ejemplo: <em>authz</em></p>
<p style="margin-bottom:0;">Podemos tomar este archivo de ejemplo como plantilla. Y copiarlo al directorio de apache, cambiarle por los permisos adecuados y después editarlo con nuestras preferencias. Podemos ponerle cualquier nombre yo aquí lo llamo <em>svn-authz-file</em>.</p>
<p><code>sudo cp /var/svn/$REPOS/conf/authz /etc/apache2/svn-authz-file<br />
sudo chmod 644  /etc/apache2/svn-authz-file<br />
sudo gedit /etc/apache2/svn-authz-file</code></p>
<p style="margin-bottom:0;">Editar el archivo no es difícil y podemos ver que la plantilla ya trae un ejemplo con la sintaxis. Yo por ejemplo solo le agrego algo como esto:</p>
<p><code>[$REPOS:/]<br />
$NOMBREUSUARIO = rw<br />
$NOMBRENUEVOUSUARIO = r</code><br />
En donde $NOMBREUSUARIO puede leer y escribir el repositorio $REPOS y $NOMBRENUEVOUSUARIO solo puede leerlo.</p>
<h2>Poniendo todas las opciones de configuración a nuestro repositorio</h2>
<p style="margin-bottom:0;">Ahora solo resta decirle a apache que sirva de interfaz a nuestro repositorio con todas las opciones que le acabamos de dar.</p>
<p style="margin-bottom:0;">Para hacer esto editamos el archivo <em>dav_svn_conf</em> que se encuentra dentro de la carpeta <em>mods-available</em> del directorio de apache.</p>
<p><code>sudo gedit /etec/apache2/mods-available/dav_svn_conf</code></p>
<p style="margin-bottom:0;">Este archivo tiene de nuevo un ejemplo de llenado, cada repositorio tiene sus opciones dentro de las etiquetas <em>location</em>. Podemos repetir la que ya tiene por defecto y agregarle nuestras opciones.</p>
<p><code>&lt;Location /<strong>$REPOS</strong>&gt;<br />
DAV svn<br />
# our access control policy<br />
AuthzSVNAccessFile <strong>/etc/apache2/svn-authz-file</strong><br />
SVNPath "<strong>/var/svn/$REPOS</strong>"<br />
AuthType Basic<br />
AuthName "Subversion repository"<br />
AuthUserFile <strong>/etc/apache2/svn-auth-file</strong><br />
Require valid-user<br />
<strong>SSLRequireSSL</strong><br />
&lt;/Location&gt;</code></p>
<p style="margin-bottom:0;">De estas opciones debemos modificar dentro de la etiqueta de apertura de <em>location</em> el nombre de nuestro repositorio. En donde dice <strong>SVPath</strong> ponemos el lugar donde esta el repositorio. En la opción de  <em>AuthzSVNAccessFile</em> el archivo que creamos de políticas de control de acceso. Y en la opción de <em>AuthUserFile</em> el archivo donde están las contraseñas de los usuarios. No olvidemos añadir tambien la linea <strong>SSLRequireSSL</strong></p>
<h2>Reiniciamos apache</h2>
<p style="margin-bottom:0;">Por ultimo para que todos los cambios surtan efecto:</p>
<p><code>sudo /etc/init.d/apache2 restart</code></p>
<p style="margin-bottom:0;">Si algún archivo no quedo bien editado ahora se quejara, de no ser así podemos proceder a probarlo:</p>
<p style="margin-bottom:0;">Abrimos nuestro navegador web favorito y visitamos las dirección http://localhost/$REPOS y debe de contestarnos algo así como 403: Forbiden. Ahora visitamos el sitio http<strong>s</strong>://localhost/$REPOS y debe pedirnos usuario y contraseña, en caso de que la contraseña sea incorrecta o que el usuario que introducimos no tenga permiso de lectura sobre $REPOS volverá a contestarnos 403: Forbiden.</p>
<p style="margin-bottom:0;">Si el usuario se autentifica correctamente y tiene los permisos necesarios, debe mostrarnos el repositorio si aun no hemos hecho ningún import o commit, debe ser un repositorio vacío en la revisión 0.</p>
<p style="margin-bottom:0;">He probado que estos pasos funcionan en Ubuntu 6.10, 7.04 y 7.10</p>
<h2>Mas conocimientos</h2>
<p style="margin-bottom:0;">Recuerden que el mejor lugar para aprender mas de subversion es el <a href="http://svnbook.red-bean.com/">libro oficial</a>, que ademas es libre y existe una traducción al español.</p>
<a href="http://www.facebook.com/share.php?u=http%3A%2F%2Fwww.nemediano.com.mx%2F2007%2Finstalar-svn-como-modulo-de-apache-con-ssl-y-autentificacion-basica-en-ubuntu%2F&amp;t=Instalar%20SVN%20como%20modulo%20de%20Apache%2C%20con%20SSL%20y%20autentificaci%C3%B3n%20b%C3%A1sica%2C%20en%20Ubuntu" id="facebook_share_icon_30" 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_30') || document.getElementById('facebook_share_icon_30') || document.getElementById('facebook_share_both_30') || document.getElementById('facebook_share_button_30');
	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_30') {
			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/2007/instalar-svn-como-modulo-de-apache-con-ssl-y-autentificacion-basica-en-ubuntu/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Como hacer Makefiles para programar en OpenGL y glut</title>
		<link>http://www.nemediano.com.mx/2007/como-hacer-makefiles-para-programar-en-opengl-y-glut/</link>
		<comments>http://www.nemediano.com.mx/2007/como-hacer-makefiles-para-programar-en-opengl-y-glut/#comments</comments>
		<pubDate>Sat, 01 Sep 2007 15:37:22 +0000</pubDate>
		<dc:creator>nemediano</dc:creator>
				<category><![CDATA[Computación]]></category>
		<category><![CDATA[Mis demonios]]></category>
		<category><![CDATA[Recetario de Ubuntu]]></category>
		<category><![CDATA[c]]></category>
		<category><![CDATA[geany]]></category>
		<category><![CDATA[glut]]></category>
		<category><![CDATA[makefile]]></category>
		<category><![CDATA[opengl]]></category>
		<category><![CDATA[ubuntu]]></category>

		<guid isPermaLink="false">http://nemediano.wordpress.com/2007/09/01/como-hacer-makefiles-para-programar-en-opengl-y-glut/</guid>
		<description><![CDATA[Bueno en el post pasado aprendimos como instalar el compilador y las librerías(bibliotecas para los puristas del idioma) en Ubuntu, para poder hacer nuestros propios programas de OpeGL y glut. Supongo que si estas leyendo esto es que todavía no sabes muy bien como programar en OpenGL y probablemente quieres un entorno de desarrollo medio [...]]]></description>
			<content:encoded><![CDATA[<p>Bueno en el post pasado aprendimos como instalar el compilador y las librerías(bibliotecas para los puristas del idioma) en Ubuntu, para poder hacer nuestros propios programas de OpeGL y glut. Supongo que si estas leyendo esto es que todavía no sabes muy bien como programar en OpenGL y probablemente quieres un entorno de desarrollo medio amigable para hacer todo el show de codifico, intento compilar, corrijo errores, va de nuevo.Lo mas recomendable para hacer esto es construir un makefile (por eso en el post pasado instalamos el paquete build-essentials).<span id="more-21"></span></p>
<p>El makefile es un archivo de texto plano, que usa la herramienta make, dicho archivo debe ser escrito por el desarrollador y dice como se compila el programa que escribió. Usualmente los makefiles son complejos y contienen un montón de reglas, sin embargo nosotros <strong>nos vamos a limitar a tres</strong>: una para compilar, una para limpiar y otra para reconstruir.</p>
<p>Así que abrimos nuestro editor de texto plano favoritos y construimos un archivo que tenga por nombre makefile (el nombre es muy importante).</p>
<p>Si nuestro programa solo va tener un archivo fuente esta sera nuestra plantilla:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
</pre></td><td class="code"><pre class="make" style="font-family:monospace;">LIBDIR <span style="color: #004400;">=</span> <span style="color: #004400;">-</span>L<span style="color: #004400;">/</span>usr<span style="color: #004400;">/</span>X11R6<span style="color: #004400;">/</span>lib
CC <span style="color: #004400;">=</span> gcc
CFLAGS <span style="color: #004400;">=</span> <span style="color: #004400;">-</span>Wall
LIBRARIES <span style="color: #004400;">=</span> <span style="color: #004400;">-</span>lglut <span style="color: #004400;">-</span>lGL <span style="color: #004400;">-</span>lGLU <span style="color: #004400;">-</span>lm
ejecutable<span style="color: #004400;">:</span> fuente<span style="color: #004400;">.</span>c
	<span style="color: #004400;">$</span><span style="color: #004400;">&#40;</span><span style="color: #000088;">CC</span><span style="color: #004400;">&#41;</span> <span style="color: #004400;">$</span><span style="color: #004400;">&#40;</span><span style="color: #000088;">CFLAGS</span><span style="color: #004400;">&#41;</span> <span style="color: #004400;">-</span>o <span style="color: #000088; font-weight: bold;">$@</span> <span style="color: #004400;">$</span><span style="color: #004400;">&#40;</span><span style="color: #000088;">LIBDIR</span><span style="color: #004400;">&#41;</span> <span style="color: #000088; font-weight: bold;">$?</span> <span style="color: #004400;">$</span><span style="color: #004400;">&#40;</span><span style="color: #000088;">LIBRARIES</span><span style="color: #004400;">&#41;</span>
destroy<span style="color: #004400;">:</span>
	rm <span style="color: #004400;">-</span>f <span style="color: #004400;">*.</span>o ejecutable
clean<span style="color: #004400;">:</span>
	rm <span style="color: #004400;">-</span>f <span style="color: #004400;">*.</span>o</pre></td></tr></table></div>

<p>En donde <em>ejecutable</em> es el nombre que queremos que tenga nuestro archivo ejecutable y <em>fuente</em> es el nombre de nuestro <strong>único</strong> archivo fuente.</p>
<p>Analizando un poco vemos que el makefile define unas variables en las primeras lineas, y luego define unas reglas, las reglas siempre son de la forma:</p>
<p>[objetivo]: [dependencia]<br />
[comandos]</p>
<p>Donde <em>objetivo</em> es el nombre de la operación que queremos hacer, <em>dependencia</em> es todo lo que necesitamos para llevarla a acabo y <em>comandos</em> es lo que debemos hacer para llevar a cabo la operación.</p>
<p>Las reglas que defino son <em>ejecutable</em> que sirve para hacer el ejecutable, <em>clean</em> que sirve para borrar todos los los archivos intermedios que hace el compilador (por ejemplo los .o) y <em>destroy</em> que borra todo lo que hace el compilador y nos deja listos para intentar compilar de nuevo (por ejemplo en nuestro periodo de ensayo error).</p>
<p>Se observa que uso gcc como compilador, por que el lenguaje C es usualmente nuestro default, si piensan programar en c++, cambien gcc por g++. Tambien fijense que entra las librerías mando a GL a GLU y a glut, que es por que queremos hacer un programa de OpenGL con glut, pero además mando un misterioso -lm, estas son as demás librerías de default de C, por ejemplo si en nuestro programa queremos usar funciones definidas en math.h.</p>
<p>Si queremos hacer un programa con mas de un código fuente esta es otra plantilla:</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
</pre></td><td class="code"><pre class="make" style="font-family:monospace;">LIBDIR <span style="color: #004400;">=</span> <span style="color: #004400;">-</span>L<span style="color: #004400;">/</span>usr<span style="color: #004400;">/</span>X11R6<span style="color: #004400;">/</span>lib
CC <span style="color: #004400;">=</span> gcc
CFLAGS <span style="color: #004400;">=</span> <span style="color: #004400;">$</span><span style="color: #004400;">&#40;</span><span style="color: #000088;">COMPILERFLAGS</span><span style="color: #004400;">&#41;</span>
LIBRARIES <span style="color: #004400;">=</span> <span style="color: #004400;">-</span>lglut <span style="color: #004400;">-</span>lGL <span style="color: #004400;">-</span>lGLU <span style="color: #004400;">-</span>lm
OBJ <span style="color: #004400;">=</span> fuente1<span style="color: #004400;">.</span>o fuente2<span style="color: #004400;">.</span>o fuente3<span style="color: #004400;">.</span>o fuente4<span style="color: #004400;">.</span>o
BIN <span style="color: #004400;">=</span> ejecutable
&nbsp;
all<span style="color: #004400;">:</span> <span style="color: #004400;">$</span><span style="color: #004400;">&#40;</span><span style="color: #000088;">BIN</span><span style="color: #004400;">&#41;</span>
<span style="color: #004400;">$</span><span style="color: #004400;">&#40;</span><span style="color: #000088;">BIN</span><span style="color: #004400;">&#41;</span> <span style="color: #004400;">:</span> <span style="color: #004400;">$</span><span style="color: #004400;">&#40;</span><span style="color: #000088;">OBJ</span><span style="color: #004400;">&#41;</span>
	<span style="color: #004400;">$</span><span style="color: #004400;">&#40;</span><span style="color: #000088;">CC</span><span style="color: #004400;">&#41;</span> <span style="color: #004400;">$</span><span style="color: #004400;">&#40;</span><span style="color: #000088;">CFLAGS</span><span style="color: #004400;">&#41;</span> <span style="color: #004400;">-</span>o <span style="color: #000088; font-weight: bold;">$@</span> <span style="color: #004400;">$</span><span style="color: #004400;">&#40;</span><span style="color: #000088;">LIBDIR</span><span style="color: #004400;">&#41;</span> <span style="color: #000088; font-weight: bold;">$?</span> <span style="color: #004400;">$</span><span style="color: #004400;">&#40;</span><span style="color: #000088;">LIBRARIES</span><span style="color: #004400;">&#41;</span>
&nbsp;
fuente1<span style="color: #004400;">.</span>o<span style="color: #004400;">:</span> fuente1<span style="color: #004400;">.</span>c
	<span style="color: #004400;">$</span><span style="color: #004400;">&#40;</span><span style="color: #000088;">CC</span><span style="color: #004400;">&#41;</span> <span style="color: #004400;">-</span>c fuente1<span style="color: #004400;">.</span>c <span style="color: #004400;">-</span>o fuente1<span style="color: #004400;">.</span>o <span style="color: #004400;">$</span><span style="color: #004400;">&#40;</span><span style="color: #000088;">CFLAGS</span><span style="color: #004400;">&#41;</span>
&nbsp;
fuente2<span style="color: #004400;">.</span>o<span style="color: #004400;">:</span> fuente2<span style="color: #004400;">.</span>c
	<span style="color: #004400;">$</span><span style="color: #004400;">&#40;</span><span style="color: #000088;">CC</span><span style="color: #004400;">&#41;</span> <span style="color: #004400;">-</span>c fuente2<span style="color: #004400;">.</span>c <span style="color: #004400;">-</span>o fuente2<span style="color: #004400;">.</span>o <span style="color: #004400;">$</span><span style="color: #004400;">&#40;</span><span style="color: #000088;">CFLAGS</span><span style="color: #004400;">&#41;</span>
&nbsp;
fuente3<span style="color: #004400;">.</span>o<span style="color: #004400;">:</span> fuente3<span style="color: #004400;">.</span>c
	<span style="color: #004400;">$</span><span style="color: #004400;">&#40;</span><span style="color: #000088;">CC</span><span style="color: #004400;">&#41;</span> <span style="color: #004400;">-</span>c fuente3<span style="color: #004400;">.</span>c <span style="color: #004400;">-</span>o fuente3<span style="color: #004400;">.</span>o <span style="color: #004400;">$</span><span style="color: #004400;">&#40;</span><span style="color: #000088;">CFLAGS</span><span style="color: #004400;">&#41;</span>
&nbsp;
fuente4<span style="color: #004400;">.</span>o<span style="color: #004400;">:</span> fuente4<span style="color: #004400;">.</span>c
	<span style="color: #004400;">$</span><span style="color: #004400;">&#40;</span><span style="color: #000088;">CC</span><span style="color: #004400;">&#41;</span> <span style="color: #004400;">-</span>c fuente4<span style="color: #004400;">.</span>c <span style="color: #004400;">-</span>o fuente4<span style="color: #004400;">.</span>o <span style="color: #004400;">$</span><span style="color: #004400;">&#40;</span><span style="color: #000088;">CFLAGS</span><span style="color: #004400;">&#41;</span>
&nbsp;
destroy<span style="color: #004400;">:</span>
	rm <span style="color: #004400;">-</span>f <span style="color: #004400;">$</span><span style="color: #004400;">&#40;</span><span style="color: #000088;">OBJ</span><span style="color: #004400;">&#41;</span> <span style="color: #004400;">$</span><span style="color: #004400;">&#40;</span><span style="color: #000088;">BIN</span><span style="color: #004400;">&#41;</span>
clean<span style="color: #004400;">:</span>
	rm <span style="color: #004400;">-</span>f <span style="color: #004400;">$</span><span style="color: #004400;">&#40;</span><span style="color: #000088;">OBJ</span><span style="color: #004400;">&#41;</span></pre></td></tr></table></div>

<p>En donde <em>fuente1</em>, &#8230; <em>fuentei</em>, son todos los archivos fuentes que componen el programa y <em>ejecutable</em> es el nombre del ejecutable.</p>
<h2><strong>Ahora lo importante:</strong></h2>
<p>Es ampliamente recomendado tener una carpeta donde guardar todo lo referente a nuestro programa y solo eso, es decir mi fuente y mi makefile deben estar en una carpeta para ellos solos (esto para facilitar su transporte) y que no se vayan a volar algo sin querer al escribir una regla mal del make XD<br />
Para compilar nuestro programa simplemente escribimos en la linea de comandos &#8220;make&#8221;: (obviamente debemos estar parados en el directorio donde esta todo):</p>
<pre>$make</pre>
<p>Si nuestro programa compilo correctamente genero el archio ejecutable, <span style="text-decoration: underline;">pero si tuvimos errores, veremos los errores y warnings en la shell</span> y debemos de hacer los siguiente:<br />
ejecutar <strong>make destroy</strong>, para limpiar toda al basura generada por la compilación fallida, corregir nuestro fuente y luego volver a intentar compilar.</p>
<pre>$make destroy<strong> </strong></pre>
<h2>Algunas observaciones:</h2>
<ul>
<li>Estos makefiles son solo recomendaciones y de hecho no siguen las reglas GNU de los makefiles, para aprender mas de eso pueden visitar: http://www.gnu.org/software/make/</li>
<li>Para escribir este post me base en la guia publicada por el area de linux de la fesa, quizas si le dan un ojo les quede mas claro http://www.acatlan.unam.mx/linux/graficacion/compilalinux.html</li>
<li>Si nuestro fuente tiene cabeceras por ejemplo cabecera.h, estas no necesitan ser compiladas y por lo tanto no se ponen en el make, basta que en el fuente sean usadas #include, Siempre que la cabecera no tenga código en C, si no mas bien declaraciones de estructuras y variables globales (que es como debe ser).</li>
</ul>
<a href="http://www.facebook.com/share.php?u=http%3A%2F%2Fwww.nemediano.com.mx%2F2007%2Fcomo-hacer-makefiles-para-programar-en-opengl-y-glut%2F&amp;t=Como%20hacer%20Makefiles%20para%20programar%20en%20OpenGL%20y%20glut" id="facebook_share_icon_21" 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_21') || document.getElementById('facebook_share_icon_21') || document.getElementById('facebook_share_both_21') || document.getElementById('facebook_share_button_21');
	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_21') {
			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/2007/como-hacer-makefiles-para-programar-en-opengl-y-glut/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>
