<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:blogger='http://schemas.google.com/blogger/2008' xmlns:georss='http://www.georss.org/georss' xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-5314052884467946568</id><updated>2024-09-14T04:40:39.489-07:00</updated><category term="JavaScript"/><category term="JQuery"/><category term="Android"/><category term="HTML5"/><category term="Java"/><category term="Canvas"/><category term="Ubuntu"/><category term="MongoDB"/><category term="C++"/><category term="CSS"/><category term="Iwoky Studios"/><category term="MySQL"/><category term="PHP"/><category term="Tomcat"/><category term="Game Development"/><category term="JQuery games"/><category term="Juegos Android"/><category term="Oracle"/><category term="PuTTy"/><category term="Variables de entorno"/><category term="Diario"/><category term="FTP"/><category term="Game Of Balls"/><category term="HTML"/><category term="IOS"/><category term="JAVA_HOME"/><category term="JDK"/><category term="JDK Windows 7"/><category term="Linux"/><category term="Opengl ES"/><category term="Prototype"/><category term="Replace"/><category term="Update"/><category term="diseño"/><category term="oficina"/><category term="openssh-server"/><category term="reforma"/><category term="ssh"/><category term="studio"/><title type='text'>appiweb</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://iwokloco-appweb.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5314052884467946568/posts/default?redirect=false'/><link rel='alternate' type='text/html' href='http://iwokloco-appweb.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/5314052884467946568/posts/default?start-index=26&amp;max-results=25&amp;redirect=false'/><author><name>iwokloco</name><uri>http://www.blogger.com/profile/15790878541512725162</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>66</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-5314052884467946568.post-6662613286152918395</id><published>2019-11-28T15:28:00.004-08:00</published><updated>2019-11-28T15:29:15.661-08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="diseño"/><category scheme="http://www.blogger.com/atom/ns#" term="Iwoky Studios"/><category scheme="http://www.blogger.com/atom/ns#" term="oficina"/><category scheme="http://www.blogger.com/atom/ns#" term="reforma"/><category scheme="http://www.blogger.com/atom/ns#" term="studio"/><title type='text'>Montando el studio</title><content type='html'>&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjo18Ins6OUgabEXV32FLUbwrg5unDXhKf0npA51TWcDJnFcCMXVyrOJUBk2h0rUZNdWWIuxWCeVOgG4wkW_PEXIoqgSRFeYfbUfItoRCBiEoz5rUxPrRRM7_5QChGwZ31ptqin75n7eM4/s1600/photo_2019-11-29_00-25-07.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;720&quot; data-original-width=&quot;1280&quot; height=&quot;225&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjo18Ins6OUgabEXV32FLUbwrg5unDXhKf0npA51TWcDJnFcCMXVyrOJUBk2h0rUZNdWWIuxWCeVOgG4wkW_PEXIoqgSRFeYfbUfItoRCBiEoz5rUxPrRRM7_5QChGwZ31ptqin75n7eM4/s400/photo_2019-11-29_00-25-07.jpg&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;
Primer mueble montado... LA MESA!!!&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;
La mesa y groot!!&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://iwokloco-appweb.blogspot.com/feeds/6662613286152918395/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://iwokloco-appweb.blogspot.com/2019/11/montando-el-studio.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5314052884467946568/posts/default/6662613286152918395'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5314052884467946568/posts/default/6662613286152918395'/><link rel='alternate' type='text/html' href='http://iwokloco-appweb.blogspot.com/2019/11/montando-el-studio.html' title='Montando el studio'/><author><name>iwokloco</name><uri>http://www.blogger.com/profile/15790878541512725162</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjo18Ins6OUgabEXV32FLUbwrg5unDXhKf0npA51TWcDJnFcCMXVyrOJUBk2h0rUZNdWWIuxWCeVOgG4wkW_PEXIoqgSRFeYfbUfItoRCBiEoz5rUxPrRRM7_5QChGwZ31ptqin75n7eM4/s72-c/photo_2019-11-29_00-25-07.jpg" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5314052884467946568.post-4798430151728948725</id><published>2018-08-10T04:04:00.000-07:00</published><updated>2018-08-10T04:04:10.466-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="JavaScript"/><title type='text'>Comprobar cuánto tarda en ejecutarse un bloque de código en JavaScript</title><content type='html'>const start = window.performance.now();&lt;br /&gt;
&lt;br /&gt;
.... bloque de código que queremos medir ....&lt;br /&gt;
&lt;br /&gt;
const elapsed = window.performance.now() - start;&lt;br /&gt;
console.log(elapsed);&lt;br /&gt;
&lt;br /&gt;
Es bastante sencillo, capturamos el tiempo actual en milliseconds y después de ejecutar un bloque de código volvemos a capturar el tiempo actual y le restamos el primero.&lt;br /&gt;
Luego pintamos en la consola el tiempo transcurrido.</content><link rel='replies' type='application/atom+xml' href='http://iwokloco-appweb.blogspot.com/feeds/4798430151728948725/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://iwokloco-appweb.blogspot.com/2018/08/comprobar-cuanto-tarda-en-ejecutarse-un.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5314052884467946568/posts/default/4798430151728948725'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5314052884467946568/posts/default/4798430151728948725'/><link rel='alternate' type='text/html' href='http://iwokloco-appweb.blogspot.com/2018/08/comprobar-cuanto-tarda-en-ejecutarse-un.html' title='Comprobar cuánto tarda en ejecutarse un bloque de código en JavaScript'/><author><name>iwokloco</name><uri>http://www.blogger.com/profile/15790878541512725162</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5314052884467946568.post-2692489201757172671</id><published>2015-07-07T10:45:00.000-07:00</published><updated>2015-07-07T10:45:26.355-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Android"/><category scheme="http://www.blogger.com/atom/ns#" term="Game Of Balls"/><category scheme="http://www.blogger.com/atom/ns#" term="Iwoky Studios"/><category scheme="http://www.blogger.com/atom/ns#" term="Juegos Android"/><title type='text'>Game Of Balls el juego de reflejos más adictivo del Universo</title><content type='html'>&lt;span style=&quot;background-color: white; color: #333333; font-family: Roboto, UILanguageFont, Arial, sans-serif; font-size: 14px; line-height: 20px;&quot;&gt;He desarrollado un nuevo juego!! Se trata de &quot;Game Of Balls&quot;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;background-color: white; color: #333333; font-family: Roboto, UILanguageFont, Arial, sans-serif; font-size: 14px; line-height: 20px;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;background-color: white; color: #333333; font-family: Roboto, UILanguageFont, Arial, sans-serif; font-size: 14px; line-height: 20px;&quot;&gt;Game of Balls es el juego de reflejos más simple y adictivo del universo.&lt;/span&gt;&lt;br /&gt;
&lt;div style=&quot;border: 0px; color: #333333; font-family: Roboto, UILanguageFont, Arial, sans-serif; font-size: 14px; line-height: 20px; margin-bottom: 5px; padding: 0px;&quot;&gt;
&lt;span style=&quot;background-color: white;&quot;&gt;Cada día la puntuación del récord diario se pone a cero! Todos tenéis la oportunidad de ser el mejor del día o&amp;nbsp;de batir el récord del mundo!&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;border: 0px; color: #333333; font-family: Roboto, UILanguageFont, Arial, sans-serif; font-size: 14px; line-height: 20px; margin-bottom: 5px; padding: 0px;&quot;&gt;
&lt;span style=&quot;background-color: white;&quot;&gt;Jugar es muy fácil, las partidas duran 60 segundos en los que vuestros reflejos y velocidad con los dedos se ponen a prueba.&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;border: 0px; color: #333333; font-family: Roboto, UILanguageFont, Arial, sans-serif; font-size: 14px; line-height: 20px; margin-bottom: 5px; padding: 0px;&quot;&gt;
&lt;span style=&quot;background-color: white;&quot;&gt;En el selector de arriba aparece una bola de un color, debéis dar con el dedo a las bolas de ese color todo lo rápido que podáis. Cuando se acaban aparece otro color y debéis hacer lo mismo.&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;border: 0px; color: #333333; font-family: Roboto, UILanguageFont, Arial, sans-serif; font-size: 14px; line-height: 20px; margin-bottom: 5px; padding: 0px;&quot;&gt;
&lt;span style=&quot;background-color: white;&quot;&gt;Cada bola es un punto, consigue todas las que puedas antes de que acabe el tiempo.&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;border: 0px; color: #333333; font-family: Roboto, UILanguageFont, Arial, sans-serif; font-size: 14px; line-height: 20px; margin-bottom: 5px; padding: 0px;&quot;&gt;
&lt;span style=&quot;background-color: white;&quot;&gt;Lleva al límite tus reflejos y conviértete en el mejor jugador!&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;border: 0px; color: #333333; font-family: Roboto, UILanguageFont, Arial, sans-serif; font-size: 14px; line-height: 20px; margin-bottom: 5px; padding: 0px;&quot;&gt;
&lt;span style=&quot;background-color: white;&quot;&gt;No importa tu edad sólo importan tus habilidades.&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
Aquí tenéis el enlace a play store:&lt;br /&gt;
&lt;a href=&quot;https://play.google.com/store/apps/details?id=game.iwok.com.gameofballs&quot;&gt;https://play.google.com/store/apps/details?id=game.iwok.com.gameofballs&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
Muy pronto lo publicaré para IOS!!&lt;br /&gt;
Aquí os dejo el vídeo, espero que lo disfrutéis.&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;iframe width=&quot;320&quot; height=&quot;266&quot; class=&quot;YOUTUBE-iframe-video&quot; data-thumbnail-src=&quot;https://i.ytimg.com/vi/QK_ztOYaoMY/0.jpg&quot; src=&quot;https://www.youtube.com/embed/QK_ztOYaoMY?feature=player_embedded&quot; frameborder=&quot;0&quot; allowfullscreen&gt;&lt;/iframe&gt;&lt;/div&gt;
&lt;br /&gt;
Para cualquier pregunta relacionada con el desarrollo o publicación ya sabéis que podéis consultarme!&lt;br /&gt;
&lt;br /&gt;
Un saludete a todos!</content><link rel='replies' type='application/atom+xml' href='http://iwokloco-appweb.blogspot.com/feeds/2692489201757172671/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://iwokloco-appweb.blogspot.com/2015/07/game-of-balls-el-juego-de-reflejos-mas.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5314052884467946568/posts/default/2692489201757172671'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5314052884467946568/posts/default/2692489201757172671'/><link rel='alternate' type='text/html' href='http://iwokloco-appweb.blogspot.com/2015/07/game-of-balls-el-juego-de-reflejos-mas.html' title='Game Of Balls el juego de reflejos más adictivo del Universo'/><author><name>iwokloco</name><uri>http://www.blogger.com/profile/15790878541512725162</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://img.youtube.com/vi/QK_ztOYaoMY/default.jpg" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5314052884467946568.post-1107420066949064094</id><published>2015-02-02T02:48:00.002-08:00</published><updated>2015-02-02T02:48:58.355-08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Android"/><category scheme="http://www.blogger.com/atom/ns#" term="Diario"/><category scheme="http://www.blogger.com/atom/ns#" term="IOS"/><category scheme="http://www.blogger.com/atom/ns#" term="MongoDB"/><category scheme="http://www.blogger.com/atom/ns#" term="MySQL"/><category scheme="http://www.blogger.com/atom/ns#" term="PuTTy"/><title type='text'>Diario de un developer</title><content type='html'>En año nuevo me propuse un reto. Tenía un proyecto pensado desde hacia tiempo, pero no había tenido el valor de intentar hacerlo, básicamente por sus dimensiones.&lt;div&gt;
Estoy desarrollando como un loco, y voy publicando en un blog diario de desarrollo, lo que hago cada día, con un tono menos serio de lo que se esperaría de un blog técnico!&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;a href=&quot;http://iwdiario.blogspot.com.es/&quot;&gt;http://iwdiario.blogspot.com.es/&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
El blog está teniendo bastantes más visitas de las que esperaba!&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
El tema es:&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;background-color: white; color: #292f33; font-family: Arial, sans-serif; font-size: 16px; line-height: 22px; white-space: pre-wrap;&quot;&gt;1 developer, 1 proyecto enorme, 60 días de loco desarrollo, sin dinero, solo tiempo.&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
O me hará rico o más pobre!&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Espero que lo disfrutéis y no dudéis en comentar en el blog, preguntar. También podéis seguirme en twitter:&amp;nbsp;&lt;b style=&quot;background: rgb(245, 248, 250); font-family: Arial, sans-serif; font-size: 14px; line-height: 14px; text-decoration: none !important;&quot;&gt;&lt;span style=&quot;color: #0b5394;&quot;&gt;&lt;a class=&quot;ProfileHeaderCard-screennameLink u-linkComplex js-nav&quot; href=&quot;https://twitter.com/iwoklocoBlog&quot; style=&quot;background: rgb(245, 248, 250); font-family: Arial, sans-serif; font-size: 14px; line-height: 14px; text-decoration: none !important;&quot;&gt;&lt;span style=&quot;background: rgb(245, 248, 250);&quot;&gt;@&lt;/span&gt;&lt;span class=&quot;u-linkComplex-target&quot; style=&quot;background: rgb(245, 248, 250); font-family: Arial, sans-serif; font-size: 14px; line-height: 14px; text-decoration: none !important;&quot;&gt;iwoklocoBlog&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;
&lt;b style=&quot;background: rgb(245, 248, 250); font-family: Arial, sans-serif; font-size: 14px; line-height: 14px; text-decoration: none !important;&quot;&gt;&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;
&lt;b style=&quot;background: rgb(245, 248, 250); font-family: Arial, sans-serif; font-size: 14px; line-height: 14px; text-decoration: none !important;&quot;&gt;&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiztsokdZXA_5w-4yQ6v5PkQp27t93vQaLeAFa-s5Kaupv5EpIWVLXuPsMhSau2cidDdOQ0KF9-cs_F9OVtSiIXeO4nVZ6aQOQlhIPdzDwdmx3m9Oawr4K4VEHtdghB0r8bWLn6DNEyWKI/s1600/PSY_clips__FAIR_DEA_359821a.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiztsokdZXA_5w-4yQ6v5PkQp27t93vQaLeAFa-s5Kaupv5EpIWVLXuPsMhSau2cidDdOQ0KF9-cs_F9OVtSiIXeO4nVZ6aQOQlhIPdzDwdmx3m9Oawr4K4VEHtdghB0r8bWLn6DNEyWKI/s1600/PSY_clips__FAIR_DEA_359821a.jpg&quot; height=&quot;225&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;
&lt;b style=&quot;background: rgb(245, 248, 250); font-family: Arial, sans-serif; font-size: 14px; line-height: 14px; text-decoration: none !important;&quot;&gt;&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://iwokloco-appweb.blogspot.com/feeds/1107420066949064094/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://iwokloco-appweb.blogspot.com/2015/02/diario-de-un-developer.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5314052884467946568/posts/default/1107420066949064094'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5314052884467946568/posts/default/1107420066949064094'/><link rel='alternate' type='text/html' href='http://iwokloco-appweb.blogspot.com/2015/02/diario-de-un-developer.html' title='Diario de un developer'/><author><name>iwokloco</name><uri>http://www.blogger.com/profile/15790878541512725162</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiztsokdZXA_5w-4yQ6v5PkQp27t93vQaLeAFa-s5Kaupv5EpIWVLXuPsMhSau2cidDdOQ0KF9-cs_F9OVtSiIXeO4nVZ6aQOQlhIPdzDwdmx3m9Oawr4K4VEHtdghB0r8bWLn6DNEyWKI/s72-c/PSY_clips__FAIR_DEA_359821a.jpg" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5314052884467946568.post-500008368741795097</id><published>2014-11-05T07:02:00.004-08:00</published><updated>2014-11-05T07:02:40.148-08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Android"/><category scheme="http://www.blogger.com/atom/ns#" term="Iwoky Studios"/><category scheme="http://www.blogger.com/atom/ns#" term="Juegos Android"/><title type='text'>Sushi Dragon</title><content type='html'>Hola a todos!&lt;div&gt;
&lt;div&gt;
Os quiero presentar Sushi Dragon! El juego para Android que he creado.&lt;/div&gt;
&lt;div&gt;
Durante un año estuve desarrollando mi propio engine 2D sobre el SDK de android basado en OpenGL ES 1.0.&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
Decidí hacerlo completamente de cero, incluso implementé el sistema detector de gestos sobre las funciones básicas de la SDK de android.&lt;/div&gt;
&lt;div&gt;
Como primer proyecto mostrando las funcionalidades de mi engine Iwok2D, presento Sushi Dragon.&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
Un juego para que los más pequeños se diviertan cuidando, disfrazando y jugando con un pequeño dragón azul comedor de sushi!&lt;/div&gt;
&lt;div&gt;
Este es el enlace para descargarlo:&amp;nbsp;&lt;a href=&quot;https://play.google.com/store/apps/details?id=com.iwok.game&amp;amp;hl=es&quot; style=&quot;text-align: center;&quot;&gt;Sushi Dragon en Play Store!&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgENV4UGw1DTb0sS3fNIugJ19oDb923mVrF3hxuny43aQu-MgtJ1SRCFa5oha15idv1cPANKnBT3BQ-ceRsieEXERiflDcYGLV30oZgnZHLZWiJNH_laHENYUdDlLgjm37ZZUPOXV7TSS4/s1600/icon+512x512.png&quot; height=&quot;200&quot; width=&quot;200&quot; /&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;
Espero que os guste, y que os animeis a probarlo!&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;
Para aquellos que tengáis dudas sobre el proceso de desarrollo, diseño, distribución, inclusión de publicidad, etc. No dudeis en preguntar!&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;
Un saludo a todos!&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;
Aquí os dejo el enlace a mi portal de desarrollo de juegos:&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;
&lt;a href=&quot;http://www.iwokystudios.com/&quot;&gt;www.iwokystudios.com&lt;/a&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://iwokloco-appweb.blogspot.com/feeds/500008368741795097/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://iwokloco-appweb.blogspot.com/2014/11/sushi-dragon.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5314052884467946568/posts/default/500008368741795097'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5314052884467946568/posts/default/500008368741795097'/><link rel='alternate' type='text/html' href='http://iwokloco-appweb.blogspot.com/2014/11/sushi-dragon.html' title='Sushi Dragon'/><author><name>iwokloco</name><uri>http://www.blogger.com/profile/15790878541512725162</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgENV4UGw1DTb0sS3fNIugJ19oDb923mVrF3hxuny43aQu-MgtJ1SRCFa5oha15idv1cPANKnBT3BQ-ceRsieEXERiflDcYGLV30oZgnZHLZWiJNH_laHENYUdDlLgjm37ZZUPOXV7TSS4/s72-c/icon+512x512.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5314052884467946568.post-6693421022905233089</id><published>2014-09-23T06:27:00.003-07:00</published><updated>2014-09-23T06:27:40.665-07:00</updated><title type='text'>CSS: Bordes redondeados CSS</title><content type='html'>Buenas a todos!&lt;br /&gt;
Para tener divs con los bordes redondeados compatibles con todos los navegadores la clase css contendrá los siguientes atributos:&lt;br /&gt;
&lt;br /&gt;
-webkit-border-radius: 10px;&lt;br /&gt;
-moz-border-radius: 10px;&lt;br /&gt;
border-radius: 10px;&lt;br /&gt;
&lt;br /&gt;
&lt;div style=&quot;-webkit-border-radius: 10px; -webkit-border-radius: 10px; background: #00ff00; border-radius: 10px; height: 200px; width: 200px;&quot;&gt;
Div con los bordes redondeados!&lt;/div&gt;
&lt;br /&gt;
10px lógicamente hace referencia al radio.&lt;br /&gt;
&lt;br /&gt;
Un saludete!</content><link rel='replies' type='application/atom+xml' href='http://iwokloco-appweb.blogspot.com/feeds/6693421022905233089/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://iwokloco-appweb.blogspot.com/2014/09/css-bordes-redondeados-css.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5314052884467946568/posts/default/6693421022905233089'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5314052884467946568/posts/default/6693421022905233089'/><link rel='alternate' type='text/html' href='http://iwokloco-appweb.blogspot.com/2014/09/css-bordes-redondeados-css.html' title='CSS: Bordes redondeados CSS'/><author><name>iwokloco</name><uri>http://www.blogger.com/profile/15790878541512725162</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5314052884467946568.post-4738089915820018042</id><published>2014-09-23T06:16:00.001-07:00</published><updated>2014-09-23T06:16:01.646-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="CSS"/><title type='text'>CSS: Fondo transparente con CSS</title><content type='html'>Buenas a todos!&lt;br /&gt;
&lt;br /&gt;
Esta es una solución cross browser, para tener fondos transparentes en CSS.&lt;br /&gt;
El color lo indicamos con los valores rgb, el último parámetro de rgba indica el porcentaje de opacidad.&lt;br /&gt;
&lt;br /&gt;
div.bg_opacity{&lt;br /&gt;
&amp;nbsp; &amp;nbsp; background: rgb(0, 0, 0) transparent;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; background: rgba(0, 0, 0, 0.6);&lt;br /&gt;
&amp;nbsp; &amp;nbsp; filter:progid:DXImageTransform.Microsoft.gradient(startColorstr=#99000000, endColorstr=#99000000);&lt;br /&gt;
&amp;nbsp; &amp;nbsp; -ms-filter: &quot;progid:DXImageTransform.Microsoft.gradient(startColorstr=#99000000, endColorstr=#99000000)&quot;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
Un saludete!</content><link rel='replies' type='application/atom+xml' href='http://iwokloco-appweb.blogspot.com/feeds/4738089915820018042/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://iwokloco-appweb.blogspot.com/2014/09/css-fondo-transparente-con-css.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5314052884467946568/posts/default/4738089915820018042'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5314052884467946568/posts/default/4738089915820018042'/><link rel='alternate' type='text/html' href='http://iwokloco-appweb.blogspot.com/2014/09/css-fondo-transparente-con-css.html' title='CSS: Fondo transparente con CSS'/><author><name>iwokloco</name><uri>http://www.blogger.com/profile/15790878541512725162</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5314052884467946568.post-3667109228507104856</id><published>2014-09-17T15:10:00.001-07:00</published><updated>2014-09-17T15:10:28.027-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="C++"/><title type='text'>Apuntes de C++: Sobrecarga de funciones, constructores de copias y argumentos implícitos</title><content type='html'>Buenas a todos!&lt;br /&gt;
El siguiente post, continua con los apuntes sobre C++, esta vez resumo un poco el tema de la sobrecarga de funciones contructoras, los constructores de copias y los argumentos implícitos. Finalizo con algo curioso, obtener punteros que apunten a funciones sobrecargadas.&lt;br /&gt;
&lt;br /&gt;
Las funciones constructoras de clase se pueden sobrecargar, pero las funciones destructoras no.&lt;br /&gt;
&lt;br /&gt;








&lt;br /&gt;
&lt;div class=&quot;p1&quot;&gt;
&lt;span class=&quot;s1&quot;&gt;class&lt;/span&gt; Persona{&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&amp;nbsp; &amp;nbsp; int x;&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
public:&lt;/div&gt;
&lt;div class=&quot;p2&quot;&gt;
&lt;span class=&quot;s2&quot;&gt;&amp;nbsp; &amp;nbsp; Persona(){ x=&lt;/span&gt;&lt;span class=&quot;s3&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;; } &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;//Constructor sin inicializador&lt;/div&gt;
&lt;div class=&quot;p2&quot;&gt;
&lt;span class=&quot;s2&quot;&gt;&amp;nbsp; &amp;nbsp; Persona(int n){ x=n; }&amp;nbsp; &lt;/span&gt;//Constructor con inicializador&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
};&lt;/div&gt;
&lt;div class=&quot;p3&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;p3&quot;&gt;
En el código anterior tenemos la función constructora sobrecargada.&lt;/div&gt;
&lt;div class=&quot;p3&quot;&gt;
Sin la versión de constructor sin inicializador, no podría inicializarse un array dinámico, y se generaría un error en tiempo de compilación.&lt;/div&gt;
&lt;div class=&quot;p3&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;p3&quot;&gt;
Persona *persona;&lt;/div&gt;
&lt;div class=&quot;p3&quot;&gt;
persona = new Persona[20];&lt;/div&gt;
&lt;div class=&quot;p3&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;p3&quot;&gt;
Con el constructor sin inicializador el array dinámico persona, contiene 20 objetos de tipo persona, con x = 0.&lt;/div&gt;
&lt;div class=&quot;p3&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;p3&quot;&gt;
Cuando se pasa un objeto a una función o esta lo devuelve pueden presentarse dificultades, ya que automáticamente se generan copias del objeto.&lt;/div&gt;
&lt;div class=&quot;p3&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;p3&quot;&gt;
Al pasar un objeto a una función se realiza una copia bit a bit de ese objeto. Hay cosas que no deseamos que sean idénticas en la copia, como por ejemplo si el objeto original apunta a la memoria asignada por un puntero, la copia apuntará a la misma dirección de memoria, y la copia podría alterar la memoria original.&lt;/div&gt;
&lt;div class=&quot;p3&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;p3&quot;&gt;
Cuando una función devuelve un objeto, normalmente el compilador generará un objeto temporal que mantiene una copia del valor devuelto por la función. Esta acción es automática y no controlable.&lt;/div&gt;
&lt;div class=&quot;p3&quot;&gt;
Este objeto desaparece al devolver su valor y al desaparecer llama a su función destructora.&lt;/div&gt;
&lt;div class=&quot;p3&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;p3&quot;&gt;
Para evitar estos problemas se puede definir un &quot;&lt;b&gt;constructor de copias&lt;/b&gt;&quot;, un tipo especial de función constructora sobrecargada.&lt;/div&gt;
&lt;div class=&quot;p3&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;p3&quot;&gt;
&lt;b&gt;&lt;span style=&quot;font-size: large;&quot;&gt;Situaciones en las que se aplica un constructor de copias&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;
&lt;div class=&quot;p3&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;p3&quot;&gt;
Los constructores de copias sólo se aplican a situaciones de inicialización, no de asignación.&lt;/div&gt;
&lt;div class=&quot;p3&quot;&gt;
Hay tres situaciones de inicialización típicas:&lt;/div&gt;
&lt;div class=&quot;p3&quot;&gt;
- Se emplea un objeto para inicializar otro en una declaración.&lt;/div&gt;
&lt;div class=&quot;p3&quot;&gt;
&lt;i&gt;myclass x = y;&lt;/i&gt;&lt;/div&gt;
&lt;div class=&quot;p3&quot;&gt;
- Se pasa un objeto como parámetro a una función.&lt;/div&gt;
&lt;div class=&quot;p3&quot;&gt;
&lt;i&gt;funcionX(y);&lt;/i&gt;&lt;/div&gt;
&lt;div class=&quot;p3&quot;&gt;
- Se crea un objeto temporal al devolver un objeto por una función.&lt;/div&gt;
&lt;div class=&quot;p3&quot;&gt;
&lt;i&gt;y = funcionX();&lt;/i&gt;&lt;/div&gt;
&lt;div class=&quot;p3&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;p3&quot;&gt;







&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&lt;span class=&quot;s1&quot;&gt;class&lt;/span&gt; Persona{&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&amp;nbsp; &amp;nbsp; int x;&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
public:&lt;/div&gt;
&lt;div class=&quot;p2&quot;&gt;
&lt;span class=&quot;s2&quot;&gt;&amp;nbsp; &amp;nbsp; Persona(){ x=&lt;/span&gt;&lt;span class=&quot;s3&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;; } &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;//Constructor sin inicializador&lt;/div&gt;
&lt;div class=&quot;p2&quot;&gt;
&lt;span class=&quot;s2&quot;&gt;&amp;nbsp; &amp;nbsp; Persona(int n){ x=n; }&amp;nbsp; &lt;/span&gt;//Constructor con inicializador&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&amp;nbsp; &amp;nbsp; Persona(&lt;span class=&quot;s1&quot;&gt;const&lt;/span&gt; Persona &amp;amp;obj){…}&lt;span class=&quot;s4&quot;&gt;//Constructor de copias&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
};&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
Argumentos implícitos&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
Usar argumentos implícitos es una forma abreviada de sobrecarga de funciones.&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
void f(int a = 0, int b = 0);&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
La función anterior emplea como argumentos implícitos los parámetros a y b.&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
Este tipo de declaración permite llamar a la función f de las siguientes formas:&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;







&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&lt;span class=&quot;s1&quot;&gt;f();&amp;nbsp; &amp;nbsp; &lt;/span&gt;//a=0, b=0&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&lt;span class=&quot;s1&quot;&gt;f(&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;); &amp;nbsp; &lt;/span&gt;//a=5, b=0&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&lt;span class=&quot;s1&quot;&gt;f(&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;); &lt;/span&gt;//a=5, b=2&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
No hay forma de dar valor por defecto a &#39;a&#39; y especificar &#39;b&#39;.&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
Los &lt;b&gt;argumentos implícitos&lt;/b&gt; deben ser &lt;b&gt;constantes&lt;/b&gt; o &lt;b&gt;variables globales&lt;/b&gt;.&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&lt;span style=&quot;font-size: large;&quot;&gt;&lt;b&gt;Búsqueda de la dirección de una función sobrecargada&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
Igual que en C es posible asignar la dirección de una función a un puntero y acceder a la misma a través del puntero:&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
p = zap; &amp;nbsp;//donde tenemos zap();&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
Para obtener la dirección de una función sobrecargada, es &lt;b&gt;el modo de declarar el puntero&lt;/b&gt; el que determina la dirección de la función sobrecargada.&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;







&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&lt;span class=&quot;s1&quot;&gt;void&lt;/span&gt; space(int count);&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&lt;span class=&quot;s1&quot;&gt;void&lt;/span&gt; space(int count, char ch);&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
main(){&lt;/div&gt;
&lt;div class=&quot;p2&quot;&gt;
&lt;span class=&quot;s2&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;void&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt; (*fp1)(int); &amp;nbsp; &lt;/span&gt;//puntero a una función void con un parámetro int&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&amp;nbsp; &amp;nbsp; &lt;span class=&quot;s1&quot;&gt;void&lt;/span&gt; (*fp2)(int)(char);&lt;/div&gt;
&lt;div class=&quot;p3&quot;&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;p2&quot;&gt;
&lt;span class=&quot;s2&quot;&gt;&amp;nbsp; &amp;nbsp; fp1 = space;&amp;nbsp; &amp;nbsp; &lt;/span&gt;//void space(int count);&lt;/div&gt;
&lt;div class=&quot;p2&quot;&gt;
&lt;span class=&quot;s2&quot;&gt;&amp;nbsp; &amp;nbsp; fp2 = space;&amp;nbsp; &amp;nbsp; &lt;/span&gt;//void space(int count, char ch);&lt;/div&gt;
&lt;div class=&quot;p3&quot;&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&amp;nbsp; &amp;nbsp; fp1(&lt;span class=&quot;s3&quot;&gt;22&lt;/span&gt;);&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&amp;nbsp; &amp;nbsp; fp2(&lt;span class=&quot;s3&quot;&gt;30&lt;/span&gt;, &lt;span class=&quot;s4&quot;&gt;&#39;x&#39;&lt;/span&gt;);&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
}&lt;/div&gt;
&lt;br /&gt;
&lt;div class=&quot;p1&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
En el siguiente post, continuaré con la &lt;b&gt;sobrecarga de operadores&lt;/b&gt;.&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
Un saludo a todos!&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
</content><link rel='replies' type='application/atom+xml' href='http://iwokloco-appweb.blogspot.com/feeds/3667109228507104856/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://iwokloco-appweb.blogspot.com/2014/09/apuntes-de-c-sobrecarga-de-funciones.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5314052884467946568/posts/default/3667109228507104856'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5314052884467946568/posts/default/3667109228507104856'/><link rel='alternate' type='text/html' href='http://iwokloco-appweb.blogspot.com/2014/09/apuntes-de-c-sobrecarga-de-funciones.html' title='Apuntes de C++: Sobrecarga de funciones, constructores de copias y argumentos implícitos'/><author><name>iwokloco</name><uri>http://www.blogger.com/profile/15790878541512725162</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5314052884467946568.post-4718413105900841964</id><published>2014-09-07T16:11:00.002-07:00</published><updated>2014-09-07T16:11:25.068-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="C++"/><title type='text'>Apuntes de C++ : Arrays y punteros</title><content type='html'>Continuando con los resúmenes de mis apuntes del libro &quot;C++ guia de autoenseñanza&quot; de Herbert Schildt, en este post trataré los Arrays, los punteros y las referencias.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;&lt;span style=&quot;font-size: large;&quot;&gt;Cómo crear un array&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
int lista[20];&lt;br /&gt;
Esta línea crea un array de 20 elementos de tipo entero.&lt;br /&gt;
&lt;br /&gt;
Para crear un array de objetos de una clase concreta, se emplea la misma sintaxis:&lt;br /&gt;
&lt;br /&gt;
class Nave_espacial{&lt;br /&gt;
&amp;nbsp; &amp;nbsp; int r;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; int g;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; int b;&lt;br /&gt;
public:&lt;br /&gt;
&amp;nbsp; &amp;nbsp; Nave_espacial(int r, int g, int b);&lt;br /&gt;
&amp;nbsp; &amp;nbsp; void setColor(int r, int g, int b);&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
void Nave_espacial::setColor(int r, int g, int b){...}&lt;br /&gt;
&lt;br /&gt;
main(){&lt;br /&gt;
&amp;nbsp; &amp;nbsp; Nave_espacial naves[20];&lt;br /&gt;
&amp;nbsp; &amp;nbsp; naves[0].setColor(255, 0 , 0); &amp;nbsp; &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
Creamos un array para 20 objetos de tipo Nave_espacial y modificamos el color de la primera nave de la lista.&lt;br /&gt;
&lt;br /&gt;
Nave_espacial naves[2] = { Nave_espacial(1,2,3) , &amp;nbsp;Nave_espacial(4,5,6) };&lt;br /&gt;
&lt;br /&gt;
Este tipo de inicialización del array, permite llamar a las funciones constructoras de cada uno de los objetos del array pasándoles los parámetros que sean necesarios.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;&lt;span style=&quot;font-size: large;&quot;&gt;Punteros a objetos&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;p1&quot;&gt;
class Muestra{&lt;/div&gt;
&lt;div class=&quot;p2&quot;&gt;
&lt;span class=&quot;Apple-tab-span&quot;&gt;&lt;/span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;int id, valor;&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
public:&lt;/div&gt;
&lt;div class=&quot;p2&quot;&gt;
&lt;span class=&quot;Apple-tab-span&quot;&gt;&lt;/span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;Muestra(int _id, int _valor){ id = _id; valor = _valor; }&lt;/div&gt;
&lt;div class=&quot;p2&quot;&gt;
&lt;span class=&quot;Apple-tab-span&quot;&gt;&lt;/span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;int getId(){ return id; }&lt;/div&gt;
&lt;div class=&quot;p2&quot;&gt;
&lt;span class=&quot;Apple-tab-span&quot;&gt;&lt;/span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;int getValor(){ return valor; }&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
};&lt;/div&gt;
&lt;div class=&quot;p3&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
main(){&lt;/div&gt;
&lt;div class=&quot;p2&quot;&gt;
&lt;span class=&quot;Apple-tab-span&quot;&gt;&lt;/span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;int i;&lt;/div&gt;
&lt;div class=&quot;p2&quot;&gt;
&lt;span class=&quot;Apple-tab-span&quot;&gt;&lt;/span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;Muestra muestras[4] = {&lt;/div&gt;
&lt;div class=&quot;p4&quot;&gt;
&lt;span class=&quot;Apple-tab-span&quot;&gt;&lt;/span&gt;&lt;span class=&quot;Apple-tab-span&quot;&gt;&lt;/span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;Muestra(0, 20),&lt;/div&gt;
&lt;div class=&quot;p4&quot;&gt;
&lt;span class=&quot;Apple-tab-span&quot;&gt;&lt;/span&gt;&lt;span class=&quot;Apple-tab-span&quot;&gt;&lt;/span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;Muestra(1, 23),&lt;/div&gt;
&lt;div class=&quot;p4&quot;&gt;
&lt;span class=&quot;Apple-tab-span&quot;&gt;&lt;/span&gt;&lt;span class=&quot;Apple-tab-span&quot;&gt;&lt;/span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;Muestra(2, 21),&lt;/div&gt;
&lt;div class=&quot;p4&quot;&gt;
&lt;span class=&quot;Apple-tab-span&quot;&gt;&lt;/span&gt;&lt;span class=&quot;Apple-tab-span&quot;&gt;&lt;/span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;Muestra(3, 23)&lt;/div&gt;
&lt;div class=&quot;p2&quot;&gt;
&lt;span class=&quot;Apple-tab-span&quot;&gt;&lt;/span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;};&lt;/div&gt;
&lt;div class=&quot;p2&quot;&gt;
&lt;span class=&quot;Apple-tab-span&quot;&gt;&lt;/span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;Muestra *m;&lt;/div&gt;
&lt;div class=&quot;p2&quot;&gt;
&lt;span class=&quot;Apple-tab-span&quot;&gt;&lt;/span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;m = muestras;&lt;/div&gt;
&lt;div class=&quot;p5&quot;&gt;
&lt;span class=&quot;Apple-tab-span&quot;&gt; &lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;p2&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;p2&quot;&gt;
&lt;span class=&quot;Apple-tab-span&quot;&gt;&lt;/span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;for(i=0; i&amp;lt;4; i++){&lt;/div&gt;
&lt;div class=&quot;p4&quot;&gt;
&lt;span class=&quot;Apple-tab-span&quot;&gt;&lt;/span&gt;&lt;span class=&quot;Apple-tab-span&quot;&gt;&lt;/span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;cout &amp;lt;&amp;lt; m-&amp;gt;getValor() &amp;lt;&amp;lt; &quot; , &quot;;&lt;/div&gt;
&lt;div class=&quot;p4&quot;&gt;
&lt;span class=&quot;Apple-tab-span&quot;&gt;&lt;/span&gt;&lt;span class=&quot;Apple-tab-span&quot;&gt;&lt;/span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;m++;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;p2&quot;&gt;
&lt;span class=&quot;Apple-tab-span&quot;&gt;&lt;/span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
}&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
Creamos un puntero m para apuntar a objetos de la clase Muestra, y cogemos la dirección del array.&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
Cuando se incrementa el puntero, este apunta al próximo objeto del array.&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
Para emplear las funciones miembro de los objetos se emplea el operador -&amp;gt;.&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&lt;b&gt;&lt;span style=&quot;font-size: large;&quot;&gt;Uso de new y delete&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
En C la asignación de memoria dinámica se realizaba mediante &lt;b&gt;malloc()&lt;/b&gt; y la memoria asignada se liberaba utilizando &lt;b&gt;free()&lt;/b&gt;. Estas funciones estándar siguen siendo válidas en C++.&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
C++ proporciona un método más seguro para asignar memoria y liberar memoria, &lt;b&gt;new&lt;/b&gt; y &lt;b&gt;delete&lt;/b&gt;.&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
Muestra *m;&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
m = &lt;b&gt;new&lt;/b&gt; Muestra(2, 40);&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&lt;b&gt;delete&lt;/b&gt; m;&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
Creamos un puntero para objetos de una clase en concreto.&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&lt;b&gt;new&lt;/b&gt; nos devuelve un puntero a la memoria asignada dinámicamente, que es lo suficientemente grande como para contener el objeto de la clase.&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&lt;b&gt;delete&lt;/b&gt; devuelve la memoria cuando ya no se necesita.&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
Si no hay memoria disponible para asignar, &lt;b&gt;new&lt;/b&gt; devuelve un puntero nulo.&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
Solamente debe llamarse &lt;b&gt;delete&lt;/b&gt; con punteros obtenidos previamente mediante &lt;b&gt;new&lt;/b&gt;. En caso contrario, se bloquea el sistema de asignación, interrumpiéndose el programa.&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&lt;b&gt;new&lt;/b&gt; asigna automáticamente la memoria necesaria para albergar un objeto del tipo especificado, así que no es necesario emplear &lt;b&gt;sizeof&lt;/b&gt; para calcular el número de bytes requeridos.&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
Tanto &lt;b&gt;new&lt;/b&gt; como &lt;b&gt;delete&lt;/b&gt; pueden sobrecargarse permitiendo que el programador cree a su medida su propio sistema de asignación de memoria.&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
m = &lt;b&gt;new&lt;/b&gt; Muestra[10];&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
El puntero m apuntará a la primera posición de un array de 10 objetos de clase Muestra.&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
Para eliminar un array asignado dinámicamente, se emplea la siguiente instrucción:&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&lt;b&gt;delete&lt;/b&gt; []m;&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
Así el compilador llama a la función destructora para cada elemento del array, y &lt;b&gt;m no se libera en múltiples ocasiones, se libera sólo una vez&lt;/b&gt;.&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&lt;b&gt;&lt;span style=&quot;font-size: large;&quot;&gt;Referencias: pasar parámetros por referencia a una función&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
K = 10;&lt;br /&gt;
void sumarK(int *n);&lt;br /&gt;
&lt;br /&gt;
void sumarK(int *n){&lt;br /&gt;
&amp;nbsp; &amp;nbsp; *n = *n + K;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
main(){&lt;br /&gt;
&amp;nbsp; &amp;nbsp; int i = 5;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; sumarK(&amp;amp;i);&lt;br /&gt;
&amp;nbsp; &amp;nbsp; cout &amp;lt;&amp;lt; &quot;Valor de i = &quot; &amp;lt;&amp;lt; i;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
Por defecto, C++ pasa los parámetros por valor, lo que significa que realiza una copia de los mismos y que si alteramos su valor dentro de las funciones, la variable original que se ha pasado a la función no se ve afectada.&lt;br /&gt;
En este ejemplo la función sumarK(int *n) recibe como parámetro un puntero a un entero, lo que significa que cuando realizamos la llamada debemos pasar como parámetro la dirección de la variable entera, para coger dicha dirección o referencia, empleamos el operador &amp;amp;i.&lt;br /&gt;
&lt;br /&gt;
Al hacer esto la función f trabaja directamente con la variable original, ya que altera el valor contenido en la dirección apuntada por el puntero.&lt;br /&gt;
&lt;br /&gt;
En C la definición de paso por referencia sólo puede hacerse de la anterior forma, pero en C++ puede automatizarse para simplificarse el paso por referencia:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
K = 10;&lt;br /&gt;
void sumarK(int &amp;amp;n);&lt;br /&gt;
&lt;br /&gt;
void sumarK(int &amp;amp;n){&lt;br /&gt;
&amp;nbsp; &amp;nbsp; n = n + K;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
main(){&lt;br /&gt;
&amp;nbsp; &amp;nbsp; int i = 5;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; sumarK(i);&lt;br /&gt;
&amp;nbsp; &amp;nbsp; cout &amp;lt;&amp;lt; &quot;Valor de i = &quot; &amp;lt;&amp;lt; i;&lt;br /&gt;
}&lt;br /&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Simplemente es necesario añadir el operador de dirección al declarar la función, &amp;amp;n.&lt;/div&gt;
&lt;div&gt;
Hecho esto el compilador ya sabe que realmente cuando se haga la llamada sumarK(i) lo que está pasando como parámetro es la dirección de la variable i.&lt;/div&gt;
&lt;div&gt;
Y del mismo modo tampoco hace falta indicar dentro de la implementación de la función, que n es un puntero.&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
Importante: &lt;b&gt;no se pueden modificar las direcciones a las que apunta una referencia&lt;/b&gt;.&lt;br /&gt;
&lt;br /&gt;
Pasar parámetros por referencia es la mejor forma de evitar los problemas asociados con la copia de argumentos, que al llamar a sus funciones destructoras pueden perjudicar partes del programa.&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
Una referencia no es un puntero. Cuando se pasa un objeto por referencia su operador de acceso a atributos y funciones miembro, es el punto &quot;.&quot; y no la flecha &quot;-&amp;gt;&quot;.&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&lt;b&gt;&lt;span style=&quot;font-size: large;&quot;&gt;Devolución de referencias&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
Una función puede devolver una referencia. Y podemos asignar directamente valores a la dirección de dicha referencia, es decir, una función puede estar en el lado izquierdo de una asignación.&lt;br /&gt;
El siguiente ejemplo es una locura, para los que nunca han trabajado con punteros o están muy acostumbrados a lenguajes como Java.&lt;br /&gt;
Vamos a crear una clase Array, para almacenar arrays de enteros.&lt;br /&gt;
Y en la función main vamos a hacer que las posiciones 2 y 3 del array contengan los valores 4 y 30:&lt;br /&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;







&lt;br /&gt;
&lt;div class=&quot;p1&quot;&gt;
class Array(){&lt;/div&gt;
&lt;div class=&quot;p2&quot;&gt;
&lt;span class=&quot;Apple-tab-span&quot;&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;int size;&lt;/div&gt;
&lt;div class=&quot;p2&quot;&gt;
&lt;span class=&quot;Apple-tab-span&quot;&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;int *set;&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
public:&lt;/div&gt;
&lt;div class=&quot;p2&quot;&gt;
&lt;span class=&quot;Apple-tab-span&quot;&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;Array(int _size);&lt;/div&gt;
&lt;div class=&quot;p2&quot;&gt;
&lt;span class=&quot;Apple-tab-span&quot;&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;int &amp;amp;put(int i);&lt;/div&gt;
&lt;div class=&quot;p2&quot;&gt;
&lt;span class=&quot;Apple-tab-span&quot;&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;int get(int i);&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
};&lt;/div&gt;
&lt;div class=&quot;p3&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
Array::Array(int _size){&lt;/div&gt;
&lt;div class=&quot;p2&quot;&gt;
&lt;span class=&quot;Apple-tab-span&quot;&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;set = new int[_size];&lt;/div&gt;
&lt;div class=&quot;p2&quot;&gt;
&lt;span class=&quot;Apple-tab-span&quot;&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;size = _size;&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
}&lt;/div&gt;
&lt;div class=&quot;p3&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
int &amp;amp;Array::put(int i){&lt;/div&gt;
&lt;div class=&quot;p2&quot;&gt;
&lt;span class=&quot;Apple-tab-span&quot;&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;if(!(i&amp;lt;0 || i&amp;gt;=size)) return set[i]; //devuelve una referencia a set[i]&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
}&lt;/div&gt;
&lt;div class=&quot;p3&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
int Array::get(int i){&lt;/div&gt;
&lt;div class=&quot;p2&quot;&gt;
&lt;span class=&quot;Apple-tab-span&quot;&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;if(!(i&amp;lt;0 || i&amp;gt;=size)) return set[i]; //devuelve el entero contenido en set[i]&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
}&lt;/div&gt;
&lt;div class=&quot;p3&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
main(){&lt;/div&gt;
&lt;div class=&quot;p2&quot;&gt;
&lt;span class=&quot;Apple-tab-span&quot;&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;Array a(20);&lt;/div&gt;
&lt;div class=&quot;p2&quot;&gt;
&lt;span class=&quot;Apple-tab-span&quot;&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;a.put(2) = 4;&lt;/div&gt;
&lt;div class=&quot;p2&quot;&gt;
&lt;span class=&quot;Apple-tab-span&quot;&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;a.put(3) = 30;&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
} &amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&lt;br /&gt;
Para que una función devuelva una referencia debemos poner el operador &amp;amp; delante del nombre de función.&lt;br /&gt;
Una vez hemos indicado esto automáticamente el compilador sabe que debe devolver la dirección de set[i] y no el valor que contiene.&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&lt;b&gt;Una referencia no puede ser referenciada&lt;/b&gt;.&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&lt;b&gt;No pueden crearse arrays de referencias&lt;/b&gt;.&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&lt;b&gt;Las referencias son similares a los punteros, pero no son punteros&lt;/b&gt;.&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
Hasta aquí la segunda parte de los apuntes de C++.&lt;br /&gt;
Espero que estos resúmenes os sirvan de &quot;referencia&quot; y os sean de utilidad!&lt;br /&gt;
Un saludo a todos!!&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://iwokloco-appweb.blogspot.com/feeds/4718413105900841964/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://iwokloco-appweb.blogspot.com/2014/09/apuntes-de-c-arrays-y-punteros.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5314052884467946568/posts/default/4718413105900841964'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5314052884467946568/posts/default/4718413105900841964'/><link rel='alternate' type='text/html' href='http://iwokloco-appweb.blogspot.com/2014/09/apuntes-de-c-arrays-y-punteros.html' title='Apuntes de C++ : Arrays y punteros'/><author><name>iwokloco</name><uri>http://www.blogger.com/profile/15790878541512725162</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5314052884467946568.post-2991343491788194136</id><published>2014-09-06T15:17:00.002-07:00</published><updated>2014-09-06T15:17:28.686-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="C++"/><title type='text'>Apuntes de C++</title><content type='html'>El siguiente post, no es un tutorial en sí. Son fragmentos a modo de síntesis de mis apuntes escritos durante la lectura del libro &quot;C++ guia de autoenseñanza&quot; de Herbert Schildt. Un libro lleno de ejemplos y perfecto para empezar de cero o volver a recordar C++.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;&lt;span style=&quot;font-size: large;&quot;&gt;Sobrecarga de funciones&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
En C++ varias funciones pueden tener el mismo nombre mientras el tipo o el número de sus argumentos sea distinto. Cuando ocurre esto, se dice que son funciones sobrecargadas.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;&lt;br /&gt;&lt;/b&gt;
&lt;b&gt;&lt;span style=&quot;font-size: large;&quot;&gt;Funciones constructoras en C++&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;
Las funciones contructoras de una clase en C++ tienen el mismo nombre que la clase y no incluyen ningún tipo de retorno.&lt;br /&gt;
&lt;br /&gt;
class Sprite{&lt;br /&gt;
&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt; &lt;/span&gt;public:&lt;br /&gt;
&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt;  &lt;/span&gt;int x;&lt;br /&gt;
&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt;  &lt;/span&gt;int y;&lt;br /&gt;
&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt;  &lt;/span&gt;Sprite();&lt;br /&gt;
&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt;  &lt;/span&gt;Sprite(int x, int y);&lt;br /&gt;
&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt;  &lt;/span&gt;~Sprite();&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
Sprite::Sprite(){&lt;br /&gt;
&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt; &lt;/span&gt;x = 0;&lt;br /&gt;
&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt; &lt;/span&gt;y = 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
Sprite::Sprite(int _x, int _y){&lt;br /&gt;
&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt; &lt;/span&gt;x = _x;&lt;br /&gt;
&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt; &lt;/span&gt;y = _y;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
Sprite::~Sprite(){&lt;br /&gt;
&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt; &lt;/span&gt;cout &amp;lt;&amp;lt; &quot;Destruyendo el sprite \n&quot;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main(int argc, char *argv[]){&lt;br /&gt;
&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt; &lt;/span&gt;Sprite sp;&lt;br /&gt;
&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt; &lt;/span&gt;cout &amp;lt;&amp;lt; &quot;Position x &quot; &amp;lt;&amp;lt; sp.x;&lt;br /&gt;
}&lt;br /&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
Es importante ver que a diferencia de otros lenguajes como java o javascript, en C++ una &lt;b&gt;sentencia de declaración de variable es una sentencia de acción&lt;/b&gt;, que desencadena que sea llamado el constructor sin parámetros.&lt;br /&gt;
También C++ permite que se ejecute una función cuando el objeto va a ser destruido, son las llamadas funciones destructoras, y tienen el mismo nombre que la clase pero vienen precedidas por el símbolo ~. Las funciones destructoras no pueden tener parámetros.&lt;br /&gt;
Los objetos locales se destruyen al salir de su ámbito y los objetos globales se destruyen al finalizar el programa.&lt;br /&gt;
&lt;br /&gt;
No se puede obtener la dirección ni de las funciones constructoras ni de las destructoras.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;&lt;span style=&quot;font-size: large;&quot;&gt;Herencia en C++&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;
En este ejemplo tenemos una clase B que hereda de una clase A:&lt;br /&gt;
&lt;br /&gt;
class A{&lt;br /&gt;
&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt; &lt;/span&gt;int x;&lt;br /&gt;
public:&lt;br /&gt;
&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt; &lt;/span&gt;void setX(int _x);&lt;br /&gt;
&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt; &lt;/span&gt;int getX();&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
class B : public A{&lt;br /&gt;
&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt; &lt;/span&gt;int y;&lt;br /&gt;
public:&lt;br /&gt;
&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt; &lt;/span&gt;void setY(int _y);&lt;br /&gt;
&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt; &lt;/span&gt;int getY();&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
La declaración de la clase B indica al compilador que B heredará de la clase A, y tendrá públicos los mismos elementos que se hayan definido como públicos en la clase A, pero que todos los elementos de la clase base A permanecerán privados para B, de forma que no serán accesibles directamente.&lt;br /&gt;
El hecho de que una clase derivada no tenga acceso directo a las propiedades privadas de su clase base es para mantener la encapsulación.&lt;br /&gt;
&lt;br /&gt;
La sintaxis parar realizar herencia es la siguiente:&lt;br /&gt;
class nombre_clase_derivada : tipo_acceso nombre_clase_base{...};&lt;br /&gt;
&lt;br /&gt;
El tipo de acceso puede ser public, private o protected.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;&lt;span style=&quot;font-size: large;&quot;&gt;Punteros a objeto&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;
A diferencia de lenguajes como Java en el que siempre que pasamos un objeto como parámetro de una función, este es pasado por referencia. Lo que significa que realmente estamos pasando la dirección de ese objeto y que todas las modificaciones que hagamos dentro de la función afectarán al objeto en sí. En C++ si queremos modificar un objeto dentro de una función, debemos especificar la dirección que hace referencia a dicho objeto, esto es lo que llamamos un puntero a un objeto.&lt;br /&gt;
Un puntero a objeto es una variable que contiene la dirección de memoria donde está contenido el objeto.&lt;br /&gt;
&lt;br /&gt;
class Televisor{&lt;br /&gt;
&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt; &lt;/span&gt;int pulgadas;&lt;br /&gt;
public:&lt;br /&gt;
&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt; &lt;/span&gt;Televisor(int _pulgadas);&lt;br /&gt;
&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt; &lt;/span&gt;int getPulgadas();&lt;br /&gt;
};&lt;br /&gt;
Televisor::Televisor(int _pulgadas){&lt;br /&gt;
&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt; &lt;/span&gt;pulgadas = _pulgadas; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;br /&gt;
}&lt;br /&gt;
int Televisor::getPulgadas(){&lt;br /&gt;
&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt; &lt;/span&gt;return pulgadas;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main(int argc, char *argv[]){&lt;br /&gt;
&amp;nbsp; &amp;nbsp; Televisor tele(32);&lt;br /&gt;
&amp;nbsp; &amp;nbsp; Televisor *t;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; t = &amp;amp;tele;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; cout &amp;lt;&amp;lt; &quot;Pulgadas &quot; &amp;lt;&amp;lt; t-&amp;gt;getPulgadas();&lt;br /&gt;
&amp;nbsp; &amp;nbsp; return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&quot;Televisor *t&quot; define un puntero para apuntar a objetos de la clase Televisor.&lt;br /&gt;
&quot;t = &amp;amp;tele&quot; asigna la dirección del objeto tele al puntero t.&lt;br /&gt;
&quot;t-&amp;gt;getPulgadas()&quot; ejecuta la función miembro del objeto tele.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;&lt;span style=&quot;font-size: large;&quot;&gt;Clases, estructuras y uniones&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
Las clases y las estructuras tienen prácticamente las mismas capacidades.&lt;br /&gt;
En C++ las estructuras pueden incluir funciones miembro, incluyendo funciones constructoras y destructoras.&lt;br /&gt;
La única diferencia es que por defecto los miembros de una clase son privados y los miembros de una estructura son públicos.&lt;br /&gt;
&lt;br /&gt;
struct nombre_estructura{&lt;br /&gt;
...miembros públicos...&lt;br /&gt;
private:&lt;br /&gt;
...miembros privados...&lt;br /&gt;
}lista_objetos;&lt;br /&gt;
&lt;br /&gt;
Tanto &lt;b&gt;struct &lt;/b&gt;como &lt;b&gt;class&lt;/b&gt; crean nuevos tipos de clase.&lt;br /&gt;
Al poseer las mismas capacidades, es una cuestión de preferencias decidir emplear struct o class. Pero lo más común es emplear struct para objetos que no tienen funciones miembro.&lt;br /&gt;
&lt;br /&gt;
Las uniones en C++ también definen tipos de clase y también pueden contener funciones miembro.&lt;br /&gt;
Las uniones son como estructuras, por defecto tienen todos los miembros públicos hasta que se usa el especificador private. Su característica principal es que todos los miembros comparten la misma posición de memoria (como en C).&lt;br /&gt;
La capacidad de las uniones para enlazar código y datos permite crear tipos de clases en los que todos los datos usan una posición compartida. Esto no puede hacerse usando una clase.&lt;br /&gt;
Las uniones no pueden heredar de otra clase ni ser clases base. Tampoco pueden tener ningún miembro static, ni contener objetos que tengan un constructor o destructor. Pero las uniones sí pueden tener constructor y destructor.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;&lt;span style=&quot;font-size: large;&quot;&gt;Funciones insertadas&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
C++ permite definir funciones que realmente no son llamadas sinó que son insertadas en el código en el momento de la llamada. Como no tienen asociado el mecanismo de llamada y vuelta de la función, pueden ejecutarse más rápidamente que las funciones normales.&lt;br /&gt;
La desventaja es que si son demasiado largas y se las llama muy a menudo, el programa aumentará su longitud.&lt;br /&gt;
Una función inline se debe definir antes de ser llamada.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;inline &lt;/b&gt;tipo_retorno nombre_funcion(parámetros){...}&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;inline&lt;/b&gt; es una solicitud no una obligación para el compilador. Todo depende de las restricciones del compilador en concreto, si no la hace insertada, la compilará como una función normal.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;&lt;span style=&quot;font-size: large;&quot;&gt;Inserción automática&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;
En la declaración de una función miembro se puede incluir su definición si es suficientemente corta. Esto provoca que la función se convierta automáticamente en una función insertada, si es posible. La palabra clave inline, en este caso no es necesaria.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;&lt;span style=&quot;font-size: large;&quot;&gt;Asignación de objetos&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;
Cuando asignamos un objeto a otro, se hace una copia a nivel de bits de todos los miembros. Los contenidos de los datos del objeto asignado se copian en los miembros equivalentes.&lt;br /&gt;
La asignación hace que los dos objetos sean idénticos, pero están realmente separados.&lt;br /&gt;
&lt;br /&gt;
a = b;&lt;br /&gt;
&lt;br /&gt;
Copia los valores de los datos miembros de b en el objeto a. Si posteriormente modificamos a o b, son completamente independientes.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;&lt;span style=&quot;font-size: large;&quot;&gt;Paso de objetos a funciones&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
Por omisión todos los objetos se pasan por valor a una función. Esto significa que se hace una copia idéntica del objeto y es la copia la que es usada por la función. Los cambios que se hagan dentro de la función en el objeto no afectan al objeto pasado como parámetro.&lt;br /&gt;
Cuando se hace una copia de un objeto para usarla en una llamada a función, no se llama a la función constructora. Sin embargo, cuando la función finaliza y la copia se destruye, se llama a la función destructora. Ya que los objetos pueden haber asignado memoria que debe ser liberada. Esto puede ser fuente de problemas. Ya que, si un objeto pasado como parámetro asigna memoria dinámica y al acabar la función se llama a su función destructora y esa memoria se libera, el objeto original quedará dañado y sin uso efectivo.&lt;br /&gt;
Hay que asegurarse de que las funciones destructoras de las copias de objetos pasados por valor, no provoquen efectos laterales que inutilicen los objetos originales.&lt;br /&gt;
&lt;br /&gt;
Para evitar esto es mejor pasar la dirección de los objetos y no los objetos en sí. Al pasar una dirección, no se crea un nuevo objeto y no se llama a ningún destructor cuando se sale de la función.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;&lt;span style=&quot;font-size: large;&quot;&gt;Objetos devueltos por funciones&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
Cuando un objeto es devuelto por una función, se crea automáticamente un objeto temporal que guarda el valor devuelto. Después de devolver el valor, este objeto se destruye. La destrucción de este objeto temporal puede causar efectos laterales inesperados en algunas situaciones.&lt;br /&gt;
Si el objeto devuelto por una función tiene una función destructora que libera dinámicamente memoria asignada, esa memoria puede quedar liberada incluso aunque el objeto al que se asigna el valor devuelto lo siga utilizando.&lt;br /&gt;
Lo principal es entender que cuando un objeto es devuelto desde una función, el objeto temporal usado para hacer efectivo el retorno habrá llamado a su función destructora.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;&lt;span style=&quot;font-size: large;&quot;&gt;Introducción a las funciones amigas&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
Una función amiga no es un miembro de una clase pero tiene acceso a sus elementos privados.&lt;br /&gt;
Las funciones amigas principalmente son útiles para la sobrecarga de operadores y la creación de funciones de E/S o para que una función tenga acceso a los miembros privados de dos o más clases diferentes.&lt;br /&gt;
&lt;br /&gt;
class A{&lt;br /&gt;
&amp;nbsp; &amp;nbsp; int n;&lt;br /&gt;
public:&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;b&gt;friend &lt;/b&gt;int nombre_función ( A obj );&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
int nombre_función (&amp;nbsp;A obj&amp;nbsp;){&lt;br /&gt;
&amp;nbsp; &amp;nbsp; obj.n++;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; return obj.n;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
Las funciones amigas no son funciones miembro y no se puede acceder a ellas mediante un nombre de objeto. La llamada a la función se realiza como una llamada normal.&lt;br /&gt;
Las funciones amigas no se heredan. Si una clase base tiene una función amiga, esta función no es amiga de las clases derivadas de esta clase base.&lt;br /&gt;
Una función amiga puede ser amiga de más de una clase.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;&lt;span style=&quot;font-size: large;&quot;&gt;Referencias anticipadas&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;
C++ permite hacer referencias anticipadas para poder emplear nombres de clases que todavía no han sido declarados. Para hacer esto, debemos advertir al compilador antes de realizar la referencia, que el nombre en concreto que vamos a usar pertenecerá a una clase. Lo hacemos de la siguiente forma:&lt;br /&gt;
&lt;br /&gt;
class nombre_clase_A;&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;&lt;span style=&quot;font-size: large;&quot;&gt;Función miembro de una clase y amiga de otra clase&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;








&lt;br /&gt;
&lt;div class=&quot;p1&quot;&gt;
class Cliente;&lt;/div&gt;
&lt;div class=&quot;p2&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
class Vendedor : public Persona{&lt;/div&gt;
&lt;div class=&quot;p3&quot;&gt;
&lt;span class=&quot;Apple-tab-span&quot;&gt;&lt;/span&gt;&amp;nbsp; &amp;nbsp; int id_vendedor;&lt;/div&gt;
&lt;div class=&quot;p3&quot;&gt;
&lt;span class=&quot;Apple-tab-span&quot;&gt;&lt;/span&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;float salario;&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
public:&lt;/div&gt;
&lt;div class=&quot;p3&quot;&gt;
&lt;span class=&quot;Apple-tab-span&quot;&gt;&lt;/span&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;int numero_ventas(Cliente c);&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
};&lt;/div&gt;
&lt;div class=&quot;p2&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
class Cliente : public Persona{&lt;/div&gt;
&lt;div class=&quot;p3&quot;&gt;
&lt;span class=&quot;Apple-tab-span&quot;&gt;&lt;/span&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;int id_cliente;&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
public:&lt;/div&gt;
&lt;div class=&quot;p3&quot;&gt;
&lt;span class=&quot;Apple-tab-span&quot;&gt;&lt;/span&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;friend int Vendedor::numero_ventas(Cliente c);&lt;span class=&quot;Apple-tab-span&quot;&gt; &lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
};&lt;/div&gt;
&lt;div class=&quot;p2&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
int Vendedor::numero_ventas(Cliente c){...}&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Hasta aquí la primera parte de los apuntes sobre C++!&lt;br /&gt;
Un saludo a todos!!</content><link rel='replies' type='application/atom+xml' href='http://iwokloco-appweb.blogspot.com/feeds/2991343491788194136/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://iwokloco-appweb.blogspot.com/2014/09/apuntes-de-c.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5314052884467946568/posts/default/2991343491788194136'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5314052884467946568/posts/default/2991343491788194136'/><link rel='alternate' type='text/html' href='http://iwokloco-appweb.blogspot.com/2014/09/apuntes-de-c.html' title='Apuntes de C++'/><author><name>iwokloco</name><uri>http://www.blogger.com/profile/15790878541512725162</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5314052884467946568.post-6934290116938065515</id><published>2014-04-11T00:48:00.001-07:00</published><updated>2014-04-11T00:48:15.976-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Ubuntu"/><title type='text'>Ubuntu: crear alias para comandos y mantener los cambios en ~/.bash</title><content type='html'>Buenas a todos!&lt;br /&gt;
Normalmente cuando empleamos mucho el shell de ubuntu, tenemos que repetir muchas veces los mismos comandos, esto puede acabar ralentizando nuestro trabajo.&lt;br /&gt;
Por ejemplo, supongamos que estamos &amp;nbsp;editando archivos de configuración de un servidor nginx y constantemente tenemos que estar escribiendo:&lt;br /&gt;
&lt;code&gt;nano /etc/nginx/sites-available/default&lt;/code&gt;&lt;br /&gt;
&lt;br /&gt;
Sería mucho más cómodo poder poner en cualquier momento, nginxconf y que se ejecutara esa misma instrucción para editar el archivo. Podemos conseguir esto empleando la instrucción alias, que asigna a un nombre de variable una cadena que define una instrucción:&lt;br /&gt;
&lt;br /&gt;
&lt;code&gt;root@ubuntu:/# alias nginxconf=&#39;nano /etc/nginx/sites-available/default&#39;&lt;/code&gt;&lt;br /&gt;
&lt;br /&gt;
Ahora si escribís nginxconf, en la consola directamente se ejecutará la instrucción que habéis indicado.&lt;br /&gt;
Pero si reiniciais el equipo, el alias desaparecerá.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;&lt;span style=&quot;color: #073763; font-size: large;&quot;&gt;Modificar el archivo ~/.bash para mantener los alias&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
Para que los alias que necesiteis sean permanentes y no tengáis que crearlos cada vez que reiniciais el equipo, debéis editar el archivo ~/.bash.&lt;br /&gt;
Abrir el archivo bashrc:&lt;br /&gt;
&lt;code&gt;sudo nano ~/.bashrc&lt;/code&gt;&lt;br /&gt;
&lt;br /&gt;
Al final del archivo debéis escribir la instrucción que crea el alias:&lt;br /&gt;
&lt;code&gt;alias nginxconf=&#39;nano /etc/nginx/sites-available/default&#39;&lt;/code&gt;&lt;br /&gt;
&lt;br /&gt;
Guardáis los cambios (control+X y Yes), y cuando el equipo reinicie, los cambios se habrán aplicado.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;&lt;span style=&quot;color: #073763; font-size: large;&quot;&gt;Aplicar los cambios del archivo ~/.bash sin reiniciar el equipo&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
Para no tener que reiniciar, y que los alias que hayáis introducido ya estén disponibles, podéis ejecutar la siguiente instrucción:&lt;br /&gt;
&lt;br /&gt;
&lt;code&gt;sudo source ~/.bashrc&lt;/code&gt;&lt;br /&gt;
&lt;br /&gt;
Y con esto ya está todo!&lt;br /&gt;
Un saludo!&lt;br /&gt;
&lt;br /&gt;</content><link rel='replies' type='application/atom+xml' href='http://iwokloco-appweb.blogspot.com/feeds/6934290116938065515/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://iwokloco-appweb.blogspot.com/2014/04/ubuntu-crear-alias-para-comandos-y.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5314052884467946568/posts/default/6934290116938065515'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5314052884467946568/posts/default/6934290116938065515'/><link rel='alternate' type='text/html' href='http://iwokloco-appweb.blogspot.com/2014/04/ubuntu-crear-alias-para-comandos-y.html' title='Ubuntu: crear alias para comandos y mantener los cambios en ~/.bash'/><author><name>iwokloco</name><uri>http://www.blogger.com/profile/15790878541512725162</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5314052884467946568.post-7114393234002919652</id><published>2014-04-10T04:28:00.001-07:00</published><updated>2014-04-10T04:28:11.846-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="MongoDB"/><title type='text'>MongoDB: borrar una base de datos en MongoDB</title><content type='html'>Buenas a todos!&lt;br /&gt;
Para borrar una base de datos en MongoDB desde la línea de comandos, debemos seleccionar la base de datos que queremos borrar y emplear la instrucción dropDatabase():&lt;br /&gt;
Por ejemplo vamos a borrar la base de datos mydb:&lt;br /&gt;
&lt;br /&gt;
&lt;code&gt;root@ubuntu:/# mongo&lt;br /&gt;
&lt;/code&gt;&lt;br /&gt;
&lt;div&gt;
&lt;div&gt;
&lt;code&gt;&amp;gt; show dbs&lt;/code&gt;&lt;/div&gt;
&lt;div&gt;
&lt;code&gt;db0 &amp;nbsp; &amp;nbsp; 0.203125GB&lt;/code&gt;&lt;/div&gt;
&lt;div&gt;
&lt;code&gt;db_world &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;0.203125GB&lt;/code&gt;&lt;/div&gt;
&lt;div&gt;
&lt;code&gt;mydb &amp;nbsp; &amp;nbsp;0.203125GB&lt;/code&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;
show dbs, nos muestra las bases de datos activas de MongoDB.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;code&gt;&amp;gt; use mydb&lt;/code&gt;&lt;br /&gt;
&lt;code&gt;switched to db mydb&lt;/code&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Seleccionamos como base de datos actual mydb.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;code&gt;&amp;gt; db.dropDatabase()&lt;/code&gt;&lt;/div&gt;
&lt;div&gt;
&lt;code&gt;{ &quot;dropped&quot; : &quot;mydb&quot;, &quot;ok&quot; : 1 }&lt;/code&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Borramos la base de datos mydb y ahora mostramos de nuevo las bases de datos:&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;code&gt;&amp;gt; show dbs&lt;/code&gt;&lt;/div&gt;
&lt;div&gt;
&lt;code&gt;db0 &amp;nbsp; &amp;nbsp; 0.203125GB&lt;/code&gt;&lt;/div&gt;
&lt;div&gt;
&lt;code&gt;db_world &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;0.203125GB&lt;/code&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Como podéis ver ya no se muestra mydb en el listado de bases de datos.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Y eso es todo! Un saludo a todos!&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://iwokloco-appweb.blogspot.com/feeds/7114393234002919652/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://iwokloco-appweb.blogspot.com/2014/04/mongodb-borrar-una-base-de-datos-en.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5314052884467946568/posts/default/7114393234002919652'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5314052884467946568/posts/default/7114393234002919652'/><link rel='alternate' type='text/html' href='http://iwokloco-appweb.blogspot.com/2014/04/mongodb-borrar-una-base-de-datos-en.html' title='MongoDB: borrar una base de datos en MongoDB'/><author><name>iwokloco</name><uri>http://www.blogger.com/profile/15790878541512725162</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5314052884467946568.post-8474389740491786242</id><published>2014-04-10T03:20:00.004-07:00</published><updated>2014-04-10T03:20:55.212-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="MongoDB"/><title type='text'>MongoDB: crear una base de datos en MongoDB</title><content type='html'>Buenas a todos!&lt;br /&gt;
&lt;br /&gt;
Crear una base de datos en MongoDB es tan simple como abrir el cliente del servidor en el shell, y usar la instrucción use y el nombre de la base de datos.&lt;br /&gt;
&lt;br /&gt;
root@ubuntu:/# mongo&lt;br /&gt;
&amp;gt; &lt;b&gt;use db_nueva&lt;/b&gt;&lt;br /&gt;
switched to db db_nueva&lt;br /&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
Esta instrucción comprueba si ya existe la base de datos, y entonces asigna su referencia a la variable db, para que podamos consultar, y realizar otras operaciones sobre esta base de datos en concreto. En caso de que no exista, crea la base de datos.&lt;br /&gt;
&lt;br /&gt;
Si cerramos el cliente en este punto, la base de datos desaparecerá ya que no contiene ninguna collection, que son los equivalentes a las tablas de SQL.&lt;br /&gt;
De hecho, si ejecutamos el comando que muestra las bases de datos &quot;show dbs&quot;, no mostrará nuestra base de datos.&lt;br /&gt;
&lt;br /&gt;
Basta con que creemos una collection, en este caso products.&lt;br /&gt;
&amp;gt; db.createCollection(&quot;products&quot;)&lt;br /&gt;
{ &quot;ok&quot; : 1 }&lt;br /&gt;
&lt;br /&gt;
Una vez hecho esto la base de datos ya se ha creado y podemos verla en la lista de bases de datos:&lt;br /&gt;
&amp;gt; show dbs&lt;br /&gt;
db_nueva &amp;nbsp; &amp;nbsp; 0.203125GB&lt;br /&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Para un acercamiento mayor, podéis visitar el post &lt;a href=&quot;http://iwokloco-appweb.blogspot.com.es/2014/04/hello-world-mongodb-introduccion-mongodb.html&quot;&gt;Hello World MongoDB, introducción a MongoDB&lt;/a&gt;!&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Un saludete!&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://iwokloco-appweb.blogspot.com/feeds/8474389740491786242/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://iwokloco-appweb.blogspot.com/2014/04/mongodb-crear-una-base-de-datos-en.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5314052884467946568/posts/default/8474389740491786242'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5314052884467946568/posts/default/8474389740491786242'/><link rel='alternate' type='text/html' href='http://iwokloco-appweb.blogspot.com/2014/04/mongodb-crear-una-base-de-datos-en.html' title='MongoDB: crear una base de datos en MongoDB'/><author><name>iwokloco</name><uri>http://www.blogger.com/profile/15790878541512725162</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5314052884467946568.post-4956040984782140830</id><published>2014-04-10T03:03:00.003-07:00</published><updated>2014-04-10T03:03:51.859-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="MongoDB"/><title type='text'>Hello World MongoDB, introducción a MongoDB</title><content type='html'>Buenas a todos!&lt;br /&gt;
&lt;br /&gt;
Voy a hacer una pequeña introducción o Hello world en MongoDB!&lt;br /&gt;
&lt;br /&gt;
A diferencia de las bases de datos relacionales típicas, como Oracle o MySQL, que emplean el lenguaje de declarativo SQL, MongoDB emplea para generar las consultas, inserciones, actualizaciones y eliminaciones, JavaScript!&lt;br /&gt;
&lt;br /&gt;
Además los resultados obtenidos por las consultas están en formato JSON, lo que es perfecto cuando trabajamos con aplicaciones web.&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;color: #0b5394; font-size: large;&quot;&gt;&lt;b&gt;Equivalencias entre conceptos de SQL y conceptos de MongoDB&lt;/b&gt;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
En MongoDB no tenemos tablas, trabajamos con collections.&lt;br /&gt;
&lt;br /&gt;
Y lo que equivaldría a una fila o row de una tabla en SQL, en MongoDB es un document o BSON document. Los BSON documents son los que almacenan los  objetos json en formato binario.&lt;br /&gt;
&lt;br /&gt;
Los objetos json contienen campos o fields, no columnas como las tablas SQL.&lt;br /&gt;
&lt;br /&gt;
De todas formas ambos sistemas de base de datos emplean las primary keys, para definir los campos que identifican de forma única una fila o un document (objeto json).&lt;br /&gt;
&lt;br /&gt;
Mientras que en SQL hay que especificar la creación de todas las columnas de una tabla, MongoDB de forma automática crea un campo o field llamado &lt;span style=&quot;color: blue;&quot;&gt;_id&lt;/span&gt; que contiene la primary key, es un comportamiento por defecto muy útil.&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;color: #0b5394; font-size: large;&quot;&gt;&lt;b&gt;Hello world MongoDB&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
Muy bien! Vamos a crear una pequeña base de datos a modo de Hello world para MongoDB.&lt;br /&gt;
&lt;br /&gt;
La base de datos se llamará &#39;db_world&#39; y contendrá paises del mundo, un listado con los idiomas que se hablan y las capitales.&lt;br /&gt;
&lt;br /&gt;
Una vez instalado MongoDB, vamos a ejecutar en el shell de linux, la instrucción &quot;mongo&quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Crear la base de datos&lt;/b&gt;&lt;br /&gt;
&lt;code&gt;&amp;gt; use db_world&lt;/code&gt;
Si no existe, la crea y asigna a la variable db una referencia a las instancias de db_world.&lt;br /&gt;
Si ya existe, asigna a la variable db una referencia a las instancias de db_world.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Crear una collection e insertar un objeto&lt;/b&gt;&lt;br /&gt;
&lt;code&gt;&amp;gt; db.world.insert({country:&quot;Spain&quot;, capital:&quot;Madrid&quot;, language:[&quot;es&quot;,&quot;ca&quot;,&quot;eu&quot;,&quot;gl&quot;]})&lt;/code&gt;
Al realizar el insert se crea automáticamente la collection world, y directamente se inserta el objeto json que contiene los datos del país.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Consultar los datos de una collection&lt;/b&gt;&lt;br /&gt;
&lt;code&gt;&amp;gt; db.world.find()&lt;/code&gt;
Genera la salida:&lt;br /&gt;
&lt;code&gt;{ &quot;_id&quot; : ObjectId(&quot;534665c91895da39bc16ff56&quot;), &quot;country&quot; : &quot;Spain&quot;, &quot;capital&quot; : &quot;Madrid&quot;, &quot;language&quot; : [ &quot;es&quot;, &quot;ca&quot;, &quot;eu&quot;, &quot;gl&quot; ] }&lt;/code&gt;
&lt;br /&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Como podéis ver automáticamente ha añadido el campo primary key _id, y la salida es el objeto json.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;b&gt;Ahora vamos a añadir otro país:&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;
&lt;code&gt;&amp;gt; db.world.insert({country:&quot;Switzerland&quot;, capital:&quot;Berna&quot;, language:[&quot;fr&quot;,&quot;de&quot;,&quot;it&quot;]})&lt;/code&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Si volvemos a realizar el find sobre la collection world, generará la siguiente salida:&lt;/div&gt;
&lt;div&gt;
&lt;code&gt;&amp;gt; db.world.find()&lt;/code&gt;
Genera la salida:&lt;br /&gt;
&lt;code&gt;{ &quot;_id&quot; : ObjectId(&quot;534665c91895da39bc16ff56&quot;), &quot;country&quot; : &quot;Spain&quot;, &quot;capital&quot; : &quot;Madrid&quot;, &quot;language&quot; : [ &quot;es&quot;, &quot;ca&quot;, &quot;eu&quot;, &quot;gl&quot; ] }&lt;br /&gt;
{ &quot;_id&quot; : ObjectId(&quot;5346665762bac1c0ff258610&quot;), &quot;country&quot; : &quot;Switzerland&quot;, &quot;capital&quot; : &quot;Berna&quot;, &quot;language&quot; : [ &quot;fr&quot;, &quot;de&quot;, &quot;it&quot; ] }&lt;/code&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
find() también nos permite consultar los objetos que contienen un valor específico.&lt;/div&gt;
&lt;div&gt;
Por ejemplo, supongamos que queremos ver el país cuya capital es Berna:&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;code&gt;&amp;gt; db.world.find({capital:&quot;Berna&quot;})&lt;/code&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
Respuesta:&lt;/div&gt;
&lt;div&gt;
&lt;code&gt;{ &quot;_id&quot; : ObjectId(&quot;5346665762bac1c0ff258610&quot;), &quot;country&quot; : &quot;Switzerland&quot;, &quot;capital&quot; : &quot;Berna&quot;, &quot;language&quot; : [ &quot;fr&quot;, &quot;de&quot;, &quot;it&quot; ] }&lt;/code&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
O algo más complejo, supongamos que queremos ver los países donde se habla francés:&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;code&gt;&amp;gt; db.world.find({language:{$in:[&quot;fr&quot;]}})&lt;/code&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&amp;nbsp;Respuesta:&lt;/div&gt;
&lt;div&gt;
&lt;code&gt;{ &quot;_id&quot; : ObjectId(&quot;5346665762bac1c0ff258610&quot;), &quot;country&quot; : &quot;Switzerland&quot;, &quot;capital&quot; : &quot;Berna&quot;, &quot;language&quot; : [ &quot;fr&quot;, &quot;de&quot;, &quot;it&quot; ] }&lt;/code&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;
Cómo podéis ver, en ningún momento he tenido que declarar la estructura de los objetos que debe contener la collection world, eso es debido a que al igual que los objetos de javascript, las collections de MongoDB no obligan a cumplir una estructura determinada, de hecho su estructura puede variar dinámicamente, añadiendo o quitando campos, mediante el uso de update().&lt;br /&gt;
&lt;br /&gt;
Hasta aquí mi introducción a MongoDB!&lt;br /&gt;
Espero que haya sido fácil de entender y que os anime a utilizarlo!&lt;br /&gt;
&lt;br /&gt;
Un saludo a todos!!&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://iwokloco-appweb.blogspot.com/feeds/4956040984782140830/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://iwokloco-appweb.blogspot.com/2014/04/hello-world-mongodb-introduccion-mongodb.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5314052884467946568/posts/default/4956040984782140830'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5314052884467946568/posts/default/4956040984782140830'/><link rel='alternate' type='text/html' href='http://iwokloco-appweb.blogspot.com/2014/04/hello-world-mongodb-introduccion-mongodb.html' title='Hello World MongoDB, introducción a MongoDB'/><author><name>iwokloco</name><uri>http://www.blogger.com/profile/15790878541512725162</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5314052884467946568.post-3692361765083370683</id><published>2014-04-01T07:20:00.002-07:00</published><updated>2014-04-01T07:20:35.775-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Android"/><title type='text'>Android: activar la vibración del móvil</title><content type='html'>Buenas a todos!!&lt;br /&gt;
&lt;br /&gt;
Para que nuestras aplicaciones puedan hacer uso de la vibración del móvil es necesario que incluyamos en el AndroidManifest.xml el permiso VIBRATE:&lt;br /&gt;
&lt;br /&gt;
&lt;code&gt;&amp;lt;uses-permission android:name=&quot;android.permission.VIBRATE&quot;/&amp;gt;&lt;/code&gt;
&lt;br /&gt;
&lt;code&gt;&lt;br /&gt;&lt;/code&gt;
Una vez hecho esto, desde cualquier punto de nuestro código podemos crear una instancia de la clase Vibrator:&lt;br /&gt;
&lt;br /&gt;
&lt;code&gt;Vibrator v = (vibrator) getSystemService(Context.VIBRATOR_SERVICE);&lt;/code&gt;
&lt;br /&gt;
&lt;code&gt;&lt;br /&gt;&lt;/code&gt;
Y para hacer que vibre, hacemos una llamada al método vibrate indicando los milisegundos que queremos que el móvil se mantenga vibrando:&lt;br /&gt;
&lt;br /&gt;
&lt;code&gt;v.vibrate(500);&lt;/code&gt;
&lt;br /&gt;
&lt;code&gt;&lt;br /&gt;&lt;/code&gt;
Con esto hacemos que el móvil vibre 500 milisegundos o lo que es lo mismo, medio segundo.&lt;br /&gt;
&lt;br /&gt;
Y eso es todo! Un saludo!</content><link rel='replies' type='application/atom+xml' href='http://iwokloco-appweb.blogspot.com/feeds/3692361765083370683/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://iwokloco-appweb.blogspot.com/2014/04/android-activar-la-vibracion-del-movil.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5314052884467946568/posts/default/3692361765083370683'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5314052884467946568/posts/default/3692361765083370683'/><link rel='alternate' type='text/html' href='http://iwokloco-appweb.blogspot.com/2014/04/android-activar-la-vibracion-del-movil.html' title='Android: activar la vibración del móvil'/><author><name>iwokloco</name><uri>http://www.blogger.com/profile/15790878541512725162</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5314052884467946568.post-8595799890867829158</id><published>2014-04-01T07:12:00.003-07:00</published><updated>2014-04-01T07:12:38.327-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="MySQL"/><title type='text'>MySQL: instalar MySQL en Ubuntu Server</title><content type='html'>Buenas a todos!&lt;br /&gt;
Para instalar MySQL en Ubuntu desde la consola debemos ejecutar la siguiente instrucción:&lt;br /&gt;
&lt;br /&gt;
&lt;code&gt;sudo apt-get install mysql-server&lt;/code&gt;
&lt;br /&gt;
&lt;code&gt;&lt;br /&gt;&lt;/code&gt;
Una vez hecho esto, el servidor de base de datos MySQL ya está en funcionamiento, ahora para que sea capaz de aceptar conexiones externas, debemos modificar el archivo de configuración que se encuentra en /etc/mysql/my.cnf&lt;br /&gt;
&lt;br /&gt;
&lt;code&gt;nano /etc/mysql/my.cnf&lt;/code&gt;
&lt;br /&gt;
&lt;code&gt;&lt;br /&gt;&lt;/code&gt;
Y en el apartado &lt;b&gt;bind-address&lt;/b&gt;, sustituir la ip que encontremos, por la ip de nuestro servidor.&lt;br /&gt;
&lt;code&gt;bind-address = &lt;i&gt;120.200.10.130&lt;/i&gt;&lt;/code&gt;
&lt;br /&gt;
La ip de nuestro servidor la podemos ver gracias al comando ifconfig, en el apartado &lt;b&gt;inet&lt;/b&gt;.&lt;br /&gt;
&lt;br /&gt;
Una vez hecho esto reiniciamos el servidor MySQL con la siguiente instrucción:&lt;br /&gt;
&lt;br /&gt;
&lt;code&gt;sudo /etc/init.d/mysql restart&lt;/code&gt;
&lt;br /&gt;
&lt;code&gt;&lt;br /&gt;&lt;/code&gt;
Y eso es todo! El servidor MySQL ya está instalado, ahora lo más conveniente es que sean añadidos usuarios para poder realizar conexiones a la base de datos.&lt;br /&gt;
Para saber como añadir usuarios, podéis consultar el siguiente post:&lt;br /&gt;
&lt;a href=&quot;http://iwokloco-appweb.blogspot.com.es/2014/04/mysql-crear-un-usuario-con-todos-los.html&quot;&gt;http://iwokloco-appweb.blogspot.com.es/2014/04/mysql-crear-un-usuario-con-todos-los.html&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
Un saludo a todos!</content><link rel='replies' type='application/atom+xml' href='http://iwokloco-appweb.blogspot.com/feeds/8595799890867829158/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://iwokloco-appweb.blogspot.com/2014/04/mysql-instalar-mysql-en-ubuntu-server.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5314052884467946568/posts/default/8595799890867829158'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5314052884467946568/posts/default/8595799890867829158'/><link rel='alternate' type='text/html' href='http://iwokloco-appweb.blogspot.com/2014/04/mysql-instalar-mysql-en-ubuntu-server.html' title='MySQL: instalar MySQL en Ubuntu Server'/><author><name>iwokloco</name><uri>http://www.blogger.com/profile/15790878541512725162</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5314052884467946568.post-845452473819499154</id><published>2014-04-01T07:01:00.001-07:00</published><updated>2014-04-01T07:01:08.199-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Ubuntu"/><title type='text'>Ubuntu: crear el password para la cuenta root</title><content type='html'>Buenas a todos!&lt;br /&gt;
Es muy importante que tengamos activo el superusuario root, para poder realizar todos los cambios que queramos en Ubuntu, instalar software, crear usuarios, asignar privilegios, etc.&lt;br /&gt;
&lt;br /&gt;
&lt;code&gt;sudo passwd root&lt;/code&gt;
&lt;br /&gt;
&lt;code&gt;&lt;br /&gt;&lt;/code&gt;
Una vez indiquemos el password ya podemos trabajar como root, solamente tenemos que poner la instrucción &quot;su&quot;, nos pedirá la contraseña introducida, y ya tenemos activo el superusuario para realizar todos los cambios e instalaciones que necesitemos!&lt;br /&gt;
&lt;code&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;/code&gt;
&lt;code&gt;&lt;i&gt;usuario@ubuntu:/$&lt;/i&gt; &lt;b&gt;su&lt;/b&gt;&lt;br /&gt;
Password:&lt;br /&gt;
&lt;i&gt;root@ubuntu:/#&lt;/i&gt;&lt;/code&gt;
&lt;br /&gt;
&lt;code&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;/code&gt;
Un saludo!</content><link rel='replies' type='application/atom+xml' href='http://iwokloco-appweb.blogspot.com/feeds/845452473819499154/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://iwokloco-appweb.blogspot.com/2014/04/ubuntu-crear-el-password-para-la-cuenta.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5314052884467946568/posts/default/845452473819499154'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5314052884467946568/posts/default/845452473819499154'/><link rel='alternate' type='text/html' href='http://iwokloco-appweb.blogspot.com/2014/04/ubuntu-crear-el-password-para-la-cuenta.html' title='Ubuntu: crear el password para la cuenta root'/><author><name>iwokloco</name><uri>http://www.blogger.com/profile/15790878541512725162</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5314052884467946568.post-1635168220225413633</id><published>2014-04-01T06:53:00.001-07:00</published><updated>2014-04-01T06:53:36.029-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="openssh-server"/><category scheme="http://www.blogger.com/atom/ns#" term="PuTTy"/><category scheme="http://www.blogger.com/atom/ns#" term="ssh"/><category scheme="http://www.blogger.com/atom/ns#" term="Ubuntu"/><title type='text'>Ubuntu: configurar cliente ssh para conectarnos con Putty</title><content type='html'>Buenas a todos!&lt;br /&gt;
Para conectarnos y administrar de forma remota y segura a nuestros servidores Ubuntu empleamos el protocolo SSH, este protocolo encripta la información que transmitimos durante la comunicación.&lt;br /&gt;
Para poder emplear el protocolo ssh, es necesario que el servidor ubuntu, tenga instalado un servidor ssh.&lt;br /&gt;
En la consola de ubuntu instalamos &lt;b&gt;openssh-server&lt;/b&gt;:&lt;br /&gt;
&lt;code&gt;&amp;gt; sudo apt-get install openssh-server&lt;/code&gt;
&lt;br /&gt;
&lt;code&gt;&lt;br /&gt;&lt;/code&gt;
Una vez instalado, el servicio ssh estará activado y ya podremos conectarnos remotamente.&lt;br /&gt;
Para ver la ip de nuestro servidor podemos emplear el comando.&lt;br /&gt;
&lt;code&gt;&amp;gt; ifconfig&lt;/code&gt;&lt;br /&gt;
&lt;code&gt;&lt;br /&gt;&lt;/code&gt;
El valor que nos interesa es la ip &lt;b&gt;inet&lt;/b&gt;.&lt;br /&gt;
&lt;br /&gt;
Para conectarnos desde otro ordenador, en este caso vamos a emplear un cliente ssh &amp;nbsp;para windows llamado &lt;b&gt;PuTTy&lt;/b&gt;. &amp;nbsp;Una vez lo tengáis descargado, sólamente tenéis que ejecutarlo (no requiere instalación) y indicar la ip de vuestro servidor remoto.&lt;br /&gt;
&lt;br /&gt;
El username y password para administrar el equipo, son los de cualquier usuario que tengáis en vuestro sistema Ubuntu.&lt;br /&gt;
&lt;br /&gt;
Un saludo a todos!&lt;br /&gt;
&lt;br /&gt;</content><link rel='replies' type='application/atom+xml' href='http://iwokloco-appweb.blogspot.com/feeds/1635168220225413633/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://iwokloco-appweb.blogspot.com/2014/04/ubuntu-configurar-cliente-ssh-para.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5314052884467946568/posts/default/1635168220225413633'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5314052884467946568/posts/default/1635168220225413633'/><link rel='alternate' type='text/html' href='http://iwokloco-appweb.blogspot.com/2014/04/ubuntu-configurar-cliente-ssh-para.html' title='Ubuntu: configurar cliente ssh para conectarnos con Putty'/><author><name>iwokloco</name><uri>http://www.blogger.com/profile/15790878541512725162</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5314052884467946568.post-7159605681114652950</id><published>2014-04-01T06:40:00.002-07:00</published><updated>2014-04-01T06:40:23.104-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Ubuntu"/><title type='text'>Ubuntu: configurar el teclado español por la consola</title><content type='html'>Buenas a todos!&lt;br /&gt;
En muchas ocasiones, cuando trabajamos sobretodo con ubuntu server instalado en máquinas virtuales VMWare, nos podemos encontrar con que las teclas de nuestro teclado no se corresponden con los carácteres que se muestran. Esto suele deberse a que por defecto tiene configurado el mapeo de teclados en inglés, donde no hay ñ.&lt;br /&gt;
Para poder usar nuestro teclado español sin problemas, sólo tenemos que ejecutar la siguiente instrucción:&lt;br /&gt;
&lt;br /&gt;
&lt;code&gt;sudo loadkeys es&lt;br /&gt;&lt;/code&gt;
&lt;br /&gt;
Y con esta simple instrucción se soluciona el problema!&lt;br /&gt;
Un saludo a todos!</content><link rel='replies' type='application/atom+xml' href='http://iwokloco-appweb.blogspot.com/feeds/7159605681114652950/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://iwokloco-appweb.blogspot.com/2014/04/ubuntu-configurar-el-teclado-espanol.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5314052884467946568/posts/default/7159605681114652950'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5314052884467946568/posts/default/7159605681114652950'/><link rel='alternate' type='text/html' href='http://iwokloco-appweb.blogspot.com/2014/04/ubuntu-configurar-el-teclado-espanol.html' title='Ubuntu: configurar el teclado español por la consola'/><author><name>iwokloco</name><uri>http://www.blogger.com/profile/15790878541512725162</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5314052884467946568.post-3771728108383569504</id><published>2014-04-01T06:31:00.002-07:00</published><updated>2014-04-01T06:31:27.389-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="MySQL"/><title type='text'>MySQL: crear un usuario con todos los privilegios en MySQL</title><content type='html'>Buenas a todos!&lt;br /&gt;
Crear un usuario administrador con todos los privilegios en MySQL desde la consola puede seros muy útil. Con este usuario podréis conectaros desde el MySQL Workbench, o directamente para trabajar a través de la consola, o simplemente para conectaros desde los servidores web.&lt;br /&gt;
&lt;br /&gt;
&lt;code&gt;
mysql&amp;gt; use mysql;&lt;br /&gt;
mysql&amp;gt; GRANT ALL PRIVILEGES ON *.* TO admin@&quot;%&quot; IDENTIFIED BY &#39;password&#39; WITH GRANT OPTION;&lt;br /&gt;
mysql&amp;gt; FLUSH PRIVILEGES;&lt;/code&gt;
&lt;br /&gt;
&lt;br /&gt;
Hecho esto, ya podemos conectarnos empleando el usuario &quot;admin&quot; y con el password &quot;password&quot;.&lt;br /&gt;
&lt;br /&gt;
Espero que os sea útil! Un saludete!</content><link rel='replies' type='application/atom+xml' href='http://iwokloco-appweb.blogspot.com/feeds/3771728108383569504/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://iwokloco-appweb.blogspot.com/2014/04/mysql-crear-un-usuario-con-todos-los.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5314052884467946568/posts/default/3771728108383569504'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5314052884467946568/posts/default/3771728108383569504'/><link rel='alternate' type='text/html' href='http://iwokloco-appweb.blogspot.com/2014/04/mysql-crear-un-usuario-con-todos-los.html' title='MySQL: crear un usuario con todos los privilegios en MySQL'/><author><name>iwokloco</name><uri>http://www.blogger.com/profile/15790878541512725162</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5314052884467946568.post-5748373574064533999</id><published>2014-04-01T06:21:00.000-07:00</published><updated>2014-04-01T06:21:19.908-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="FTP"/><category scheme="http://www.blogger.com/atom/ns#" term="Linux"/><category scheme="http://www.blogger.com/atom/ns#" term="Ubuntu"/><title type='text'>Ubuntu: configurar servidor FTP en ubuntu server</title><content type='html'>Buenas a todos!&lt;br /&gt;
El programa que vamos a emplear como servidor ftp es vsftp, en un Ubuntu server.&lt;br /&gt;
Lo instalamos de la siguiente forma:&lt;br /&gt;
&lt;code&gt;sudo apt-get install vsftpd&lt;/code&gt;
&lt;br /&gt;
En el sistema operativo tenemos un usuario local llamado ftp_user, y queremos conectarnos con él a través de un cliente ftp.&lt;br /&gt;
&lt;br /&gt;
El archivo de configuración de vsftp es /etc/vsftpd.conf y he fijado los siguientes atributos y valores:&lt;br /&gt;
&lt;code&gt;listen=YES&lt;br /&gt;
anonymous_enable=NO&lt;br /&gt;
local_enable=YES&lt;br /&gt;
write_enable=YES&lt;br /&gt;
chroot_local_user=YES&lt;br /&gt;
chroot_list_enable=YES&lt;br /&gt;
chroot_list_file=/etc/&lt;b&gt;vsftpd.chroot_list&lt;/b&gt;&lt;/code&gt;
&lt;br /&gt;
&lt;code&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/code&gt;
Creamos el archivo que contendrá la lista de usuarios del ftp:&lt;br /&gt;
&lt;code&gt;nano /etc/vsftpd.chroot_list&lt;/code&gt;&lt;br /&gt;
&lt;br /&gt;
Y añadimos el usuario ftp_user.&lt;br /&gt;
&lt;code&gt;#Usuarios&lt;br /&gt;
ftp_user&lt;/code&gt;
&lt;br /&gt;
&lt;br /&gt;
Para aplicar los cambios reiniciamos el servidor:&lt;br /&gt;
sudo /etc/init.d/vsftpd restart&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Ahora vamos a añadir los permisos de escritura para el usuario ftp_user sobre los directorios del tomcat:&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;code&gt;sudo usermod -a -G www-data ftp_user&lt;/code&gt;
-a: el usuario se añadirá al grupo.&lt;br /&gt;
-G: el grupo al que se añadirá el usuario.&lt;br /&gt;
La instrucción hace que el usuario ftp_user se añada al grupo www-data.&lt;br /&gt;
&lt;br /&gt;
&lt;code&gt;sudo chgrp -R www-data /var/lib/tomcat7&lt;/code&gt;
-R: indica que el cambio será recursivo, afectará a los archivos y directorios recursivamente.&lt;br /&gt;
chgrp hace que el grupo propietario del directorio tomcat7 y sus subdirectorios archivos sea www-data.&lt;br /&gt;
&lt;br /&gt;
&lt;code&gt;sudo chmod -R g+w /var/lib/tomcat7&lt;/code&gt;
-R: indica que el cambio será recursivo.&lt;br /&gt;
g+w: significa que al grupo (&quot;g&quot;) le añadimos (&quot;+&quot;) el permiso de escritura (&quot;w&quot;).&lt;br /&gt;
&lt;br /&gt;
Y eso es todo! Con esto ya podréis subir archivos desde cualquier cliente FTP como FileZilla!&lt;br /&gt;
Espero que os sea útil!&lt;br /&gt;
&lt;br /&gt;</content><link rel='replies' type='application/atom+xml' href='http://iwokloco-appweb.blogspot.com/feeds/5748373574064533999/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://iwokloco-appweb.blogspot.com/2014/04/ubuntu-configurar-ftp-en-ubuntu-server.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5314052884467946568/posts/default/5748373574064533999'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5314052884467946568/posts/default/5748373574064533999'/><link rel='alternate' type='text/html' href='http://iwokloco-appweb.blogspot.com/2014/04/ubuntu-configurar-ftp-en-ubuntu-server.html' title='Ubuntu: configurar servidor FTP en ubuntu server'/><author><name>iwokloco</name><uri>http://www.blogger.com/profile/15790878541512725162</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5314052884467946568.post-2018340786995886298</id><published>2014-03-27T09:04:00.003-07:00</published><updated>2014-03-27T09:04:40.963-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="HTML"/><title type='text'>HTML crear un link a la página principal, enlace a la home</title><content type='html'>Buenas a todos!&lt;br /&gt;
Para crear un link a la Home o a la página principal sólo hay que indicar la dirección como &quot;/&quot;, esto indica al navegador que el enlace va al dominio principal:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;a href=&quot;/&quot;&amp;gt;Home&amp;lt;/a&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Y ya está!</content><link rel='replies' type='application/atom+xml' href='http://iwokloco-appweb.blogspot.com/feeds/2018340786995886298/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://iwokloco-appweb.blogspot.com/2014/03/html-crear-un-link-la-pagina-principal.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5314052884467946568/posts/default/2018340786995886298'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5314052884467946568/posts/default/2018340786995886298'/><link rel='alternate' type='text/html' href='http://iwokloco-appweb.blogspot.com/2014/03/html-crear-un-link-la-pagina-principal.html' title='HTML crear un link a la página principal, enlace a la home'/><author><name>iwokloco</name><uri>http://www.blogger.com/profile/15790878541512725162</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5314052884467946568.post-1027521580469117321</id><published>2014-03-27T04:46:00.001-07:00</published><updated>2014-03-27T04:46:33.067-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="PHP"/><title type='text'>PHP: Problema session_start()</title><content type='html'>Buenas a todos!&lt;br /&gt;
Hay varias razones por las que session_start() puede generar problemas, la más común es debido a la codificación de carácteres del archivo .php en cuestión, si trabajamos con UTF-8, hay que asegurarse de que sea una codificación UTF-8 sin BOM, ya que de lo contrario se añaden unos carácteres antes de la declaración de session_start() y eso genera un error.&lt;br /&gt;
&lt;br /&gt;
Los errores que suele indicarnos el servidor son:&lt;br /&gt;
&lt;code&gt;
Warning: Cannot modify header information - headers already sent by ...&lt;br /&gt;
Warning: session_start() [function.session-start]: Cannot send session cache limiter - headers already sent ...&lt;br /&gt;&lt;/code&gt;
&lt;br /&gt;
Para ver qué codificación está usando nuestro archivo php, podemos emplear el Notepad++.&lt;br /&gt;
En la pestaña Codificación podemos cambiar la codificación de nuestro archivo a UTF-8 sin BOM.&lt;br /&gt;
&lt;br /&gt;
Esto debería solucionar vuestro problema en caso de que fuera un tema de codificación.&lt;br /&gt;
&lt;br /&gt;
Tened en cuenta de que session_start() debe ser la primera línea que escriba en el fichero php, ya que escribe los headers, no podéis poner ninguna instrucción de tipo echo antes que session_start(), eso también puede generar este tipo de errores.&lt;br /&gt;
&lt;br /&gt;
Un saludo a todos!</content><link rel='replies' type='application/atom+xml' href='http://iwokloco-appweb.blogspot.com/feeds/1027521580469117321/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://iwokloco-appweb.blogspot.com/2014/03/php-problema-sessionstart.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5314052884467946568/posts/default/1027521580469117321'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5314052884467946568/posts/default/1027521580469117321'/><link rel='alternate' type='text/html' href='http://iwokloco-appweb.blogspot.com/2014/03/php-problema-sessionstart.html' title='PHP: Problema session_start()'/><author><name>iwokloco</name><uri>http://www.blogger.com/profile/15790878541512725162</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5314052884467946568.post-9093988366821374476</id><published>2014-03-19T08:27:00.002-07:00</published><updated>2014-03-19T08:27:28.096-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="PHP"/><title type='text'>PHP: Borrar una variable de la sesión</title><content type='html'>Buenas a todos!&lt;br /&gt;
Borrar variables de la sesión en PHP puede ser algo muy importante, sobretodo en portales donde se deben reestablecer los valores iniciales del portal, o bien durante las etapas de desarrollo en las que debemos hacer pruebas constantes.&lt;br /&gt;
&lt;br /&gt;
Por ejemplo, supongamos que tenemos una tienda virtual y hemos ido acumulando productos en una variable de sesión llamada &#39;cart&#39;, y una vez el cliente realiza el pago final debemos eliminar esta variable para que pueda volver a comprar. Evitando que se acumulen los nuevos artículos con los productos del pedido anterior.&lt;br /&gt;
&lt;br /&gt;
&lt;code&gt;unset($_SESSION[&#39;cart&#39;]);&lt;br /&gt;&lt;/code&gt;
&lt;br /&gt;
Así de simple, unset nos permite eliminar variables específicas, en este caso le indicamos la variable de sesión &#39;cart&#39;.&lt;br /&gt;
&lt;br /&gt;
Ahora si comprobamos si está la variable en sesión con isset(), veremos que el resultado es false.&lt;br /&gt;
&lt;br /&gt;
&lt;code&gt;isset($_SESSION[&#39;cart&#39;])&lt;/code&gt; dará como resultado false.&lt;br /&gt;
&lt;br /&gt;
Un saludo a todos!</content><link rel='replies' type='application/atom+xml' href='http://iwokloco-appweb.blogspot.com/feeds/9093988366821374476/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://iwokloco-appweb.blogspot.com/2014/03/php-borrar-una-variable-de-la-sesion.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5314052884467946568/posts/default/9093988366821374476'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5314052884467946568/posts/default/9093988366821374476'/><link rel='alternate' type='text/html' href='http://iwokloco-appweb.blogspot.com/2014/03/php-borrar-una-variable-de-la-sesion.html' title='PHP: Borrar una variable de la sesión'/><author><name>iwokloco</name><uri>http://www.blogger.com/profile/15790878541512725162</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5314052884467946568.post-536116958621068510</id><published>2014-03-19T05:50:00.002-07:00</published><updated>2014-03-19T05:52:16.079-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="JavaScript"/><title type='text'>Comprobar si una variable existe en JavaScript</title><content type='html'>Comprobar si una variable existe o está definida en JavaScript puede es muy simple:&lt;br /&gt;
&lt;br /&gt;
&lt;code&gt;
if(typeof variable == &#39;undefined&#39;){&lt;br /&gt;&amp;nbsp; &amp;nbsp;//La variable no ha sido definida&lt;br /&gt;
}else{&lt;br /&gt;&amp;nbsp; &amp;nbsp;//La variable existe&lt;br /&gt;
}&lt;/code&gt;&lt;br /&gt;
&lt;code&gt;&lt;br /&gt;&lt;/code&gt;
Es importante diferenciar entre declaración de la variable y definición. La variable puede estar declarada pero no definida, lo que significa que no se le ha asignado ningún valor.&lt;br /&gt;
&lt;br /&gt;
&lt;code&gt;var variable;&lt;/code&gt;&lt;br /&gt;
&lt;code&gt;&lt;br /&gt;&lt;/code&gt;
&lt;code&gt;if(typeof variable == &#39;undefined&#39;){&lt;br /&gt;&amp;nbsp; &amp;nbsp;//La variable no ha sido definida&lt;br /&gt;}else{&lt;br /&gt;&amp;nbsp; &amp;nbsp;//La variable existe&lt;br /&gt;}&lt;/code&gt;&lt;br /&gt;
&lt;code&gt;&lt;br /&gt;&lt;/code&gt;
Esto indicará que la variable es undefined.&lt;br /&gt;
Así que realmente lo que comprobamos es si la variable está definida, ya que la variable puede existir pero no tener ningún valor asignado, en cuyo caso está no definida.&lt;br /&gt;
&lt;br /&gt;
Un saludo a todos!</content><link rel='replies' type='application/atom+xml' href='http://iwokloco-appweb.blogspot.com/feeds/536116958621068510/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://iwokloco-appweb.blogspot.com/2014/03/comprobar-si-una-variable-existe-en.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5314052884467946568/posts/default/536116958621068510'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5314052884467946568/posts/default/536116958621068510'/><link rel='alternate' type='text/html' href='http://iwokloco-appweb.blogspot.com/2014/03/comprobar-si-una-variable-existe-en.html' title='Comprobar si una variable existe en JavaScript'/><author><name>iwokloco</name><uri>http://www.blogger.com/profile/15790878541512725162</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry></feed>