<?xml version='1.0' encoding='UTF-8'?><rss xmlns:atom='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0' version='2.0'><channel><atom:id>tag:blogger.com,1999:blog-9191328551308072706</atom:id><lastBuildDate>Sun, 20 May 2012 01:23:01 +0000</lastBuildDate><category>logging</category><category>nasa</category><category>HK</category><category>javascript</category><category>tiempo</category><category>matemáticas</category><category>MSL</category><category>youtube</category><category>phobos-grunt</category><category>http</category><category>ebook</category><category>chrome</category><category>citas</category><category>sinCiencia</category><category>ATV</category><category>ecologia</category><category>python</category><category>walkandlisten</category><category>filosofia</category><category>alternativa3</category><category>scp</category><category>warming</category><category>kvm</category><category>rrhh</category><category>kind</category><category>apache</category><category>virtualización</category><category>astro</category><category>marte</category><category>mysql</category><category>curs TIC</category><category>técnica</category><category>ssh</category><category>eivissa</category><category>empresa</category><category>bookmarks</category><category>django</category><category>ibiza</category><category>kindle</category><category>sf</category><category>jquery</category><category>programación</category><category>Linux</category><category>viking</category><category>mod_rewrite</category><category>mart</category><category>https</category><category>qemu</category><category>ESA</category><category>ubuntu</category><category>ciencia</category><category>series</category><category>biblioteca</category><category>estadistica</category><title>Estribancus</title><description>Blog personal de'n Pere Vilàs</description><link>http://www.pvilas.com/</link><managingEditor>noreply@blogger.com (Pere Vilás)</managingEditor><generator>Blogger</generator><openSearch:totalResults>100</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-9191328551308072706.post-8128060844564497628</guid><pubDate>Sat, 05 May 2012 20:09:00 +0000</pubDate><atom:updated>2012-05-05T22:27:20.272+02:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>sinCiencia</category><title>#sinCiencia No al recorte en ciencia</title><description>&lt;span style="background-color: white; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 13px; line-height: 18px; text-align: left;"&gt;Me sumo&amp;nbsp;también a la iniciativa&amp;nbsp;&lt;/span&gt;&lt;a href="http://amazings.es/2012/04/25/sinciencia-no-hay-futuro/" style="background-color: white; color: #3d85c6; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 13px; line-height: 18px; text-align: left; text-decoration: none;"&gt;&lt;b&gt;#sinCiencia&lt;/b&gt;&lt;/a&gt;&lt;span style="background-color: white; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 13px; line-height: 18px; text-align: left;"&gt;&amp;nbsp;lanzada por&lt;/span&gt;&lt;span style="background-color: white; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 13px; line-height: 18px; text-align: left;"&gt;&amp;nbsp;&lt;/span&gt;&lt;a href="http://www.amazings.es/" style="background-color: white; color: #3d85c6; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 13px; line-height: 18px; text-align: left; text-decoration: none;"&gt;Amazings&lt;/a&gt;&lt;span style="background-color: white; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 13px; line-height: 18px; text-align: left;"&gt;&amp;nbsp;para concienciar sobre la catástrofe que suponen los recortes en ciencia para el futuro de España.&lt;/span&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif;"&gt;&lt;span style="font-size: 12px; line-height: 16px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;span style="background-color: white; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 12px; line-height: 16px; text-align: justify;"&gt;1) Es cierto que no se forma a los universitarios ni en la la innovación ni en la forma de desarrollar proyectos propios. Por lo tanto, son muchos conocimientos que generan un valor añadido muy pequeño o nulo. Supongo que el Plan Bolonia mejorará este tema.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="background-color: white; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 12px; line-height: 16px; text-align: justify;"&gt;2) Los empresarios españoles de mi área geográfica no tienen el más mínimo interés en invertir ni siquiera una pequeña parte de los inmensos excedentes generados durante la época de las vacas gordas en proyectos que se salgan de lo tradicional. Esto provoca que la economía acabe dependiendo de uno o dos sectores con lo que se hace vulnerable. Por otra parte, estos sectores suelen requerir mano de obra de baja cualificación.&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="background-color: white; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 12px; line-height: 16px; text-align: justify;"&gt;Esto contrasta con algunos países (que entraron antes en la revolución industrial) en los que rápidamente se aplicó con éxito la ciencia a la actividad económica.&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="background-color: white; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 12px; line-height: 16px; text-align: justify;"&gt;En conclusión, si los que vienen por abajo no son innovadores y los que ya están arriba no se gastan un duro en tirar del carro de la innovación pues como que tenemos un problema.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="background-color: white; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 12px; line-height: 16px; text-align: justify;"&gt;Mi impresión es que se trata de un problema cultural: si no se valora la ciencia, tampoco se valora la innovación. Sin innovación no hay crecimiento económico.&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="background-color: white; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 12px; line-height: 16px; text-align: justify;"&gt;Un problema cultural no se soluciona a base de meter pasta, se soluciona con voluntad y con el esfuerzo de educar a la población desde muy pequeñitos en valores como la racionalidad, el método científico y el placer de descubir y conocer lo que nos rodea.&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="background-color: white; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 12px; line-height: 16px; text-align: justify;"&gt;Hay que decir bien claro que es verdad que lo que hace un futbolista es divertido, pero que también lo es diseñar timones de barcos o antibióticos. Y qué decir de encontrar una nueva necesidad e intentar ganar dinero con ello... ¡aunque a veces no se tenga éxito!.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="background-color: white; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 12px; line-height: 16px; text-align: justify;"&gt;Estoy hablando de un compromiso de toda la sociedad, a todos los niveles, para cambiar nuestras prioridades en pos de conseguir un mejor futuro.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="background-color: white; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 12px; line-height: 16px; text-align: justify;"&gt;En una sociedad moderna y cohesionada como la nuestra (toco madera), si empezamos ahora deberíamos conseguir resultados en unos diez o quince años. Entre todos, somos capaces de hacerlo.&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9191328551308072706-8128060844564497628?l=www.pvilas.com' alt='' /&gt;&lt;/div&gt;</description><link>http://www.pvilas.com/2012/05/sinciencia-no-al-recorte-en-ciencia.html</link><author>noreply@blogger.com (Pere Vilás)</author><thr:total>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-9191328551308072706.post-3208962524709676102</guid><pubDate>Wed, 02 May 2012 10:44:00 +0000</pubDate><atom:updated>2012-05-02T12:44:54.699+02:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>Linux</category><category domain='http://www.blogger.com/atom/ns#'>ssh</category><category domain='http://www.blogger.com/atom/ns#'>scp</category><title>Copiar bajo ssh : scp</title><description>Para copiar ficheros via ssh podemos usar el comando scp, con la siguiente sintaxis:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;scp /home/usuario/fichero usuario@host:/destino&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9191328551308072706-3208962524709676102?l=www.pvilas.com' alt='' /&gt;&lt;/div&gt;</description><link>http://www.pvilas.com/2012/05/copiar-bajo-ssh-scp.html</link><author>noreply@blogger.com (Pere Vilás)</author><thr:total>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-9191328551308072706.post-7003628576472672642</guid><pubDate>Mon, 23 Apr 2012 09:22:00 +0000</pubDate><atom:updated>2012-04-23T11:22:28.307+02:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>python</category><title>Dado un numero de semana ¿Cuál es la fecha del lunes? / Given an (iso) week number, Whats the date of Monday?</title><description>&lt;br /&gt;¿En qué semana cae el 7 de junio de 2012? / What's the week number of june 7, 2012?&lt;br /&gt;&lt;pre class="default prettyprint" style="background-attachment: initial; background-clip: initial; background-color: white; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-image: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; font-family: Consolas, Menlo, Monaco, 'Lucida Console', 'Liberation Mono', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Courier New', monospace, serif; font-size: 14px; line-height: 18px; margin-bottom: 10px; max-height: 600px; overflow-x: auto; overflow-y: auto; padding-bottom: 5px; padding-left: 5px; padding-right: 5px; padding-top: 5px; text-align: left; vertical-align: baseline; width: auto;"&gt;&lt;code style="background-attachment: initial; background-clip: initial; background-color: #eeeeee; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-image: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; font-family: Consolas, Menlo, Monaco, 'Lucida Console', 'Liberation Mono', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Courier New', monospace, serif; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;&lt;span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-image: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;datetime&lt;/span&gt;&lt;span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-image: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;.&lt;/span&gt;&lt;span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-image: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;date&lt;/span&gt;&lt;span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-image: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;(&lt;/span&gt;&lt;span class="lit" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-image: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: maroon; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;2012&lt;/span&gt;&lt;span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-image: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;,&lt;/span&gt;&lt;span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-image: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt; &lt;/span&gt;&lt;span class="lit" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-image: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: maroon; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;6&lt;/span&gt;&lt;span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-image: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;,&lt;/span&gt;&lt;span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-image: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt; &lt;span style="color: maroon;"&gt;7&lt;/span&gt;&lt;/span&gt;&lt;span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-image: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;).&lt;/span&gt;&lt;span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-image: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;isocalendar&lt;/span&gt;&lt;span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-image: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;()[&lt;/span&gt;&lt;span class="lit" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-image: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: maroon; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;1&lt;/span&gt;&lt;span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-image: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;]&lt;/span&gt;&lt;span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-image: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span class="lit" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-image: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: maroon; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;23&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;¿Cuál es el lunes de la semana 23 de 2012?. What's the monday of the week 23 of 2012?&lt;br /&gt;&lt;br /&gt;&lt;pre class="default prettyprint" style="background-attachment: initial; background-clip: initial; background-color: white; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-image: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; margin-bottom: 10px; max-height: 600px; overflow-x: auto; overflow-y: auto; padding-bottom: 5px; padding-left: 5px; padding-right: 5px; padding-top: 5px; text-align: left; vertical-align: baseline; width: auto;"&gt;&lt;code style="background-attachment: initial; background-clip: initial; background-color: #eeeeee; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-image: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;&lt;span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-image: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;&lt;span style="font-family: Consolas, Menlo, Monaco, 'Lucida Console', 'Liberation Mono', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Courier New', monospace, serif;"&gt;&lt;span style="font-size: 14px; line-height: 18px;"&gt;time.asctime(time.strptime(('%s %s 1' % (2012, 23,)), '%Y %U %w'))&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="lit" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-image: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: maroon; font-family: Consolas, Menlo, Monaco, 'Lucida Console', 'Liberation Mono', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Courier New', monospace, serif; font-size: 14px; line-height: 18px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;'Mon Jun  4 00:00:00 2012' &lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9191328551308072706-7003628576472672642?l=www.pvilas.com' alt='' /&gt;&lt;/div&gt;</description><link>http://www.pvilas.com/2012/04/dado-un-numero-de-semana-cual-es-la.html</link><author>noreply@blogger.com (Pere Vilás)</author><thr:total>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-9191328551308072706.post-4421477735172986412</guid><pubDate>Fri, 23 Mar 2012 12:12:00 +0000</pubDate><atom:updated>2012-03-23T16:19:11.301+01:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>http</category><category domain='http://www.blogger.com/atom/ns#'>mod_rewrite</category><category domain='http://www.blogger.com/atom/ns#'>https</category><category domain='http://www.blogger.com/atom/ns#'>apache</category><title>Apache redireccionar ciertas ip hacia https</title><description>&lt;br /&gt;Queremos que sólo ciertas ip tengan acceso a contenido con http, y las demás las queremos redirigir a https. ¿Cómo lo hacemos?.&lt;br /&gt;&lt;br /&gt;&lt;div&gt;Podemos usar mod_rewrite con estas reglas:&lt;/div&gt;&lt;div&gt;&lt;code&gt;&lt;br class="Apple-interchange-newline" /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;RewriteEngine On&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;RewriteCond %{REMOTE_ADDR} !^192\.168\.1\.4$&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}&lt;/code&gt;&lt;/div&gt;&lt;br /&gt;En este caso, sólo la dirección 192.168.1.4 tendría acceso via http, los demás serían redireccionados a https.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9191328551308072706-4421477735172986412?l=www.pvilas.com' alt='' /&gt;&lt;/div&gt;</description><link>http://www.pvilas.com/2012/03/apache-redireccionar-ciertas-ip-hacia.html</link><author>noreply@blogger.com (Pere Vilás)</author><thr:total>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-9191328551308072706.post-7328892826951131377</guid><pubDate>Fri, 23 Mar 2012 12:12:00 +0000</pubDate><atom:updated>2012-03-23T16:20:38.467+01:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>http</category><category domain='http://www.blogger.com/atom/ns#'>mod_rewrite</category><category domain='http://www.blogger.com/atom/ns#'>https</category><category domain='http://www.blogger.com/atom/ns#'>apache</category><title>Apache redirect some ip to https</title><description>We want to allow some ip to http an redirect the rest to https. How can we do it?&lt;br /&gt;&lt;br /&gt;We can use mod_rewrite with these rules:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;RewriteEngine On&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;RewriteCond %{REMOTE_ADDR} !^192\.168\.1\.4$&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;In this case only 192.168.1.4 gets access to http, other ips will be redirected to https. &lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9191328551308072706-7328892826951131377?l=www.pvilas.com' alt='' /&gt;&lt;/div&gt;</description><link>http://www.pvilas.com/2012/03/apache-redirect-some-ip-to-https.html</link><author>noreply@blogger.com (Pere Vilás)</author><thr:total>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-9191328551308072706.post-8830795268501378822</guid><pubDate>Thu, 22 Mar 2012 19:50:00 +0000</pubDate><atom:updated>2012-03-22T20:50:30.504+01:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>Linux</category><category domain='http://www.blogger.com/atom/ns#'>ubuntu</category><title>Yet another apache ssl installation manual on debian ubuntu / Aún otro manual de instalación de apache ssl en debian ubuntu</title><description>Nunca había instalado apache con SSL en debian. El proceso es muy sencillo: &lt;br /&gt;&lt;br /&gt;Activar el módulo ssl:&lt;br /&gt;&lt;span style="font-family: monospace;"&gt;sudo a2enmod ssl&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Crear el certificado; primero lo creamos y luego lo copiamos en el directorio por defecto:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt;$mkdir ssl&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt;cd ssl&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt;openssl genrsa -des3 -out server.key 1024&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt;openssl rsa -in server.key -out server.key.insecure&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt;openssl req -new -key server.key -out server.csr&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt;openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Nota: si no queremos que cada vez que arrancamos el servidor http nos pida la clave del certificado hacemos, &lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt;openssl rsa -in server.key -out server.key.nopass&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Y ahora "instalamos" el certificado,&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt;sudo cp server.crt /etc/ssl/certs&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt;sudo cp server.key.nopass /etc/ssl/private&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;En nuestro fichero de configuración de apache tenemos que añadir algo parecido a esto:&lt;br /&gt;&lt;code&gt; virtualhost *:443&lt;br /&gt; DocumentRoot /var/www/blahblah&lt;br /&gt;        SSLEngine on&lt;br /&gt; SSLCertificateFile /etc/ssl/certs/server.crt&lt;br /&gt; SSLCertificateKeyFile /etc/ssl/private/server.key.nopass&lt;br /&gt;&lt;br /&gt;....&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;Ahora rearrancamos el servidor con &lt;code&gt;sudo service apache2 restart&lt;/code&gt;, y ya tenemos soporte SSL. Naturalmente, como el certificado lo creamos nosotros, los navegadores nos avisarán de que no ha sido emitido por una entidad de confianza pero tendremos las comunicaciones con el servidor aseguradas por https.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9191328551308072706-8830795268501378822?l=www.pvilas.com' alt='' /&gt;&lt;/div&gt;</description><link>http://www.pvilas.com/2012/03/yet-another-apache-ssl-installation.html</link><author>noreply@blogger.com (Pere Vilás)</author><thr:total>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-9191328551308072706.post-1782014956126799697</guid><pubDate>Sun, 11 Mar 2012 20:40:00 +0000</pubDate><atom:updated>2012-03-11T21:41:41.572+01:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>mysql</category><category domain='http://www.blogger.com/atom/ns#'>python</category><title>Usar cliente Mysql python en windows</title><description>Si has intentado, sin éxito, instalar el módulo MySQLdb en windows tal vez te interese pasar por &lt;a href="http://www.codegood.com/"&gt;este&lt;/a&gt; sitio web y bajarte el instalador para windows en vez de tener que compilar las librerías en tu PC ;-)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9191328551308072706-1782014956126799697?l=www.pvilas.com' alt='' /&gt;&lt;/div&gt;</description><link>http://www.pvilas.com/2012/03/usar-cliente-mysql-con-python.html</link><author>noreply@blogger.com (Pere Vilás)</author><thr:total>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-9191328551308072706.post-5799396888174107587</guid><pubDate>Thu, 08 Mar 2012 17:57:00 +0000</pubDate><atom:updated>2012-03-08T19:30:53.218+01:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>python</category><title>Paso de parámetros a programas en python / How to pass parameters to a python program</title><description>Para pasar parámetros a los programas se usa el módulo getopt, que nos permite trabajar cómodamente con ellos.&lt;br /&gt;&lt;br /&gt;En primer lugar tenemos que saber que el contenido de la línea de comandos nos viene en forma de lista en sys.argv. &lt;br /&gt;&lt;br/&gt;Si invocamos un programa en python, como parámetros nos interesará todo lo que venga después de la primera posición, es decir sys.argv[1:], así que en general llamaremos a una función main así &lt;br /&gt;&lt;pre class="brush: python"&gt;if __name__=='__main__':&lt;br /&gt; main(sys.argv[1:])&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Ahora veremos el funcionamiento de getopt, os paso un ejemplo:&lt;br /&gt;&lt;pre class="brush: python"&gt;def main(argv): &lt;br /&gt; try:      &lt;br /&gt;  opts, args = getopt.getopt(argv, "hps:", &lt;br /&gt;                                                  ["help", "prn", "server="])&lt;br /&gt; except getopt.GetoptError:          &lt;br /&gt;  print "Opcion no valida"&lt;br /&gt;  usage()                         &lt;br /&gt;  sys.exit(2)                     &lt;br /&gt;  &lt;br /&gt;&lt;/pre&gt;Vemos que getopt toma tres argumentos:&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;El primero es la cadena que le pasamos para analizar&lt;/li&gt;&lt;li&gt;El segundo son las opciones en forma corta, las que se usan con la sintaxis -h, -p, -s="algo"&lt;/li&gt;&lt;li&gt;El tercero son las mismas opciones pero en forma larga que se usan con dos guiones --help, --prn, --server="algo"&lt;/li&gt;&lt;/ol&gt;Observamos que las opciones en forma corta seguidas de dos puntos o en forma larga seguidas del símbolo igual esperan que les pasemos un argumento. Getopt se encarga de que si al programa le pasamos alguna opción que no esté en la lista salte la excepción GetoptError.&lt;br /&gt;&lt;br/&gt;Como ahora ya tenemos las opciones y sus posibles valores, el tratamiento será algo similar a esto&lt;br /&gt;&lt;pre class="brush: python"&gt;for opt, arg in opts:                &lt;br /&gt;  if opt in ("-h", "--help"):      &lt;br /&gt;   usage()                     &lt;br /&gt;   sys.exit()                  &lt;br /&gt;  elif opt in ('-p', "--prn"):                &lt;br /&gt;   p_pantalla=True             &lt;br /&gt;  elif opt in ("-s", "--server"):          &lt;br /&gt;   r_server=arg            &lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Si hay algún tipo de error durante el parseado de los argumentos, es una buena idea dar una ayuda al usuario antes de terminar el programa, por ejemplo &lt;br /&gt;&lt;div&gt;&lt;pre class="brush: python"&gt;def usage():&lt;br /&gt; print """&lt;br /&gt;Opcions:&lt;br /&gt;--help (-h)\t\tTreu aquesta ajuda&lt;br /&gt;--prn (-p)\t\tTreu impressio de tickets per pantalla&lt;br /&gt;--server (-s)\t\tServidor actualització&lt;br /&gt;"""&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Y esto es todo por hoy&lt;br/&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9191328551308072706-5799396888174107587?l=www.pvilas.com' alt='' /&gt;&lt;/div&gt;</description><link>http://www.pvilas.com/2012/03/paso-de-parametros-programas-en-python.html</link><author>noreply@blogger.com (Pere Vilás)</author><thr:total>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-9191328551308072706.post-6003983736052151865</guid><pubDate>Wed, 07 Mar 2012 15:56:00 +0000</pubDate><atom:updated>2012-03-16T12:13:06.466+01:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>ebook</category><category domain='http://www.blogger.com/atom/ns#'>biblioteca</category><title>El cierre de library.nu o la quema de la biblioteca de Alejandría</title><description>El cierre por parte de un juez de Munich del sitio web library.nu a instancias de un grupo de 17 editoriales, está siendo comparada por algunos de los partidarios de la web con la quema de la biblioteca de Alejandría.&amp;nbsp; &lt;br /&gt;&lt;br /&gt;library.nu era el sitio web de compartición de &lt;b&gt;ebooks técnico-científicos&lt;/b&gt; más importante de Internet.&lt;br /&gt;&lt;br /&gt;No voy a entrar una vez más en el cansino asunto de si los propietarios legales de los derechos de los textos (no necesariamente los autores) deben poder cerrar un sitio web donde un tercero ha colgado un link. Lo único que si parece probado es que &lt;b&gt;la mayoría de las descargas provenían de países del tercer mundo&lt;/b&gt; y ese es el verdadero drama en todo esto.&lt;br /&gt;&lt;br /&gt;No estamos hablando de un peliculasyonkis o de un seriespepito, estamos hablando del cierre de un sitio que compartía enlaces a libros de ciencia y tecnología que de ninguna otra manera van a ser accesibles por los habitantes de un tercer mundo hambriento de conocimiento, al que se le van a cortar más si cabe los recursos necesarios para progresar.&lt;br /&gt;&lt;br /&gt;Pero es que además la industria editorial sigue sin darse cuenta de que los ricachones del primer mundo van a comprarse el libro en papel &lt;b&gt;si este les es útil&lt;/b&gt;. Yo mismo he pedido varios libros en amazon de Estados Unidos que había encontrado y "hojeado" en library.nu. Si no fuera por este sitio nisiquiera tendría idea de su existencia puesto que no se distribuyen en España.&lt;br /&gt;&lt;br /&gt;Creedme lectores cuando afirmo que si no se democratiza de alguna forma justa el acceso al conocimiento, e Internet parece el medio idóneo para hacerlo, vamos a observar el aumento de las injusticias en el mundo.&lt;br /&gt;&lt;br /&gt;Os dejo &lt;a href="http://gen.lib.rus.ec/"&gt;este link&lt;/a&gt; por si os es de utilidad.&lt;br /&gt;&lt;br /&gt;Para leer más:&lt;br /&gt;&lt;br /&gt;Artículo de Christopher Kelty, profesor de la U. de California, en Aljazeera: &lt;a href="http://www.aljazeera.com/indepth/opinion/2012/02/2012227143813304790.html"&gt;The disappearing virtual library&lt;/a&gt;. Donde afirma que "leer será tener una copia ilegal en el cerebro" y que "los bárbaros que pusieron la industria editorial de rodillas no eran otros que estudiantes de cada rincón del planeta".&lt;br /&gt;&lt;br /&gt;Artículo del periódico Huffington Post anunciando el cierre: &lt;a href="http://www.huffingtonpost.com/2012/02/15/librarynu-book-downloading-injunction_n_1280383.html?ref=books"&gt;Library.nu, Book Downloading Site, Targeted In Injunctions Requested By 17 Publishers&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9191328551308072706-6003983736052151865?l=www.pvilas.com' alt='' /&gt;&lt;/div&gt;</description><link>http://www.pvilas.com/2012/03/la-quema-de-biblioteca-de-alejandria.html</link><author>noreply@blogger.com (Pere Vilás)</author><thr:total>2</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-9191328551308072706.post-6778568323474234976</guid><pubDate>Mon, 05 Mar 2012 15:39:00 +0000</pubDate><atom:updated>2012-03-06T19:14:20.351+01:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>mysql</category><title>Acceso remoto a servidor Mysql</title><description>Para acceder remotamente a un servidor Mysql lo mejor es usar ssh y hacerlo en local desde la shell pero en los casos en que tengamos que conectar necesariamente desde otro host lo podemos hacer de la siguiente forma:&lt;br /&gt;&lt;br /&gt;1.- Editamos (/etc/mysql/my.cnf en Debian, /etc/my.cnf en CentOS) y ponemos la bind-address como la IP del propio servidor. Reiniciar el servicio mysql. Esto hará que escuche en el puerto 3306 del propio servidor en vez de sólo el bucle local localhost.&lt;br /&gt;&lt;br /&gt;&lt;div style="border: 1px solid #DDD; padding: 1em 0.75em;"&gt;&lt;code&gt;bind-address = ip_servidor&lt;/code&gt;&lt;/div&gt;&lt;br /&gt;Si está presente la directiva skip-networking hay que comentarla&lt;br /&gt;&lt;br /&gt;2.- Crear un usuario remoto. Entar en mysql y hacer&lt;br /&gt;&lt;br /&gt;&lt;div style="border: 1px solid #DDD; padding: 1em 0.75em;"&gt;&lt;code&gt;GRANT ALL ON nombre_db.* TO 'usuario'@'ip-usuario' IDENTIFIED BY 'password';&lt;/code&gt;&lt;/div&gt;&lt;br /&gt;3.- Abrir el puerto 3306 con iptables,&lt;br /&gt;&lt;div style="border: 1px solid #DDD; padding: 1em 0.75em;"&gt;&lt;code&gt;#iptables -A INPUT -i eth0 -s ip_remota -p tcp --destination-port 3306 -j ACCEPT&lt;br /&gt;#service iptables save&lt;br /&gt;&lt;/code&gt;&lt;/div&gt;O bien, si usamos ufw,&lt;br/&gt;&lt;div style="border: 1px solid #DDD; padding: 1em 0.75em;"&gt;&lt;code&gt;sudo ufw allow proto tcp from ip/mascara to any port 3306&lt;br /&gt;&lt;/code&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9191328551308072706-6778568323474234976?l=www.pvilas.com' alt='' /&gt;&lt;/div&gt;</description><link>http://www.pvilas.com/2012/03/acceso-remoto-servidor-mysql.html</link><author>noreply@blogger.com (Pere Vilás)</author><thr:total>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-9191328551308072706.post-7553030098890716185</guid><pubDate>Sun, 04 Mar 2012 21:15:00 +0000</pubDate><atom:updated>2012-03-05T16:40:53.849+01:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>ESA</category><category domain='http://www.blogger.com/atom/ns#'>ATV</category><title>El ATV3 Edoardo Amaldi, preparado para partir</title><description>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://blogs.esa.int/atv/files/2012/01/esa_atv3_logo1-300x298.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="198" src="http://blogs.esa.int/atv/files/2012/01/esa_atv3_logo1-300x298.jpg" width="200" /&gt;&lt;/a&gt;&lt;/div&gt;El Automated Transfer Vehicle 3 (ATV3) "Edoardo Amaldi" está preparado para partir hacia la ISS el día 23 de marzo de 2012 a las 04:31 GMT.&lt;br /&gt;&lt;br /&gt;La nave es un cargero espacial de 20 T, con 6.6 T de carga útil que es capaz de navegar por si sola hasta la Espación Espacial Internacional (ISS) y amarrar automáticamente con una precisión inferior a seis centímetros.&lt;br /&gt;&lt;br /&gt;El astronauta europeo André Kuipers será el encargado de supervisar la maniobra de atraque.&lt;br /&gt;&lt;br /&gt;Siguiendo la estela de sus predecesores, el cargero suministrará a los tripulantes combustible, comida, agua, oxígeno. También se incluye un sistema que recicla la orina en agua potable.&lt;br /&gt;&lt;br /&gt;La retirada del transbordador espacial por la NASA ha obligado a la ESA a disponer los procesos de &amp;nbsp;fabricación de manera que se consiga una cadencia de un cargero al año. Esto es necesario ya que en este momento sólo los ATV y los japoneses HTV están capacitados para llevar grandes cargas hasta la ISS. Junto a las Progress rusas, también pueden aumentar la órbita de la Estación así como hacerla maniobrar en caso de peligro de choque con basura espacial.&amp;nbsp;En estos momentos ya se está trabajando en el ATV4 "Albert Einstein".&lt;br /&gt;&lt;br /&gt;El Edoardo Amaldi (bautizado así por el gran físico italiano) será lanzado por un Arianne 5 desde el espaciopuerto de la ESA en la Guayana Francesa. Será la carga más pesada lanzada en toda la larga história del lanzador. Después de 171 días de misión, el ATV3 será desorbitado y se desintegrará en la atmósfera no sin antes haber sido cargado con toda la "basura" que ha ido generado la ISS desde la última visita de un cargero.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;object class="BLOGGER-youtube-video" classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0" data-thumbnail-src="http://0.gvt0.com/vi/icZs8bKvIfQ/0.jpg" height="266" width="320"&gt;&lt;param name="movie" value="http://www.youtube.com/v/icZs8bKvIfQ&amp;fs=1&amp;source=uds" /&gt; &lt;param name="bgcolor" value="#FFFFFF" /&gt; &lt;embed width="320" height="266"  src="http://www.youtube.com/v/icZs8bKvIfQ&amp;fs=1&amp;source=uds" type="application/x-shockwave-flash"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9191328551308072706-7553030098890716185?l=www.pvilas.com' alt='' /&gt;&lt;/div&gt;</description><link>http://www.pvilas.com/2012/03/el-atv3-edoardo-amaldi-preparado-para.html</link><author>noreply@blogger.com (Pere Vilás)</author><thr:total>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-9191328551308072706.post-8156454655715747358</guid><pubDate>Thu, 01 Mar 2012 12:03:00 +0000</pubDate><atom:updated>2012-03-04T22:36:07.372+01:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>python</category><title>Con qué día empieza la semana en python?  What's the first day of the week in python?</title><description>Venga, vamos a jugar un poco más con las fechas. ¿Con qué día empezó esta semana?.&lt;br /&gt;&lt;br /&gt;&lt;div style="background-color: lightgrey;"&gt;&lt;code&gt; d=datetime.date.today()&lt;br /&gt;delta=datetime.timedelta(days=1)&lt;br /&gt;fecha_inicio_semana=d-(delta*(d.isoweekday()-1))&lt;br /&gt; &lt;/code&gt;&lt;/div&gt;&lt;br /&gt;Warning, for the the non-ISO calendars such as UK/USA: the function isoweekday assumes that the first day of the week is Monday.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9191328551308072706-8156454655715747358?l=www.pvilas.com' alt='' /&gt;&lt;/div&gt;</description><link>http://www.pvilas.com/2012/03/con-que-dia-empieza-la-semana-en-python.html</link><author>noreply@blogger.com (Pere Vilás)</author><thr:total>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-9191328551308072706.post-693930997859583874</guid><pubDate>Wed, 29 Feb 2012 15:52:00 +0000</pubDate><atom:updated>2012-02-29T17:10:57.957+01:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>django</category><category domain='http://www.blogger.com/atom/ns#'>python</category><title>Menor de edad en python / Legal age in python</title><description>Hoy día 29/02/2012 (29 de febrero de año bisiesto), me he encontrado con que el algoritmo que usaba para el cálculo de minoría de edad me ha fallado. Después de varias indagaciones he dejado este como bueno:&lt;br /&gt;&lt;br /&gt;&lt;div style="background-color: lightgrey;"&gt;&lt;code&gt;from datetime import date, datetime, timedelta&lt;br /&gt;&lt;br /&gt;def menor_edad(nascut):&lt;br /&gt;&amp;nbsp;&amp;nbsp;""" accepts a string date in iso format Y-m-d and returns True if&lt;br /&gt;  &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;it is in spanish legal age today """&lt;br /&gt;&amp;nbsp;&amp;nbsp;t=timedelta(seconds=31556926*18)&lt;br /&gt;&amp;nbsp;&amp;nbsp;fa_divuit=date.today()-t&lt;br /&gt;&amp;nbsp;&amp;nbsp;fecha=datetime.strptime(nascut, '%Y-%m-%d').date()&lt;br /&gt;&amp;nbsp;&amp;nbsp;return (fecha &amp;gt; =fa_divuit)&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9191328551308072706-693930997859583874?l=www.pvilas.com' alt='' /&gt;&lt;/div&gt;</description><link>http://www.pvilas.com/2012/02/menor-de-edad-en-python-legal-age-in.html</link><author>noreply@blogger.com (Pere Vilás)</author><thr:total>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-9191328551308072706.post-8819994942418945581</guid><pubDate>Mon, 27 Feb 2012 19:04:00 +0000</pubDate><atom:updated>2012-02-27T20:44:56.739+01:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>ESA</category><title>Presentación del vector VEGA de la ESA</title><description>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;object class="BLOGGER-youtube-video" classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0" data-thumbnail-src="http://1.gvt0.com/vi/x3XxBuyhyLU/0.jpg" height="266" width="320"&gt;&lt;param name="movie" value="http://www.youtube.com/v/x3XxBuyhyLU&amp;fs=1&amp;source=uds" /&gt; &lt;param name="bgcolor" value="#FFFFFF" /&gt; &lt;embed width="320" height="266"  src="http://www.youtube.com/v/x3XxBuyhyLU&amp;fs=1&amp;source=uds" type="application/x-shockwave-flash"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/div&gt;Aunque sea con un cierto retraso después del lanzamiento inaugural, en este vídeo del constructor aeroespacial italiano Avio podemos ver alguna de las principales características del lanzador.&amp;nbsp;Vega: Un gran trabajo de los italianos con gran participación española.&lt;br /&gt;&lt;br /&gt;En este otro vídeo de Euronews hay entrevistas y se profundiza en los detalles más innovadores del proyecto tales como la estructura hecha en materiales compuestos con el método del "filament winding".&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;object width="320" height="266" class="BLOGGER-youtube-video" classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0" data-thumbnail-src="http://3.gvt0.com/vi/UNspeRxpnjs/0.jpg"&gt;&lt;param name="movie" value="http://www.youtube.com/v/UNspeRxpnjs&amp;fs=1&amp;source=uds" /&gt;&lt;param name="bgcolor" value="#FFFFFF" /&gt;&lt;embed width="320" height="266"  src="http://www.youtube.com/v/UNspeRxpnjs&amp;fs=1&amp;source=uds" type="application/x-shockwave-flash"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9191328551308072706-8819994942418945581?l=www.pvilas.com' alt='' /&gt;&lt;/div&gt;</description><link>http://www.pvilas.com/2012/02/presentacion-del-vector-vega-de-la-esa.html</link><author>noreply@blogger.com (Pere Vilás)</author><thr:total>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-9191328551308072706.post-7074725133443664837</guid><pubDate>Fri, 24 Feb 2012 11:23:00 +0000</pubDate><atom:updated>2012-02-24T12:23:19.953+01:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>django</category><category domain='http://www.blogger.com/atom/ns#'>python</category><title>Filtrado fácil de clave foránea en una ficha de django</title><description>Es sabido que django mapea las claves foráneas a un ModelChoiceField en ModelForm, pero ¿qué ocurre cuando sólo queremos seleccionar un subconjunto de ellas?.&lt;br /&gt;&lt;br /&gt;Por ejemplo, supongamos que estamos dando de alta un empleado y a la hora de seleccionar su categoría sólo queremos que aparezcan las que están asociadas a su sección.&lt;br /&gt;&lt;br /&gt;Tenemos la ficha:&lt;br /&gt;&lt;br /&gt;&lt;div style="background-color: lightgrey;"&gt;&lt;code&gt;&lt;/code&gt;&lt;br /&gt;class AddForm(forms.ModelForm):&lt;br /&gt;&amp;nbsp;&amp;nbsp;class Meta:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;model=Empleado&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;fields=('clave', 'descripcion', 'categoria', 'jefe_seccion', 'email',)&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;La propiedad queryset del campo categoría estará definida por defecto como Categoria.objects.all(), así que hacemos:&lt;br /&gt;&lt;br /&gt;&lt;div style="background-color: lightgrey;"&gt;&lt;code&gt;p=AddForm()&lt;br /&gt;p.fields['categoria'].queryset=Categoria.objects.filter(seccion=self.seccion)&lt;br /&gt;&lt;/code&gt;&lt;/div&gt;&lt;br /&gt;Con lo que en la ficha sólo nos saldrán las categorías de la sección actual.&lt;br /&gt;Otra forma más complicada consiste en pasarle el parámetro al constructor de la clase pero hay que hacerlo con los kwargs por que si no tendremos problemas en cuando queramos usar la ficha para editar.&lt;br /&gt;&lt;br /&gt;&lt;div style="background-color: lightgrey;"&gt;&lt;code&gt;class AddForm(forms.ModelForm):&lt;br /&gt;         &amp;nbsp;&amp;nbsp;categoria=forms.ModelChoiceField( label=u'Categoría', queryset = Categoria.objects.none())&lt;br /&gt;&amp;nbsp;&amp;nbsp;def __init__(self, *args, **kwargs):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;sec = kwargs.pop('sec', None)&lt;br /&gt;  &amp;nbsp;&amp;nbsp;&amp;nbsp;super(AddForm, self).__init__(*args, **kwargs)       &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;if sec:        &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.fields['categoria'].queryset = Categoria.objects.filter(seccion = sec)&lt;br /&gt;&amp;nbsp;&amp;nbsp;class Meta:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;model=Empleado&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;fields=('clave', 'descripcion', 'categoria', 'jefe_seccion', 'email',)&lt;br /&gt;&lt;/code&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9191328551308072706-7074725133443664837?l=www.pvilas.com' alt='' /&gt;&lt;/div&gt;</description><link>http://www.pvilas.com/2012/02/filtrado-facil-de-clave-foranea-en-una.html</link><author>noreply@blogger.com (Pere Vilás)</author><thr:total>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-9191328551308072706.post-894681732374581144</guid><pubDate>Sun, 12 Feb 2012 19:12:00 +0000</pubDate><atom:updated>2012-02-12T20:12:16.235+01:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>programación</category><title>Use subversion in windows with the command line</title><description>if you hate TortoiseSVN and you prefer to work with svn manually, you can use this wonderful client&lt;br /&gt;&lt;br style="background-color: #fafafa; color: #333333; font-family: 'Helvetica Neue Light', HelveticaNeue-Light, 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 19px; text-align: justify;" /&gt;&lt;a href="http://www.collab.net/downloads/subversion/" style="-webkit-transition-delay: initial; -webkit-transition-duration: 0.3s; -webkit-transition-property: color; -webkit-transition-timing-function: initial; background-color: #fafafa; color: #009eb8; display: inline; font-family: 'Helvetica Neue Light', HelveticaNeue-Light, 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 19px; outline-color: initial; outline-style: none; outline-width: initial; text-align: justify; text-decoration: none;"&gt;CollabNet subversion Command-Line Client&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9191328551308072706-894681732374581144?l=www.pvilas.com' alt='' /&gt;&lt;/div&gt;</description><link>http://www.pvilas.com/2012/02/use-subversion-in-windows-with-command.html</link><author>noreply@blogger.com (Pere Vilás)</author><thr:total>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-9191328551308072706.post-8089601815873944319</guid><pubDate>Sun, 12 Feb 2012 19:04:00 +0000</pubDate><atom:updated>2012-02-12T20:33:00.292+01:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>programación</category><title>Usar subversion en windows con la línea de comandos</title><description>Por si alguien odia el TortoiseSVN y prefiere trabajar con el subversion "a mano", recomiendo este cliente de CollabNet&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.collab.net/downloads/subversion/"&gt;CollabNet subversion Command-Line Client&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9191328551308072706-8089601815873944319?l=www.pvilas.com' alt='' /&gt;&lt;/div&gt;</description><link>http://www.pvilas.com/2012/02/usar-subversion-en-windows-con-la-linea.html</link><author>noreply@blogger.com (Pere Vilás)</author><thr:total>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-9191328551308072706.post-9197139328826224329</guid><pubDate>Sat, 11 Feb 2012 16:52:00 +0000</pubDate><atom:updated>2012-02-11T17:52:03.788+01:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>python</category><category domain='http://www.blogger.com/atom/ns#'>programación</category><title>Procesador de texto "Sublime Text"</title><description>No soy yo muy dado a cambiar mi preciado vi para programar. Sin embargo, me he encontrado &lt;a href="http://www.sublimetext.com/"&gt;con este procesador de texto&lt;/a&gt; (hecho en python) que tiene versiones para Linux, Win y Mac. Tiene muy buena pinta. Su nombre es Sublime Text.&lt;br /&gt;&lt;br /&gt;Para empezar a usarlo ve a una carpeta que tenga código. Haz Project-&amp;gt;Save As... luego Project-&amp;gt;Add Folder.&lt;br /&gt;&lt;br /&gt;&amp;nbsp;Voy a probarlo una temporada a ver que tal.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-kWU83KLpccE/Tzace3wXkdI/AAAAAAAAAXA/gHaSQmTQTgI/s1600/pythonHeroSmall.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="249" src="http://3.bp.blogspot.com/-kWU83KLpccE/Tzace3wXkdI/AAAAAAAAAXA/gHaSQmTQTgI/s320/pythonHeroSmall.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9191328551308072706-9197139328826224329?l=www.pvilas.com' alt='' /&gt;&lt;/div&gt;</description><link>http://www.pvilas.com/2012/02/procesador-de-texto-sublime-text.html</link><author>noreply@blogger.com (Pere Vilás)</author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-kWU83KLpccE/Tzace3wXkdI/AAAAAAAAAXA/gHaSQmTQTgI/s72-c/pythonHeroSmall.png' height='72' width='72'/><thr:total>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-9191328551308072706.post-270633461810280566</guid><pubDate>Tue, 07 Feb 2012 18:34:00 +0000</pubDate><atom:updated>2012-02-07T19:34:33.632+01:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>django</category><category domain='http://www.blogger.com/atom/ns#'>logging</category><category domain='http://www.blogger.com/atom/ns#'>python</category><title>Configurar logging en python y django con yaml</title><description>Os paso el esquema de logging que utilizo en mis aplicaciones por si os puede servir de ayuda. Lo he ido montando a partir de diversas fuentes y experiencias.&lt;br /&gt;&lt;br /&gt;Un punto importante es dejar el fichero de configuración del logging fuera del programa para independizar mejor el sistema de logging de la aplicación.&lt;br /&gt;&lt;br /&gt;Este puede ser un ejemplo del fichero de configuración en yaml (logger.conf):&lt;br /&gt;&lt;br /&gt;&lt;div style="background-color: lightgrey;"&gt;&lt;code&gt;&lt;/code&gt;&lt;br /&gt;&lt;code&gt;version: 1&lt;/code&gt;&lt;br /&gt;&lt;code&gt;formatters:&lt;/code&gt;&lt;br /&gt;&lt;code&gt;&amp;nbsp; brief:&lt;/code&gt;&lt;br /&gt;&lt;code&gt;&amp;nbsp; &amp;nbsp; format: '%(name)s - %(levelname)s - %(message)s'&lt;/code&gt;&lt;br /&gt;&lt;code&gt;&amp;nbsp; simple:&lt;/code&gt;&lt;br /&gt;&lt;code&gt;&amp;nbsp; &amp;nbsp; format: '%(asctime)s - %(name)s - %(levelname)s - %(message)s'&lt;/code&gt;&lt;br /&gt;&lt;code&gt;&amp;nbsp; detailed:&lt;/code&gt;&lt;br /&gt;&lt;code&gt;&amp;nbsp; &amp;nbsp; format: '%(asctime)s %(module)-17s line:%(lineno)-4d %(levelname)-8s %(message)s'&lt;/code&gt;&lt;br /&gt;&lt;code&gt;&amp;nbsp; email:&lt;/code&gt;&lt;br /&gt;&lt;code&gt;&amp;nbsp; &amp;nbsp; format: 'Timestamp: %(asctime)s\nModule: %(module)s\n Line: %(lineno)d\nMessage: %(message)s'&lt;/code&gt;&lt;br /&gt;&lt;code&gt;handlers:&lt;/code&gt;&lt;br /&gt;&lt;code&gt;&amp;nbsp; console:&lt;/code&gt;&lt;br /&gt;&lt;code&gt;&amp;nbsp; &amp;nbsp; class: logging.StreamHandler&lt;/code&gt;&lt;br /&gt;&lt;code&gt;&amp;nbsp; &amp;nbsp; level: DEBUG&lt;/code&gt;&lt;br /&gt;&lt;code&gt;&amp;nbsp; &amp;nbsp; formatter: brief&lt;/code&gt;&lt;br /&gt;&lt;code&gt;&amp;nbsp; &amp;nbsp; stream: ext://sys.stdout&lt;/code&gt;&lt;br /&gt;&lt;code&gt;&amp;nbsp; file:&lt;/code&gt;&lt;br /&gt;&lt;code&gt;&amp;nbsp; &amp;nbsp; class: logging.handlers.RotatingFileHandler&lt;/code&gt;&lt;br /&gt;&lt;code&gt;&amp;nbsp; &amp;nbsp; level: INFO&lt;/code&gt;&lt;br /&gt;&lt;code&gt;&amp;nbsp; &amp;nbsp; formatter: detailed&lt;/code&gt;&lt;br /&gt;&lt;code&gt;&amp;nbsp; &amp;nbsp; filename: app.log&lt;/code&gt;&lt;br /&gt;&lt;code&gt;&amp;nbsp; &amp;nbsp; mode: a&lt;/code&gt;&lt;br /&gt;&lt;code&gt;&amp;nbsp; &amp;nbsp; maxBytes: 10485760&lt;/code&gt;&lt;br /&gt;&lt;code&gt;&amp;nbsp; &amp;nbsp; backupCount: 5&lt;/code&gt;&lt;br /&gt;&lt;code&gt;&amp;nbsp; smtp:&lt;/code&gt;&lt;br /&gt;&lt;code&gt;&amp;nbsp; &amp;nbsp; class: logging.handlers.SMTPHandler&lt;/code&gt;&lt;br /&gt;&lt;code&gt;&amp;nbsp; &amp;nbsp; level: ERROR&lt;/code&gt;&lt;br /&gt;&lt;code&gt;&amp;nbsp; &amp;nbsp; formatter: email&lt;/code&gt;&lt;br /&gt;&lt;code&gt;&amp;nbsp; &amp;nbsp; mailhost: smtp.xxxxx.es&lt;/code&gt;&lt;br /&gt;&lt;code&gt;&amp;nbsp; &amp;nbsp; fromaddr: yyy@xxxx.es&lt;/code&gt;&lt;br /&gt;&lt;code&gt;&amp;nbsp; &amp;nbsp; toaddrs: &amp;nbsp;yyyy@xxxx.es&lt;/code&gt;&lt;br /&gt;&lt;code&gt;&amp;nbsp; &amp;nbsp; subject: &amp;nbsp;Error en aplicacion XX&lt;/code&gt;&lt;br /&gt;&lt;code&gt;root:&lt;/code&gt;&lt;br /&gt;&lt;code&gt;&amp;nbsp; level: DEBUG&lt;/code&gt;&lt;br /&gt;&lt;code&gt;&amp;nbsp; handlers: [console]&lt;/code&gt;&lt;/div&gt;&lt;code&gt;&lt;br /&gt;&lt;/code&gt;Se observan los formateadores de los mensajes y los handlers para la cónsola, fichero y correo. Por defecto el logging sale por cónsola, si queremos que los errores salgan por email handlers de root sería [console, smtp], para fichero que rotara cada maxBytes [file], etc... Realmente cómodo.&lt;br /&gt;&lt;br /&gt;Para cargar la configuración, primero parseamos el yaml (PyYAML) y luego lo enviamos a dictConfig, que realiza la configuración así:&lt;br /&gt;&lt;br /&gt;&lt;code&gt; &lt;/code&gt;&lt;br /&gt;&lt;div style="background-color: lightgrey;"&gt;&lt;code&gt;import yaml&lt;br /&gt;import logging&lt;/code&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;#nos aseguramos de que dictConfig esté presente (python 2.7), sino, lo cargamos de la libreria de django&amp;nbsp;&lt;/code&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;code&gt;try:&amp;nbsp;&lt;/code&gt;&lt;br /&gt;&lt;code&gt;&amp;nbsp; &amp;nbsp; from logging.config import dictConfig&amp;nbsp;&lt;/code&gt;&lt;br /&gt;&lt;code&gt;except ImportError:&amp;nbsp;&lt;/code&gt;&lt;br /&gt;&lt;code&gt;&amp;nbsp; &amp;nbsp; from django.utils.dictconfig import dictConfig &lt;br /&gt;&lt;br /&gt;# Cargamos la configuracion del fichero, la parseamos y la enviamos a dictConf&lt;br /&gt;try:&lt;br /&gt;&amp;nbsp; &amp;nbsp; logging.config.dictConfig(yaml.load(file('logger.conf','r')))&lt;br /&gt;except Exception, e:&lt;br /&gt;&amp;nbsp; &amp;nbsp; print "Error configurating logger ", str(e)&lt;br /&gt;&lt;/code&gt;&lt;/div&gt;&lt;br /&gt;Ahora ya podemos el usar el sistema. En general, es conveniente nombrar cada logger con el nombre de su módulo para que cuando haya muchos mensajes sepamos cuál los está enviando, para ello podemos usar el valor de __name__, así:&lt;br /&gt;&lt;br /&gt;&lt;div style="background-color: lightgrey;"&gt;&lt;code&gt;logger=logging.getLogger(__name__) # __name__ contiene el nombre del modulo&lt;br /&gt;logger.debug("blah blah")&lt;/code&gt;&lt;/div&gt;&lt;br /&gt;Si queremos que cada clase tenga su logger privado, tenemos que tomar una pequeña precaución para evitar un error si otros usan una librería nuestra con otro sistema de handles,&lt;br /&gt;&lt;br /&gt;Declaramos una clase "nula":&lt;br /&gt;&lt;br /&gt;&lt;div style="background-color: lightgrey;"&gt;&lt;code&gt;class Nullhandler(logging.Handler):&lt;br /&gt;&amp;nbsp; &amp;nbsp;def emit(self, record):&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;pass&lt;br /&gt;&lt;/code&gt;&lt;/div&gt;&lt;br /&gt;y ahora, en la clase hacemos&lt;br /&gt;&lt;br /&gt;&lt;div style="background-color: lightgrey;"&gt;&lt;code&gt;class Clase():&lt;br /&gt;&amp;nbsp; &amp;nbsp;def __init__(self):&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;self.__logger=logging.getLogger(__name__)&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;self.__logger.addHandler(NullHandler())&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;self.__logger.debug("clase iniciada")&lt;br /&gt;&lt;/code&gt;&lt;/div&gt;&lt;br /&gt;Como veis es un tema un poco denso pero que una vez bien configurado nos será imprescindible para trazar correctamente las aplicaciones. Espero que os haya ayudado.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9191328551308072706-270633461810280566?l=www.pvilas.com' alt='' /&gt;&lt;/div&gt;</description><link>http://www.pvilas.com/2012/02/configurar-logging-en-python-y-django.html</link><author>noreply@blogger.com (Pere Vilás)</author><thr:total>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-9191328551308072706.post-4191992922365237518</guid><pubDate>Mon, 30 Jan 2012 19:30:00 +0000</pubDate><atom:updated>2012-01-30T20:30:55.868+01:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>javascript</category><category domain='http://www.blogger.com/atom/ns#'>jquery</category><title>Obtener valor de radiobutton con JQuery</title><description>Si tenemos un grupo de radiobutton,s podemos conocer cuál ha sido seleccionado con&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &lt;code&gt;$("input[name='nombre de grupo']:checked").val();&amp;nbsp;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: x-small;"&gt; Fuente: &lt;a href="http://lennyvpg.wordpress.com/2009/01/14/obtener-el-valor-radiobutton-seleccionado-en-jquery/"&gt;Blog de Victor Puertas&lt;/a&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9191328551308072706-4191992922365237518?l=www.pvilas.com' alt='' /&gt;&lt;/div&gt;</description><link>http://www.pvilas.com/2012/01/obtener-valor-de-radiobutton-con-jquery.html</link><author>noreply@blogger.com (Pere Vilás)</author><thr:total>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-9191328551308072706.post-2922741471160154911</guid><pubDate>Tue, 27 Dec 2011 18:18:00 +0000</pubDate><atom:updated>2011-12-27T19:21:29.525+01:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>astro</category><category domain='http://www.blogger.com/atom/ns#'>nasa</category><title>¿Un paseito por la Luna?</title><description>&lt;p&gt;Para celebrar fin de año, os propongo este bonito vídeo que he subido a youtube. En él podremos disfrutar un paseo por la superficie lunar con el Lunar Roving Vehicle. A partir del minuto 0:52 la cámara está filmando encima del rover.&lt;/p&gt; &lt;p&gt;El Apolo 16 fué el penúltimo en alunizar y el primero en hacerlo en una zona montañosa. Se lanzo desde Cabo Cañaveral el 16 de Abril de 1972. En total, la misión duró once días de los cuales tres pasaron sobre la superficie de la Luna. El Comandante John Young y el Piloto Charles Duke son los protagonistas del vídeo.&lt;/p&gt; &lt;p&gt;Molts d'anys i bons! Bon 2012!&lt;/p&gt; &lt;iframe width="853" height="480" src="http://www.youtube.com/embed/hVIMGGreyaY?hd=1" frameborder="0" allowfullscreen&gt;&lt;/iframe&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9191328551308072706-2922741471160154911?l=www.pvilas.com' alt='' /&gt;&lt;/div&gt;</description><link>http://www.pvilas.com/2011/12/un-paseito-por-la-luna.html</link><author>noreply@blogger.com (Pere Vilás)</author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://img.youtube.com/vi/hVIMGGreyaY/default.jpg' height='72' width='72'/><thr:total>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-9191328551308072706.post-1230089563061461826</guid><pubDate>Wed, 21 Dec 2011 12:48:00 +0000</pubDate><atom:updated>2011-12-21T13:48:33.562+01:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>eivissa</category><category domain='http://www.blogger.com/atom/ns#'>ibiza</category><title>Ibiza Eivissa en google street view</title><description>¡Me acabo de dar cuenta de que por fin estamos en el Google Street View!&lt;div&gt;&lt;br /&gt; &lt;iframe width="425" height="350" frameborder="0" scrolling="no" marginheight="0" marginwidth="0" src="http://maps.google.com/?ie=UTF8&amp;amp;ll=38.909101,1.437707&amp;amp;spn=0.014777,0.013862&amp;amp;t=h&amp;amp;z=16&amp;amp;vpsrc=6&amp;amp;layer=c&amp;amp;cbll=38.909242,1.433932&amp;amp;panoid=EJS2dphP-Kp15LLVolKESg&amp;amp;cbp=12,311.71,,0,0.61&amp;amp;source=embed&amp;amp;output=svembed"&gt;&lt;/iframe&gt;&lt;br /&gt;&lt;small&gt;&lt;a href="http://maps.google.com/?ie=UTF8&amp;amp;ll=38.909101,1.437707&amp;amp;spn=0.014777,0.013862&amp;amp;t=h&amp;amp;z=16&amp;amp;vpsrc=6&amp;amp;layer=c&amp;amp;cbll=38.909242,1.433932&amp;amp;panoid=EJS2dphP-Kp15LLVolKESg&amp;amp;cbp=12,311.71,,0,0.61&amp;amp;source=embed" style="color:#0000FF;text-align:left"&gt;View Larger Map&lt;/a&gt;&lt;/small&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9191328551308072706-1230089563061461826?l=www.pvilas.com' alt='' /&gt;&lt;/div&gt;</description><link>http://www.pvilas.com/2011/12/ibiza-eivissa-en-google-street-view.html</link><author>noreply@blogger.com (Pere Vilás)</author><thr:total>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-9191328551308072706.post-7698846370809270160</guid><pubDate>Mon, 05 Dec 2011 11:49:00 +0000</pubDate><atom:updated>2011-12-05T13:03:16.200+01:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>django</category><category domain='http://www.blogger.com/atom/ns#'>python</category><title>Shell en django</title><description>Ocurre muchas veces que necesitamos una shell en django para realizar pruebas o tareas de mantenimiento. Conseguirla es muy sencillo ya que settings.py se cargará desde el primer momento en que importemos un modelo o cualquier módulo de django. &amp;nbsp;Lo único que tenemos que hacer es exportar la variable DJANGO_SETTINGS_MODULE con el valor del fichero de settings que queremos utilizar. Yo uso este script (suponiendo que nuestros settings están en settings.py):&lt;br /&gt;&lt;br /&gt;&lt;b&gt;shell.sh&lt;/b&gt;&lt;br /&gt;&lt;code&gt;export DJANGO_SETTINGS_MODULE="settings"&lt;/code&gt;&lt;br /&gt;&lt;code&gt;python &lt;/code&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;desde aquí ya podemos operar con los modelos:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;from gesion.models import Cliente&lt;br /&gt;c=Cliente(clave='444', descripcion='Pepe Perez')&lt;br /&gt;c.save()&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Si queremos acceder desde un script independiente en python podemos usar setup_environ de esta forma: &lt;br /&gt;&lt;br /&gt;&lt;b&gt;mantenimiento.py&lt;/b&gt;&lt;br /&gt;&lt;code&gt;from django.core.management import setup_environ&lt;br /&gt;&lt;br /&gt;try:&lt;br /&gt;&amp;nbsp;&amp;nbsp;import settings&lt;br /&gt;except ImportError:&lt;br /&gt;&amp;nbsp;&amp;nbsp;import sys&lt;br /&gt;&amp;nbsp;&amp;nbsp;sys.stderr.write("No encuentro el fichero de settings")&lt;br /&gt;&amp;nbsp;&amp;nbsp;sys.exit(1)&lt;br /&gt;&lt;br /&gt;setup_environ(settings)&lt;br /&gt;&lt;br /&gt;.... &lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Espero que os sirva.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9191328551308072706-7698846370809270160?l=www.pvilas.com' alt='' /&gt;&lt;/div&gt;</description><link>http://www.pvilas.com/2011/12/shell-en-django.html</link><author>noreply@blogger.com (Pere Vilás)</author><thr:total>2</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-9191328551308072706.post-7857015332791902654</guid><pubDate>Thu, 24 Nov 2011 10:01:00 +0000</pubDate><atom:updated>2011-11-24T11:05:35.300+01:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>Linux</category><category domain='http://www.blogger.com/atom/ns#'>ebook</category><category domain='http://www.blogger.com/atom/ns#'>ubuntu</category><title>Copiar pdf a iPhone iPad fácil ubuntu</title><description>1) Instalar el lector &lt;a href="http://www.lexcycle.com/"&gt;Stanza&lt;/a&gt; en el dispositivo.&lt;div&gt;2) Conectar el dispositivo al PC. Saldrá un directorio llamado "Documentación sobre iPad-&amp;gt;Stanza".&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Todo lo que copiemos en este directorio nos saldrá luego en el apartado "downloads" del stanza.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Probado con Ubuntu 11. Happy reading!!&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9191328551308072706-7857015332791902654?l=www.pvilas.com' alt='' /&gt;&lt;/div&gt;</description><link>http://www.pvilas.com/2011/11/copiar-pdf-iphone-ipad-facil-ubuntu.html</link><author>noreply@blogger.com (Pere Vilás)</author><thr:total>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-9191328551308072706.post-7192862989453630469</guid><pubDate>Wed, 23 Nov 2011 18:06:00 +0000</pubDate><atom:updated>2011-11-24T11:43:00.134+01:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>tiempo</category><category domain='http://www.blogger.com/atom/ns#'>MSL</category><title>Tiempo EST, CET, CEST, PST</title><description>Un twitt refiriéndose al lanzamiento del Curiosity dice:&lt;br /&gt;&lt;cite&gt;&lt;br /&gt;&lt;/cite&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;cite&gt;"Liftoff scheduled for 10:02 a.m. EST. http://www.nasa.gov/msl #MSL". &lt;/cite&gt; &lt;/div&gt;&lt;cite&gt;&lt;br /&gt;&lt;/cite&gt;&lt;br /&gt;Vale. ¿Y eso qué hora es en España?. El tiempo EST se refiere al tiempo oficial de la costa este de los EEUU. En España peninsular e Illes Balears estamos en el tiempo CET (Central European Time) o CEST en verano (Central European Sumer Time), es decir en GMT+1 o GMT+2 en verano, GMT corresponde a la hora en el meridiano 0 o meridiano de Greenwich .&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://upload.wikimedia.org/wikipedia/commons/thumb/a/ad/Standard_time_zones_of_the_world.png/1024px-Standard_time_zones_of_the_world.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="344" src="http://upload.wikimedia.org/wikipedia/commons/thumb/a/ad/Standard_time_zones_of_the_world.png/1024px-Standard_time_zones_of_the_world.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Si miramos este mapa de &lt;a href="http://upload.wikimedia.org/wikipedia/commons/thumb/a/ad/Standard_time_zones_of_the_world.png/1280px-Standard_time_zones_of_the_world.png"&gt;husos horarios de wikipedia&lt;/a&gt; vemos que Cabo Cañaveral está en la costa este, en el uso GMT-5 (en amarillo). En invierno, como España está en el huso GMT+1 (en verde) tenemos que sumar 6 horas al tiempo EST para que nos dé en tiempo CET. O sea, el Curiosity será lanzado a las 16:02 h, tiempo de España y les Illes Balears, una hora menos en las Islas Canarias.&lt;br /&gt;&lt;br /&gt;El tiempo EST es importante por ser el usado por los grandes núcleos de población de los EEUU (Boston, Whashington, Nueva York y Miami). Otra zona horaria importante es la usada en la costa oeste, el llamado PST (Pacific Standard Time) por ser el usado en Seattle, Portland, San Francisco y Los Ángeles. En este caso el huso está en GMT-08 y por lo tanto hay que sumar 8 horas para transformarlo en GMT y de ahí una hora más para pasarlo a EST. En total hay una diferencia horaria de nueve horas.&lt;br /&gt;&lt;br /&gt;Observamos que para calcular la hora equivalente en otro huso que está más al Oeste tenemos que restar los husos que vamos pasando. Para calcular la hora equivalente a otro huso que está más al Este tenemos que sumar los husos que vamos pasando. De todas formas, hay que consultar el mapa porque como veis, la hora oficial depende de consideraciones políticas p.e. Groenlandia cae en cinco zonas horarias pero sólo usa tres.&lt;br /&gt;&lt;br /&gt;La mayoría de países europeos usan CET (en verde) menos Portugal, Irlanda y Reino Unido a la izquierda en los que hay que restar una hora.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9191328551308072706-7192862989453630469?l=www.pvilas.com' alt='' /&gt;&lt;/div&gt;</description><link>http://www.pvilas.com/2011/11/tiempo-est-cet-cest.html</link><author>noreply@blogger.com (Pere Vilás)</author><thr:total>0</thr:total></item></channel></rss>
