tag:blogger.com,1999:blog-47171530293517036782024-03-13T12:47:57.353-06:00Esteban GonzálezAnonymoushttp://www.blogger.com/profile/02234142471203536128noreply@blogger.comBlogger36125tag:blogger.com,1999:blog-4717153029351703678.post-23747697766557009732011-07-14T09:10:00.005-05:002011-07-14T09:47:38.003-05:00Fibonacci recursivo - Mala idea<div id="entrada"><div class="encabezado">Algoritmos Computacionales </div><br />
Ya sabemos que hacer Fibonacci en lenguaje C esta muy repetitivo, pero ahora vengo a intentar mostrarles el porque es muy mala idea querer hacer la serie en forma recursiva.<br />
<br />
En la siguiente imagen muestro el código para la serie de Fibonacci en forma recursiva. Lo que he agregado es un contador dentro de la función "fibo" para conocer al final cuantas veces se manda a llamar y así tener un punto de comparación con la forma iterativa.<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiw5-RlDKgwNQz6neJz3WjlHrEvLG5OL_BKsJMxKBpv2SnYSqmiytxoJgAeii9oBb_ZP6V7_VLIA3sKQzTZGGkhOylz_G7sPqWLhY1PCAkhuABioJTodrfOfqI63NZTFu249NhWNZJaHbqQ/s1600/fibo-01.png" imageanchor="1" style="margin-left:1em; margin-right:1em"><img border="0" height="400" width="346" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiw5-RlDKgwNQz6neJz3WjlHrEvLG5OL_BKsJMxKBpv2SnYSqmiytxoJgAeii9oBb_ZP6V7_VLIA3sKQzTZGGkhOylz_G7sPqWLhY1PCAkhuABioJTodrfOfqI63NZTFu249NhWNZJaHbqQ/s400/fibo-01.png" /></a></div><br />
También en la forma iterativa agregue un contador, que en realidad no se necesitaba por el hecho de ser iterativo, pero lo pongo al igual que en recursivo para conocer las veces que se repite el proceso.<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiGpHwJF78N7crsw3YYzuqBYVQGpazqzpu1HgRGxZaZXJmwIQL0MTGCz2BiI5jsyoLLLkY5Bqt-SED6yAPifmWGmSEgtx9TtVnwMp373yKe5Ztfxg__omZeq4RA80ss5xZ5SDM5tKQm4Sym/s1600/fibo-02.png" imageanchor="1" style="margin-left:1em; margin-right:1em"><img border="0" height="369" width="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiGpHwJF78N7crsw3YYzuqBYVQGpazqzpu1HgRGxZaZXJmwIQL0MTGCz2BiI5jsyoLLLkY5Bqt-SED6yAPifmWGmSEgtx9TtVnwMp373yKe5Ztfxg__omZeq4RA80ss5xZ5SDM5tKQm4Sym/s400/fibo-02.png" /></a></div><br />
Los resultados son los siguientes:<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgYzJ4onfzkSgzMDiq_VdAOWtkLde53j2y4pk1b-ZGlZFn47Bv_d7904L6ZeIZExEX42lt9AkmioADH92EnSpisD5_ZRdNPFezVG69_7bH5VMLNVl2GbMGUs9r4447Xl339mRLT79YIExft/s1600/fibo-03.png" imageanchor="1" style="margin-left:1em; margin-right:1em"><img border="0" height="43" width="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgYzJ4onfzkSgzMDiq_VdAOWtkLde53j2y4pk1b-ZGlZFn47Bv_d7904L6ZeIZExEX42lt9AkmioADH92EnSpisD5_ZRdNPFezVG69_7bH5VMLNVl2GbMGUs9r4447Xl339mRLT79YIExft/s400/fibo-03.png" /></a></div><br />
Tenemos que Fibonacci recursivo con una instancia de 40, el contador nos da como resultado <b>331160281</b>, esto quiere decir que se hace tal cantidad de llamadas.<br />
<br />
En cambio con forma iterativa:<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEioD3nbI1vSxU2_joAoUQCUn59WHoA1eXymIwv1-eE-lCC_7ke_P2cbQa4cDEZnFFasaGbNRCfH88dgwVZDnlgn-LO-0MKEDwtGxaQSHCn8ZCzAbs2mvJePvykIlfVeitoj6cxpOeKsPabg/s1600/fibo-04.png" imageanchor="1" style="margin-left:1em; margin-right:1em"><img border="0" height="51" width="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEioD3nbI1vSxU2_joAoUQCUn59WHoA1eXymIwv1-eE-lCC_7ke_P2cbQa4cDEZnFFasaGbNRCfH88dgwVZDnlgn-LO-0MKEDwtGxaQSHCn8ZCzAbs2mvJePvykIlfVeitoj6cxpOeKsPabg/s400/fibo-04.png" /></a></div><br />
Tenemos que solamente se repite el proceso <b>39</b> veces para una instancia de 40.<br />
<br />
Para esta demostración tomamos la instancia como la cantidad de números de la serie de Fibonacci que se desean obtener.<br />
<br />
En cuanto a tiempo de ejecución también nos da en la forma recursiva, un tiempo mayor, esto se podría verificar colocando un contador de tiempo.<br />
<br />
<b>Conclusión:</b><br />
Es muy mala idea hacer la serie de Fibonacci con fines prácticos.<br />
<br />
</div>Anonymoushttp://www.blogger.com/profile/02234142471203536128noreply@blogger.com1tag:blogger.com,1999:blog-4717153029351703678.post-82605201376852681462011-07-14T08:20:00.043-05:002011-07-14T08:41:34.589-05:00Análisis asintótico<div id="entrada"><div class="encabezado">Algoritmos Computacionales </div><br />
Suponiendo que las siguientes funciones indican la complejidad asintótica de algunos algoritmos para resolver un problema, se tienen que ordenar en orden del peor algoritmo al mejor, donde el mejor sería aquél que tarde menos en resolver el problema.<br />
<br />
En la imagen se muestran las ocho funciones a ordenar:<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhWzmRogdjhDe98vUGAoYVep7pDRYTSvqECfdlAbLSgyiLUngxsDlUsAH3xm12zbS6GvMorLr5Nitmt8KjdIrCL1eBZuPxDlZ9vtTaU5ULCxrmI7D-yNfjJWCNnB87VFrEZZktERBHsucos/s1600/analisis-01.png" imageanchor="1" style="margin-left:1em; margin-right:1em"><img border="0" height="164" width="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhWzmRogdjhDe98vUGAoYVep7pDRYTSvqECfdlAbLSgyiLUngxsDlUsAH3xm12zbS6GvMorLr5Nitmt8KjdIrCL1eBZuPxDlZ9vtTaU5ULCxrmI7D-yNfjJWCNnB87VFrEZZktERBHsucos/s400/analisis-01.png" /></a></div><br />
Tenemos que:<br />
<br />
I. La función que implica mayor comlejidad es <b>f2</b>, porque al elevar una variable a una potencia igual a sí misma, incrementará rápidamente.<br />
<br />
II. Parecido al caso anterior pero con la diferencia de que en la base tenemos una constante, tenemos que <b>f1</b> es la que sigue a esta lista.<br />
<br />
III. Ahora tenemos una base a la n elevada a la siete, esto nos daría en una gráfica que se encuentra más abajo de las dos anteriores esta es <b>f3</b>.<br />
<br />
IV. Ahora tenemos una logarítmica un tanto engañosa <b>f4</b>, que sabemos de antemano que es mayor a f6 por el hecho de tener una n multiplicando al logaritmo.<br />
<br />
V. Si aplicamos propiedades de los logaritmos y simplificamos, tenemos que <b>f7</b> es la siguiente en nuestra escala.<br />
<br />
VI. Una variable multiplicada a una constante grande <b>f8</b>, es menor a la constante elevada al logaritmo.<br />
<br />
VII. Ya casi por terminar tenemos <b>f5</b>, porque una raíz es de los mejores casos que se puede tener.<br />
<br />
VIII. Por regla vimos que <b>f6</b>, una función logarítmica es mejor a una polinomial. <br />
<br />
Este orden lo obtuvimos en colaboración con todos los alumnos de la clase.<br />
</div>Anonymoushttp://www.blogger.com/profile/02234142471203536128noreply@blogger.com1tag:blogger.com,1999:blog-4717153029351703678.post-57526376269927023272011-07-14T08:00:00.004-05:002011-07-14T08:11:12.712-05:00Gráfica aplicando escala logarítmica<div id="entrada"><div class="encabezado">Algoritmos Computacionales </div><br />
En una de nuestras primeras sesiones vimos lo que pasa cuando tenemos diferentes funciones y como se ven graficadas.<br />
<br />
Esta es la tabla con datos y cada columna una función diferente.<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiwY458pXHvbJsx8Qhj1i1cfjmEWAJ16uc0yyLK0fdHlsVK3QZQZyjy0KbaKcUFHnFFZB_ARDSZiDxFSTU50sZPYckbejrcI8t8CAeFe-oICe1cqr7k-Cs9A8DYK964HQAjfJ8ZzPwX2FG8/s1600/tabla-01.png" imageanchor="1" style="margin-left:1em; margin-right:1em"><img border="0" height="284" width="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiwY458pXHvbJsx8Qhj1i1cfjmEWAJ16uc0yyLK0fdHlsVK3QZQZyjy0KbaKcUFHnFFZB_ARDSZiDxFSTU50sZPYckbejrcI8t8CAeFe-oICe1cqr7k-Cs9A8DYK964HQAjfJ8ZzPwX2FG8/s400/tabla-01.png" /></a></div><br />
Al graficar tenemos que aplicar la escala logaritmica para lograr observar como se disparan las líneas de la función exponencial.<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiGijBNN2b6-qF7IQ0hB3KbJprY8Xe33Vd-5kVWzpa8KDl8cM0P-EgkXbXyCDSJh1Z3rXKAOL6mH10PSMMUkpvjq_fpXSKXr9T5bmRyIv7aA-tKbKIoR2isLv0Y3mPu3xIY_UwzoS84m06J/s1600/tabla-02.png" imageanchor="1" style="margin-left:1em; margin-right:1em"><img border="0" height="203" width="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiGijBNN2b6-qF7IQ0hB3KbJprY8Xe33Vd-5kVWzpa8KDl8cM0P-EgkXbXyCDSJh1Z3rXKAOL6mH10PSMMUkpvjq_fpXSKXr9T5bmRyIv7aA-tKbKIoR2isLv0Y3mPu3xIY_UwzoS84m06J/s400/tabla-02.png" /></a></div><br />
</div>Anonymoushttp://www.blogger.com/profile/02234142471203536128noreply@blogger.com1tag:blogger.com,1999:blog-4717153029351703678.post-74133893021392307052011-07-12T02:30:00.004-05:002013-01-10T04:30:39.590-06:00Lista enlazada simple<div id="entrada"><div class="encabezado">Algoritmos Computacionales <br />
Tarea 4 </div><br />
Vídeo incrustado hablando de listas enlazadas simples y muestra de un ejemplo desde terminal.<br />
<br />
<center><br />
<iframe width="480" height="390" src="http://www.youtube.com/embed/6svAFPM2TRg" frameborder="0" allowfullscreen></iframe><br />
</center><br />
<br />
El vídeo original dura aproximadamente 4 minutos, por más que intente Mencoder no convertía como debería.<br />
<br />
</div>Anonymoushttp://www.blogger.com/profile/02234142471203536128noreply@blogger.com3tag:blogger.com,1999:blog-4717153029351703678.post-43127136396787148132011-07-08T05:00:00.023-05:002011-07-08T05:13:13.500-05:00Problema de las 8 reinas<div id="entrada"><div class="encabezado">Algoritmos Computacionales <br />
Tarea 3 </div><br />
Esta tarea corresponde al tema de algoritmos recursivos. El trabajo a entregar es una presentación en diapositivas.<br />
<br />
<div class="linea"></div><center><br />
<div style="width:425px" id="__ss_8542112"><strong style="display:block;margin:12px 0 4px"><a href="http://www.slideshare.net/esteban-gzz/problema-de-las-8-reinas" title="Problema de las 8 reinas">Problema de las 8 reinas</a></strong><object id="__sse8542112" width="425" height="355"><param name="movie" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=algoritmoreinas3-110708050741-phpapp02&stripped_title=problema-de-las-8-reinas&userName=esteban-gzz" /><param name="allowFullScreen" value="true"/><param name="allowScriptAccess" value="always"/><embed name="__sse8542112" src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=algoritmoreinas3-110708050741-phpapp02&stripped_title=problema-de-las-8-reinas&userName=esteban-gzz" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="355"></embed></object><div style="padding:5px 0 12px">Ver más presentaciones de <a href="http://www.slideshare.net/esteban-gzz">Esteban González</a>.</div></div></center><br />
<div class="linea"></div><br />
Esta animación muestra todos los cambios que se hacen al resolver por recursión el problema de las ocho reinas. Lo pongo aquí porque en la presentación no se pueden ver los cambios.<br />
<br />
<center><br />
<img src="http://upload.wikimedia.org/wikipedia/commons/1/1f/Eight-queens-animation.gif" /><br />
</center><br />
<br />
Obtenido de <a href="http://en.wikipedia.org/wiki/Eight_queens_puzzle">Wikipedia</a>.<br />
</div>Anonymoushttp://www.blogger.com/profile/02234142471203536128noreply@blogger.com3tag:blogger.com,1999:blog-4717153029351703678.post-57904237475440287242011-07-05T22:00:00.002-05:002011-07-06T04:21:43.066-05:00Problema de Clique<div id="entrada"><div class="encabezado">Algoritmos Computacionales <br />
Tarea 2 </div><br />
En complejidad computacional, el problema de la Clique o Problema de la liga de amigos, es un problema <b>NP-completo</b> según la Teoría de la complejidad computacional.<br />
<br />
<div class="subtema">Problema</div><br />
EL problema de clique es el siguiente:<br />
<b>Dado un grafo no dirigido G, y un número natural k, determinar si G posee un clique de tamaño k.</b><br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEicAGAdQEOMtVpUUBuMxtbayBY4uJeLLWdYUcUwdPtchWvWpkhj6zAce4eFGMctz-4crWF7J5DVcNkT_iMxkjx84j_cAlqDy9v-jfynf7ocVIvfSjDTO4H0Y7f5tDTJSyedHOTHXot4gpeK/s1600/clique-02.png" imageanchor="1" style="margin-left:1em; margin-right:1em"><img border="0" height="305" width="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEicAGAdQEOMtVpUUBuMxtbayBY4uJeLLWdYUcUwdPtchWvWpkhj6zAce4eFGMctz-4crWF7J5DVcNkT_iMxkjx84j_cAlqDy9v-jfynf7ocVIvfSjDTO4H0Y7f5tDTJSyedHOTHXot4gpeK/s400/clique-02.png" /></a></div><br />
De nuevo:<br />
Dado un grafo no dirigido cualquiera G= (V,E), en el cual V={1,2,…,n} es el conjunto <br />
de los vértices del grafo y E es el conjunto de aristas. Un clique es un conjunto C de <br />
vértices donde todo par de vértices de C esta conectado con una arista en G, es decir C <br />
es un subgrafo completo.<br />
<br />
Este problema se puede enunciar como un <b>problema de decisión</b> si la pregunta que se hace es <u>saber si existe una clique de tamaño k en el grafo</u>.<br />
<br />
El correspondiente <b>problema de optimización</b>, consiste en <u>encontrar una clique de tamaño máximo en un grafo</u>.<br />
<br />
Una vez que tenemos k o más vertices que forman una clique, es trivial verificar que lo son, por eso es un problema NP.<br />
<br />
<div class="subtema">¿Qué es un clique?</div><br />
El término proviene de la palabra inglesa clique, que define a un grupo de personas que comparten intereses en común.<br />
<br />
En esta analogía, las personas serían los vértices y los intereses en común, las aristas. Cuando todas compartan un mismo interés, forman un grafo completo, es decir, forman un clique.<br />
<br />
Un clique en un grafo no dirigido G es un conjunto de vértices V, tal que para todo par de vértices de V, existe una arista que las conecta, donde el <b>tamaño de un clique</b> es el <u>número de vértices que contiene</u>.<br />
<br />
<div class="subtema">Ejemplo</div><br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiM98gTrSioSXH5CCWU26qefHDPPEDF_75daWZX1JTgSM7QdvI1Z7nsd5gWnlf9CowbMVj3HjcK6Tyu4_OYWDMAL1Zgl0J4EpBxsuaFOt-Gw8IlomI3zphZAQ3XTRBpJLH35oQaUdzQHhV-/s1600/clique-01.png" imageanchor="1" style="margin-left:1em; margin-right:1em"><img border="0" height="255" width="301" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiM98gTrSioSXH5CCWU26qefHDPPEDF_75daWZX1JTgSM7QdvI1Z7nsd5gWnlf9CowbMVj3HjcK6Tyu4_OYWDMAL1Zgl0J4EpBxsuaFOt-Gw8IlomI3zphZAQ3XTRBpJLH35oQaUdzQHhV-/s400/clique-01.png" /></a></div><br />
El grafo G:<br />
Tiene cliques {1,2,5} y {1,4,5} de tamaño 3.<br />
Tiene cliques {2,3} y {3,4} de tamaño 2.<br />
<br />
<div class="subtema">Aplicaciones al mundo real</div><br />
<b>Link Farm</b><br />
Una granja de enlaces es un grupo de sitios web que enlazan a todos los sitios de un grupo entre sí. Esto es una forma de spamming para los indices de un motor de búsqueda.<br />
<br />
Los motores de búsqueda necesitan una forma para encontrar la relevancia de una página. Un método para encontrarla es examinando todos los enlaces provenientes de páginas relevantes.<br />
<br />
En otras palabras, crear una granja de enlaces tenía el propósito de incrementar la relevancia de un sitio web para aparecer en los primeros lugares de búsqueda. Para ello se creaban páginas que enlazaran unas a otras conteniendo los enlaces hacia aquellos sitios a los que se les deseaba dar popularidad.<br />
<br />
<b>Segmentación de imágenes y reconocimiento de patrones</b><br />
Un problema muy común en computación gráfica es el de encontrar patrones dentro de una imagen. Hay una gran cantidad de problemas que entran dentro de esta categoría desde reconocimiento de bordes hasta búsqueda de figuras geométricas.<br />
<br />
Un problema particular que se puede resolver utilizando una variación de Clique Máxima es la de reconocimiento de segmentos o regiones. Una región en una imagen es un conjunto de pixeles que comparten alguna característica.<br />
<br />
<b>Cálculo de probabilidades condicionales</b><br />
El algoritmo general más común en redes bayesianas es el de agrupamiento "árbol cliques". El método de agrupamiento consiste en transformar la estructura de la red para obtener un árbol, mediante agrupación de nodos. Para ello, se hace una transformación de la red a un árbol de cliques máximas.<br />
<br />
<b>Biología</b><br />
En el desarrollo evolutivo, una de las maneras de reconocer muchos de los procesos es mirar la expresión de genes en términos de las redes de la expresión de genes, que son los grafos. Los sistemas de regulación a menudo se revela como cliques en la red de expresión.<br />
<br />
Al estudiar las estructuras de proteínas, una de las técnicas más importantes es analizar las proteínas similares, y encontrar cliques en común para las redes estructurales basados en grafos de las proteínas.<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjHBrD6XnUVgN5vM_byH0ositx-5I1Cawew9_EMP7gRDBmSr9Y-H4L_NuIhHgibgtHBXDJEUjbOeQDQZdDRohdOBGC6uTboSplnst7u1f_fEDe-twPz8ZwqZbDq1SCrF5pjFKJv0xDQ4YHJ/s1600/clique-03.jpg" imageanchor="1" style="margin-left:1em; margin-right:1em"><img border="0" height="273" width="284" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjHBrD6XnUVgN5vM_byH0ositx-5I1Cawew9_EMP7gRDBmSr9Y-H4L_NuIhHgibgtHBXDJEUjbOeQDQZdDRohdOBGC6uTboSplnst7u1f_fEDe-twPz8ZwqZbDq1SCrF5pjFKJv0xDQ4YHJ/s400/clique-03.jpg" /></a></div><br />
<div class="subtema">Algoritmos para resolver este problema</div><br />
<b>Algoritmo de fuerza bruta</b><br />
Un ejemplo de algoritmo de fuerza bruta para encontrar una clique en un grafo consiste en listar todos los subconjuntos de vértices V y verificar para cada uno de ellos si forma una clique.<br />
<br />
Ese algoritmo es <u>polinómico si k es una constante</u>, pero como no lo es para este caso, tenemos un <u>exponencial</u> de <b>n^k</b>.<br />
<br />
<b>Algoritmo Bron-Kerbosch</b><br />
Este algoritmo consiste en arrancar con cliques de un solo elemento e intentar mezclar cliques para obtener otras más grandes, hasta que no queden más mezclas por intentarse. Dos cliques pueden ser mezcladas si cada nodo de la primera es adyacente a cada nodo de la segunda.<br />
<br />
Es eficiente en el peor de los casos por un resultado de Moon and Moser, donde un grafo de n vértices tiene a lo sumo 3^(n/3) cliques máximos, y el tiempo de ejecución del peor caso del algoritmo Bron-Kerbosch, con una estrategia dinámica que reduce al mínimo el número de llamadas recursivas realizadas en cada paso, es <b>O(3^(n/3))</b>, que coincidan con este límite.<br />
<br />
Para estos dos algoritmos es fácil saber cuál es mejor que el otro. Tenemos que:<br />
- El mejor es Bron-Kerbosch.<br />
- El peor es Fuerza bruta.<br />
<br />
<div class="linea"></div><br />
En el siguiente pdf encontramos la reducción SAT para el problema de clique:<br />
<a href="http://web.eecs.utk.edu/~langston/courses/cs594-fall2003/transform.pdf">Time reduction</a><br />
<br />
<b>Bibliografía:</b><br />
<a href="http://revistaseletronicas.pucrs.br/fo/ojs/index.php/hifen/article/viewFile/3811/2906">Problema de Clique Máximo</a><br />
<a href="http://www.unse-prog2.comxa.com/downloads/UNIDAD%201-Problemas.pdf">Clasificación de problemas</a><br />
<a href="http://en.wikipedia.org/wiki/Clique_problem">Clique problem - Wikipedia</a><br />
<a href="http://es.wikipedia.org/wiki/Problema_de_la_clique">Problema de la clique - Wikipedia</a><br />
<a href="http://es.wikipedia.org/wiki/NP_(Complejidad_computacional)">Complejidad computacional</a><br />
<a href="http://scienceblogs.com/goodmath/2007/07/cliques_subgraphs_and_a_bit_of.php">Cliques and a bit of biology</a><br />
</div>Anonymoushttp://www.blogger.com/profile/02234142471203536128noreply@blogger.com2tag:blogger.com,1999:blog-4717153029351703678.post-87553533062074756042011-07-01T03:00:00.181-05:002011-07-01T11:34:16.593-05:00Algoritmo de Prim<div id="entrada"><div class="encabezado">Algoritmos Computacionales <br />
Tarea 1 </div><br />
El Algoritmo de Prim es de los más conocidos en la teoría de grafos cuyo principal objetivo consiste en encontrar el árbol de expansión mínima en un cierto grafo, que debe ser conexo, no dirigido y cuyas aristas están etiquetadas.<br />
<br />
Pero para entender esto, veamos que son estos conceptos:<br />
<br />
<b>Grafo</b> - Se define como un conjunto de objetos llamados vértices o nodos y la unión de pares de vértices por líneas llamadas aristas, que pueden ser orientadas o no. Orientadas quiere decir si se indica la dirección en que se puede mover de vértice a vértice.<br />
<br />
<b>Conexo</b> - Quiere decir que todos los pares de vértices deben de estar unidos por un camino o arista.<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj3kT4UUhrGLj5GQU2dnB6ziFk1G5bqXodcBTCqCON8BbEXXDL2xM-Gl_KWUDglkQKJ_QVeNQsSwk6qAPq4Jwd7Jyt656tO7-fxp8q9TTpPOCjKuuVqXzJA-ssOIMfIDAyrpw6rxfo3rkvP/s1600/grafo-01.jpg" imageanchor="1" style="margin-left:1em; margin-right:1em"><img border="0" height="137" width="353" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj3kT4UUhrGLj5GQU2dnB6ziFk1G5bqXodcBTCqCON8BbEXXDL2xM-Gl_KWUDglkQKJ_QVeNQsSwk6qAPq4Jwd7Jyt656tO7-fxp8q9TTpPOCjKuuVqXzJA-ssOIMfIDAyrpw6rxfo3rkvP/s400/grafo-01.jpg" /></a></div><br />
<b>No dirigido</b> - Es decir, que no se indica hacia dónde se mueve.<br />
<br />
<b>Aristas etiquetadas</b> - Que nos indiquen un peso, cuota o distancia entre vértices.<br />
<br />
Sin embargo este no es el único algoritmo que existe para encontrar el árbol de expansión mínima, ya que existe otro como lo es el:<br />
<br />
<ul><li>Algoritmo de Kruskal</li>
</ul><br />
<div class="tema">Ejemplo de grafo conexo, no dirigido y con aristas etiquetadas</div><br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjHBDOSZ9gWL0G6r3PVnsb5b7d-QPVZhZR6Kcy9nJYV343pLCBfGrBYyTQUf8dt1x6NoG96wQuauRJJxY-7beLpOU9y_KHGnGppT1dMnFp2aufG1l4b7Gcpue_4OhMJqJFKksAbdAjG3rgR/s1600/grafo-04.png" imageanchor="1" style="margin-left:1em; margin-right:1em"><img border="0" height="177" width="220" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjHBDOSZ9gWL0G6r3PVnsb5b7d-QPVZhZR6Kcy9nJYV343pLCBfGrBYyTQUf8dt1x6NoG96wQuauRJJxY-7beLpOU9y_KHGnGppT1dMnFp2aufG1l4b7Gcpue_4OhMJqJFKksAbdAjG3rgR/s400/grafo-04.png" /></a></div><br />
Cada punto negro es un vértice o nodo, y se le suele asignar una letra para hacer referencia a cada uno. También es posible encontrar grafos donde sus vértices se indican con números, esto no afecta en nada.<br />
<br />
"Sea <b>V</b> el conjunto de nodos de un grafo pesado no dirigido. El algoritmo de Prim comienza cuando se asigna a un conjunto <b>U</b> de nodos un nodo inicial perteneciente a <b>V</b>, en el cual crece un árbol de expansión, arista por arista. En cada paso se localiza la arista más corta <b>(u,v)</b> que conecta a <b>U</b> con <b>V-U</b>, y después se agrega <b>v</b>, el vértice en <b>V-U</b>, a <b>U</b>. Este paso se repite hasta que <b>V=U</b>. El algoritmo de Prim es de <b>O(N^2)</b>, donde <b>|V| = N</b>."<br />
<br />
En otras palabras:<br />
<br />
"Este algoritmo construye un árbol agregando aristas de manera iterativa hasta que se obtiene un árbol de expansión mínima. El algoritmo comienza con un solo vértice. Después, en cada iteración, agrega al árbol actual una arista de peso mínimo que no completa un ciclo."<br />
<br />
<div class="tema">Aplicaciones en la vida real</div><br />
Este algoritmo puede ser utilizado en muchos campos como lo son las carreteras, vías férreas, aéreas o marítimas. También en redes eléctricas o de telefonía.<br />
<br />
Actualmente empresas con servicios de cable e internet que necesitan expandirse lo más posible por toda una ciudad, hacen uso de estos algoritmos para seleccionar las rutas cuyos caminos sean los mas cortos y que generen un ahorro en el uso de cable como la fibra óptica.<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi1Yo1SjjCDiLz53f5N-xARAf17HekT1NTD_ySdSS58DXej8z0E5cx-WrpgNArNtcCkk9bSiz9MuL9Q4tEHonuiW9xifqKFGz8Zs9rtwjpeF7O4Hnv_G90Xs6qHVfNCvPLl09I0WtMGNMhQ/s1600/grafo-02.jpg" imageanchor="1" style="margin-left:1em; margin-right:1em"><img border="0" height="400" width="292" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi1Yo1SjjCDiLz53f5N-xARAf17HekT1NTD_ySdSS58DXej8z0E5cx-WrpgNArNtcCkk9bSiz9MuL9Q4tEHonuiW9xifqKFGz8Zs9rtwjpeF7O4Hnv_G90Xs6qHVfNCvPLl09I0WtMGNMhQ/s400/grafo-02.jpg" /></a></div><br />
En este caso el resultado de encontrar el camino de mínima expansión sería el siguiente:<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj4pWPxYuanAuEW3_fUg6NrWkVP2H73e0_JUV9hu7lnNvCMWThuq4l0NNiYYqhdV5hbi-6-Ik_9RlPBqcZsB3v8hin2oHA0ezDHNQ1UqyApNqd1ACW4gcJvMOMFm6ZYrvhmEsc5i6cdD9PL/s1600/grafo-03.jpg" imageanchor="1" style="margin-left:1em; margin-right:1em"><img border="0" height="400" width="292" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj4pWPxYuanAuEW3_fUg6NrWkVP2H73e0_JUV9hu7lnNvCMWThuq4l0NNiYYqhdV5hbi-6-Ik_9RlPBqcZsB3v8hin2oHA0ezDHNQ1UqyApNqd1ACW4gcJvMOMFm6ZYrvhmEsc5i6cdD9PL/s400/grafo-03.jpg" /></a></div><br />
Un ejemplo simple imaginable sería el querer viajar en auto por carretera a ciertas ciudades y buscar los caminos que generan distancias más cortas entre ciudades, en el menor tiempo posible o viajando la mínima cantidad de horas.<br />
<br />
<div class="tema">Ejemplo de ejecución</div><br />
Obtenido de Wikipedia, al final se encuentra el enlace.<br />
<table border="1" cellspacing="0" cellpadding="5"><tr> <th>Image</th> <th>Descripción</th> <th>No visto</th> <th>En el grafo</th> <th>En el árbol</th> </tr>
<tr> <td><a href="/wiki/Archivo:Prim_Algorithm_0.svg" class="image"><img alt="Prim Algorithm 0.svg" src="http://upload.wikimedia.org/wikipedia/commons/thumb/a/a8/Prim_Algorithm_0.svg/200px-Prim_Algorithm_0.svg.png" width="200" height="168" /></a></td> <td>Este es el grafo ponderado de partida. No es un árbol ya que requiere que no haya ciclos y en este grafo los hay. Los números cerca de las aristas indican el peso. Ninguna de las aristas está marcada, y el vértice <b>D</b> ha sido elegido arbitrariamente como el punto de partida.</td> <td>C, G</td> <td>A, B, E, F</td> <td>D</td> </tr>
<tr> <td><a href="/wiki/Archivo:Prim_Algorithm_1.svg" class="image"><img alt="Prim Algorithm 1.svg" src="http://upload.wikimedia.org/wikipedia/commons/thumb/5/56/Prim_Algorithm_1.svg/200px-Prim_Algorithm_1.svg.png" width="200" height="168" /></a></td> <td>El segundo vértice es el más cercano a <b>D</b>: <b>A</b> está a 5 de distancia, <b>B</b> a 9, <b>E</b> a 15 y <b>F</b> a 6. De estos, 5 es el valor más pequeño, así que marcamos la arista <b>DA</b>.</td> <td>C, G</td> <td>B, E, F</td> <td>A, D</td> </tr>
<tr> <td><a href="/wiki/Archivo:Prim_Algorithm_2.svg" class="image"><img alt="Prim Algorithm 2.svg" src="http://upload.wikimedia.org/wikipedia/commons/thumb/f/f5/Prim_Algorithm_2.svg/200px-Prim_Algorithm_2.svg.png" width="200" height="168" /></a></td> <td>El próximo vértice a elegir es el más cercano a <b>D</b> o <b>A</b>. <b>B</b> está a 9 de distancia de <b>D</b> y a 7 de <b>A</b>, <b>E</b> está a 15, y <b>F</b> está a 6. 6 es el valor más pequeño, así que marcamos el vértice <b>F</b> y a la arista <b>DF</b>.</td> <td>C</td> <td>B, E, G</td> <td>A, D, F</td> </tr>
<tr> <td><a href="/wiki/Archivo:Prim_Algorithm_3.svg" class="image"><img alt="Prim Algorithm 3.svg" src="http://upload.wikimedia.org/wikipedia/commons/thumb/b/b4/Prim_Algorithm_3.svg/200px-Prim_Algorithm_3.svg.png" width="200" height="168" /></a></td> <td>El algoritmo continua. El vértice <b>B</b>, que está a una distancia de 7 de <b>A</b>, es el siguiente marcado. En este punto la arista <b>DB</b> es marcada en rojo porque sus dos extremos ya están en el árbol y por lo tanto no podrá ser utilizado.</td> <td>null</td> <td>C, E, G</td> <td>A, D, F, B</td> </tr>
<tr> <td><a href="/wiki/Archivo:Prim_Algorithm_4.svg" class="image"><img alt="Prim Algorithm 4.svg" src="http://upload.wikimedia.org/wikipedia/commons/thumb/7/7e/Prim_Algorithm_4.svg/200px-Prim_Algorithm_4.svg.png" width="200" height="168" /></a></td> <td>Aquí hay que elegir entre <b>C</b>, <b>E</b> y <b>G</b>. <b>C</b> está a 8 de distancia de <b>B</b>, <b>E</b> está a 7 de distancia de <b>B</b>, y <b>G</b> está a 11 de distancia de <b>F</b>. <b>E</b> está más cerca, entonces marcamos el vértice <b>E</b> y la arista <b>EB</b>. Otras dos aristas fueron marcadas en rojo porque ambos vértices que unen fueron agregados al árbol.</td> <td>null</td> <td>C, G</td> <td>A, D, F, B, E</td> </tr>
<tr> <td><a href="/wiki/Archivo:Prim_Algorithm_5.svg" class="image"><img alt="Prim Algorithm 5.svg" src="http://upload.wikimedia.org/wikipedia/commons/thumb/e/e3/Prim_Algorithm_5.svg/200px-Prim_Algorithm_5.svg.png" width="200" height="168" /></a></td> <td>Sólo quedan disponibles <b>C</b> y <b>G</b>. <b>C</b> está a 5 de distancia de <b>E</b>, y <b>G</b> a 9 de distancia de <b>E</b>. Se elige <b>C</b>, y se marca con el arco <b>EC</b>. El arco <b>BC</b> también se marca con rojo.</td> <td>null</td> <td>G</td> <td>A, D, F, B, E, C</td> </tr>
<tr> <td><a href="/wiki/Archivo:Prim_Algorithm_6.svg" class="image"><img alt="Prim Algorithm 6.svg" src="http://upload.wikimedia.org/wikipedia/commons/thumb/9/99/Prim_Algorithm_6.svg/200px-Prim_Algorithm_6.svg.png" width="200" height="168" /></a></td> <td><b>G</b> es el único vértice pendiente, y está más cerca de <b>E</b> que de <b>F</b>, así que se agrega <b>EG</b> al árbol. Todos los vértices están ya marcados, el <a href="/wiki/%C3%81rbol_de_expansi%C3%B3n_m%C3%ADnimo" title="Árbol de expansión mínimo" class="mw-redirect">árbol de expansión mínimo</a> se muestra en verde. En este caso con un peso de 39.</td> <td>null</td> <td>null</td> <td>A, D, F, B, E, C, G</td> </tr>
</table><br />
<div class="tema">Código y ejecución</div><br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi8QyFL9in258o-mbpJAGEl5zIuGgks-TvYVSYsnsvn_9B8nDEwBuTJBWVsW9dZuAczxY1Sjz4RMUm1un1XZgJmqRJUPrF7vHLvbeP0iaqihXWQ4xiOX2w6a4uLgnUdQDLUpXLhP1TdQOtw/s1600/codigo-01.png" imageanchor="1" style="margin-left:1em; margin-right:1em"><img border="0" height="400" width="397" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi8QyFL9in258o-mbpJAGEl5zIuGgks-TvYVSYsnsvn_9B8nDEwBuTJBWVsW9dZuAczxY1Sjz4RMUm1un1XZgJmqRJUPrF7vHLvbeP0iaqihXWQ4xiOX2w6a4uLgnUdQDLUpXLhP1TdQOtw/s400/codigo-01.png" /></a></div><br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj7Ey-RzFrYx4fADVdHoxgOH9GWRWmBVo4LlYBzlmpJMWb6Kj4-47AS_oXsEVoGJDXiHGKG2B8SqyfOjGg-jZ0-3CyBKj6Xr4f9nX96MI7bBqFcJePAKkY8z-U7tQcZKnqhcIcb-CnJ5Y4z/s1600/codigo-02.png" imageanchor="1" style="margin-left:1em; margin-right:1em"><img border="0" height="400" width="337" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj7Ey-RzFrYx4fADVdHoxgOH9GWRWmBVo4LlYBzlmpJMWb6Kj4-47AS_oXsEVoGJDXiHGKG2B8SqyfOjGg-jZ0-3CyBKj6Xr4f9nX96MI7bBqFcJePAKkY8z-U7tQcZKnqhcIcb-CnJ5Y4z/s400/codigo-02.png" /></a></div><br />
El código primero abre desde un archivo de texto los pares de vértices y la distancia entre ellos, para luego acomodar los valores en un arreglo.<br />
<br />
Las iteraciones las logré gracias al ejemplo en C++ del blog de Ankit.<br />
<br />
Esta es la captura de los datos de entrada, guardados en un archivo.<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjPufrT-aJNTSx49v7ep7bi7hmkpDfRja9yEIbmWBWCW_pVBYo2jQdF9RUTtBa5z21Ou8LW_7EfS08V-BRAHpRofpHADJfvhmybMQ-zFASpDLs9RQ91Wn_65Y34qRFqf5AHhTh1ZQ7jTb-d/s1600/codigo-03.png" imageanchor="1" style="margin-left:1em; margin-right:1em"><img border="0" height="143" width="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjPufrT-aJNTSx49v7ep7bi7hmkpDfRja9yEIbmWBWCW_pVBYo2jQdF9RUTtBa5z21Ou8LW_7EfS08V-BRAHpRofpHADJfvhmybMQ-zFASpDLs9RQ91Wn_65Y34qRFqf5AHhTh1ZQ7jTb-d/s400/codigo-03.png" /></a></div><br />
El grafo se ve de esta manera:<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiRj5xJJySlAtT_KZUuYHIb2S4H9HFpYX6sUUIgj38ubiB_rG-VN-8OWhp0DkpKjli3DEZ7AsTuP-MqBZxBkjU4XjNRymWddkho1WTlA58wKrBM3i5rhPJm5Tajn9JBqPcW0S86dI5tiN64/s1600/grafo-05.png" imageanchor="1" style="margin-left:1em; margin-right:1em"><img border="0" height="282" width="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiRj5xJJySlAtT_KZUuYHIb2S4H9HFpYX6sUUIgj38ubiB_rG-VN-8OWhp0DkpKjli3DEZ7AsTuP-MqBZxBkjU4XjNRymWddkho1WTlA58wKrBM3i5rhPJm5Tajn9JBqPcW0S86dI5tiN64/s400/grafo-05.png" /></a></div><br />
Ejecución:<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhd7io8yrUenhcD-zQrbrolysETbX5iirAUs2VtftV9tqcN9m_iH0yqGM-kboKKxCcoiCnlMVpynL3j3CGzk7zqMVUtxyTDDmgu3DgBKqBjksIUxL2RFNzOGTXAC4w-964wAl_s56bJKBFK/s1600/codigo-04.png" imageanchor="1" style="margin-left:1em; margin-right:1em"><img border="0" height="297" width="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhd7io8yrUenhcD-zQrbrolysETbX5iirAUs2VtftV9tqcN9m_iH0yqGM-kboKKxCcoiCnlMVpynL3j3CGzk7zqMVUtxyTDDmgu3DgBKqBjksIUxL2RFNzOGTXAC4w-964wAl_s56bJKBFK/s400/codigo-04.png" /></a></div><br />
El resultado obtenido como distancia mínima fue de 12.<br />
<br />
El resultado obtenido fue:<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgE8JmgxeJ1-V1bXmip5hYUCgZm-eY5q-Gly_V1Ayl-Hav6G9mFsvevLUIq9qCZPg5HpRrnIS6GmGaza7L3zNzcKFkPWsQI7gbDGlT0k6Lb6qXvfSmwSHNlouPqclAbjOaYSBJ-6bHODYuC/s1600/grafo-06.png" imageanchor="1" style="margin-left:1em; margin-right:1em"><img border="0" height="283" width="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgE8JmgxeJ1-V1bXmip5hYUCgZm-eY5q-Gly_V1Ayl-Hav6G9mFsvevLUIq9qCZPg5HpRrnIS6GmGaza7L3zNzcKFkPWsQI7gbDGlT0k6Lb6qXvfSmwSHNlouPqclAbjOaYSBJ-6bHODYuC/s400/grafo-06.png" /></a></div><br />
Esto fue todo por hoy, para dudas o correcciones, dejen su comentario.<br />
<br />
<b>Bibliografía:</b><br />
Libro: Matemáticas Discretas - Richard Johnsonbaugh (págs.398-401)<br />
<a href="http://lcg.ciens.ucv.ve/~ernesto/nds/CotoND200302.pdf">Algoritmos básicos de Grafos</a><br />
<a href="http://es.wikipedia.org/wiki/Teor%C3%ADa_de_grafos">Teoría de Grafos</a><br />
<a href="http://es.wikipedia.org/wiki/Algoritmo_de_Prim">Algoritmo de Prim</a><br />
<br />
<b>Blogs consultados:</b><br />
<a href="http://algoritmoshade.blogspot.com/">Jonathan De La Rosa</a><br />
<a href="http://ankitstar.blogspot.com/">Ankit Agrawal</a><br />
</div>Anonymoushttp://www.blogger.com/profile/02234142471203536128noreply@blogger.com7tag:blogger.com,1999:blog-4717153029351703678.post-27628159444501009902011-05-22T20:00:00.179-05:002011-05-23T00:35:00.620-05:00Crear archivos jar ejecutables<div id="entrada"><div class="encabezado">Entrada extra </div><br />
Cuando trabajamos en un proyecto en lenguaje java nos habremos de dar cuenta que hacemos uso de muchos archivos e inclusive directorios para almacenar nuestro trabajo, y sabemos que si deseamos que alguien más pueda ejecutar nuestro proyecto en su computadora tendríamos que enviarle todos estos archivos y directorios para que lo pueda compilar y ejecutar en su computadora.<br />
<br />
Entonces surge el ideal de colocar todos estos archivos y directorios en un único fichero comprimido. Java nos ofrece el comando <b>jar</b>, que nos permite hacer esto. Este comando junta todo lo que le indiquemos, ya sean carpetas completas, clases, imágenes o archivos de datos, y todo lo coloca en un archivo nuevo con extensión <b>.jar</b>.<br />
<br />
Este nuevo .jar es similar a ficheros que ya conocemos como los .zip, .rar o los .tar que ya hemos manejado antes. Inclusive descompresores winrar o winzip puedes abrir el contenido de nuestro nuevo fichero con extensión jar.<br />
<br />
Además Java nos permite ejecutar el contenido del fichero .jar sin necesidad de desempaquetarlo.<br />
<br />
<div class="tema">El comando jar</div><br />
<div class="terminal">$ jar</div><br />
A este comando desde el terminal podemos incluirle las siguientes opciones:<br />
<br />
<b>c</b> - Indica que vamos a crear un archivo, y si existe ya uno se eliminará.<br />
<b>f</b> - Indicar el nombre del fichero, que va inmediatamente después.<br />
<b>v</b> - Indica que queremos obtener información durante el proceso de creación del archivo.<br />
<b>m</b> - Indica al programa que queremos personalizar el archivo de manifiesto para añadir información adicional.<br />
<b>M</b> - Indica que no se cree el archivo de manifiesto.<br />
<b>0</b> - Indicamos que no queremos que se comprima el contenido del archivo.<br />
<br />
<div class="tema">Crear un fichero jar</div><br />
Antes de la creación de nuestro fichero jar, debemos procurar que nuestros archivos estan compilados y funcionan correctamente.<br />
<br />
Nota: Ya que el proceso de compilar y ejecutar archivos java ya es un tanto repetitivo a estas alturas, me salto este paso.<br />
<br />
<div class="subtema">Cuando las clases del programa no pertenecen a paquetes</div><br />
En este caso solo debemos meter las clases en el <b>.jar</b>, así que nos ubicamos en el directorio donde se encuentran contenidas nuestros archivos <b>.class</b> y ejecutamos el siguiente comando desde el terminal:<br />
<br />
<div class="terminal">$ jar -cf Nuevo.jar fichero1.class fichero2.class fichero3.class</div><br />
La opción "c" indica que queremos crear un fichero.jar nuevo.<br />
La opción "f" sirve para indicar el nombre del fichero.<br />
<br />
Finalmente se pone una lista de ficheros .class, o de cualquier otro tipo que queramos meter en nuestro jar.<br />
<br />
También se pueden usar comodines, como <b>*.class</b> para meter todos los .class del directorio.<br />
<br />
<div class="subtema">Cuando las clases del programa pertenecen a paquetes</div><br />
Para esto debemos meter la estructura de directorios equivalente a los paquetes del proyecto completo.<br />
<br />
Nos vamos al directorio padre de donde empiece nuestra estructura de paquetes.<br />
<br />
<div class="terminal">$ jar -cf Nuevo.jar nombredelpaquete</div><br />
Esto colocará el paquete dentro de nuestro jar.<br />
<br />
También podemos incluir los .class indicando el camino relativo para llegar a ellos:<br />
<br />
<div class="terminal">$ jar -cf Nuevo.jar nombredelpaquete/Hola.class</div><br />
<div class="tema">Ejecutar el jar</div><br />
Tenemos que colocar nuestro fichero .jar en el CLASSPATH, para poder recurrir a él.<br />
<br />
Para ejecutar el archivo escribiríamos lo siguiente en el terminal:<br />
<br />
<div class="terminal">$ java -cp ./Nuevo.jar prueba.Hola</div><br />
Ejecutar de esta manera no es lo mejor, ya que tenemos que ponerle opciones al ejecutar, además debemos conocer el nombre de la clase principal y en que paquete se encuentra.<br />
<br />
Afortunadamente java nos ofrece otra posibilidad de forma que no ocupemos tanto rollo. Se trata de un fichero de texto donde metemos una línea en la que se ponga cual es la clase principal. Este fichero se conoce como fichero de manifiesto y su contenido es tan simple como este:<br />
<br />
<b>Main-Class: prueba.Hola</b><br />
<br />
El archivo de manifiesto es un archivo de texto plano por lo que podrá ser creado con cualquier editor de textos convencional. El archivo podrá tener cualquier nombre y extensión, ya que lo que el programa jar hará, será mezclar el contenido de este archivo con el que se crea por defecto.<br />
<br />
<div class="subtema">Crear jar agregando nuestro archivo manifiesto</div><br />
Cuando construimos el jar, debemos incluir este fichero de la siguiente forma. Por ejemplo, si el fichero lo llamamos manifiesto.mf y lo ponemos en el directorio donde vamos a construir el jar, el comando para hacerlo sería este:<br />
<br />
<div class="terminal">$ jar cmf manifiesto.mf Nuevo.jar prueba/Hola.class</div><br />
Agregamos la opción "m" para indicar que vamos a añadir un fichero de manifiesto.<br />
Importante el orden en que colocamos las cosas; como en las opciones colocamos mf, debemos indicar primero lo que requiere "m" en este caso el archivo manifiesto, y después "f" el nombre de nuestro jar.<br />
<br />
<div class="subtema">Ejecutar nuestro jar</div><br />
Una vez construido, se ejecuta de la siguiente manera:<br />
<br />
<div class="terminal">$ java -jar Nuevo.jar</div><br />
La opción "-jar" indica que se va a ejecutar el Nuevo.jar que se ponga a continuación haciendo caso de su fichero de manifiesto y como este fichero de manfiesto dice que la clase principal es prueba.Hola, será esta la que se ejecute.<br />
<br />
Con esto podemos entregar directamente nuestro fichero jar a un amigo y listo, no tendrá problemas para ejecutarlo.<br />
<br />
<div class="tema">Ejemplos</div><br />
<div class="subtema">Jar con archivo manifiesto</div><br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEicnMHTW2XNH_5drf3TtdzT9FvHWnfMsUZCWUC9jKW26F4W1XWg-YA3MSBuetpzwQkY9DB5uqwKc6rPGD76HKTn-CYspS4Anvp-C-FCPmdNiVvWxPvOmL0zb0YYOSol7YChIEO08EEEI6tY/s1600/jar-02.png" imageanchor="1" style="margin-left:1em; margin-right:1em"><img border="0" height="196" width="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEicnMHTW2XNH_5drf3TtdzT9FvHWnfMsUZCWUC9jKW26F4W1XWg-YA3MSBuetpzwQkY9DB5uqwKc6rPGD76HKTn-CYspS4Anvp-C-FCPmdNiVvWxPvOmL0zb0YYOSol7YChIEO08EEEI6tY/s400/jar-02.png" /></a></div><br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjkJf2daMpb8srsyGdfgcm4w9jv8QGeeF48LZXqS0KXuZqfmwlfM0sngYaQ46IWpFCoWHlMP_WnIJwaBYewPLjuwdu-bGPZDw9L40R8mY6q3cu-GTQO-5u24v9T6KFNK5rNwHx329nzr5w-/s1600/jar-01.png" imageanchor="1" style="margin-left:1em; margin-right:1em"><img border="0" height="112" width="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjkJf2daMpb8srsyGdfgcm4w9jv8QGeeF48LZXqS0KXuZqfmwlfM0sngYaQ46IWpFCoWHlMP_WnIJwaBYewPLjuwdu-bGPZDw9L40R8mY6q3cu-GTQO-5u24v9T6KFNK5rNwHx329nzr5w-/s400/jar-01.png" /></a></div><br />
Como ven en la secuencia de comando de la captura de ventana hago lo siguiente:<br />
-Ver los archivos contenidos de la carpeta "hola".<br />
-Visualizar el contenido del archivo "manifiesto.mf".<br />
-Compilar el archivo "Hola.java".<br />
-Ejecutar "Hola" para verificar que funciona.<br />
-Crear el fichero jar.<br />
-Ver nuevamente el contenido de la carpeta.<br />
-Ejecutar el contenido del fichero jar.<br />
<br />
Así se ven los archivos finales:<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEidTxmlsxpbKiTmuFQ8VuH3Ow53Ed-ryQgIWG8C2j-r73Zzr-57OkxatOfv6ELm_kGcNBEnXvTI4OAxBsSeUeuOre5Q7BYS7Ebe0EyPEHCV6vdbD5tcBxXOgMD-T9UO8JF-vGThcPdBBVaa/s1600/jar-03.png" imageanchor="1" style="margin-left:1em; margin-right:1em"><img border="0" height="82" width="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEidTxmlsxpbKiTmuFQ8VuH3Ow53Ed-ryQgIWG8C2j-r73Zzr-57OkxatOfv6ELm_kGcNBEnXvTI4OAxBsSeUeuOre5Q7BYS7Ebe0EyPEHCV6vdbD5tcBxXOgMD-T9UO8JF-vGThcPdBBVaa/s400/jar-03.png" /></a></div><br />
<div class="subtema">Jar con archivo manifiesto y clases contenidas en un paquete</div><br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg8hoKCehW7M0KX-7OA1CTraXiDJhlXgd0idgodiHcBKfstUViePfhRygpJpvEtvBN9BNyvHyIaaHNONhLj5abUH2Bb6wzv94KMYjsKKbdqL4MojY7tNKQMhbnIjAevtYPCcbO5GA6MAiQM/s1600/jar-04.png" imageanchor="1" style="margin-left:1em; margin-right:1em"><img border="0" height="200" width="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg8hoKCehW7M0KX-7OA1CTraXiDJhlXgd0idgodiHcBKfstUViePfhRygpJpvEtvBN9BNyvHyIaaHNONhLj5abUH2Bb6wzv94KMYjsKKbdqL4MojY7tNKQMhbnIjAevtYPCcbO5GA6MAiQM/s400/jar-04.png" /></a></div><br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjFtgpFwwElQNM2ZiLPOQT93qjqNRYcN_VvZlBWJk3BKpFCtdgOPWFODe57Tz2xJQajLvIpERq_T9PuQz6LJi2sT_TJUH8bAv3Po_fXhSh890po_ybLwjbtdNZcvfZURbSQPrz49Ed4PHaO/s1600/jar-05.png" imageanchor="1" style="margin-left:1em; margin-right:1em"><img border="0" height="144" width="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjFtgpFwwElQNM2ZiLPOQT93qjqNRYcN_VvZlBWJk3BKpFCtdgOPWFODe57Tz2xJQajLvIpERq_T9PuQz6LJi2sT_TJUH8bAv3Po_fXhSh890po_ybLwjbtdNZcvfZURbSQPrz49Ed4PHaO/s400/jar-05.png" /></a></div><br />
Ahora una prueba con otro ejemplo, en este caso lo realizado fue:<br />
-Primero compilo los archivos .java contenidos en el paquete "graficador".<br />
-Ejecuto la clase principal del paquete para corroborar que funciona.<br />
-Vemos los archivos contenidos en el directorio actual.<br />
-Creamos el fichero jar.<br />
-Volvemos a ver los archivos contenidos, y vemos que se creo nuestro jar.<br />
.Por último ejecutamos el jar para probar.<br />
<br />
Esta es una imagen de como resulta después de la ejecución del jar:<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjxTE_rw0uZ8Se6gGBkufi1jIgYktf5CZ2WzenZXWb5UfggCtGwAwBDwZdC-UcWZril3aDEI7tYBh_o13dWKVgUn1Ypik2xWbZ2btQL3recXasuf1i83eHQ7lxKE2-jsQF2ySEgYFUlSSdl/s1600/jar-06.png" imageanchor="1" style="margin-left:1em; margin-right:1em"><img border="0" height="335" width="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjxTE_rw0uZ8Se6gGBkufi1jIgYktf5CZ2WzenZXWb5UfggCtGwAwBDwZdC-UcWZril3aDEI7tYBh_o13dWKVgUn1Ypik2xWbZ2btQL3recXasuf1i83eHQ7lxKE2-jsQF2ySEgYFUlSSdl/s400/jar-06.png" /></a></div><br />
Espero les haya servido para que ustedes hagan sus propios <b>jar</b> y puedan compartir sus proyectos. Cabe mencionar que es posible crear estos jar sin necesidad de incluir los archivos <b>.java</b> para evitar que alguien nos copie, y al solo incluir los <b>.class</b> solo podrán ejecutar y ver como va nuestro proyecto.<br />
<br />
Les dejo los <b>.jar</b> de los ejemplos para que prueben verlos.<br />
<br />
<b>Descargar ejemplos desde MediaFire:</b><br />
<a href="http://www.mediafire.com/?8hv4techw0hgj4o">HolaMundo.jar</a><br />
<a href="http://www.mediafire.com/?or89v6b3uiu37io">Graficador.jar</a><br />
<br />
<b>Referencias:</b><br />
<a href="http://www.chuidiang.com/java/novatos/hacer_ficheros_jar.php">Ficheros JAR</a><br />
<a href="http://login.osirislms.com/index.php?modname=foro&op=message&idThread=28">Jar ejecutable</a><br />
</div>Anonymoushttp://www.blogger.com/profile/02234142471203536128noreply@blogger.com2tag:blogger.com,1999:blog-4717153029351703678.post-76457806320031039892011-05-16T07:40:00.003-05:002011-05-22T00:05:45.296-05:00Demostración final<div id="entrada"><div class="encabezado">Taller de Programación Orientada a Objetos <br />
Semana 14 </div><br />
Diapositivas en persona o video en YouTube.<br />
<br />
<div class="linea"></div><br />
<center><div style="width:425px" id="__ss_8056478"><strong style="display:block;margin:12px 0 4px"><a href="http://www.slideshare.net/esteban-gzz/demostracin-final-8056478" title="Demostración final">Demostración final</a></strong><object id="__sse8056478" width="425" height="355"><param name="movie" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=demostracionfinal-110521235721-phpapp01&stripped_title=demostracin-final-8056478&userName=esteban-gzz" /><param name="allowFullScreen" value="true"/><param name="allowScriptAccess" value="always"/><embed name="__sse8056478" src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=demostracionfinal-110521235721-phpapp01&stripped_title=demostracin-final-8056478&userName=esteban-gzz" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="355"></embed></object><div style="padding:5px 0 12px">Ver más presentaciones de <a href="http://www.slideshare.net/esteban-gzz">Esteban González</a>.</div></div></center><br />
<br />
<center><object width="425" height="344"><param name="movie" value="http://www.youtube.com/v/hFw6sps9MFo?hl=es&fs=1"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube.com/v/hFw6sps9MFo?hl=es&fs=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="344"></embed></object></center><br />
<br />
<div class="linea"></div><br />
En esta demostración:<br />
- En que lenguaje.<br />
- Porqué.<br />
- Con que herramientas.<br />
- Como obtenerlas.<br />
- Como instalarlas.<br />
- Highlights de código.<br />
- Documentación del código.<br />
- Como compilar/ejecutar (el software y las pruebas).<br />
- Qué hace el programa, qué falta.<br />
- Qué fue difícil, tardado, etc.<br />
<br />
</div>Anonymoushttp://www.blogger.com/profile/02234142471203536128noreply@blogger.com4tag:blogger.com,1999:blog-4717153029351703678.post-34694657871798355872011-05-16T07:35:00.001-05:002011-05-17T04:06:16.114-05:00Presentación final<div id="entrada"><div class="encabezado">Programación Orientada a Objetos <br />
Semana 14 </div><br />
Diapositivas en persona o video en YouTube.<br />
<br />
<div class="linea"></div><center><br />
<div style="width:425px" id="__ss_7991451"><strong style="display:block;margin:12px 0 4px"><a href="http://www.slideshare.net/esteban-gzz/presentacin-final-7991451" title="Presentación final">Presentación final</a></strong><object id="__sse7991451" width="425" height="355"><param name="movie" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=presentacionfinal-110517035848-phpapp01&stripped_title=presentacin-final-7991451&userName=esteban-gzz" /><param name="allowFullScreen" value="true"/><param name="allowScriptAccess" value="always"/><embed name="__sse7991451" src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=presentacionfinal-110517035848-phpapp01&stripped_title=presentacin-final-7991451&userName=esteban-gzz" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="355"></embed></object><div style="padding:5px 0 12px">Ver más presentaciones de <a href="http://www.slideshare.net/esteban-gzz">Esteban Gonzalez</a>.</div></div></center><br />
<div class="linea"></div><br />
Para esta presentación:<br />
- Para qué sirve tu proyecto.<br />
- Para quién es tu proyecto.<br />
- Porqué.<br />
- Diseño de clases (UML clases).<br />
- Diseño de función (UML secuencia).<br />
- Diseño de pruebas.<br />
- Diseño de pantallas.<br />
- Opcional (Base de datos, serializacion, distribuidos).<br />
<br />
</div>Anonymoushttp://www.blogger.com/profile/02234142471203536128noreply@blogger.com8tag:blogger.com,1999:blog-4717153029351703678.post-68095246114791607482011-05-12T08:30:00.003-05:002011-05-16T04:32:40.688-05:00Guardar archivos en la nube - Ubuntu One<div id="entrada"><div class="encabezado">Entrada extra </div><br />
Al finalizar nuestros trabajos de Taller de Programación, comúnmente nos olvidamos de los archivos y dónde quedaron guardados, por lo que es bueno tener algún tipo de respaldo que este accesible en Internet. Con esto evitaremos tal y como nos menciono la Dra. Elisa, si un día se nos cae la Laptop al río y nuestro proyecto estaba guardado solamente ahí sería una pérdida muy grande. Afortunadamente existen muchas páginas y aplicaciones que nos permiten guardar archivos en la nube.<br />
<br />
Algunos de los servicios que en lo personal yo he usado y recomiendo son:<br />
<ol><li><b>Google Docs:</b> Servicio que nos proporciona Google con una capacidad de almacenaje de 1GB y que además nos permite crear documentos en línea.</li>
<li><b>Sky Drive:</b> Es proporcionado por Microsoft dentro se sus servicios de Windows Live y que nos brinda una aplicación para escritorio llamada Mesh. Tenemos una capacidad de 25GB en la web y 5GB extras para la sincronización con Mesh.</li>
<li><b>Ubuntu One:</b> Precisamente este servicio es de Ubuntu y nos regala 2GB gratis y opciones para expandir a más capacidad con precios accesibles.</li>
</ol><br />
Estos servicios antes mencionados no tienen ningún consto pero si requieren tener una cuenta creada previamente, o sino la opción de crear una cuenta nueva.<br />
<br />
<div class="tema">Ubuntu One</div><br />
Ya que recién cree esta cuenta les hablaré un poquito de ella y los pasos que seguí para hacerlo.<br />
<br />
<a href="https://one.ubuntu.com/"> >> Ir a Ubuntu One</a><br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiUhwl4rpEbQTDEfgCbNuLlEbgPRG3rm5jLjlMQncT4ZkeNFdf5feuTovnUQ4PQW4h5eV4n_cdX9CEKzio7f5iaF880dewLUlkdjw2brJm7SecyQep-R3iAIKCVGl-WH9JC6Q1pAS-ipFHQ/s1600/Cloud-04.png" imageanchor="1" style="margin-left:1em; margin-right:1em"><img border="0" height="160" width="319" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiUhwl4rpEbQTDEfgCbNuLlEbgPRG3rm5jLjlMQncT4ZkeNFdf5feuTovnUQ4PQW4h5eV4n_cdX9CEKzio7f5iaF880dewLUlkdjw2brJm7SecyQep-R3iAIKCVGl-WH9JC6Q1pAS-ipFHQ/s400/Cloud-04.png" /></a></div><br />
Una vez que estemos en la página nos vamos a la opción Join de la barra de menú.<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjhObO-aGq8CFofEXWmaBvvXTtnxFYyAhm-gKl6SDqt3WyjMin6TdQjf34GIQVYx5Hn3zg0AbXbeFh750E-PW2wk_ppX-uFPBO0kY2-vYl2C_GPNy1FF3X-5HUOVAYl1kVSjlF1yTdgomeN/s1600/Cloud-05.png" imageanchor="1" style="margin-left:1em; margin-right:1em"><img border="0" height="64" width="119" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjhObO-aGq8CFofEXWmaBvvXTtnxFYyAhm-gKl6SDqt3WyjMin6TdQjf34GIQVYx5Hn3zg0AbXbeFh750E-PW2wk_ppX-uFPBO0kY2-vYl2C_GPNy1FF3X-5HUOVAYl1kVSjlF1yTdgomeN/s400/Cloud-05.png" /></a></div><br />
O directamente en el siguiente enlace: <a href="https://one.ubuntu.com/plans/">Join</a><br />
<br />
Nos desplegará las siguientes opciones de planes, yo por supuesto seleccione la que es Gratis.<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgnVEev6eud6r0wUJaB7JxjeZNZfk7AtZrw6wehGt5SKfWaXmy-ooXC_N1PtzVTN1CgniKTH9QUHYhcFlZZn_5i1mYEcT0rZydnLoZL6n8j2cZ3VNBctuIOjChg5DC_cRj9-L8JOqmaFFfu/s1600/Cloud-06.png" imageanchor="1" style="margin-left:1em; margin-right:1em"><img border="0" height="378" width="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgnVEev6eud6r0wUJaB7JxjeZNZfk7AtZrw6wehGt5SKfWaXmy-ooXC_N1PtzVTN1CgniKTH9QUHYhcFlZZn_5i1mYEcT0rZydnLoZL6n8j2cZ3VNBctuIOjChg5DC_cRj9-L8JOqmaFFfu/s400/Cloud-06.png" /></a></div><br />
Todo es muy simple, ahora solo basta crearnos una cuenta nueva.<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjUXnrI6WGRDqxBrqgZyK6ynrzuLAWy-rG4eL1TAFSnrNV5mMMwf4mLnwaIUBYk35U8Bn4V7GevWWsHRJZ40NIJCEgE7gT1HovN8R6lsRdNiNSsrVEXcChWKGPhlKsztcWvJsBhXhcD0ZkB/s1600/Cloud-07.png" imageanchor="1" style="margin-left:1em; margin-right:1em"><img border="0" height="270" width="313" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjUXnrI6WGRDqxBrqgZyK6ynrzuLAWy-rG4eL1TAFSnrNV5mMMwf4mLnwaIUBYk35U8Bn4V7GevWWsHRJZ40NIJCEgE7gT1HovN8R6lsRdNiNSsrVEXcChWKGPhlKsztcWvJsBhXhcD0ZkB/s400/Cloud-07.png" /></a></div><br />
Nos nos piden tantos datos, así que no hay que preocuparse porque quieran secuestrarnos o algo parecido.<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEibiIy1bdrb8XuT9HyW0L-juJiR-P0aSpTMcshqyJf59bNlR5Ca_TjwnvwoxMckX3C7O2oiZOiChls4BtJiDbHdWV21W1l_GrOWtBI0PcNOGQgsQJ0148_70vaiOP5YOVv6G16Ig-LrAB1B/s1600/Cloud-08.png" imageanchor="1" style="margin-left:1em; margin-right:1em"><img border="0" height="292" width="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEibiIy1bdrb8XuT9HyW0L-juJiR-P0aSpTMcshqyJf59bNlR5Ca_TjwnvwoxMckX3C7O2oiZOiChls4BtJiDbHdWV21W1l_GrOWtBI0PcNOGQgsQJ0148_70vaiOP5YOVv6G16Ig-LrAB1B/s400/Cloud-08.png" /></a></div><br />
Cuando tengamos la cuenta creada ya podemos ingresar y empezar a hacer uso de este servicio.<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiV1WitOm9AfamgREPEH2IIyZ3dk8LYUaDhQZaxZtM1FIsBwBKU55I5LZ9ttQ0SIa7H8yzr5p99rZeUSaLY4-fTBX6trPtsbx1XIxT9Xjw01IzoTvJoEIX-HStvVI4bzMIoe8ofY1WgZRwr/s1600/Cloud-09.png" imageanchor="1" style="margin-left:1em; margin-right:1em"><img border="0" height="203" width="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiV1WitOm9AfamgREPEH2IIyZ3dk8LYUaDhQZaxZtM1FIsBwBKU55I5LZ9ttQ0SIa7H8yzr5p99rZeUSaLY4-fTBX6trPtsbx1XIxT9Xjw01IzoTvJoEIX-HStvVI4bzMIoe8ofY1WgZRwr/s400/Cloud-09.png" /></a></div><br />
Ya podemos crear carpetas dentro de la opción Files.<br />
<br />
Ahora ya tenemos un lugar más donde podemos salvar archivos tan importantes como lo son los de nuestro proyecto y ya no habrá escusas como "Chuck Norris destruyo mi Lap" o "Olvide la USB en casa".<br />
<br />
Otra cosa buena es que Ubuntu One tiene una aplicación de escritorio y que nos permite manejar la cuenta desde la misma aplicación así como subir archivos más fácilmente. Lo malo es que al parecer estando dentro de la universidad no se nos permite el acceso por algún motivo.<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEicvxw1GAR_vvW1D39MXhxqH-uaEpcbDI-4kogY5e2AqzXeRFCZ7lnX4dFfZg9nRvu9ISq_b4ZeCYzcFUzec7LZMFEpuc8nyLmDipx46j3W0HxW6s9IxGnLNApVl_TmGbH8mleHZ3DE7YcT/s1600/Cloud-10.png" imageanchor="1" style="margin-left:1em; margin-right:1em"><img border="0" height="396" width="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEicvxw1GAR_vvW1D39MXhxqH-uaEpcbDI-4kogY5e2AqzXeRFCZ7lnX4dFfZg9nRvu9ISq_b4ZeCYzcFUzec7LZMFEpuc8nyLmDipx46j3W0HxW6s9IxGnLNApVl_TmGbH8mleHZ3DE7YcT/s400/Cloud-10.png" /></a></div><br />
He probado desde la conexión de mi casa y aquí no me ha dado problemas con la aplicación Ubuntu One. Al abrir por primera vez este programa en la computadora nos pedirá que creemos una cuenta nueva, pero en nuestro caso que ya habíamos creado una anteriormente solo será necesario ingresar nuestros datos y la sincronización con el servidor será automática.<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgRWImzsYacCUG2at6DNUQNerWL45pIvl5E68OxqmSlClSWhSA_oDDzB2cgEyiMGiRNBsaiCWgMjMB1aTCrBehvEjGKswdaBy1J6whmBTb6291ZkVNnDhvIrR8I3xiK32U7xuWAAsx6VQVX/s1600/One-01.png" imageanchor="1" style="margin-left:1em; margin-right:1em"><img border="0" height="400" width="366" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgRWImzsYacCUG2at6DNUQNerWL45pIvl5E68OxqmSlClSWhSA_oDDzB2cgEyiMGiRNBsaiCWgMjMB1aTCrBehvEjGKswdaBy1J6whmBTb6291ZkVNnDhvIrR8I3xiK32U7xuWAAsx6VQVX/s400/One-01.png" /></a></div><br />
También podemos manejar los sitios donde existe la sincronización de nuestros archivos, con la posibilidad de eliminar un sitio que podría ser una intrusión.<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiNDADHv15PZcnwx8LQ2XYQAdLsZLvVfcXgxcB8H56X8_rFMx0UBpja2Tad8TWcF_Lk5lN2cQORQC-0hR3uErrP9jq93BJvV068mFMJv49TmJvxf4ciXX3X8bsS_1PyQdOxNN0_dSN-QB4k/s1600/One-02.png" imageanchor="1" style="margin-left:1em; margin-right:1em"><img border="0" height="400" width="366" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiNDADHv15PZcnwx8LQ2XYQAdLsZLvVfcXgxcB8H56X8_rFMx0UBpja2Tad8TWcF_Lk5lN2cQORQC-0hR3uErrP9jq93BJvV068mFMJv49TmJvxf4ciXX3X8bsS_1PyQdOxNN0_dSN-QB4k/s400/One-02.png" /></a></div><br />
Nos podemos dar cuenta entre nuestras carpetas que después de utilizar esta aplicación, tenemos una nueva con el nombre de Ubuntu One, al abrirla podemos encontrar las carpetas y archivos sincronizados con el servidor que se identifican con un indicador verde.<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi_2TgxTpP0TVJaa8kT7w74gzYFqYOYvnJbqaxQTLat6D1aeswVNteBLjf60qzKilwfF49jPBNtY8gk-BwTmskDN2vuHo0VFgniDHjlJYibLsB6T0IQUXc8Vga3wlabh1q18mKX7gj2Mhnw/s1600/One-03.png" imageanchor="1" style="margin-left:1em; margin-right:1em"><img border="0" height="224" width="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi_2TgxTpP0TVJaa8kT7w74gzYFqYOYvnJbqaxQTLat6D1aeswVNteBLjf60qzKilwfF49jPBNtY8gk-BwTmskDN2vuHo0VFgniDHjlJYibLsB6T0IQUXc8Vga3wlabh1q18mKX7gj2Mhnw/s400/One-03.png" /></a></div><br />
La finalidad de esta carpeta es la facilidad de respaldo de archivos en la nube, ya que solo arrastrando una carpeta a este lugar, o creando una carpeta nueva y copiando archivos existentes, esta es subida directamente al servidor, y cuando estemos en otro ordenador nuestras carpetas también estarán ahí siempre y cuando se haya configurado la sincronización de archivos.<br />
<br />
Por si no lo sabían, espero les sirva.<br />
<br />
NOTA: Me gustaría que los puntos obtenidos aquí vayan al Taller, ya que es dónde más me hace falta.<br />
</div>Anonymoushttp://www.blogger.com/profile/02234142471203536128noreply@blogger.com2tag:blogger.com,1999:blog-4717153029351703678.post-42116421947260662982011-05-10T07:30:00.003-05:002011-05-16T04:33:55.353-05:00Implementación de interfaces gráficas<div id="entrada"><div class="encabezado">Taller de Programación Orientada a Objetos <br />
Semana 13 </div><br />
Códigos documentados que implementan pantallas gráficas con la funcionalidad correcta de los componentes ya incorporada.<br />
<br />
Tal y como había creado mi diseño en papel, lo intente reproducir en Java lo más parecido posible y lo siguiente fue el resultado.<br />
<br />
Como ya mencione antes esta es la ventana principal de mi programa, y sus opciones están en la barra lateral izquierda.<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj8f-2Ex1nQaHbWc93Sm9Xbrf23JGB69gGmHbAy3frDCd3pSBexSXlFrTLpabJhFzQ2GwfvVrQ_epqbvecgw9LwaXyOMy91QXifCNJEZNFOFJTwAsWJbnfzq6PjoyOKNq3dycF5E4YutGOj/s1600/Grafica-01.png" imageanchor="1" style="margin-left:1em; margin-right:1em"><img border="0" height="286" width="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj8f-2Ex1nQaHbWc93Sm9Xbrf23JGB69gGmHbAy3frDCd3pSBexSXlFrTLpabJhFzQ2GwfvVrQ_epqbvecgw9LwaXyOMy91QXifCNJEZNFOFJTwAsWJbnfzq6PjoyOKNq3dycF5E4YutGOj/s400/Grafica-01.png" /></a></div><br />
El código de esta parte. Es donde están acomodados los paneles, y el uso de acomodo mediante paneles adentro de paneles...<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiwrf7j1kInohOBhtfJ5gIDtG8hzZiBxRVEgMn4hplCJaqhpr7TTzdqkw_rIS1gtID4dWOtWEJE4JPhtDtHXC8qBrE6fODzaIiWkc3kv1qerPISw47VgS7Qr2N-bTdGUMl-kLRo80kLvzfb/s1600/Imple-01.png" imageanchor="1" style="margin-left:1em; margin-right:1em"><img border="0" height="374" width="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiwrf7j1kInohOBhtfJ5gIDtG8hzZiBxRVEgMn4hplCJaqhpr7TTzdqkw_rIS1gtID4dWOtWEJE4JPhtDtHXC8qBrE6fODzaIiWkc3kv1qerPISw47VgS7Qr2N-bTdGUMl-kLRo80kLvzfb/s400/Imple-01.png" /></a></div><br />
Esta es la segunda ventana que había propuesto. Es donde tenemos las opciones de ver los archivos de datos que tenemos hasta el momento y que se mostrarán a un lado en el panel blanco cuanod se haya seleccionado alguno.<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjlofdEb7kdcPCD2fpMeCbeWHEZEiOJOonqoi8w0L6Goj1gy29oNVYtwEhMEzcQIP5Q5ABeUIH6CTuuItTpyUpbBu71Mm1TMILmlaqadiFWZVHl2cbhHTugHF-J37aCDicfuXAWAgRMqg_4/s1600/Grafica-02.png" imageanchor="1" style="margin-left:1em; margin-right:1em"><img border="0" height="287" width="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjlofdEb7kdcPCD2fpMeCbeWHEZEiOJOonqoi8w0L6Goj1gy29oNVYtwEhMEzcQIP5Q5ABeUIH6CTuuItTpyUpbBu71Mm1TMILmlaqadiFWZVHl2cbhHTugHF-J37aCDicfuXAWAgRMqg_4/s400/Grafica-02.png" /></a></div><br />
Aquí es la ventana de opciones que se tendrán al tener una gráfica. Como ven le falta meterle más contenido aquí y es porque me falta implementar bien esta parte ya que solo he logrado crear pequeños ejemplos de gráficas pero desde Netbeans.<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjI-5ChqvtoLqcPY8VEZ8-zfIQUGKB9N9kT_eBglJe5SoWowL5NG2aim2unOSodMd8sEi8PS-7B0UWw3yufK4lQlPh2BxtQR_qpOmKaUi37wV1bnGqEP11sW8DcZLZzBrpzqRQkronyoVzi/s1600/Grafica-03.png" imageanchor="1" style="margin-left:1em; margin-right:1em"><img border="0" height="285" width="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjI-5ChqvtoLqcPY8VEZ8-zfIQUGKB9N9kT_eBglJe5SoWowL5NG2aim2unOSodMd8sEi8PS-7B0UWw3yufK4lQlPh2BxtQR_qpOmKaUi37wV1bnGqEP11sW8DcZLZzBrpzqRQkronyoVzi/s400/Grafica-03.png" /></a></div><br />
El código que genera el acomodo de los paneles. Para el cambio de paneles en la ventana sin necesidad de crear una ventana nueva, utilizo un repaint() para actualizar los paneles.<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgt8Q9HFoQMN1_jfSap4BWDT-quISp-3r-pya_kiSybEug_OUUCH02VfRuNrMgu2d4NFbfz0-tX5EYxVO84aYf4tVlEyLqL7W7k9bAm18iFvlnNlsRgbEHdjWbj4whdujeY37qxM8_-Mpfr/s1600/Imple-02.png" imageanchor="1" style="margin-left:1em; margin-right:1em"><img border="0" height="381" width="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgt8Q9HFoQMN1_jfSap4BWDT-quISp-3r-pya_kiSybEug_OUUCH02VfRuNrMgu2d4NFbfz0-tX5EYxVO84aYf4tVlEyLqL7W7k9bAm18iFvlnNlsRgbEHdjWbj4whdujeY37qxM8_-Mpfr/s400/Imple-02.png" /></a></div><br />
Lo de mostrar la información de un archivo aun no logro acomodarlo en el panel blanco, que más bien sería un JTextArea, y solo me sale en terminal. Espero corregirlo bien para la demostración del jueves.<br />
<br />
<div class="subtema">Ejemplos de gráficas generadas con JFreeChart.</div><br />
Estas imágenes son ejemplo del uso de la librería JFreeChart en Java para la creación de imágenes.<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi4McODK8ICrOju9CbtrDn1Uy2PsSaeK_q3Sk5csh6jYPDZDlCRzOW6yzlJ5AjBIF0O1X2YEfjQ8pRlslpQm2FE4qSQVYWd_q_Lg_bQaJL0_IESZ9Pq3xoJZWkcO-qD8jxrBkwCOQ5F1gF1/s1600/Interfaz-01.jpg" imageanchor="1" style="margin-left:1em; margin-right:1em"><img border="0" height="298" width="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi4McODK8ICrOju9CbtrDn1Uy2PsSaeK_q3Sk5csh6jYPDZDlCRzOW6yzlJ5AjBIF0O1X2YEfjQ8pRlslpQm2FE4qSQVYWd_q_Lg_bQaJL0_IESZ9Pq3xoJZWkcO-qD8jxrBkwCOQ5F1gF1/s400/Interfaz-01.jpg" /></a></div><br />
En la anterior me hace idea a lo que quiero llegar... un botón al final para guardar la gráfica.<br />
<br />
Aquí los otros dos tipos de gráficas que tengo pensado incluir:<br />
<br />
Lineal:<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgJ46f8ey07wMDWzx2JE_iGvczr-79aHi9VCNKf0DmzTBQ6glHdzjhDAseieYSEJ4MHKNvP5gcNzHDNZb9SRnrhFuqQicXZ309JAuQTSn5bg9WUFlvhTzmluyeBIz0g9dg7HuyRXwk7AMBw/s1600/Interfaz-02.jpg" imageanchor="1" style="margin-left:1em; margin-right:1em"><img border="0" height="240" width="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgJ46f8ey07wMDWzx2JE_iGvczr-79aHi9VCNKf0DmzTBQ6glHdzjhDAseieYSEJ4MHKNvP5gcNzHDNZb9SRnrhFuqQicXZ309JAuQTSn5bg9WUFlvhTzmluyeBIz0g9dg7HuyRXwk7AMBw/s400/Interfaz-02.jpg" /></a></div><br />
Pastel:<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiXat6o_rxLyUr_k30NUIXiRkeEa9_9Ar0s1bDY_k7Z-P9YpMxy5iHNzTj5t9DniA-9IKmseU9XgKEV4Yc5-ONL1cGrEhOi3ASfeY_t8d-BQid_JZfqP5i016RHYP2dMHymyEX6zTN0w_Vz/s1600/Interfaz-03.jpg" imageanchor="1" style="margin-left:1em; margin-right:1em"><img border="0" height="240" width="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiXat6o_rxLyUr_k30NUIXiRkeEa9_9Ar0s1bDY_k7Z-P9YpMxy5iHNzTj5t9DniA-9IKmseU9XgKEV4Yc5-ONL1cGrEhOi3ASfeY_t8d-BQid_JZfqP5i016RHYP2dMHymyEX6zTN0w_Vz/s400/Interfaz-03.jpg" /></a></div><br />
Poco a poco va tomando forma.<br />
</div>Anonymoushttp://www.blogger.com/profile/02234142471203536128noreply@blogger.com4tag:blogger.com,1999:blog-4717153029351703678.post-14324742272907421362011-05-10T07:10:00.002-05:002011-05-16T04:34:39.359-05:00Diseño de interfaces gráficas<div id="entrada"><div class="encabezado">Programación Orientada a Objetos <br />
Semana 13 </div><br />
Dibujos de diseños de pantallas que identifican los componentes utilizados, su posicionamiento y función.<br />
<br />
<div class="tema">Primero... ¿Qué es la interfaz gráfica?</div><br />
La interfaz gráfica de usuario, conocida también como GUI (Graphical User Interface) es un programa informático que actúa de interfaz de usuario, utilizando un conjunto de imágenes y objetos gráficos para representar la información y acciones disponibles en la interfaz.<br />
<br />
Su principal uso, consiste en proporcionar un entorno visual sencillo para permitir la comunicación con el sistema operativo de una máquina o computador.<br />
<br />
Habitualmente las acciones se realizan mediante manipulación directa, para facilitar la interacción del usuario con la computadora. Surge como evolución de los intérpretes de comandos que se usaban para operar los primeros sistemas operativos y es pieza fundamental en un entorno gráfico. Como ejemplos de interfaz gráfica de usuario, cabe citar los entornos de escritorio Windows, el X-Window de GNU/Linux o el de Mac OS X, Aqua.<br />
<br />
En el contexto del proceso de interacción persona-ordenador, la interfaz gráfica de usuario es el artefacto tecnológico de un sistema interactivo que posibilita, a través del uso y la representación del lenguaje visual, una interacción amigable con un sistema informático.<br />
<br />
<div class="subtema">Dibujos de ventanas</div><br />
Aquí les muestro los dibujos de las pantallas tal y como yo quiero que queden, por lo menos hasta este momento.<br />
<br />
En la primer ventana desplegada quiero que se muestre una barra lateral a la izquierda que muestre las opciones en este caso del menú principal: Ver bases de datos, Crear nueva, Recientes. Abajo se encuentra el botón Salir con la misma función del cierre de la ventana con la tacha de la esquina superior izquierda. El nombre del programa es desplegado en la ventana. A un lado esta un panel blanco que da la bienvenida mientras no se tenga que mostrar nada ahí.<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgdC9Vkdy6MQmZBb9iarZXlOLyKsqmoo3Pjqz5Q_rq8I1MNEyNVz3kfTZHQmkXyk-cpS1NlZlslXrLMnDg5cCPXEHIohFzSZAYB5fHc4rQfNrwwYh_hyphenhyphenxikAspuN1IEduAzFDnBGeIC0WH7/s1600/Borrador-01.jpg" imageanchor="1" style="margin-left:1em; margin-right:1em"><img border="0" height="300" width="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgdC9Vkdy6MQmZBb9iarZXlOLyKsqmoo3Pjqz5Q_rq8I1MNEyNVz3kfTZHQmkXyk-cpS1NlZlslXrLMnDg5cCPXEHIohFzSZAYB5fHc4rQfNrwwYh_hyphenhyphenxikAspuN1IEduAzFDnBGeIC0WH7/s400/Borrador-01.jpg" /></a></div><br />
El botón de bases de datos debe mostrarte en la ventana los archivos que se tienen disponibles para abrir y visualizar en pantalla.<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjDNoQD3Pm_FebWTh7oZFCBGMqnOTp60wD3X_6JXRiCHRevjVZEMJxfV4vus7spuf9in08SUzzKGyLEEbZUZmlCRQ7qZs0qL2UvEkyUsecdCpnXxZwYQoIhlvCD3fatXXlYa_q4nUAAYbCz/s1600/Borrador-02.jpg" imageanchor="1" style="margin-left:1em; margin-right:1em"><img border="0" height="300" width="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjDNoQD3Pm_FebWTh7oZFCBGMqnOTp60wD3X_6JXRiCHRevjVZEMJxfV4vus7spuf9in08SUzzKGyLEEbZUZmlCRQ7qZs0qL2UvEkyUsecdCpnXxZwYQoIhlvCD3fatXXlYa_q4nUAAYbCz/s400/Borrador-02.jpg" /></a></div><br />
Vemos que se tiene bajo la lista de archivos el botón Menú que te hace regresar a la ventana anterior.<br />
<br />
Así es como se mostraría una tabla con los datos del archivo, no serían en celdas como lo es habitual en Excel pero si nos permite ver que información se encuentra ahí.<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgQmnphPwcPeao65JngeqiY_1TMZIp0T03jo6CwrViRXq_MoDVi2r4ehyphenhyphenM8jhIolyvUHpgoCuFiJ1W1R74t0edVh5u3IXFMK94l-sDoq95_BHUqrtW5jNRyie5_U4yhuWOCRPOZr4g4Iryj/s1600/Borrador-03.jpg" imageanchor="1" style="margin-left:1em; margin-right:1em"><img border="0" height="300" width="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgQmnphPwcPeao65JngeqiY_1TMZIp0T03jo6CwrViRXq_MoDVi2r4ehyphenhyphenM8jhIolyvUHpgoCuFiJ1W1R74t0edVh5u3IXFMK94l-sDoq95_BHUqrtW5jNRyie5_U4yhuWOCRPOZr4g4Iryj/s400/Borrador-03.jpg" /></a></div><br />
Vemos que al final se encuentra el botón graficar que nos permite precisamente crear una gráfica con los datos mostrados en la tabla.<br />
<br />
Al crear la gráfica esta se muestra con las opciones predeterminadas y nos permite en la lista de opciones hacer cambios a esta misma.<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgyo4XVkPPs0tkRq5LbFyo9x1w7VQNlMpMsPHou0VvSOnPIMhcUQZKFrPEbZjdM2b5G488H4NkXzEwKZTtgTcnVamekzTR0E0p6oZFLTpCbd1sMCKytChbg8eGCU4JZZNK63lDIJZdcWKge/s1600/Borrador-04.jpg" imageanchor="1" style="margin-left:1em; margin-right:1em"><img border="0" height="300" width="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgyo4XVkPPs0tkRq5LbFyo9x1w7VQNlMpMsPHou0VvSOnPIMhcUQZKFrPEbZjdM2b5G488H4NkXzEwKZTtgTcnVamekzTR0E0p6oZFLTpCbd1sMCKytChbg8eGCU4JZZNK63lDIJZdcWKge/s400/Borrador-04.jpg" /></a></div><br />
Falta también un botón al final de la gráfica que nos permita guardar la gráfica como una imagen con el formato .png o .jpg y que estas se puedan mostrar en una ventana que se despliegue al presionar Recientes de la ventana principal.<br />
<br />
<b>Referencias:</b><br />
<a href="http://es.wikipedia.org/wiki/Interfaz_gr%C3%A1fica_de_usuario">Definición de interfaz gráfica</a><br />
</div>Anonymoushttp://www.blogger.com/profile/02234142471203536128noreply@blogger.com1tag:blogger.com,1999:blog-4717153029351703678.post-64557683980116864672011-05-04T23:50:00.050-05:002011-05-05T04:35:36.024-05:00Implementación de sistemas distribuidos<div id="entrada"><div class="encabezado">Taller de Programación Orientada a Objetos <br />
Semana 12 </div><br />
Implementación de por lo menos un prototipo pequeño para lograr la operación distribuida por lo menos parcial del sistema bajo desarrollo.<br />
<br />
Para esta semana donde tratamos sistemas distribuidos decidí hacer un programa que aplicará a mi proyecto tal y como lo mencione en la entrada anterior. Este trata de el envío de un archivo desde el servidor hasta el cliente cuando este hace solicitud de el.<br />
<br />
<div class="subtema">En mi programa solo tengo tres clases, que son las siguientes:</div><br />
<b>Servidor:</b> El servidor se encarga de abrir el socket necesario para la comunicación con el cliente, que en este caso se espera a que solicite un archivo que se encuentra almacenado. Para este ejemplo coloque el nombre de un archivo que yo cree con el nombre de Enviado.txt.<br />
<br />
<b>Cliente:</b> Este entra en comunicación con el servidor mediante el socket abierto y la dirección IP del servidor, para este ejemplo deje que solo funcionara en localhost, ya que solo lo probé desde un terminal a otro de una misma computadora.<br />
<br />
<b>TomaArchivo:</b> Este archivo tiene en un string la ruta del archivo que se enviará, y otras variables necesarias para el envío de los datos en paquetes separados. Aquí es donde se implementa la serialización.<br />
<br />
Para lograr la funcionalidad trabaje con el código visto en el taller y junto con la explicación que encontré en el siguiente <a href=""http://www.chuidiang.com/java/sockets/fichero_socket/fichero_socket.php">blog</a>.<br />
<br />
Les muestro la parte del código que corresponde a la parte del socket y lo necesario para la transferencia de datos.<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg1BANY6PLuY3k4jYsR3Lz0w2W-ESAtyGDmQPRhKBUEAKdqGDznE_8SITOPDT_KOiiljEmq16voSPia_A2aaUhSfq4ZSATT6aBGm-YYpa11mGZPMO9YtInSYF-ygyeY23KPz_l_u0Xrv9G6/s1600/distri-03.png" imageanchor="1" style="margin-left:1em; margin-right:1em"><img border="0" height="339" width="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg1BANY6PLuY3k4jYsR3Lz0w2W-ESAtyGDmQPRhKBUEAKdqGDznE_8SITOPDT_KOiiljEmq16voSPia_A2aaUhSfq4ZSATT6aBGm-YYpa11mGZPMO9YtInSYF-ygyeY23KPz_l_u0Xrv9G6/s400/distri-03.png" /></a></div><br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjS8CDVmR5E1e0joBSwMYtuwSMd3eO0PeD74CyZB7Y9ErINi8xgLNpPYIM-zjjFiFE5N3v4hqAjB3h8W4w3Z6MhjfFGaplmIyhrINbG94C23kyx6yFR28Sj3WRWgChQOu0Dv6orbcmKPPG_/s1600/distri-04.png" imageanchor="1" style="margin-left:1em; margin-right:1em"><img border="0" height="357" width="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjS8CDVmR5E1e0joBSwMYtuwSMd3eO0PeD74CyZB7Y9ErINi8xgLNpPYIM-zjjFiFE5N3v4hqAjB3h8W4w3Z6MhjfFGaplmIyhrINbG94C23kyx6yFR28Sj3WRWgChQOu0Dv6orbcmKPPG_/s400/distri-04.png" /></a></div><br />
En seguida esta una captura de los archivos antes de ser compilados y ejecutados.<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhMuQZKdQ0PjY2e8GumveKO9JCPChmnOk2qjjR9ZuARLUf4H8HGnCerek2alfrPWTG68gNu93KpETDUKGR3yTtTEQEdA_vxiTt-7G4vWI3H8696-iQJSQ3xecLolS8AZqR7Z-P_chz5BKF4/s1600/distri-01.png" imageanchor="1" style="margin-left:1em; margin-right:1em"><img border="0" height="86" width="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhMuQZKdQ0PjY2e8GumveKO9JCPChmnOk2qjjR9ZuARLUf4H8HGnCerek2alfrPWTG68gNu93KpETDUKGR3yTtTEQEdA_vxiTt-7G4vWI3H8696-iQJSQ3xecLolS8AZqR7Z-P_chz5BKF4/s400/distri-01.png" /></a></div><br />
El archivo Enviado.txt contiene lo siguiente.<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhFVrOJQsAJEaTy3n5BSB88QSOrJAkGZl2n9LZ2whgguePFi0TKDEitkUVFQfXZAulg39uYaZsNPcpXv594XWJ9bZMWMis7cmTMysL8Q4xJZ_3_pK-osCAWYGK1yLOmYE5EWXQzb_KSXq9B/s1600/distri-02.png" imageanchor="1" style="margin-left:1em; margin-right:1em"><img border="0" height="239" width="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhFVrOJQsAJEaTy3n5BSB88QSOrJAkGZl2n9LZ2whgguePFi0TKDEitkUVFQfXZAulg39uYaZsNPcpXv594XWJ9bZMWMis7cmTMysL8Q4xJZ_3_pK-osCAWYGK1yLOmYE5EWXQzb_KSXq9B/s400/distri-02.png" /></a></div><br />
Una vez compilados los archivos, así se ve la ejecución simultanea del cliente y el servidor.<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiGsSlMOg2JedUME-keAr2ExW5cm-VNRtUT66UMqK-0O5K8PyGZtoON8cJSk8IH77eo0qlV3aQ5LY1LeaKFn_2nfFHU-DqkVdqFiJ2Aj2ReaWagiPFY8_5ZwZm8ZUlkXvt8UwQ_yah564yY/s1600/distri-05.png" imageanchor="1" style="margin-left:1em; margin-right:1em"><img border="0" height="162" width="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiGsSlMOg2JedUME-keAr2ExW5cm-VNRtUT66UMqK-0O5K8PyGZtoON8cJSk8IH77eo0qlV3aQ5LY1LeaKFn_2nfFHU-DqkVdqFiJ2Aj2ReaWagiPFY8_5ZwZm8ZUlkXvt8UwQ_yah564yY/s400/distri-05.png" /></a></div><br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEibWy3H-1sYm1J3fN-YceMPwAeGEyJjpW-DfFHlsJiozKzdb1DKFlbwG3FaVSvQ9uehuEgmk7sz0kvewcT9dorPMEbnmQexfNbEnMQ_CnXfqhLT762e-5lTblG03RrFoLMGKJDskuIA-mcP/s1600/distri-06.png" imageanchor="1" style="margin-left:1em; margin-right:1em"><img border="0" height="239" width="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEibWy3H-1sYm1J3fN-YceMPwAeGEyJjpW-DfFHlsJiozKzdb1DKFlbwG3FaVSvQ9uehuEgmk7sz0kvewcT9dorPMEbnmQexfNbEnMQ_CnXfqhLT762e-5lTblG03RrFoLMGKJDskuIA-mcP/s400/distri-06.png" /></a></div><br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg6peTLFqh68wLYw52N4Q3EBQzPj_r9ZnJsm-E8vAM29v4OTpb_ZEpkol5yVhpRRVbjo0Tj8ndYEW3hFZHCtOQq2QaE-J3QBELWp4mvf1O9e01n9grZQNN6a6iw3-1i8Gtz22vUKZqPoyuh/s1600/distri-07.png" imageanchor="1" style="margin-left:1em; margin-right:1em"><img border="0" height="239" width="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg6peTLFqh68wLYw52N4Q3EBQzPj_r9ZnJsm-E8vAM29v4OTpb_ZEpkol5yVhpRRVbjo0Tj8ndYEW3hFZHCtOQq2QaE-J3QBELWp4mvf1O9e01n9grZQNN6a6iw3-1i8Gtz22vUKZqPoyuh/s400/distri-07.png" /></a></div><br />
Ya por último la muestra de como quedaron los archivos, y ver como los datos recibidos desde el servidor se guardan en un archivo creado con el nombre de Recibido.txt.<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhXOSM-bwzmNyv03xXIkQ5NvAybVREmi8f_v8HAQCCcoBZqAJr8R0l6WwggtnmjUhz1jz0r2jvqBmytoTDxIpeEvrNjUD6RDnhB4LBufEfURTit93536VPgOBquq-6XfI1bm4FNIS47YLGf/s1600/distri-08.png" imageanchor="1" style="margin-left:1em; margin-right:1em"><img border="0" height="131" width="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhXOSM-bwzmNyv03xXIkQ5NvAybVREmi8f_v8HAQCCcoBZqAJr8R0l6WwggtnmjUhz1jz0r2jvqBmytoTDxIpeEvrNjUD6RDnhB4LBufEfURTit93536VPgOBquq-6XfI1bm4FNIS47YLGf/s400/distri-08.png" /></a></div><br />
Aunque podría ser muy útil, hasta el momento no lo pienso integrar realmente a mi proyecto, ya que me falta entrarle más con el aspecto de la toma de datos y la forma de graficar. <br />
</div>Anonymoushttp://www.blogger.com/profile/02234142471203536128noreply@blogger.com1tag:blogger.com,1999:blog-4717153029351703678.post-5909303803796260532011-05-04T20:10:00.127-05:002011-05-05T03:41:31.743-05:00Sistemas distribuidos<div id="entrada"><div class="encabezado">Programación Orientada a Objetos <br />
Semana 12 </div><br />
Texto con diagramas que explica la operación del software de manera distribuida.<br />
<br />
<div class="tema">¿Qué es un sistema distribuido?</div><br />
Un sistema distribuido se define como una colección de computadoras separadas físicamente y conectadas entre sí por una red de comunicaciones; cada máquina posee sus componentes de hardware y software que el usuario percibe como un solo sistema. El usuario accede a los recursos remotos de la misma manera en que accede a recursos locales, o un grupo de computadores que usan un software para conseguir un objetivo en común.<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhtNcgHBmVTBhR0wrZsePz4uarihcsZZzOKCTNNjy30i4PpDvshqhfopid0Hqxn8ArbXidoatClR8HWVO6EU4mzabZl1dG-L0g0L2Z9z_a6_pt2Yittp6bNIOmCuu2RsnbbVKnkhcDj_-DF/s1600/distribuidos-01.png" imageanchor="1" style="margin-left:1em; margin-right:1em"><img border="0" height="254" width="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhtNcgHBmVTBhR0wrZsePz4uarihcsZZzOKCTNNjy30i4PpDvshqhfopid0Hqxn8ArbXidoatClR8HWVO6EU4mzabZl1dG-L0g0L2Z9z_a6_pt2Yittp6bNIOmCuu2RsnbbVKnkhcDj_-DF/s400/distribuidos-01.png" /></a></div><br />
Los sistemas distribuidos deben ser muy confiables, ya que si un componente del sistema se descompone otro componente debe de ser capaz de reemplazarlo, esto se denomina tolerancia a fallos.<br />
<br />
El tamaño de un sistema distribuido puede ser muy variado, ya sean decenas de hosts en una red de área local o millones de hosts como en Internet.<br />
<br />
<div class="tema">Características</div><br />
<b>Concurrencia:</b> Esta característica de los sistemas distribuidos permite que los recursos disponibles en la red puedan ser utilizados simultáneamente por los usuarios o agentes que interactúan en la red.<br />
<br />
<b>Carencia de reloj global:</b> Las coordinaciones para la transferencia de mensajes entre los diferentes componentes para la realización de una tarea, no tienen una temporización general, esta más bien distribuida a los componentes.<br />
<br />
<b>Fallos independientes de los componentes:</b> Cada componente del sistema puede fallar independientemente, con lo cual los demás pueden continuar ejecutando sus acciones. Esto permite el logro de las tareas con mayor efectividad, pues el sistema en su conjunto continua trabajando.<br />
<br />
<div class="tema">¿Cómo debe estar creado?</div><br />
<ul><li>Para cada uno de los usuarios debe de ser similar al trabajo en el sistema centralizado.<br />
Seguridad interna en el sistema distribuido.</li>
<li>Se ejecuta en múltiples computadoras.</li>
<li>Entorno de trabajo cómodo.</li>
<li>Dependiente de redes (LAN/WAN).</li>
<li>Compatibilidad entre los dispositivos conectados.</li>
<li>Transparencia, el uso de múltiples procesadores y el acceso remoto debe de ser invisible.</li>
<li>Interacción entre los equipos.</li>
<li>Diseño de software compatible con varios usuarios y sistemas operativos.</li>
</ul><br />
<div class="tema">Herramientas para crear un sistema distribuido</div><br />
<b>RMI</b> (Remote Method Invocation) es parte de la librería de clases de Java que permite la creación de sistemas distribuidos en Java.<br />
<br />
RMI fue el primer framework para crear sistemas distribuidos que apareció para Java. Además, viene integrado en cualquier máquina virtual Java posterior a la 1.0 y está pensado para hacer fácil la creación de sistemas distribuidos a partir de una aplicación cuyas clases ya estén implementadas.<br />
<br />
Características particulares de RMI.<br />
Al contrario que otras tecnologías de sistemas distribuidos, RMI no busca la colaboración de objetos de distintas plataformas, programados en diferentes lenguajes, Java se encarga de solucionar los problemas de heterogeneidad. Así, su API es más sencillo y natural al no contemplar que tipos de datos existan o no en los lenguajes en los que se implementan cliente y servidor.<br />
<br />
<div class="tema">¿Cómo podría aplicarlo a mi proyecto?</div><br />
Retomando que mi proyecto es de un programa que cree gráficas a partir de archivos de datos, que en primera idea solo tenia pensado en que los archivos fueran locales en la computadora, con un sistema distribuido podría aprovechar el uso de cliente-servidor.<br />
<br />
En esto el cliente que es el usuario del programa solicite un cierto archivo de datos concentrado en un servidor, y que este pueda ser recibido desde ese servidor, para ser guardado en la computadora del usuario.<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg0DjCVoh4LPREv2z-EPmWtahGXTI4bElFTu0k2PQGGWb8G8Ergrspj-EUF8E9bnI5EogDLnLxEHJLAteqjktM2QjFcCnbskmoO_zr30vIBgIUDXZp0CaIMUcgxi_tEqLwUV1k7g65dB7qv/s1600/distribuidos-02.jpg" imageanchor="1" style="margin-left:1em; margin-right:1em"><img border="0" height="233" width="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg0DjCVoh4LPREv2z-EPmWtahGXTI4bElFTu0k2PQGGWb8G8Ergrspj-EUF8E9bnI5EogDLnLxEHJLAteqjktM2QjFcCnbskmoO_zr30vIBgIUDXZp0CaIMUcgxi_tEqLwUV1k7g65dB7qv/s400/distribuidos-02.jpg" /></a></div><br />
El ideal es que si el usuario modifica algo en la tabla de datos, este archivo sea regresado modificado al servidor, para que cuando otro usuario necesite el mismo archivo para crear cierta gráfica, este tenga la versión mas reciente.<br />
<br />
Sistemas distribuidos también podría aplicar creando en el servidor las clases para la creación de la gráfica y que el cliente solo haga solicitud de ella y por medio de RMI se haga la transferencia del objeto.<br />
<br />
<b>Enlaces:</b><br />
<a href="http://es.wikipedia.org/wiki/Computaci%C3%B3n_distribuida">Definición de sistema distribuido</a><br />
<a href="http://www.di.uniovi.es/~lourdes/publicaciones/bt99.pdf">Desarrollo de sistemas distribuidos</a><br />
<a href="http://www.monografias.com/trabajos16/sistemas-distribuidos/sistemas-distribuidos.shtml">Más de sistemas distribuidos</a><br />
</div>Anonymoushttp://www.blogger.com/profile/02234142471203536128noreply@blogger.com1tag:blogger.com,1999:blog-4717153029351703678.post-6856131732655348912011-04-15T18:45:00.000-05:002011-04-15T18:45:00.236-05:00Implementación de pruebas unitarias<div id="entrada"><div class="encabezado">Taller de Programación Orientada a Objetos <br />
Semana 11 </div><br />
Implementación de las pruebas unitarias en código documentado y un reporte de los resultados de su ejecución.<br />
<br />
</div>Anonymoushttp://www.blogger.com/profile/02234142471203536128noreply@blogger.com2tag:blogger.com,1999:blog-4717153029351703678.post-66832127060354341042011-04-14T09:30:00.095-05:002011-04-14T09:30:02.531-05:00Diseño de pruebas unitarias<div id="entrada"><div class="encabezado">Programación Orientada a Objetos <br />
Semana 11 </div><br />
Esta entrada es referente a las pruebas unitarias que estamos por aplicar a nuestro proyecto. Primeramente tenemos que conocer que es una prueba unitaria en la materia de programación, y es que esta es una manera de probar si una parte de nuestro código funciona correctamente. Con esto nos podemos asegurar que cada una de los métodos de una clase funcionen correctamente individualmente.<br />
<br />
La principal razón por la que se escriben pruebas para cada función o método en una clase, es para que su buen funcionamiento sea independiente de las otras.<br />
<br />
Con lo que debe cumplir una prueba unitaria para considerase buena debe seguir por lo menos los siguientes requisitos:<br />
<br />
<b>Automatizable:</b> No debería requerirse una intervención manual.<br />
<br />
<b>Completas:</b> Deben cubrir la mayor cantidad de código.<br />
<br />
<b>Reutilizables:</b> No se deben crear pruebas que sólo puedan ser ejecutadas una sola vez.<br />
<br />
<b>Independientes:</b> La ejecución de una prueba no debe afectar a la ejecución de otra.<br />
<br />
El objetivo de una prueba unitaria es comprobar que partes individuales del código funcionan correctamente.<br />
<br />
Las ventajas que nos brindan las pruebas unitarias son:<br />
<br />
<b>Fomentan el cambio:</b> Las pruebas unitarias facilitan que el programador cambie el código para mejorar su estructura, puesto que permiten hacer pruebas sobre los cambios y así asegurarse de que los nuevos cambios no han introducido errores.<br />
<br />
<b>Simplifica la integración:</b> Puesto que permiten llegar a la fase de integración con un grado alto de seguridad de que el código está funcionando correctamente.<br />
<br />
<b>Documenta el código:</b> Las propias pruebas son documentación del código puesto que ahí se puede ver cómo utilizarlo.<br />
<br />
<b>Separación de la interfaz y la implementación:</b> Dado que la única interacción entre los casos de prueba y las unidades bajo prueba son las interfaces de estas últimas, se puede cambiar cualquiera de los dos sin afectar al otro.<br />
<br />
<b>Los errores están más acotados y son más fáciles de localizar:</b> Dado que tenemos pruebas unitarias que pueden desenmascararlos.<br />
<br />
Otra ventaja de las pruebas unitarias es que nos da más confianza para modificar código ya que se pierde el miedo a hacer modificaciones y volver inconsistente el sistema.<br />
<br />
Según el tipo de componente, podemos probar varios aspectos del código:<br />
Funciones individuales o métodos de objeto: Probar las entradas y las salidas y comprobar que los valores obtenidos son los esperados.<br />
<br />
Clases de objetos: Hacer pruebas aisladas de operaciones o probar también las secuencias de las operaciones.<br />
<br />
Componentes: Hay que tener en cuenta si son distribuidos, en este caso es recomendable pasarle al componente pruebas de estrés.<br />
<br />
<div class="subtema">¿Donde ejecutamos las pruebas unitarias?</div>En java podemos usar JUnit para las pruebas unitarias y JMeter para pruebas de rendimiento. Para otros lenguajes existen herramientas similares.<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhU2FfBH-M1rko8hmdhDKv30LHUZm9TDPMHDZpQjHgMIwY588sRR_izJRBxrK3UkhOoXoX6H4CiGa0QZwlWWomk6hpxJwYNnFcZLRbY-ZGufGx3YAshRns7YVTrE-Fz8Zf5W959N8shX3yt/s1600/Unitarias-01.jpg" imageanchor="1" style="margin-left:1em; margin-right:1em"><img border="0" height="178" width="227" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhU2FfBH-M1rko8hmdhDKv30LHUZm9TDPMHDZpQjHgMIwY588sRR_izJRBxrK3UkhOoXoX6H4CiGa0QZwlWWomk6hpxJwYNnFcZLRbY-ZGufGx3YAshRns7YVTrE-Fz8Zf5W959N8shX3yt/s400/Unitarias-01.jpg" /></a></div><br />
<b>JUnit</b> es un conjunto de clases que permite realizar la ejecución de clases Java de manera controlada, para poder evaluar si el funcionamiento de cada uno de los métodos de la clase se comporta como se espera. Es decir, en función de algún valor de entrada se evalúa el valor de retorno esperado; si la clase cumple con la especificación, entonces JUnit devolverá que el método de la clase pasó exitosamente la prueba; en caso de que el valor esperado sea diferente al que regresó el método durante la ejecución, JUnit devolverá un fallo en el método correspondiente.<br />
<br />
Yo descargue JUnit desde el siguiente enlace:<br />
<br />
<b><a href="https://github.com/KentBeck/junit/downloads">Descargas</a></b><br />
<br />
En la página hay varios paquetes, yo recomiendo bajar el más reciente que hasta el momento es el credo el 18 de enero de este año.<br />
<br />
<b><a href="http://junit.sourceforge.net/doc/cookbook/cookbook.htm">Crear nuestros propios Tests</a></b><br />
<br />
En el enlace anterior esta una página de ayuda con un ejemplo simple de como empezar con JUnit y la creación de tests.<br />
<br />
<div class="subtema">¿Cuándo implementamos las pruebas unitarias?</div>De forma paralela a la codificación o antes de la codificación siguiendo un desarrollo guiado por pruebas.<br />
<br />
<b>Referencias:</b><br />
<a href="http://es.wikipedia.org/wiki/Prueba_unitaria">Prueba unitaria</a><br />
<a href="http://isg2.pbworks.com/w/page/7624280/Pruebas-del-Software">Pruebas en el Software</a><br />
</div>Anonymoushttp://www.blogger.com/profile/02234142471203536128noreply@blogger.com1tag:blogger.com,1999:blog-4717153029351703678.post-26648516955482345242011-04-12T10:00:00.003-05:002011-05-05T05:37:41.620-05:00Implementación de eventos, excepciones y errores<div id="entrada"><div class="encabezado">Taller de Programación Orientada a Objetos <br />
Semana 10 </div><br />
Incorporación de eventos, excepciones y errores particulares del software.<br />
<br />
<div class="tema">Excepciones</div><br />
Pequeños bloques de <b>try</b> y <b>catch</b> de mi código.<br />
<br />
Con el manejo de archivos:<br />
<pre class="brush:java">try {
out = new FileOutputStream("Datos01.dat");
p = new PrintStream(out);
p.println("Tabla nueva");
p.close();
} catch (Exception e) {
System.err.println("Error con el archivo");
}
</pre><br />
<pre class="brush:java">try {
FileInputStream fstream = new FileInputStream(project/01.dat);
DataInputStream in = new DataInputStream(fstream);
while (in.available() !=0) {
System.out.println(in.readLine());
}
in.close();
} catch (Exception e) {
System.err.println("Error al crear");
}
</pre><br />
En la entrada de datos:<br />
<pre class="brush:java">public EntradaDatos() {
InputStreamReader entrada = new InputStreamReader(System.in);
BufferedReader br = new BufferedReader(entrada);
try {
System.out.println("Dime tu nombre:");
nombre = br.readLine();
System.out.println("Dime cuanto daras:");
valor = Double.parseDouble(br.readLine());
} catch(Exception e) {
e.printStackTrace();
}
}
</pre><br />
</div>Anonymoushttp://www.blogger.com/profile/02234142471203536128noreply@blogger.com2tag:blogger.com,1999:blog-4717153029351703678.post-71713433743472398942011-04-12T08:00:00.113-05:002011-04-14T00:19:48.053-05:00Identificación de eventos, excepciones y errores<div id="entrada"><div class="encabezado">Programación Orientada a Objetos <br />
Semana 10 </div><br />
Texto con diagramas que explica los eventos, excepciones y errores particulares al software que está diseñando.<br />
<br />
<div class="tema">Eventos</div>En Java, los eventos representan toda la actividad que tiene lugar entre el usuario y la aplicación. Abstract Windowing Toolkit (AWT) comunica estas acciones a los programas de uso de eventos. Cuando el usuario interactúa con un programa digamos haciendo clic en un botón de comando, el sistema crea un evento que representa la acción y delega en el código de control de eventos dentro del programa. Este código determina la forma de controlar el evento por lo que el usuario obtiene la respuesta adecuada.<br />
<br />
Existen varios grupos de <b>eventos comunes</b> en programas creados en Java, como pueden ser:<br />
Eventos de la <b>ventana</b>.<br />
Eventos del <b>teclado</b>.<br />
Eventos del <b>ratón</b>.<br />
Eventos de las <b>barras de desplazamiento</b>.<br />
<br />
Para que un evento logre hacer la acción para la cual se le programo, es necesario tener un escuchador que este al pendiente de las acciones del usuario, y este responda inmediatamente de alguna forma.<br />
<br />
> Como todo programa que incluye una interfaz gráfica como eventos de mi proyecto tendré una ventana que responderá a los botones de la esquina superior y marcan el cierre o la acción de minimizar la ventana.<br />
<br />
> Como en mi programa se necesita que el usuario llene algunos campos se tiene que tener un escuchador para el teclado, que este recibiendo datos del teclado.<br />
<br />
> Y el escuchador para los botones de la ventana principal, también requiere del escuchador.<br />
<br />
Estos será los eventos que tendría tomados en cuenta en mi programa.<br />
<br />
<div class="tema">Excepciones</div>Una excepción es un evento, que se produce durante la ejecución de un programa, que interrumpe el flujo normal de las instrucciones del programa.<br />
<br />
Cuando se produce un error dentro de un método, el método crea un objeto y lo entrega al sistema en el tiempo de ejecución. El objeto, llamado un Objeto de Excepción, contiene información sobre el error, incluyendo su tipo y el estado del programa cuando se produjo el error. A la creación de un objeto de excepción y la entrega al sistema en el tiempo de ejecución se denomina una excepción.<br />
<br />
El sistema de ejecución busca en la pila de llamadas de un método que contiene un bloque de código que puede controlar la excepción. Este bloque de código que se llama un controlador de excepciones. La búsqueda se inicia con el método en el que se produjo el error y procede a través de la pila de llamadas en el orden inverso en el que los métodos fueron llamados.<br />
<br />
Existen tres <b>tipos de excepciones</b>:<br />
El primer tipo de excepción es la <b>excepción comprobada</b>. Estas son condiciones excepcionales que una aplicación bien escrita debe anticipar y recuperarse. Por ejemplo, si se le pide al usuario indicar el nombre de un archivo que se desea abrir, y se comete un error en la escritura del archivo y este no existe, entonces el programa deberá lanzar un aviso de error en la escritura del nombre del archivo.<br />
<br />
El segundo tipo de excepción es el <b>error</b>. Estas son condiciones excepcionales que son externos a la demanda, y que la aplicación por lo general no puede anticipar o recuperarse. Por ejemplo, si es necesario abrir un archivo para que el programa haga determinada acción y por fallas en el sistema o hardware este archivo no se puede abrir, estaríamos enfrentando este tipo de error.<br />
<br />
El tercer tipo de excepción es la <b>excepción en tiempo de ejecución</b>. Estas son condiciones excepcionales que son internos a la demanda, y que la aplicación por lo general no puede anticipar o recuperarse. Estos por lo general indican errores de programación, tales como errores de lógica o el uso indebido de una API.<br />
<br />
El primer paso en la construcción de un controlador de excepciones es encerrar el código que podría lanzar una excepción dentro de un try.<br />
<br />
Para asociar controladores de excepciones con try al proporcionar una o más bloques catch inmediatamente después de la try de bloque. Ningún código puede estar entre el final de las try de bloque y el comienzo de la primera catch de bloque.<br />
<br />
<div class="marco">try {<br />
<br />
} catch (ExceptionType name) {<br />
<br />
} catch (ExceptionType name) {<br />
<br />
}</div><br />
<div class="tema">Errores</div>EL error es un tipo de excepción que no se puede anticipar y por lo general termina cerrando el programa. Lo ideal es avisar al usuario que se deberá cerrar el programa por completo, y evitar que el programa se cierre frente a los ojos del usuario sin darle previo aviso.<br />
<br />
> En mi caso, si al abrir el programa se detecta un error que impide abrir correctamente el programa, este deberá cerrarse inmediatamente.<br />
<br />
> También se puede esperar a que en el momento de la ejecución del programa un evento deje de escuchar las peticiones por falla en el sistema mismo, este deberá mandar el error y avisar del cierre próximo del programa.<br />
<br />
<b>Referencias:</b><br />
<a href="http://download.oracle.com/javase/tutorial/essential/exceptions/">Java Exceptions</a><br />
<a href="http://sunsite.dcc.uchile.cl/java/docs/JavaTut/Cap4/tipoev.html">Eventos en Java</a><br />
</div>Anonymoushttp://www.blogger.com/profile/02234142471203536128noreply@blogger.com1tag:blogger.com,1999:blog-4717153029351703678.post-19860748483944871432011-03-31T10:30:00.004-06:002011-03-31T10:30:03.028-06:00Aplicación de patrones de diseño<div id="entrada"><div class="encabezado">Taller de Programación Orientada a Objetos <br />
Semana 9 </div><br />
Incorporación de patrones de diseño en la implementación del proyecto.<br />
</div>Anonymoushttp://www.blogger.com/profile/02234142471203536128noreply@blogger.com1tag:blogger.com,1999:blog-4717153029351703678.post-28728033744890298492011-03-31T09:00:00.044-06:002011-03-31T09:34:30.156-06:00Identificación de patrones de diseño<div id="entrada"><div class="encabezado">Programación Orientada a Objetos <br />
Semana 9 </div><br />
Para esta semana el trabajo a entregar es un texto con diagramas que explique cuáles patrones se aprovechan en nuestro proyecto.<br />
<br />
Algunas personas definen un patrón como una solución recurrente para un problema en un contexto. Primero, un contexto es el entorno, situación, o condiciones interrelacionadas dentro de las cuales existe algo. Segundo, un problema es una cuestión insatisfecha, algo que se necesita investigar y resolver. Un problema se puede especificar mediante un conjunto de causas y efectos. Normalmente un problema está restringido al contexto en el que ocurre. Finalmente, la solución se refiere a la respuesta al problema dentro de un contexto que ayuda a resolver las dificultades.<br />
<br />
Entonces, si tenemos una solución a un problema en un contexto, ¿Será este un patrón? No necesariamente. También necesitamos asociar la característica de recurrencia con la definición de un patrón. Los patrones deberían comunicar soluciones de diseño a los desarrolladores que los leen y los utilizan. Como puedes ver, aunque el concepto de patrón es bastante simple, definir realmente el término es muy complejo.<br />
<br />
<div class="subtema">Abstracción de patrones</div>Un patrón describe, con algún nivel de abstracción, una solución experta a un problema. Los patrones solucionan problemas que existen en muchos niveles de abstracción. Hay patrones que describen soluciones para todo, desde el análisis hasta el diseño y desde la arquitectura hasta la implementación.<br />
<br />
<div class="subtema">Identificar un patrón</div>Se han manejado muchos proyectos J2EE en Sun Java Center, y, con el tiempo, se ha notado que ocurren problemas similares en todos estos proyectos. También se ha visto que han emergido soluciones similares para todos estos problemas. Aunque las estrategias de implementación variaran, las soluciones generales eran bastante similares.<br />
<br />
Cuando se ha visto un problema y una solución recurrentes, se ha intentado identificar y documentar sus características usando la plantilla de patrón. También se emprendió el procesamiento de significado de los patrones buscando patrones en soluciones ya implementadas.<br />
<br />
Muchas veces, soluciones similares podrían representar un sólo patrón. Cuando se decide cómo formar un patrón, es importante considerar cual es la mejor forma de comunicar la solución. Algunas veces, un nombre independiente mejora la comunicación entre los desarrolladores. Si es así, es mejor considerar la documentación de dos soluciones similares como dos patrones diferentes.<br />
<br />
Existen tres categorías de patrones de diseño de acuerdo a su propósito, y son los siguientes:<br />
<br />
<b>Creacionales:</b> Inicialización y configuración de objetos.<br />
<br />
<b>Estructurales:</b> Separan la interfaz de la implementación. Se ocupan de cómo las clases y objetos se agrupan, para formar estructuras más grandes.<br />
<br />
<b>Comportamiento:</b> Más que describir objetos o clases, describen la comunicación entre ellos.<br />
<br />
En cuanto a mi proyecto muestro cuales patrones creo que me servirían implementar y les explico el porque creo que me ayudan de alguna forma.<br />
<br />
<div class="subtema">Patrón creacional: Builder</div><br />
El patrón Builder es usado para permitir la creación de una variedad de objetos complejos desde un objeto fuente, el objeto fuente se compone de una variedad de partes que contribuyen individualmente a la creación de cada objeto complejo a través de un conjunto de llamadas a interfaces comunes de la clase Abstract Builder.<br />
<br />
Abstrae el proceso de creación de un objeto complejo, centralizando dicho proceso en un único punto, de tal forma que el mismo proceso de construcción pueda crear representaciones diferentes.<br />
<br />
Diagrama de ejemplo:<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh2Ji9oVMGQEpTKFWngpcupq_upWgM-M8Zmc1Vu41es6ZGSU6DGKiINH4gpVi-o7G1Dq84ReOLRvZfC3jf5D7igI0L3JA3nNXlQFIfp_cNjhKw_0LzIxMenVGw7QcntNHNJe5jbaQwRIDY9/s1600/Patron-01.png" imageanchor="1" style="margin-left:1em; margin-right:1em"><img border="0" height="180" width="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh2Ji9oVMGQEpTKFWngpcupq_upWgM-M8Zmc1Vu41es6ZGSU6DGKiINH4gpVi-o7G1Dq84ReOLRvZfC3jf5D7igI0L3JA3nNXlQFIfp_cNjhKw_0LzIxMenVGw7QcntNHNJe5jbaQwRIDY9/s400/Patron-01.png" /></a></div><br />
Algunas ventajas:<br />
<ul><li>Varia la representación interna de estructuras compleja, respetando la interfaz común.</li>
<li>Se independiza el código de construcción de la representación.</li>
<li>Evita el acoplamiento.</li>
<li>Cada ConcreteBuilder tiene el código especifico para crear y modificar una estructura interna concreta.</li>
<li>Permite un mayor control en el proceso de creación del objeto.</li>
</ul><br />
¿Porqué creo se aplica a mi proyecto?<br />
En mi proyecto cada clase se encarga de crear un objeto diferente, por ejemplo una crea la ventana con ciertas opciones, la clase de registro muestra en un label un cuadro con la información almacenada en los registros guardados, otro crea una gráfica y la inserta en un label que remplazaría al de registros.<br />
<br />
<div class="subtema">Patrón estructural: Composite</div><br />
El patrón Composite describe un grupo de objetos deben ser tratados de la misma manera que una sola instancia de un objeto. La intención de un compuesto es la de "componer" objetos en estructuras de árbol para representar jerarquías parte-todo. Aplicación del modelo compuesto permite a los clientes tratar objetos individuales y composiciones de manera uniforme<br />
<br />
Composite puede ser utilizado cuando los clientes deben pasar por alto la diferencia entre las composiciones de objetos y objetos individuales. Si los programadores encuentran que están utilizando varios objetos de la misma manera, y con frecuencia tienen casi idéntico código para manejar cada uno de ellos, entonces este patrón es una buena opción, es menos complejo en esta situación para tratar primitivos y compuestos como homogéneos.<br />
<br />
Diagrama de ejemplo:<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhn0fkJa2g8pD0CjhyphenhyphenM-DIExKqYz6lNcI4nzPoDCAia-ITnm8k-7MmJjomRD1NARQnA__0fTsfKce6U1mQ9IHwsgtnTX20GYNOxqo8B_xnEzbtoH01lKdgP_F5FP2qfoIf4FZ4Qz2ZdBT5j/s1600/Patron-02.png" imageanchor="1" style="margin-left:1em; margin-right:1em"><img border="0" height="258" width="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhn0fkJa2g8pD0CjhyphenhyphenM-DIExKqYz6lNcI4nzPoDCAia-ITnm8k-7MmJjomRD1NARQnA__0fTsfKce6U1mQ9IHwsgtnTX20GYNOxqo8B_xnEzbtoH01lKdgP_F5FP2qfoIf4FZ4Qz2ZdBT5j/s400/Patron-02.png" /></a></div><br />
<div class="subtema">Patrón de comportamiento: Mediator</div><br />
Un Mediator es un patrón de diseño que coordina las relaciones entre sus asociados. Permite la interacción de varios objetos, sin generar acoples fuertes en esas relaciones.<br />
<br />
Cuando muchos objetos interactúan con otros objetos, se puede formar una estructura muy compleja, con objetos con muchas conexiones con otros objetos. En un caso extremo cada objeto puede conocer a todos los demás objetos. Para evitar esto el patrón Mediator encapsula el comportamiento de todo un conjunto de objetos en un solo objeto.<br />
<br />
Usar el patrón Mediator cuando:<br />
Un conjunto grande de objetos se comunica de una forma bien definida, pero compleja.<br />
Reutilizar un objeto se hace difícil por que se relaciona con muchos objetos.<br />
El comportamiento de muchos objetos que esta distribuido entre varias clases, puede resumirse en una o varias por subclasificación.<br />
<br />
¿Porqué se aplica a mi proyecto?<br />
Mi proyecto necesita la interacción entre clases para la creación de los objetos en una ventana, y para evitar sobrecargar el sistema este serviría para esto ya que evitaríamos tener que estar regresando a la clase principal para crear todos los objetos nuevamente, ya que por ejemplo en la clase Gráfica se crea la gráfica pero mi idea es no quitar de vista las opciones de la ventana mostrada anterior a esta.<br />
<br />
Diagrama de ejemplo:<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgmj4Z7f4dGBtcK4O5Fk0LHeEiqvbZIwlFUKmMLpLtdVX4g2G8pEA-nSfrGIfli_7nFAI0kX2Vt5NaYQX8AyCuaJWk2IPa37OcUZw6K2Afn0TAC5lHQUU_6cNFPJpZbeC7qadMyhXfrORgC/s1600/Patron-03.png" imageanchor="1" style="margin-left:1em; margin-right:1em"><img border="0" height="121" width="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgmj4Z7f4dGBtcK4O5Fk0LHeEiqvbZIwlFUKmMLpLtdVX4g2G8pEA-nSfrGIfli_7nFAI0kX2Vt5NaYQX8AyCuaJWk2IPa37OcUZw6K2Afn0TAC5lHQUU_6cNFPJpZbeC7qadMyhXfrORgC/s400/Patron-03.png" /></a></div><br />
Ventajas y desventajas:<br />
Simplifica la comunicación entre objetos: Los objetos que se comunican de la forma "muchos a muchos" puede ser remplazada por una forma "uno a muchos" que es menos compleja y más elegante.<br />
Abstrae como los objetos cooperan: Haciendo a la mediación un concepto independiente y encapsulandolo en un objeto permite enfocar como los objetos interactúan. Esto ayuda a clarificar como los objetos se relacionan en un sistema.<br />
Centraliza el control: El mediador es el que se encarga de comunicar a los colegas, este puede ser muy complejo, difícil de entender y modificar.<br />
<br />
<b>Bibliografía:</b><br />
<a href="http://www.programacion.com/articulo/catalogo_de_patrones_de_diseno_j2ee__i__capa_de_presentacion_240">Patrones de diseño en Java</a><br />
<a href="http://msdn.microsoft.com/es-es/library/bb972240.aspx">¿Qué es un patrón de diseño</a><br />
<a href="http://es.wikipedia.org/wiki/Builder_(patr%C3%B3n_de_dise%C3%B1o)">Builder</a> | <a href="http://es.wikipedia.org/wiki/Composite_(patr%C3%B3n_de_dise%C3%B1o)">Composite</a> | <a href="http://es.wikipedia.org/wiki/Mediator_(patr%C3%B3n_de_dise%C3%B1o)">Mediator</a><br />
</div>Anonymoushttp://www.blogger.com/profile/02234142471203536128noreply@blogger.com1tag:blogger.com,1999:blog-4717153029351703678.post-10048588069579101182011-03-24T08:00:00.000-06:002011-03-24T08:00:16.296-06:00Demostración de avance parcial<div id="entrada"><div class="encabezado">Taller de Programación Orientada a Objetos <br />
Semana 8 </div><br />
Para esta semana les muestro el avance que tengo en mi proyecto, les recuerdo que se trata de un programa que te permita crear gráficas con facilidad de ciertas bases de datos. Sinceramente no llevo muy avanzado mi proyecto, hasta el momento solo hace cosas mediante la terminal, y el aspecto gráfico que sin duda es de lo más importante dado a que se requiere visualizar gráficas, lo iré incorporando poco a poco.<br />
<br />
Sigo manejando las clases Menu, Registro, Nuevo, Graficar, Barras, Histograma y Pastel. Donde Menu es la clase principal del programa.<br />
<br />
En la siguiente imagen les muestro como están los archivos dentro del paquete <b>proyecto</b>:<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh1S9UCfYpeQzfGsI33TVYD45vuSPEZKUFwYHiHHQn5rrIiDpwAxYnM99IhoWKsvh1IY7x5jnlZvK6EsBtojNft_Hlj41p0SD-RszGb-nT97ZGaoV9d9M5dE2y9mOujrG8E92p6VaokMo__/s1600/Avance-01.png" imageanchor="1" style="margin-left:1em; margin-right:1em"><img border="0" height="100" width="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh1S9UCfYpeQzfGsI33TVYD45vuSPEZKUFwYHiHHQn5rrIiDpwAxYnM99IhoWKsvh1IY7x5jnlZvK6EsBtojNft_Hlj41p0SD-RszGb-nT97ZGaoV9d9M5dE2y9mOujrG8E92p6VaokMo__/s400/Avance-01.png" /></a></div><br />
Ahora desde el terminal compilare los archivos:<br />
<div class="terminal">esteban@esteban:~/Documents$ javac proyecto/*.java</div><br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgEVnmXWL562vJ5GJrOMholTVF-pC5NPYeCxjkWoGyyZsPFWMDDoMUAPUeOIphDTUx7_7CE8izIyd9GNQ1PAsutXJfLuXQDJGQLbj45muD34H5coPqINBhjYK8yoaG-I8jTA4bKR0ZcfGWW/s1600/Avance-02.png" imageanchor="1" style="margin-left:1em; margin-right:1em"><img border="0" height="100" width="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgEVnmXWL562vJ5GJrOMholTVF-pC5NPYeCxjkWoGyyZsPFWMDDoMUAPUeOIphDTUx7_7CE8izIyd9GNQ1PAsutXJfLuXQDJGQLbj45muD34H5coPqINBhjYK8yoaG-I8jTA4bKR0ZcfGWW/s400/Avance-02.png" /></a></div><br />
Y ahora podemos ver que ya se han creado los archivos <b>.class</b> para que java pueda interpretar el código.<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiFQQz_1yvkOqleDexvRerPT9aQTlB1O89De3kdWnaspjuDhKT9mTavJ-Vzh0svBKSs_q3cZVuF_UDl0nVF1AZWA1Plq-kTBIOgvOzk1d3jMAYXXyy_1KK-gxjI4-RN5z8MtsyBoLlZqjEp/s1600/Avance-03.png" imageanchor="1" style="margin-left:1em; margin-right:1em"><img border="0" height="120" width="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiFQQz_1yvkOqleDexvRerPT9aQTlB1O89De3kdWnaspjuDhKT9mTavJ-Vzh0svBKSs_q3cZVuF_UDl0nVF1AZWA1Plq-kTBIOgvOzk1d3jMAYXXyy_1KK-gxjI4-RN5z8MtsyBoLlZqjEp/s400/Avance-03.png" /></a></div><br />
Ejecutando el programa desde el terminal se vería algo así:<br />
<div class="terminal">esteban@esteban:~/Documents$ java proyecto.Menu p</div><br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi9Z93U4srKObmfgQMiHLajUsZzKkXnCz6Z0BRvRgIFWb90nfLpTCFR9KCir7s7L5fZzOZYFs6wcuH_vq7jO_6fWXWo3kB8LxBWI4RKn1A6mrNxyeJOCiYigoDMcxgE3iheFvoSgPavfJNg/s1600/Avance-04.png" imageanchor="1" style="margin-left:1em; margin-right:1em"><img border="0" height="292" width="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi9Z93U4srKObmfgQMiHLajUsZzKkXnCz6Z0BRvRgIFWb90nfLpTCFR9KCir7s7L5fZzOZYFs6wcuH_vq7jO_6fWXWo3kB8LxBWI4RKn1A6mrNxyeJOCiYigoDMcxgE3iheFvoSgPavfJNg/s400/Avance-04.png" /></a></div><br />
Me falta ponerle más opciones al menú y agregarle la edición a los parámetros de las gráficas, que pronto estaré agregando, mientras tanto solo es muestra de que ya se logra ingresar de una clase a la otra, y escribe algo en terminal para indicarnos que es lo que se debería de estar haciendo.<br />
<br />
Les dejo unos fragmentos del código:<br />
<pre class="brush: java">public class Menu {
public Menu() {
BufferedReader entrada = null;
try {
System.out.println("Seleccione una opcion:");
Nuevo n = new Nuevo();
Registro r = new Registro();
System.out.println("Selecciona el registro
que quieres graficar:");
BufferedReader in = new BufferedReader(
new InputStreamReader(System.in));
String linea = in.readLine();
int x = Integer.parseInt(linea);
if (x == 1) {
System.out.println("Seleccionado registro 1\n");
Grafica gra = new Grafica();
System.out.println("Deseas guardar la grafica: Si/No\n");
}
} catch (Exception e) {
System.err.println("Error");
System.exit(-1);
} finally {
if (entrada != null) {
try {
entrada.close();
} catch (Exception ex) {}
}
}
}
public static void main(String[] args) {
System.out.println("Esta es la ventana del Menu\n");
Menu m = new Menu();
System.out.println("Cerrar programa\n");
return;
}
}
</pre>Es la clase Menu, donde la función main crea el mismo Menu, y este es el que nos permitirá ver las opciones disponibles en la ventana principal del programa.<br />
<br />
<pre class="brush: java"> public Nuevo() {
try {
FileWriter fw = new FileWriter("proyecto/nuevo.txt");
BufferedWriter bw = new BufferedWriter(fw);
PrintWriter salida = new PrintWriter(bw);
salida.println("Esteban");
salida.println("Cecilia");
salida.println("Roberto");
salida.println("Juan");
salida.close();
System.out.println("Se creo un nuevo archivo\n");
} catch(java.io.IOException ioex) {
System.out.println("Se presento el error: " +
ioex.toString());
}
}
public void agregarColumna() {
}
public void visualizar() {
}
</pre>En esta clase Nuevo para un nuevo registro he hecho que el programa cree una lista de nombres simple pero desde el mismo programa, pero esa no es la idea, ya que el usuario es el que ira agregando esa información.<br />
<br />
<pre class="brush: java"> public Registro() {
System.out.println("Entra a Registro");
System.out.println("Ver registros...\n");
File archivo = null;
FileReader fr = null;
BufferedReader br = null;
try {
System.out.println("1. Registro de nombres");
archivo = new File("proyecto/nuevo.txt");
fr = new FileReader(archivo);
br = new BufferedReader(fr);
String linea;
while((linea = br.readLine()) != null)
System.out.println(linea);
} catch(Exception e) {
e.printStackTrace();
}
}
</pre>Nos lee los datos que están contenidos en el archivo creado por Nuevo, y es aquí donde se comprobará que bases de datos se tienen disponibles, y poder mostrarlas al usuario.<br />
<br />
Es un tanto sencillo pero espero que vaya tomando forma.<br />
</div>Anonymoushttp://www.blogger.com/profile/02234142471203536128noreply@blogger.com2tag:blogger.com,1999:blog-4717153029351703678.post-83535652372994300372011-03-24T07:20:00.010-06:002011-03-24T07:20:00.396-06:00Presentación de diagramas del proyecto<div id="entrada"><div class="encabezado">Programación Orientada a Objetos <br />
Semana 8 </div><br />
Esta semana corresponde a la presentación de nuestros diagramas de proyecto, en el que se incluye el diagrama de clases y el diagrama de secuencia, que son los dos diagramas con los que trabajamos la semana anterior.<br />
<br />
Les dejo mi presentación en un vídeo subido a YouTube, y abajo el enlace por si lo desean ver directamente en la página.<br />
<br />
<div class="linea"></div><center><br />
<iframe title="YouTube video player" width="560" height="349" src="http://www.youtube.com/embed/c4PwBnWkvM4?rel=0" frameborder="0" allowfullscreen></iframe><br />
<a href="http://www.youtube.com/watch?v=c4PwBnWkvM4">Ver directo en YouTube</a></center><br />
<br />
<div class="linea"></div><br />
Sin más por el momento, esto sería todo para esta semana en la clase de Programación Orientada a Objetos.<br />
</div>Anonymoushttp://www.blogger.com/profile/02234142471203536128noreply@blogger.com1tag:blogger.com,1999:blog-4717153029351703678.post-8584364855047588332011-03-17T07:40:00.053-06:002011-03-17T12:05:13.823-06:00Código autogenerado y comparación<div id="entrada"><div class="encabezado">Taller de Programación Orientada a Objetos <br />
Semana 6 </div><br />
Ahora es momento de mostrarles el código autogenerado a partir del diagrama de clases creado desde Umbrello que como ya mencione es el programa que decidí usar para la creación de diagramas UML.<br />
<br />
En la entrada anterior lo que realicé fue generar el diagrama a partir del código que tenía hasta ese momento, ahora haré lo contrario, crear el diagrama de clases y a partir de ello que Umbrello me genere el código.<br />
<br />
Esta captura es la ventana del programa donde cree mi diagrama de clases, muy parecido a lo que me resulto cuando genere el diagrama a partir del código.<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgkxIbHrEkzxkYdfBi2BrCE5O2jUEt1gazmAvgLo5jEbsIrUL-0n1Vs9LN7_2rRkBLiyGDmN6ITOhzKYvjLJ5V5KknZ7q6mLCg5czfyVDk8-S982NKB5m-izsaNZfg_eEOIZN10DsbigHxI/s1600/Umbrello-01.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="275" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgkxIbHrEkzxkYdfBi2BrCE5O2jUEt1gazmAvgLo5jEbsIrUL-0n1Vs9LN7_2rRkBLiyGDmN6ITOhzKYvjLJ5V5KknZ7q6mLCg5czfyVDk8-S982NKB5m-izsaNZfg_eEOIZN10DsbigHxI/s400/Umbrello-01.png" width="400" /></a></div><br />
Para generar el código, hay que asegurarnos de seleccionar el lenguaje al que deseamos crearlo. Para esto vamos al menú <b>Code</b>, en la opción <b>Active Lenguage</b> seleccionamos nuestro lenguaje en mi caso es <b>Java</b>.<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjc9MsQIvaJNEOV_utdxe4hyphenhyphenXd6aQ6ihhrP2tPFR9igk32mpuHk_7x-UGxM_ZE7GaszFDCoEVt9N_6k8weSgERLEraaAWYSUCkwYzSiCa3fD1jfDYIwJcUzVvvKBsJbdRRcLMABB9k1eRFS/s1600/Umbrello-02.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="275" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjc9MsQIvaJNEOV_utdxe4hyphenhyphenXd6aQ6ihhrP2tPFR9igk32mpuHk_7x-UGxM_ZE7GaszFDCoEVt9N_6k8weSgERLEraaAWYSUCkwYzSiCa3fD1jfDYIwJcUzVvvKBsJbdRRcLMABB9k1eRFS/s400/Umbrello-02.png" width="400" /></a></div><br />
Ahora en el mismo menú <b>Code</b> encontramos la opción para generar el código que es <b>Code Generation Wizard</b>.<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiDRILuHfkLfo8pYbJevdqDsxdNEgwggs2rW2VsFvGbSmGZc1qq51Nkx1AdvRojuIt1WA-182xN5u6emGO-atZ0Md0m9K7TZNGI2XZKLoSR-jMPtGoQE5HVn1H1CfDhSClTxcGGqo-ORYtH/s1600/Umbrello-03.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="275" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiDRILuHfkLfo8pYbJevdqDsxdNEgwggs2rW2VsFvGbSmGZc1qq51Nkx1AdvRojuIt1WA-182xN5u6emGO-atZ0Md0m9K7TZNGI2XZKLoSR-jMPtGoQE5HVn1H1CfDhSClTxcGGqo-ORYtH/s400/Umbrello-03.png" width="400" /></a></div><br />
Después se nos desplegará una ventana para seleccionar las clases que deseamos que se genere código.<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjju7HQ3ADCRhvv1WYRZCt__bQvMFxaGLUm6ms9foJa6NRKMHHus8nQ-NLZ92rCRdJODJJWT1J3iLgxMatNbMyl2dn5CSUoWqsnNF_x83EbsvE3p67Jmkwbv0ngv-XHK6dS29Sq2TCkbkto/s1600/Umbrello-04.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjju7HQ3ADCRhvv1WYRZCt__bQvMFxaGLUm6ms9foJa6NRKMHHus8nQ-NLZ92rCRdJODJJWT1J3iLgxMatNbMyl2dn5CSUoWqsnNF_x83EbsvE3p67Jmkwbv0ngv-XHK6dS29Sq2TCkbkto/s400/Umbrello-04.png" width="331" /></a></div><br />
Al dar en siguiente nos muestra una ventana como la siguiente donde podemos cambiar nuevamente el lenguaje en el que deseamos el código, así como la ubicación en donde serán guardados los archivos.<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjg1VwEKhZE_EXhvmXsco2I3qSlp1JKhABUjz8aZB1Cs5E_HvwB0297ZjXZ3KN7wCxJrEcSqYgrbznz18Y_HQzsufzt9LLQwMo6nRf3YcCDxgeZ8G46boadTVGhZ3zwrfAh4UGc_w2ltD4E/s1600/Umbrello-05.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjg1VwEKhZE_EXhvmXsco2I3qSlp1JKhABUjz8aZB1Cs5E_HvwB0297ZjXZ3KN7wCxJrEcSqYgrbznz18Y_HQzsufzt9LLQwMo6nRf3YcCDxgeZ8G46boadTVGhZ3zwrfAh4UGc_w2ltD4E/s400/Umbrello-05.png" width="331" /></a></div><br />
Por último se nos muestra en resumen las clases y el estado en que se encuentra cada una, es decir si ya se genero código o no. Para generarlo damos clic en <b>Generate</b> y listo.<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiGASr_lyzzwvo51ctLKAoPS7qFhGw8V75ADoHk7tPoMtwKl1qTZgPSuISmM9c0QddNGdRmI0udgXpx60NCy3jM6Y79_qZRoi_Nfxo18_mput1Y-ldu2y9gLLOFNuVEDy3TqI4r2qo5O5GW/s1600/Umbrello-06.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiGASr_lyzzwvo51ctLKAoPS7qFhGw8V75ADoHk7tPoMtwKl1qTZgPSuISmM9c0QddNGdRmI0udgXpx60NCy3jM6Y79_qZRoi_Nfxo18_mput1Y-ldu2y9gLLOFNuVEDy3TqI4r2qo5O5GW/s400/Umbrello-06.png" width="331" /></a></div><br />
Si vamos a la carpeta en donde decidimos que se guardaran los archivos con el código generado, encontraremos los archivos con extensión java, los cuales podemos abrir para observar el código tal y como lo genero Umbrello.<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh16I-aXWsXYWXzGkrOHa6dfgyPcMzrXMLb3cgbZPJVA60n3OIL5mBqwzBlyEj8Mvsq9RkH08oPDQSzcPuAcb3ezLK7jMfrxFPBKvsbFf9d8saZjBp3dFIpIv6HBJr6TvXeLfppbP2lpAvQ/s1600/Umbrello-07.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="275" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh16I-aXWsXYWXzGkrOHa6dfgyPcMzrXMLb3cgbZPJVA60n3OIL5mBqwzBlyEj8Mvsq9RkH08oPDQSzcPuAcb3ezLK7jMfrxFPBKvsbFf9d8saZjBp3dFIpIv6HBJr6TvXeLfppbP2lpAvQ/s400/Umbrello-07.png" width="400" /></a></div><br />
Aquí les dejo la imagen del diagrama de secuencia:<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgOkkhm1va4m14NJxdrSRjqR5FD-93-1KFr9rCElnj6tFCIonDK1gHK0ON0PIXB4_bPvHGukaMVfFtNs4BkxuD1PosRr4x93MORMDiMgKvF8slcGRXu3Fhyphenhyphen6gNBuPaSF_d02GItj0Hllips/s1600/DiagramaSecuencia-01.png" imageanchor="1" style="margin-left:1em; margin-right:1em"><img border="0" height="400" width="344" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgOkkhm1va4m14NJxdrSRjqR5FD-93-1KFr9rCElnj6tFCIonDK1gHK0ON0PIXB4_bPvHGukaMVfFtNs4BkxuD1PosRr4x93MORMDiMgKvF8slcGRXu3Fhyphenhyphen6gNBuPaSF_d02GItj0Hllips/s400/DiagramaSecuencia-01.png" /></a></div><br />
Para el diagrama de secuencia use una página web que te facilita la creación del mismo mediante líneas de código simple, aquí les dejo el enlace:<br />
<a href="http://www.websequencediagrams.com/">Web Sequence Diagrams</a><br />
<br />
Aquí les dejo unas partes del código que genero Umbrello.<br />
<br />
<pre class="brush:java">/**
* Class Grafica
*/
public class Grafica extends Menu {
//
// Fields
//
//
// Constructors
//
public Grafica () { };
//
// Methods
//
//
// Accessor methods
//
//
// Other methods
//
/**
*/
public void obtenerDatos( )
{
}
/**
*/
public void solicitarGrafica( )
{
}
/**
*/
public void guardar( )
{
}
}
</pre><br />
<pre class="brush:java">/**
* Class Histograma
*/
public class Histograma extends Grafica {
//
// Fields
//
private String xlabel;
private String ylabel;
private float rangox;
//
// Constructors
//
public Histograma () { };
//
// Methods
//
//
// Accessor methods
//
/**
* Set the value of xlabel
* @param newVar the new value of xlabel
*/
private void setXlabel ( String newVar ) {
xlabel = newVar;
}
/**
* Get the value of xlabel
* @return the value of xlabel
*/
private String getXlabel ( ) {
return xlabel;
}
/**
* Set the value of ylabel
* @param newVar the new value of ylabel
*/
private void setYlabel ( String newVar ) {
ylabel = newVar;
}
/**
* Get the value of ylabel
* @return the value of ylabel
*/
private String getYlabel ( ) {
return ylabel;
}
/**
* Set the value of rangox
* @param newVar the new value of rangox
*/
private void setRangox ( float newVar ) {
rangox = newVar;
}
/**
* Get the value of rangox
* @return the value of rangox
*/
private float getRangox ( ) {
return rangox;
}
//
// Other methods
//
/**
*/
public void editar( )
{
}
/**
*/
public void visualizar( )
{
}
}
</pre><br />
<pre class="brush:java">/**
* Class Nuevo
*/
public class Nuevo extends Registro {
//
// Fields
//
//
// Constructors
//
public Nuevo () { };
//
// Methods
//
//
// Accessor methods
//
//
// Other methods
//
/**
*/
public void agregarColumna( )
{
}
/**
*/
public void agregarFila( )
{
}
/**
*/
public void verContenido( )
{
}
}
</pre><br />
No pongo todas las clases para no hacer mas extenso esto, así que solo deje tres de ellas.<br />
<br />
Haciendo una comparación rápida con mi código no es tan diferente, solo que en la clase histograma no me agrado como genero algunas cosas del código, así como deja el lugar donde deberían de ir los métodos, etcétera. Aún y sean parecidos prefiero seguir con la base de mi propio código. <br />
<br />
Si tienen alguna duda en como genere el código pueden preguntarme, o si tienen alguna sugerencia háganme saber.<br />
</div>Anonymoushttp://www.blogger.com/profile/02234142471203536128noreply@blogger.com1tag:blogger.com,1999:blog-4717153029351703678.post-17934999026442400972011-03-17T07:00:00.053-06:002011-03-17T07:00:17.012-06:00Diagramas de clase y secuencia de UML<div id="entrada"><div class="encabezado">Programación Orientada a Objetos <br />
Semana 6 </div><br />
Un diagrama de clase es un tipo de diagrama estático que describe la estructura de un sistema mostrando sus clases, atributos, y nos permite visualizar de forma clara las relaciones entre cada clase, así como no perder de vista sus métodos.<br />
<br />
Recordando un poco que estoy trabajando en el desarrollo de un programa que permita crear gráficas de una forma fácil y más directa que con otros programas, pienso en una interfaz sencilla pero con suficientes opciones, por lo menos las básicas.<br />
<br />
<div class="subtema">Diagrama de clases</div><br />
El siguiente es mi diagrama de clases donde podemos ver la relación que existe entre clase y clase, tal y como ya se los venía comentando en entradas anteriores. Es más fácil identificar cual clase es heredera cosas de otra. Y como clase padre encontramos al Menú, que en primera instancia nos desplegará la ventana con unas cuantas opciones, como la de crear un nuevo registro, editarlo, visualizarlo, y a partir de ahí, generar una gráfica.<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgk971sgrcngXbCr8FeOdwCrOoKgPSD9nrNf2nNt9BElhgWn2Wtw9oNFbpucAkYuA0MWpCq6kw7Ke4QtJVg2YRKre1ky2c73MllC4yuZc1S4wNQD9nUBfNaUFkj5ZIAiGFoP490MtTt_g4x/s1600/DiagramaClases-01.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="220" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgk971sgrcngXbCr8FeOdwCrOoKgPSD9nrNf2nNt9BElhgWn2Wtw9oNFbpucAkYuA0MWpCq6kw7Ke4QtJVg2YRKre1ky2c73MllC4yuZc1S4wNQD9nUBfNaUFkj5ZIAiGFoP490MtTt_g4x/s400/DiagramaClases-01.png" width="400" /></a></div><br />
<div class="subtema">Diagrama de secuencia</div><br />
El diagrama de secuencia es un tipo de diagrama usado para modelar interacción entre objetos en un sistema según UML.<br />
<br />
En mi diagrama de secuencia, es posible ver precisamente la secuencia o camino que es recorrido a lo largo de la ejecución del programa desde que se muestra el menú, y lo que este desencadena. Creo que este diagrama muestra como sería lo que el usuario vería no tanto en la lógica del programa, ya que no vemos el proceso que implica, por ejemplo, crear un registro nuevo o el editar una gráfica, por decir algo.<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj7QEhyphenhyphenKJRn5Kx-Z7ws8pVTe3HyNGkrHyYAppkBnw_P22d6HbSLn8mGhnWptMi-uxeNH2Cxu3hDaOGhzMnJGX9wJn9Yk8nGPVgmVv-DVOg1nbdtxP_7tGxkkike-S6R4QGRE2DuUdV0de-l/s1600/DiagramaSecuencia-01.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj7QEhyphenhyphenKJRn5Kx-Z7ws8pVTe3HyNGkrHyYAppkBnw_P22d6HbSLn8mGhnWptMi-uxeNH2Cxu3hDaOGhzMnJGX9wJn9Yk8nGPVgmVv-DVOg1nbdtxP_7tGxkkike-S6R4QGRE2DuUdV0de-l/s400/DiagramaSecuencia-01.png" width="343" /></a></div><br />
El programa usado para la creación del diagrama de clases, fue <b>Umbrello</b>, esté es gratuito y es posible descargarlo e instalarlo desde el centro de software de Ubuntu, con tan solo buscar UML. Otro que también descargue fue BOUML que es de la misma utilidad, pero no lo use ya que Umbrello me pareció más fácil.<br />
<br />
Para el diagrama de secuencia recurrí a una página web que te facilita la creación del mismo mediante líneas de código simple, aquí les dejo el enlace:<br />
<a href="http://www.websequencediagrams.com/">Web Sequence Diagrams</a><br />
<br />
Otras referencias:<br />
<a href="http://es.wikipedia.org/wiki/Diagrama_de_clases">Definición de diagrama de clases</a><br />
<a href="http://es.wikipedia.org/wiki/Diagrama_de_secuencia">Definición de diagrama de secuencia</a><br />
</div>Anonymoushttp://www.blogger.com/profile/02234142471203536128noreply@blogger.com2