<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">

<channel>
	<title>mooontes.com</title>
	
	<link>http://mooontes.com</link>
	<description />
	<lastBuildDate>Wed, 30 Jan 2013 12:19:05 +0000</lastBuildDate>
	<language>es-ES</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.5.1</generator>
		<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/mooontes" /><feedburner:info uri="mooontes" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><item>
		<title>Añadir un nuevo usuario a gitosis</title>
		<link>http://feedproxy.google.com/~r/mooontes/~3/EB312kw1gQc/</link>
		<comments>http://mooontes.com/2013/01/30/anadir-un-nuevo-usuario-a-gitosis/#comments</comments>
		<pubDate>Wed, 30 Jan 2013 12:13:50 +0000</pubDate>
		<dc:creator>montes</dc:creator>
				<category><![CDATA[debian]]></category>
		<category><![CDATA[programacion]]></category>
		<category><![CDATA[git]]></category>
		<category><![CDATA[gitosis]]></category>

		<guid isPermaLink="false">http://mooontes.com/?p=665</guid>
		<description><![CDATA[¿Debes añadir un usuario a gitosis (un usuario que usa windows) y explicarle los pasos que ha de realizar para tener acceso a los repositorios? Intentaré explicar los pasos desde los dos puntos de vista. (usuario) 1. Crear Clave pública Para que el administrador de acceso a los repositorios al usuario, necesita tener la clave [...]]]></description>
				<content:encoded><![CDATA[<p>¿Debes añadir un usuario a gitosis (un usuario que usa windows) y explicarle los pasos que ha de realizar para tener acceso a los repositorios? Intentaré explicar los pasos desde los dos puntos de vista.<br />
  <span id="more-665"></span></p>
<dl>
<dt>
<h2>(usuario) 1. Crear Clave pública</h2>
</dt>
<dd>
       Para que el administrador de acceso a los repositorios al usuario, necesita tener la clave pública del usuario, eso será lo que generemos ahora en windows.<br />
       Lo primero es instalar git en windows: <a target="_blank" href="http://git-scm.com/download/win">http://git-scm.com/download/win</a> La configuración por defecto nos servirá.<br />
       <a href="http://mooontes.com/2013/01/30/anadir-un-nuevo-usuario-a-gitosis/captura-de-pantalla-2013-01-30-a-las-11-11-19/" rel="attachment wp-att-668"><img src="http://mooontes.com/wp-content/uploads/2013/01/Captura-de-pantalla-2013-01-30-a-las-11.11.19-300x233.png" alt="Captura de pantalla 2013-01-30 a la(s) 11.11.19" width="300" height="233" class="alignnone size-medium wp-image-668" /></a></p>
<p>       Ahora hacemos click en el nuevo icono de Git<br />
       <a href="http://mooontes.com/2013/01/30/anadir-un-nuevo-usuario-a-gitosis/captura-de-pantalla-2013-01-30-a-las-11-14-22/" rel="attachment wp-att-670"><img src="http://mooontes.com/wp-content/uploads/2013/01/Captura-de-pantalla-2013-01-30-a-las-11.14.22.png" alt="Captura de pantalla 2013-01-30 a la(s) 11.14.22" width="74" height="65" class="alignnone size-full wp-image-670" /></a><br />
       Y nos aparecerá esta pantalla:<br />
       <a href="http://mooontes.com/2013/01/30/anadir-un-nuevo-usuario-a-gitosis/captura-de-pantalla-2013-01-30-a-las-11-14-45/" rel="attachment wp-att-673"><img src="http://mooontes.com/wp-content/uploads/2013/01/Captura-de-pantalla-2013-01-30-a-las-11.14.45.png" alt="Captura de pantalla 2013-01-30 a la(s) 11.14.45" width="683" height="399" class="alignnone size-full wp-image-673" /></a></p>
<p>       Ahora generaremos la clave, teclearemos (cambiando javier@mooontes.com por tu correo) &#8220;<em>ssh-keygen -t rsa -C &#8220;javier@mooontes.com</em>&#8221;<br />
       <a href="http://mooontes.com/2013/01/30/anadir-un-nuevo-usuario-a-gitosis/captura-de-pantalla-2013-01-30-a-las-11-20-12/" rel="attachment wp-att-676"><img src="http://mooontes.com/wp-content/uploads/2013/01/Captura-de-pantalla-2013-01-30-a-las-11.20.12.png" alt="Captura de pantalla 2013-01-30 a la(s) 11.20.12" width="682" height="401" class="alignnone size-full wp-image-676" /></a></p>
<p>       Y ya tendremos generado el fichero id_rsa.pub para enviar al administrador:<br />
       <a href="http://mooontes.com/2013/01/30/anadir-un-nuevo-usuario-a-gitosis/captura-de-pantalla-2013-01-30-a-las-12-45-47/" rel="attachment wp-att-677"><img src="http://mooontes.com/wp-content/uploads/2013/01/Captura-de-pantalla-2013-01-30-a-las-12.45.47.png" alt="Captura de pantalla 2013-01-30 a la(s) 12.45.47" width="495" height="188" class="alignnone size-full wp-image-677" /></a></p>
</dd>
<p>&nbsp;</p>
<dt>
<h2>(admin) 2. Añadir la clave pública a gitosis</h2>
</dt>
<dd>
       Descargamos la clave pública que nos ha enviado el usuario al directorio &#8220;keydir&#8221; de nuestro directorio local de gitosis usando como nombre de fichero el correo y extensión &#8220;.pub&#8221;, en el caso del ejemplo el nombre del fichero sería &#8220;javier@mooontes.com.pub&#8221;<br />
       <a href="http://mooontes.com/2013/01/30/anadir-un-nuevo-usuario-a-gitosis/captura-de-pantalla-2013-01-30-a-las-11-26-42/" rel="attachment wp-att-684"><img src="http://mooontes.com/wp-content/uploads/2013/01/Captura-de-pantalla-2013-01-30-a-las-11.26.42.png" alt="Captura de pantalla 2013-01-30 a la(s) 11.26.42" width="614" height="185" class="alignnone size-full wp-image-684" /></a>
  </dd>
<p>       Y como siempre hacemos commit y push para enviar los cambios a gitosis<br />
       <a href="http://mooontes.com/2013/01/30/anadir-un-nuevo-usuario-a-gitosis/captura-de-pantalla-2013-01-30-a-las-11-29-27/" rel="attachment wp-att-686"><img src="http://mooontes.com/wp-content/uploads/2013/01/Captura-de-pantalla-2013-01-30-a-las-11.29.27.png" alt="Captura de pantalla 2013-01-30 a la(s) 11.29.27" width="736" height="135" class="alignnone size-full wp-image-686" /></a><br />
       <a href="http://mooontes.com/2013/01/30/anadir-un-nuevo-usuario-a-gitosis/captura-de-pantalla-2013-01-30-a-las-11-30-49/" rel="attachment wp-att-687"><img src="http://mooontes.com/wp-content/uploads/2013/01/Captura-de-pantalla-2013-01-30-a-las-11.30.49.png" alt="Captura de pantalla 2013-01-30 a la(s) 11.30.49" width="342" height="136" class="alignnone size-full wp-image-687" /></a></p>
<p>       Y listo, el usuario ya puede acceder a los repositorios a los que le hayamos dado acceso.</p>
<p>&nbsp;</p>
<dt>
<h2>(usuario) 3. Clonar un repositorio</h2>
</dt>
<dd>Desde el shell de Git en cuanto el admin nos haya dado acceso, ya podremos acceder a los repositorios, por ejemplo para clonar un repositorio que se llame &#8220;analytics&#8221; y que esté en google.com sería: &#8220;git clone git@google.com:analytics.git&#8221;<br />
      <a href="http://mooontes.com/2013/01/30/anadir-un-nuevo-usuario-a-gitosis/captura-de-pantalla-2013-01-30-a-las-13-10-30/" rel="attachment wp-att-689"><img src="http://mooontes.com/wp-content/uploads/2013/01/Captura-de-pantalla-2013-01-30-a-las-13.10.30.png" alt="Captura de pantalla 2013-01-30 a la(s) 13.10.30" width="358" height="41" class="alignnone size-full wp-image-689" /></a><br />
      En el caso de que estuviese en un puerto distinto al standard de SSH (22), podríamos hacer así: (en este ejemplo el puerto sería el 666)<br />
      &#8220;git clone ssh://git@google.com:666/analytics.git&#8221;
  </dd>
</dl>
<p>Para más información sobre instalar gitosis: <a href="http://mooontes.com/2011/11/05/repositorio-git-remoto-gitosis-debian/">http://mooontes.com/2011/11/05/repositorio-git-remoto-gitosis-debian/</a></p>
<img src="http://feeds.feedburner.com/~r/mooontes/~4/EB312kw1gQc" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://mooontes.com/2013/01/30/anadir-un-nuevo-usuario-a-gitosis/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://mooontes.com/2013/01/30/anadir-un-nuevo-usuario-a-gitosis/</feedburner:origLink></item>
		<item>
		<title>Fotos en los comentarios de WordPress</title>
		<link>http://feedproxy.google.com/~r/mooontes/~3/sOB-Iz-ONk4/</link>
		<comments>http://mooontes.com/2013/01/27/fotos-en-los-comentarios-de-wordpress/#comments</comments>
		<pubDate>Sun, 27 Jan 2013 23:54:59 +0000</pubDate>
		<dc:creator>montes</dc:creator>
				<category><![CDATA[Wordpress]]></category>

		<guid isPermaLink="false">http://mooontes.com/?p=649</guid>
		<description><![CDATA[Hace como un més añadí mi primer plugin público de WordPress al directorio de wordpress.org, es un plugin que permite que los usuarios incluyan fotos en los comentarios y también ficheros multimedia, por ejemplo un PDF. Además cuando alguien incluya una imagen en un comentario podrás verlas directamente en el admin de WordPress: El plugin [...]]]></description>
				<content:encoded><![CDATA[<p>Hace como un més añadí mi primer plugin público de WordPress al directorio de <a target="_blank" href="http://wordpress.org/extend/plugins/">wordpress.org</a>, es un plugin que permite que los usuarios incluyan fotos en los comentarios y también ficheros multimedia, por ejemplo un PDF.</p>
<p><a href="http://mooontes.com/wp-content/uploads/2013/01/screenshot-1.png" rel="attachment wp-att-651"><img src="http://mooontes.com/wp-content/uploads/2013/01/screenshot-1-300x252.png" alt="screenshot-1" width="300" height="252" class="alignnone size-medium wp-image-651" /></a> <a href="http://mooontes.com/wp-content/uploads/2013/01/screenshot-2.png" rel="attachment wp-att-652"><img src="http://mooontes.com/wp-content/uploads/2013/01/screenshot-2-300x282.png" alt="screenshot-2" width="300" height="282" class="alignnone size-medium wp-image-652" /></a></p>
<p>Además cuando alguien incluya una imagen en un comentario podrás verlas directamente en el admin de WordPress:</p>
<p><a href="http://mooontes.com/wp-content/uploads/2013/01/screenshot-3.png" rel="attachment wp-att-656"><img src="http://mooontes.com/wp-content/uploads/2013/01/screenshot-3-300x195.png" alt="screenshot-3" width="300" height="195" class="alignnone size-medium wp-image-656" /></a></p>
<p>El plugin está probado en los dos últimos themes por defecto de WordPress, &#8220;Twenty Eleven&#8221; y &#8220;Twenty Twelve&#8221; y hasta la última versión de WordPress en el momento de escribir este post, la 3.5.1.</p>
<p>Más información y descarga: <a target="_blank" href="http://wordpress.org/extend/plugins/mooontes-comments-media-upload/">http://wordpress.org/extend/plugins/mooontes-comments-media-upload/</a></p>
<p>Para más alternativas en cuanto a imágenes en comentarios, puedes ver el post de Ayuda WordPress: <a target="_blank" href="http://ayudawordpress.com/video-e-imagenes-en-comentarios-wordpress/">http://ayudawordpress.com/video-e-imagenes-en-comentarios-wordpress/</a></p>
<img src="http://feeds.feedburner.com/~r/mooontes/~4/sOB-Iz-ONk4" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://mooontes.com/2013/01/27/fotos-en-los-comentarios-de-wordpress/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://mooontes.com/2013/01/27/fotos-en-los-comentarios-de-wordpress/</feedburner:origLink></item>
		<item>
		<title>¿Los mejores libros sobre HTML y CSS?</title>
		<link>http://feedproxy.google.com/~r/mooontes/~3/HPA_P4J9agI/</link>
		<comments>http://mooontes.com/2012/12/20/mejores-libros-html-css/#comments</comments>
		<pubDate>Thu, 20 Dec 2012 12:50:17 +0000</pubDate>
		<dc:creator>montes</dc:creator>
				<category><![CDATA[Maquetación]]></category>
		<category><![CDATA[programacion]]></category>
		<category><![CDATA[css]]></category>
		<category><![CDATA[html]]></category>
		<category><![CDATA[libros]]></category>
		<category><![CDATA[libros css]]></category>
		<category><![CDATA[libros html]]></category>

		<guid isPermaLink="false">http://mooontes.com/?p=631</guid>
		<description><![CDATA[Un compañero me pidió recomendación sobre libros de html/CSS, mi respuesta: Head First HTML with CSS &#038; XHTML (el XHTML está pasado de moda, pero el libro está bien) HTML&#038;CSS design and build websites Learning Web Design Editado 3/1/2013: Más recomendaciones de libros por CSS-Tricks http://css-tricks.com/bookshelf/]]></description>
				<content:encoded><![CDATA[<p>Un compañero me pidió recomendación sobre libros de html/CSS, mi respuesta:</p>
<ol>
<li><a href="http://www.headfirstlabs.com/books/hfhtml/">Head First HTML with CSS &#038; XHTML</a> (el XHTML está pasado de moda, pero el libro está bien)</li>
<li><a href="http://htmlandcssbook.com/">HTML&#038;CSS design and build websites</a></li>
<li><a href="http://www.learningwebdesign.com/">Learning Web Design</a></li>
</ol>
<p><a href="http://mooontes.com/2012/12/20/mejores-libros-html-css/css_html_books/" rel="attachment wp-att-637"><img src="http://mooontes.com/wp-content/uploads/2012/12/css_html_books.jpg" alt="css_html_books" width="800" height="327" class="alignnone size-full wp-image-637" /></a></p>
<p>Editado 3/1/2013: Más recomendaciones de libros por CSS-Tricks <a href="http://css-tricks.com/bookshelf/">http://css-tricks.com/bookshelf/</a></p>
<img src="http://feeds.feedburner.com/~r/mooontes/~4/HPA_P4J9agI" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://mooontes.com/2012/12/20/mejores-libros-html-css/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://mooontes.com/2012/12/20/mejores-libros-html-css/</feedburner:origLink></item>
		<item>
		<title>Sass: La nueva forma de maquetar</title>
		<link>http://feedproxy.google.com/~r/mooontes/~3/Gj2y_YslOyU/</link>
		<comments>http://mooontes.com/2012/11/08/sass-la-nueva-forma-de-maquetar/#comments</comments>
		<pubDate>Thu, 08 Nov 2012 20:02:17 +0000</pubDate>
		<dc:creator>montes</dc:creator>
				<category><![CDATA[Maquetación]]></category>

		<guid isPermaLink="false">http://mooontes.com/?p=575</guid>
		<description><![CDATA[Hace tiempo que quiero escribir esta entrada, desde que descubrí Sass tras unos meses usando LESS y mi vida maquetando mejoró increíblemente de un día para otro. Tanto Sass como LESS son preprocesadores de CSS. ¿Y qué narices es un &#8220;preprocesador CSS&#8221;? Un preprocesador CSS es una nueva forma de escribir CSS que aumenta enormemente [...]]]></description>
				<content:encoded><![CDATA[<p>Hace tiempo que quiero escribir esta entrada, desde que descubrí <a target="_blank" href="http://sass-lang.com/" target="_blank">Sass</a> tras unos meses usando <a target="_blank" href="http://lesscss.org/">LESS</a> y mi vida maquetando mejoró increíblemente de un día para otro.</p>
<p>Tanto Sass como LESS son preprocesadores de CSS.<br />
<span id="more-575"></span></p>
<h2>¿Y qué narices es un &#8220;preprocesador CSS&#8221;?</h2>
<p>Un preprocesador CSS es una nueva forma de escribir CSS que aumenta enormemente la productividad a la hora de maquetar, es un lenguaje que se procesa para obtener CSS normal con mucho menos esfuerzo y nos ayuda a cumplir el <a target="_blank" href="http://es.wikipedia.org/wiki/No_te_repitas">DRY</a>.</p>
<p>Por ejemplo, si queremos aplicar un color a varios elementos, con Sass sólo necesitaríamos teclear ese color una vez (usando las variables, una característica tanto de Sass como de LESS):</p>
<p><small>main.scss</small></p>
<pre class="brush: css; title: ; notranslate">
$red: #F00;

.alert {
    font-size: 120%;
    background: $red;
}

.important {
    font-size: 140%;
    border: 2px solid $red;
}
</pre>
<p>Este archivo &#8220;main.scss&#8221; se pasaría a un archivo normal CSS &#8220;<em>main.css</em>&#8221; usando uno de los muchos programas disponibles que luego veremos y sería este archivo procesado &#8220;main.css&#8221; el que subiríamos a producción.</p>
<h2>¡Vale me gusta! ¿Y cual uso? ¿Sass? ¿LESS? ¿Otro?</h2>
<p>Hay variedad de opiniones sobre esto, la mía es que el mejor es Sass (empecé usando LESS y me cambié a Sass tras convencerme de la diferencia entre ambos a favor de Sass).</p>
<p>Realmente tanto Sass como LESS son con diferencia los más famosos, incluso LESS algo más según <a target="_blank" href="http://css-tricks.com/poll-results-popularity-of-css-preprocessors/">algunas encuestas</a>, pero la realidad es que Sass es más potente, se va actualizando más rápido y encima tiene <a target="_blank" href="http://compass-style.org/">Compass</a>, una especie de framework que nos facilita la vida <a target="_blank" href="http://compass-style.org/reference/compass/css3/">con las características de CSS3</a>, <a target="_blank" href="http://compass-style.org/reference/compass/utilities/">utilidades generales</a> y <a target="_blank" href="http://compass-style.org/reference/compass/">un montón de cosas más</a>.</p>
<p>Es probable que uno de los motivos principales de que LESS sea tan popular es el que <a target="_blank" href="http://twitter.github.com/bootstrap/">Twitter Bootstrap</a> se haya hecho usando LESS, de todas formas no es ningún impedimento para usar SASS, ya que también tenemos <a target="_blank" href="https://github.com/jlong/sass-twitter-bootstrap">Twitter Bootstrap en Sass</a>.</p>
<p>Si quieres ver por tí mismo cual consideras mejor, puedes leer algunas de las comparativas (ya te adelanto que la mayoría de la gente está de acuerdo con la elección de Sass):</p>
<ul>
<li><a target="_blank" href="http://css-tricks.com/sass-vs-less/">Sass vs. LESS en CSS-TRICKS</a></li>
<li><a target="_blank" href="http://coding.smashingmagazine.com/2011/09/09/an-introduction-to-less-and-comparison-to-sass/">An Introduction To LESS, And Comparison To Sass</a></li>
<li><a target="_blank" href="http://www.slideshare.net/utbkevin/less-vs-sass-css-precompiler-showdown-14068991">LESS vs. SASS &#8211; CSS Precompiler Showdown</a></li>
<li><a target="_blank" href="http://www.youtube.com/watch?v=FlW2vvl0yvo">CSS preprocessors with Jonathan Verrecchia</a> (vídeo donde explica muy bien las ventajas de Sass sobre LESS)</li>
</ul>
<h2>Me has convencido, ¡usaré Sass! ¿Por dónde empiezo?</h2>
<p>Empieza por echarle un vistazo a <a target="_blank" href="http://sass-lang.com/">su web</a>, hay ejemplos básicos muy buenos que te harán entender rápidamente la base de lo que puedes hacer con Sass, también verás que con Sass puedes usar dos lenguajes (sirven para lo mismo, simplemente es cuestión de gustos):</p>
<dl>
<dt>.scss</dt>
<dd>Se escribe igual que CSS normal, con sus llaves y sus punto y coma.</dd>
<dt>.sass</dt>
<dd>Prescinde de llaves y puntos y coma</dd>
</dl>
<p>Si no te gusta la línea de comandos, descárgate un programa de escritorio que compile tus archivos a CSS:</p>
<dl>
<dt>Mac</dt>
<dd><a target="_blank" href="http://incident57.com/codekit/">Codekit</a> o <a target="_blank" href="http://mhs.github.com/scout-app/">Scout</a></dd>
<dt>Windows</dt>
<dd><a target="_blank" href="http://mhs.github.com/scout-app/">Scout</a></dd>
</dl>
<p>Y luego también tenemos un par de libros:</p>
<p><a target="_blank" href="http://pragprog.com/book/pg_sass/pragmatic-guide-to-sass"><img alt="Sass and Compass in action" title="Sass and Compass in action" src="http://mooontes.com/wp-content/uploads/2012/11/sass_pg_xlargecover.jpg" style="height:186px"></a> <a target="_blank" href="http://www.manning.com/netherland/"><img src="http://mooontes.com/wp-content/uploads/2012/11/sass_netherland_cover150.jpg" alt="Sass and Compass in action" title="Sass and Compass in action"></a></p>
<p>Y para acabar unos cuantos recursos interesantes de Sass en inglés:</p>
<ul>
<li><a target="_blank" href="http://stackoverflow.com/questions/8512802/checking-if-a-variable-is-defined-in-sass#answer-13237776">Checking if a variable is defined in SASS</a> (Nov 2012)</li>
<li><a target="_blank" href="http://ianstormtaylor.com/oocss-plus-sass-is-the-best-way-to-css/">OOCSS + Sass = The best way to CSS</a> (Oct 2012)</li>
<li><a target="_blank" href="http://chriseppstein.github.com/blog/2012/08/23/sass-3-2-is-released/">Sass 3.2 makes authoring CSS3 as easy as it will be</a> (Ago 2012)</li>
<li><a target="_blank" href="http://takazudo.github.com/presentation-oocss-sass/#/">OOCSS + Sass presentation</a> (Jul 2012)</li>
<li><a target="_blank" href="http://www.intridea.com/blog/2012/3/7/sass-recipes-help-with-helpers">SASS Recipes: Helping styles help themselves</a> (Mar 2012)</li>
</ul>
<p style="margin-top:20px">Espero haberte convencido para usar Sass, o al menos usar un preprocesador de CSS, el que sea, porque no usándolo estás perdiendo mucho mucho tiempo.</p>
<img src="http://feeds.feedburner.com/~r/mooontes/~4/Gj2y_YslOyU" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://mooontes.com/2012/11/08/sass-la-nueva-forma-de-maquetar/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://mooontes.com/2012/11/08/sass-la-nueva-forma-de-maquetar/</feedburner:origLink></item>
		<item>
		<title>Monitoriza tus webs desde tu propio Mac</title>
		<link>http://feedproxy.google.com/~r/mooontes/~3/g5L0Sg33540/</link>
		<comments>http://mooontes.com/2012/06/19/monitoriza-tus-webs-desde-tu-propio-mac/#comments</comments>
		<pubDate>Tue, 19 Jun 2012 18:51:41 +0000</pubDate>
		<dc:creator>montes</dc:creator>
				<category><![CDATA[Mac]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[mac]]></category>
		<category><![CDATA[osx]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[postfix]]></category>

		<guid isPermaLink="false">http://mooontes.com/?p=527</guid>
		<description><![CDATA[Este script en PHP te enviará un correo cada vez que una de tus webs no responda a un ping, para que funcione sólo tienes que hacer dos cosas, configurar el postfix de tu mac, por ejemplo puedes hacerlo con tu cuenta de Gmail guiándote por esta explicación -&#62; http://hints.macworld.com/article.php?story=20081217161612647 y luego añadir este script [...]]]></description>
				<content:encoded><![CDATA[<p>Este script en PHP te enviará un correo cada vez que una de tus webs no responda a un ping, para que funcione sólo tienes que hacer dos cosas, configurar el postfix de tu mac, por ejemplo puedes hacerlo con tu cuenta de Gmail guiándote por esta explicación -&gt; <a href="http://hints.macworld.com/article.php?story=20081217161612647">http://hints.macworld.com/article.php?story=20081217161612647</a> y luego añadir este script al crontab.<br />
<span id="more-527"></span></p>
<pre class="brush: php; title: ; notranslate">
#!/bin/php
&lt;?php

$email = 'my_email@example.com';
$domainsToCheck = array(
	'http://www.myblog.com' =&gt; true, //true means it has to check if wordpress code is present
	'http://www.example.com' =&gt; false,
	);

$domainsDown = array();

foreach ($domainsToCheck as $domain =&gt; $isWordpress) {
	if (!isDomainAvailable($domain, $isWordpress)) {
		array_push($domainsDown, $domain);
		echo &quot;Error! $domain not available!\n&quot;;
	} else {
		echo &quot;OK! $domain available\n&quot;;
	}
}

if (count($domainsDown) &gt; 0) {
	$message = &quot;\n Following domains are not working:\n\n&quot;;
	foreach ($domainsDown as $domain) {
		$message .= &quot;$domain\n&quot;;
	}
	$message .= &quot;\n\n&quot;;

	mail($email, 'ERROR ERROR domains failing! ERROR ERROR', $message);
}

//returns true, if domain is available, false if not
function isDomainAvailable($domain, $isWordpress = false)
{
	//check, if a valid url is provided
	if(!filter_var($domain, FILTER_VALIDATE_URL))
	{
		return false;
	}

	//initialize curl
	$ch = curl_init($domain);

	if ($isWordpress) {
		curl_setopt($ch, CURLOPT_HEADER, 0);
		curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); //Set curl to return the data instead of printing it to the browser.
		curl_setopt($ch, CURLOPT_FOLLOWLOCATION, TRUE);
		curl_setopt($ch, CURLOPT_URL, $domain);

		$response = curl_exec($ch);
	} else {
		curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 15);
		if (!$isWordpress)
			curl_setopt($ch, CURLOPT_HEADER, true);
		else {
			curl_setopt($ch, CURLOPT_URL, $domain);
			curl_setopt($ch, CURLOPT_HEADER, false);
		}
		curl_setopt($ch, CURLOPT_NOBODY, true);
		curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
		$response = curl_exec($ch);
	}

	curl_close($ch);

	if ($response &amp;&amp; $isWordpress) {
		if (mb_stripos($response, '&lt;meta name=&quot;generator&quot; content=&quot;WordPress') !== false) {
			return true;
		}
	} elseif ($response) {
		return true;
	}

	return false;
}

</pre>
<img src="http://feeds.feedburner.com/~r/mooontes/~4/g5L0Sg33540" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://mooontes.com/2012/06/19/monitoriza-tus-webs-desde-tu-propio-mac/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://mooontes.com/2012/06/19/monitoriza-tus-webs-desde-tu-propio-mac/</feedburner:origLink></item>
		<item>
		<title>Los hilos más activos en SMF 2</title>
		<link>http://feedproxy.google.com/~r/mooontes/~3/TMqBH0rsR_o/</link>
		<comments>http://mooontes.com/2012/02/11/los-hilos-mas-activos-en-smf-2/#comments</comments>
		<pubDate>Sat, 11 Feb 2012 21:02:54 +0000</pubDate>
		<dc:creator>montes</dc:creator>
				<category><![CDATA[programacion]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[simple machines forum]]></category>
		<category><![CDATA[smf]]></category>
		<category><![CDATA[smf2]]></category>

		<guid isPermaLink="false">http://mooontes.com/?p=501</guid>
		<description><![CDATA[Como me han preguntado cómo hacemos para mostrar los hilos más activos en furgovw, aprovecho y pongo el código aquí por si a alguien más le interesase, simplemente es poner este código en un bloque PHP de TinyPortal o el CMS que usemos con SMF2 (Simple Machines Forum) y obtendremos algo del estilo de la [...]]]></description>
				<content:encoded><![CDATA[<p>Como me han preguntado cómo hacemos para mostrar los hilos más activos en <a href="http://www.furgovw.org">furgovw</a>, aprovecho y pongo el código aquí por si a alguien más le interesase, simplemente es poner este código en un bloque PHP de TinyPortal o el CMS que usemos con SMF2 (<a href="http://www.simplemachines.org">Simple Machines Forum</a>) y obtendremos algo del estilo de la captura:</p>
<p><img src="http://mooontes.com/wp-content/uploads/2012/02/Captura-de-pantalla-2012-02-11-a-las-21.59.50.png" alt="" title="Captura de pantalla 2012-02-11 a la(s) 21.59.50" width="615" height="255" class="alignnone size-full wp-image-507" /></p>
<p><span id="more-501"></span></p>
<pre class="brush: php; title: ; notranslate">
/*
(C) Javier Montes &lt;kalimocho@gmail.com&gt; 

Twitter: @mooontes
Web: http://mooontes.com

Written for: http://www.furgovw.org

This code is licensed under GPL 2.0 http://www.gnu.org/licenses/gpl-2.0.html

THE SOFTWARE IS PROVIDED &quot;AS IS&quot;, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
*/

//Set here forums you don't want to have topics shown on hottest topics
$notShowThisForumIDs = array(50, 46, 71, 29, 43, 136, 57, 58, 56, 49, 120, 133, 128, 122, 65, 85);

global $smcFunc;

$sql = '
	SELECT 
		value
	FROM {db_prefix}settings
	WHERE variable = &quot;furgovw_hottest_topics&quot;';

$result = $smcFunc['db_query']('', $sql);

if ($row = $smcFunc['db_fetch_assoc']($result)) {

	$hottestTopics = unserialize($row['value']);

	if (($hottestTopics[0]['time'] + (60 * 15)) &lt; time()) {
		$hottestTopics = getHottestTopics($smcFunc, $notShowThisForumIDs);
	}

} else {

	$hottestTopics = getHottestTopics($smcFunc, $notShowThisForumIDs);

}

showHottestTopicsTable($smcFunc, $hottestTopics);


function getHottestTopics($smcFunc, $notShowThisForumIDs)
{
	$hottestTopics = array();

	$sql = '
		SELECT 
			COUNT(*) AS total,
			m.id_topic AS id_topic,
			t.id_first_msg AS id_first_msg 
		FROM {db_prefix}messages AS m
		LEFT JOIN {db_prefix}topics AS t
		ON m.id_topic = t.id_topic
		WHERE
		t.id_board NOT IN (' . implode(',', $notShowThisForumIDs) . ')
		AND (FROM_UNIXTIME(m.poster_time) &gt; DATE_SUB(DATE(NOW()), INTERVAL 24 HOUR))
		GROUP by m.id_topic
		ORDER BY total DESC
		LIMIT 10
		';

	$result = $smcFunc['db_query']('', $sql);

	while ($row = $smcFunc['db_fetch_assoc']($result)) {
		$hottestTopics[] = $row;
	}

	if (is_array($hottestTopics)) {
		$hottestTopics[0]['time'] = time();

		$smcFunc['db_insert']('replace',
            '{db_prefix}settings',
            array(
                'variable' =&gt; 'string', 'value' =&gt; 'string',
            ),
            array(
                'furgovw_hottest_topics', serialize($hottestTopics),
            ),
            array('variable')
        );

		return $hottestTopics;
	} else
		die('Error getting stats');
}

function showHottestTopicsTable($smcFunc, $hottestTopics)
{
	echo '&lt;table style=&quot;clear:both;margin:0 auto;&quot;&gt;';

	foreach ($hottestTopics as $hottestTopic) {

		$sql = '
			SELECT 
				m.subject, 
				m.poster_name,
				m.id_member,
				t.id_last_msg
			FROM {db_prefix}messages AS m 
			LEFT JOIN {db_prefix}topics AS t
			ON m.id_topic = t.id_topic
			WHERE m.id_topic = ' . $hottestTopic['id_topic'];

		$result = $smcFunc['db_query']('', $sql);
		$row = $smcFunc['db_fetch_assoc']($result);

   		echo '
   			&lt;tr&gt;
   				&lt;td align=&quot;right&quot;&gt;
   					&lt;h2&gt; ['.$hottestTopic['total'].' resp. hoy] &lt;/h2&gt;
   				&lt;/td&gt;
   				&lt;td&gt;
   					&lt;h2&gt;
    					&lt;a href=&quot;/index.php?topic='.
    						$hottestTopic['id_topic'].
    						'.msg'.$row['id_last_msg'].
    						';topicseen#new&quot;&gt;'.$row['subject'].
    						'&lt;/a&gt;
  					&lt;/h2&gt;
  				&lt;/td&gt;
  			&lt;/tr&gt;';
	}

	echo '&lt;/table&gt;';
}
</pre>
<img src="http://feeds.feedburner.com/~r/mooontes/~4/TMqBH0rsR_o" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://mooontes.com/2012/02/11/los-hilos-mas-activos-en-smf-2/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<feedburner:origLink>http://mooontes.com/2012/02/11/los-hilos-mas-activos-en-smf-2/</feedburner:origLink></item>
		<item>
		<title>Nuestro repositorio Git remoto con Gitosis y Debian</title>
		<link>http://feedproxy.google.com/~r/mooontes/~3/0-j0ulpj4XA/</link>
		<comments>http://mooontes.com/2011/11/05/repositorio-git-remoto-gitosis-debian/#comments</comments>
		<pubDate>Sat, 05 Nov 2011 16:34:09 +0000</pubDate>
		<dc:creator>montes</dc:creator>
				<category><![CDATA[debian]]></category>
		<category><![CDATA[git gitosis linux mac osx debian remote repository]]></category>

		<guid isPermaLink="false">http://mooontes.com/?p=446</guid>
		<description><![CDATA[Para poder tener copias remotas de nuestros repositorios Git locales tenemos muchas opciones en internet, la más conocida de lejos github , que funciona muy bien para repositorios públicos y no excesivamente grandes, pero si necesitamos tener repositorios privados o de un tamaño considerable, las opciones tipo Github dejan de ser gratis. Podemos pagar uno [...]]]></description>
				<content:encoded><![CDATA[<p>Para poder tener copias remotas de nuestros repositorios Git locales tenemos muchas opciones en internet, la más conocida de lejos <a href="http://github.com">github</a> , que funciona muy bien para repositorios públicos y no excesivamente grandes, pero si necesitamos tener repositorios privados o de un tamaño considerable, las opciones tipo Github dejan de ser gratis.<br />
<span id="more-446"></span><br />
Podemos pagar uno de estos servicios, pero si ya tenemos un servidor propio, ¿por qué no aprovecharlo también como repositorio remoto? Aquí es donde entra en juego &#8220;Gitosis&#8221;, que nos ayuda a mantener repositorios Git remotos en nuestro propio servidor, pudiendo configurar el acceso privado a los repositorios incluso por grupos.</p>
<h2>Instalar Gitosis en Debian</h2>
<p>Aunque hay varios tutoriales por internet e incluso un paquete en debian para instalar Gitosis, todos los métodos que he visto dan algún problema más o menos grave. Los siguientes pasos son producto de mezclar varios pasos de los descritos en estos tutoriales y de añadir alguno propio para lograr hacer funcionar correctamente Gitosis en un servidor debian.</p>
<ol>
<li>
<h3>Instalar python-setuptools y descargar Gitosis</h3>
</li>
<p>En el servidor:</p>
<pre class="brush: bash; title: ; notranslate">aptitude install python-setuptools</pre>
<p>y descargar Gitosis (clonar con Git)</p>
<pre class="brush: bash; title: ; notranslate">cd /data/temp
git clone git://eagain.net/gitosis</pre>
<p>(Gitosis también está disponible en github: <a href="https://github.com/res0nat0r/gitosis">https://github.com/res0nat0r/gitosis</a> )</p>
<li>
<h3>Instalar Gitosis</h3>
</li>
<p>Ojo con el parámetro &#8220;<em>&#8211;home /data/git</em>&#8220;, aquí deberéis indicar el home del usuario git, que es donde se almacenarán los repositorios</p>
<pre class="brush: bash; title: ; notranslate">python setup.py install
adduser --system --shell /bin/sh --gecos 'git version control' --group --disabled-password --home /data/git git</pre>
<li>
<h3>Generar una llave pública en nuestro ordenador local</h3>
</li>
<p>Tras instalar Gitosis en el servidor, ahora necesitaremos generar una llave pública en nuestro ordenador de desarrollo (desde donde vayamos a hacer los push)</p>
<p>En Linux o Mac:</p>
<pre class="brush: bash; title: ; notranslate">ssh-keygen -t rsa</pre>
<p>Lo que generará las llaves privada/pública en nuestro directorio de usuario, la que nos interesa, la pública, en: &#8220;<em>/home/usuario/.ssh/id_rsa.pub</em>&#8221; en Linux o &#8220;<em>/Users/usuario/.ssh/id_rsa.pub</em>&#8221; en OS X.</p>
<li>
<h3>Instalar nuestra llave pública en el servidor</h3>
</li>
<p>De vuelta al servidor y habiendo subido nuestra llave pública (por ftp por ejemplo)</p>
<p>Lo primero instalamos sudo, que en debian no viene instalado por defecto:</p>
<pre class="brush: bash; title: ; notranslate">aptitude install sudo</pre>
<p>Inicializamos Gitosis con nuestro usuario como admin (pasándole la ruta de nuestra llave pública, en este ejemplo estaría en &#8220;<em>/tmp/id_rsa.pub</em>&#8221;</p>
<pre class="brush: bash; title: ; notranslate">sudo -H -u git gitosis-init &lt; /tmp/id_rsa.pub</pre>
<p>Y para finalizar marcamos &#8220;post-update&#8221; como ejecutable para todos los usuarios:</p>
<pre class="brush: bash; title: ; notranslate">sudo chmod 755 /data/git/repositories/gitosis-admin.git/hooks/post-update</pre>
<li>
<h3>Bonus track: Redmine o cualquier gestor web de Git en el servidor</h3>
</li>
<p>Si vamos a usar Redmine o cualquier tipo de gestor o visualizador web de Git, necesitaremos incluir al usuario de apache &#8220;www-data&#8221; en el grupo de &#8220;git&#8221; para que sea capaz de leer los repositorios que generemos:</p>
<pre class="brush: bash; title: ; notranslate">usermod -a -G git www-data</pre>
<li>
<h3>Ya estamos listos, nuestro primer push</h3>
</li>
<p>Ya sólo nos queda clonar el repositorio de la configuración de Gitosis para poder ir configurando los permisos para los repositorios que añadamos, desde nuestro ordenador de desarrollo (Linux o Mac) sustituyendo &#8220;miservidor.com&#8221; por el dominio o ip de vuestro servidor:</p>
<pre class="brush: bash; title: ; notranslate">git clone git@miservidor.com:gitosis-admin.git</pre>
<p>y ahora podemos entrar a ver la configuración de gitosis y añadir algún repositorio, por ejemplo si queremos añadir el repositorio &#8220;montes&#8221; a nuestro servidor:</p>
<pre class="brush: bash; title: ; notranslate">cd gitosis-admin
vim gitosis.conf</pre>
<p>y en &#8220;<em>gitosis.conf</em>&#8221; añadiremos &#8220;montes&#8221; como writable:</p>
<pre class="brush: bash; title: ; notranslate">[gitosis]
  3 [group gitosis-admin]
  4 writable = gitosis-admin montes
  5 members = yo@gmail.com
</pre>
<p>grabamos y haremos nuestro primer push para actualizar la configuración de gitosis en el servidor remoto:</p>
<pre class="brush: bash; title: ; notranslate">git commit -a -m &quot;Dar permisos de escritura en el repositorio montes para el grupo gitosis-admin&quot;
git push</pre>
<p>Con esto hemos dado permisos de escritura en el repositorio &#8220;montes&#8221; (que aún no existe) a nuestro usuario (yo@gmai.com al que pertenece la llave pública que configuramos en el paso anterior).</p>
<p>Sólo nos queda crear el repositorio en nuestro ordenador de desarrollo (Linux o Mac):</p>
<pre class="brush: bash; title: ; notranslate">cd ..
mkdir montes
cd montes
git init</pre>
<p>añadir nuestro servidor remoto como repositorio remoto:</p>
<pre class="brush: bash; title: ; notranslate">git remote add origin git@miservidor.com:montes</pre>
<p>y hacer nuestro primer push!</p>
<pre class="brush: bash; title: ; notranslate">git add .
git commit -a -m &quot;Primer commit!&quot;
git push miservidor master</pre>
<p>Listo! ya hemos enviado nuestro primer push a nuestro propio servidor Git remoto!</p>
</ol>
<p>&nbsp;</p>
<p>Fuentes:<br />
<a href="http://ymbra.com/es/blog/ramon/gestion-de-repositorios-git-con-gitosis">http://ymbra.com/es/blog/ramon/gestion-de-repositorios-git-con-gitosis</a><br />
<a href="https://github.com/res0nat0r/gitosis">https://github.com/res0nat0r/gitosis</a></p>
<img src="http://feeds.feedburner.com/~r/mooontes/~4/0-j0ulpj4XA" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://mooontes.com/2011/11/05/repositorio-git-remoto-gitosis-debian/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<feedburner:origLink>http://mooontes.com/2011/11/05/repositorio-git-remoto-gitosis-debian/</feedburner:origLink></item>
		<item>
		<title>Conferencia PHP Profesional – Carlos Buenosvinos</title>
		<link>http://feedproxy.google.com/~r/mooontes/~3/a6pOAb1Iv6U/</link>
		<comments>http://mooontes.com/2011/05/23/conferencia-php-profesional-carlos-buenosvinos/#comments</comments>
		<pubDate>Mon, 23 May 2011 22:42:14 +0000</pubDate>
		<dc:creator>montes</dc:creator>
				<category><![CDATA[programacion]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://mooontes.com/?p=432</guid>
		<description><![CDATA[Si te interesa PHP, te recomiendo que busques como sea un par de horas libres y te veas la conferencia de Carlos Buenosvinos sobre las herramientas necesarias para programar en PHP profesionalmente, vale su peso en oro (y gracias de nuevo a decharlas.com!) Vídeo Vimeo Conferencia PHP Profesional y diapositivas]]></description>
				<content:encoded><![CDATA[<p>Si te interesa PHP, te recomiendo que busques como sea un par de horas libres y te veas la conferencia de Carlos Buenosvinos sobre las herramientas necesarias para programar en PHP profesionalmente, vale su peso en oro (y gracias de nuevo a <a href='http://www.decharlas.com'>decharlas.com</a>!)</p>
<p><a target='_blank' href='http://decharlas.uji.es/php-profesional.php'>Vídeo Vimeo Conferencia PHP Profesional y diapositivas</a></p>
<img src="http://feeds.feedburner.com/~r/mooontes/~4/a6pOAb1Iv6U" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://mooontes.com/2011/05/23/conferencia-php-profesional-carlos-buenosvinos/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://mooontes.com/2011/05/23/conferencia-php-profesional-carlos-buenosvinos/</feedburner:origLink></item>
		<item>
		<title>Symfony2, tutorial para comenzar ultra-rápido</title>
		<link>http://feedproxy.google.com/~r/mooontes/~3/zEpPs3V3MMU/</link>
		<comments>http://mooontes.com/2011/03/27/symfony2-tutorial-para-comenzar-ultra-rapido/#comments</comments>
		<pubDate>Sun, 27 Mar 2011 01:32:44 +0000</pubDate>
		<dc:creator>montes</dc:creator>
				<category><![CDATA[programacion]]></category>
		<category><![CDATA[symfony2]]></category>

		<guid isPermaLink="false">http://mooontes.com/?p=380</guid>
		<description><![CDATA[This post in english at http://en.mooontes.com/2011/03/27/symfony2-ultra-fast-start-tutorial/ NOTA: Este tutorial se ha realizado en Ubuntu 11.04 &#8211; Natty Narwhal, no se ha comprobado su funcionamiento en otros sistemas operativos. Esto es sólo una especie de chuleta de ejemplo por si se te olvida alguna cosa tras leer la documentación de symfony2, pero evidentemente es imprescindible leérsela [...]]]></description>
				<content:encoded><![CDATA[<p><em>This post in english at <a href="http://en.mooontes.com/2011/03/27/symfony2-ultra-fast-start-tutorial/">http://en.mooontes.com/2011/03/27/symfony2-ultra-fast-start-tutorial/</a></p>
<p>NOTA: Este tutorial se ha realizado en Ubuntu 11.04 &#8211; Natty Narwhal, no se ha comprobado su funcionamiento en otros sistemas operativos. Esto es sólo una especie de chuleta de ejemplo por si se te olvida alguna cosa tras leer la documentación de symfony2, pero evidentemente es imprescindible leérsela antes para saber de qué va todo esto <img src='http://mooontes.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  <a href="http://symfony.com/doc/2.0/book/index.html">http://symfony.com/doc/2.0/book/index.html</a></em></p>
<p>El código fuente utilizado está disponible en: <a href='https://github.com/montes/Adictos-Symfony2-Bundle' target='_blank'>https://github.com/montes/Adictos-Symfony2-Bundle</a></p>
<p>ACTUALIZACIÓN 23/5/2011: Actualizado para symfony2 beta2<br />
<span id="more-380"></span></p>
<p>&nbsp;</p>
<h2>1. Descarga</h2>
<p>Descarga Symfony2 Standard Edition (en el momento de escribir esto la BETA2): <a href='http://symfony.com/download' target='_blank'>http://symfony.com/download</a></p>
<p>Descomprime</p>
<pre class="brush: bash; title: ; notranslate">
tar -zxvf Symfony_Standard_Vendors_2.0.0BETA2.tgz
</pre>
<p>Y cambia los permisos de app/cache y app/logs para que sean escribibles por php, por ejemplo:</p>
<pre class="brush: bash; title: ; notranslate">
chmod 777 app/cache app/logs
</pre>
<p>Configura en tu servidor el directorio &#8220;<em>web/</em>&#8221; como raíz y ya deberías poder cargar la página de bienvenida de symfony2 desde <a target="_blank"  href="http://127.0.0.1/app_dev.php/">http://127.0.0.1/app_dev.php/</a></p>
<p>&nbsp;</p>
<h2>2. Configura la base de datos</h2>
<p>Configura <em>app/config/parameters.ini</em> con las opciones de tu base de datos (también lo puedes hacer desde <a href="http://127.0.0.1/app_dev.php/_configurator/">http://127.0.0.1/app_dev.php/_configurator/</a> ), para mysql sería algo así:</p>
<pre class="brush: plain; title: ; notranslate">
[parameters]
    database_driver=pdo_mysql
    database_host=localhost
    database_name=symfony2
    database_user=symfony2
    database_password=password
    mailer_transport=smtp
    mailer_host=localhost
    mailer_user=
    mailer_password=
    locale=en
    csrf_secret=op234j234j2424jojpfwesdcsdc
</pre>
<p>&nbsp;</p>
<h2>3. Crear nuestro primer bundle</h2>
<p>Ahora ya podemos crear un bundle:</p>
<pre class="brush: bash; title: ; notranslate">
php app/console init:bundle &quot;Montes\AdictosBundle&quot; src
</pre>
<p>Ahora toca añadir a <em>app/autoload.php</em> :</p>
<pre class="brush: php; title: ; notranslate">
$loader-&gt;registerNamespaces(array(
    'Montes'                         =&gt; __DIR__.'/../src',
    // ...
));
</pre>
<p>y añadir a <em>app/AppKernel.php</em> :</p>
<pre class="brush: php; title: ; notranslate">
    $bundles = array(
        // ...
        new Montes\AdictosBundle\MontesAdictosBundle(),
    );
</pre>
<p>&nbsp;</p>
<h2>4. Ruta</h2>
<p>Para que symfony2 sepa dónde enviar las peticiones, añadimos a <em>app/config/routing_dev.yml</em> :</p>
<pre class="brush: bash; title: ; notranslate">
homepage:
    pattern:  /adictos
    defaults: { _controller: MontesAdictosBundle:Default:index }
</pre>
<p>En este punto ya podemos cargar nuestro recién creado bundle yendo a: <a target="_blank" href="http://127.0.0.1/app_dev.php/adictos">http://127.0.0.1/app_dev.php/adictos</a></p>
<p>&nbsp;</p>
<h2>5. Controller</h2>
<p>El controller por defecto (<em>Montes/AdictosBundle/Controller/DefaultController.php</em>) ya nos lo ha creado Symfony2, ahora vamos a crear el controller StoreController.php</p>
<pre class="brush: php; title: ; notranslate">
//Montes/AdictosBundle/Controller/StoreController.php
&lt;?php

namespace Montes\AdictosBundle\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template;

class StoreController extends Controller
{
    /**
     * @Template()
     */
    public function indexAction($store)
    {
        return array('store' =&gt; $store);
    }
}
</pre>
<p>y añadimos a <em>app/config/routing_dev.yml</em></p>
<pre class="brush: bash; title: ; notranslate">
store:
    pattern: /adictos/{store}
    defaults: { _controller: MontesAdictosBundle:Store:index }
</pre>
<p>y una nueva plantilla de twig a <em>Montes/AdictosBundle/Resources/Views/Store/index.html.twig</em></p>
<pre class="brush: xml; title: ; notranslate">
So you want store &quot;{{ store }}&quot;?
</pre>
<p>Y ahora cargando <a target="_blank" href="http://127.0.0.1/app_dev.php/adictos/mi-tienda">http://127.0.0.1/app_dev.php/adictos/mi-tienda</a> obtendremos:</p>
<p><em>So you want store &#8220;mi-tienda&#8221;?</em></p>
<p>&nbsp;</p>
<h2>6. Modelo</h2>
<p><em>NOTA: Para entrar en detalle sobre Doctrine2 recomiendo <a target='_blank' href='http://parasitovirtual.wordpress.com/category/cursos-y-articulos/desarrollo-de-webs/php/doctrine/'>el blog de Francisco Belmonte</a>, una maravilla.</em></p>
<p><del datetime="2011-05-23T21:32:54+00:00">Primero añadimos a <em>app/config/config.yml</em> &#8220;<em>MontesAdictosBundle: ~</em>&#8220;</del> A partir de la BETA1 por defecto el mapping es automático.</p>
<p>Comenzamos con Doctrine, vamos a definir nuestro modelo para una tienda. Antes de nada, como aún no hemos creado ningún modelo tendremos que crear el directorio <em>Montes/AdictosBundle/Entity</em> que es donde los guardaremos todos.</p>
<p>Y ya podemos empezar, modelo para Store:</p>
<pre class="brush: php; title: ; notranslate">
&lt;?php
// Montes/AdictosBundle/Entity/Store.php

namespace Montes\AdictosBundle\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
 * @ORM\Entity
 */
class Store
{
    /**
     * @ORM\Id
     * @ORM\Column(type=&quot;integer&quot;)
     * @ORM\GeneratedValue(strategy=&quot;AUTO&quot;)
     */
     protected $id;

    /**
     * @ORM\ManyToMany(targetEntity=&quot;Category&quot;)
     * @ORM\JoinTable(name=&quot;stores_categories&quot;,
     *      joinColumns={@ORM\JoinColumn(name=&quot;store_id&quot;, referencedColumnName=&quot;id&quot;)},
     *      inverseJoinColumns={@ORM\JoinColumn(name=&quot;category_id&quot;, referencedColumnName=&quot;id&quot;)})
     */
    protected $categories;

    /**
     * @ORM\Column(type=&quot;string&quot;, length=&quot;255&quot;)
     */
    protected $url;

    /**
     * @ORM\Column(type=&quot;string&quot;, length=&quot;255&quot;)
     */
    protected $name;

    /**
     * @ORM\Column(type=&quot;integer&quot;)
     */
    protected $clicks = 0;

    /**
     * @ORM\Column(type=&quot;boolean&quot;)
     */
    protected $validated = false;

    /**
     * @ORM\Column(type=&quot;integer&quot;)
     */
    protected $pcomments = 0;

    /**
     * @ORM\Column(type=&quot;integer&quot;)
     */
    protected $ncomments = 0;

    /**
     * @ORM\Column(type=&quot;boolean&quot;)
     */
    protected $active = false;

    /**
     * @ORM\Column(type=&quot;datetime&quot;, name=&quot;updated_at&quot;)
     */
    protected $updatedAt;

    /**
     * @ORM\Column(type=&quot;datetime&quot;, name=&quot;created_at&quot;)
     */
    protected $createdAt;

    public function __construct()
    {
        $this-&gt;categories = new \Doctrine\Common\Collections\ArrayCollection();
        $this-&gt;createdAt = new \DateTime();
        $this-&gt;updatedAt = new \DateTime();
    }
}
</pre>
<p>Modelo para Category:</p>
<pre class="brush: php; title: ; notranslate">
&lt;?php
// Montes/AdictosBundle/Entity/Category.php

namespace Montes\AdictosBundle\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
 * @ORM\Entity
 */
class Category
{
    /**
     * @ORM\Id
     * @ORM\Column(type=&quot;integer&quot;)
     * @ORM\GeneratedValue(strategy=&quot;AUTO&quot;)
     */
    protected $id;

    /**
     * @ORM\OneToMany(targetEntity=&quot;Category&quot;, mappedBy=&quot;parent&quot;)
     */
    protected $children;

    /**
     * @ORM\ManyToOne(targetEntity=&quot;Category&quot;, inversedBy=&quot;children&quot;)
     * @ORM\JoinColumn(name=&quot;parent_id&quot;, referencedColumnName=&quot;id&quot;)
     * @ORM\Column(nullable=&quot;true&quot;)
     */
    protected $parent;

    /**
     * @ORM\ManyToMany(targetEntity=&quot;Store&quot;, mappedBy=&quot;categories&quot;)
     */
    protected $stores;

    /**
     * @ORM\Column(type=&quot;string&quot;, length=&quot;255&quot;)
     */
    protected $name;

    /**
     * @ORM\Column(type=&quot;string&quot;, length=&quot;255&quot;, name=&quot;url_string&quot;, unique=&quot;true&quot;)
     */
    protected $urlString;

    public function __construct()
    {
        $this-&gt;stores = new \Doctrine\Commmon\Collections\ArrayCollection();
    }
}
</pre>
<p>Y ahora vamos a consola y para generar las tablas en la base de datos ejecutamos:</p>
<pre class="brush: bash; title: ; notranslate">
php app/console doctrine:schema:create
</pre>
<p>y para completar nuestro modelo con sus getters/setters:</p>
<pre class="brush: bash; title: ; notranslate">
php app/console doctrine:generate:entities MontesAdictosBundle
</pre>
<p>&nbsp;</p>
<h2>7. Probando el modelo</h2>
<p>Vamos a cambiar la acción que muestra la tienda a su propia acción (storeAction) para hacer hueco al índice del store controller en indexAction, que ahora mostrará el total de tiendas que tenemos almacenadas en la BD.</p>
<pre class="brush: bash; title: ; notranslate">
# app/config/routing_dev.yml
store:
    pattern: /adictos/{store}
    defaults: { _controller: MontesAdictosBundle:Store:store }

store_index:
    pattern: /adictos/
    defaults: { _controller: MontesAdictosBundle:Store:index }
</pre>
<pre class="brush: php; title: ; notranslate">
&lt;?php
// Montes/AdictosBundle/Controller/StoreController.php

namespace Montes\AdictosBundle\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template;

class StoreController extends Controller
{

    /**
     * @Template()
     */
    public function indexAction()
    {
        $em = $this-&gt;get('doctrine.orm.entity_manager');
        $stores = $em-&gt;createQuery('SELECT count(s.id) AS total FROM Montes\AdictosBundle\Entity\Store s')-&gt;getSingleScalarResult();
        return array('stores' =&gt; $stores);
    }

    /**
     * @Template()
     */
    public function storeAction($store)
    {
        return array('store' =&gt; $store);
    }
}

</pre>
<pre class="brush: xml; title: ; notranslate">
&lt;!-- Montes/AdictosBundle/Resources/views/Store/index.html.twig --&gt;
We have a total of {{ stores }} stores.
</pre>
<pre class="brush: xml; title: ; notranslate">
&lt;!-- Montes/AdictosBundle/Resources/views/Store/store.html.twig --&gt;
So you want store &quot;{{ store }}&quot;?
</pre>
<p>Ahora al cargar <a target="_blank" href="http://127.0.0.1/app_dev.php/adictos/">http://127.0.0.1/app_dev.php/adictos/</a> nos saldrá <em>We have a total of 0 stores</em> y al cargar <a target="_blank" href="http://127.0.0.1/app_dev.php/adictos/mi-tienda">http://127.0.0.1/app_dev.php/adictos/mi-tienda</a> nos saldrá <em>So you want store &#8220;mi-tienda&#8221;?</em></p>
<img src="http://feeds.feedburner.com/~r/mooontes/~4/zEpPs3V3MMU" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://mooontes.com/2011/03/27/symfony2-tutorial-para-comenzar-ultra-rapido/feed/</wfw:commentRss>
		<slash:comments>25</slash:comments>
		<feedburner:origLink>http://mooontes.com/2011/03/27/symfony2-tutorial-para-comenzar-ultra-rapido/</feedburner:origLink></item>
		<item>
		<title>USB TDT (DVB-T) HD para Ubuntu, OSX y Windows</title>
		<link>http://feedproxy.google.com/~r/mooontes/~3/DSrCsBWgSKU/</link>
		<comments>http://mooontes.com/2010/11/29/usb-tdt-dvb-t-hd-para-ubuntu-osx-y-windows/#comments</comments>
		<pubDate>Mon, 29 Nov 2010 18:32:53 +0000</pubDate>
		<dc:creator>montes</dc:creator>
				<category><![CDATA[Hardware]]></category>
		<category><![CDATA[dvb-t]]></category>
		<category><![CDATA[osx]]></category>
		<category><![CDATA[tdt]]></category>
		<category><![CDATA[ubuntu]]></category>
		<category><![CDATA[usb]]></category>
		<category><![CDATA[windows]]></category>

		<guid isPermaLink="false">http://mooontes.com/?p=365</guid>
		<description><![CDATA[Llevaba tiempo buscando una tarjeta o USB TDT HD que fuese compatible con los tres sistemas operativos que utilizo y al final lo he encontrado, es el WinTV NOVA-T-HD: Funciona tanto en Ubuntu 10.10 como OSX 10.6.5 sólo conectándolo, no hay que configurar nada. En el caso de Windows aún no he probado, pero trae [...]]]></description>
				<content:encoded><![CDATA[<p>Llevaba tiempo buscando una tarjeta o USB TDT HD que fuese compatible con los tres sistemas operativos que utilizo y al final lo he encontrado, es el WinTV NOVA-T-HD:<br />
<a href="http://www.hauppauge.es/site/products/data_novathdstick.html"><img src="http://mooontes.com/wp-content/uploads/2010/11/novathdstick_top-300x96.jpg" alt="wintv nova-tdt-hd" title="wintv nova-tdt-hd" width="450" class="alignnone size-medium wp-image-367" /></a></p>
<p>Funciona tanto en Ubuntu 10.10 como OSX 10.6.5 sólo conectándolo, no hay que configurar nada. En el caso de Windows aún no he probado, pero trae un CD con los drivers.</p>
<p>En Ubuntu 10.10 yo lo uso con Me TV (<em>sudo aptitude install me-tv</em>)</p>
<p><img src="http://mooontes.com/wp-content/uploads/2010/11/me-tv.png" alt="" title="me-tv" width="567" height="419" class="alignnone size-full wp-image-373" /></p>
<p>En OSX sólo hay que instalar <a href='http://www.elgato.com/elgato/int/mainmenu/products/software/EyeTV-3/product1.en.html'>Eye TV</a> y funcionará perfectamente, ya que este USB es el que llevan dentro los famosos USB de &#8220;elgato&#8221; para Mac.</p>
<p>Yo la compré en un MediaMarkt, creo recordar que por algo menos de 50€ pero se encuentra fácil por internet, por ejemplo en <a href='http://www.pixmania.com/es/es/4031007/art/hauppauge/memoria-usb-wintv-nova-t.html'>pixmania</a>.</p>
<p>- Review en castellano: <a href='http://www.mashardware.com/index.php?/Articulos/Review-de-la-sintonizadora-Hauppauge-WinTV-NOVA-T-HD.html'>mashardware.com</a></p>
<img src="http://feeds.feedburner.com/~r/mooontes/~4/DSrCsBWgSKU" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://mooontes.com/2010/11/29/usb-tdt-dvb-t-hd-para-ubuntu-osx-y-windows/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		<feedburner:origLink>http://mooontes.com/2010/11/29/usb-tdt-dvb-t-hd-para-ubuntu-osx-y-windows/</feedburner:origLink></item>
	</channel>
</rss>
