<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>AxiaCore &#187; Python</title>
	<atom:link href="http://axiacore.com/tag/python/feed/" rel="self" type="application/rss+xml" />
	<link>http://axiacore.com</link>
	<description>Tenemos poderes magicos...</description>
	<lastBuildDate>Tue, 10 Apr 2012 23:35:04 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.2</generator>
		<item>
		<title>Generando hojas de cálculo flexibles con Python</title>
		<link>http://axiacore.com/2012/04/generando-hojas-de-calculo-flexibles-con-python/</link>
		<comments>http://axiacore.com/2012/04/generando-hojas-de-calculo-flexibles-con-python/#comments</comments>
		<pubDate>Tue, 10 Apr 2012 23:33:14 +0000</pubDate>
		<dc:creator>andres.quiroga</dc:creator>
				<category><![CDATA[Desarrollo]]></category>
		<category><![CDATA[General]]></category>
		<category><![CDATA[Python]]></category>

		<guid isPermaLink="false">http://axiacore.com/?p=2308</guid>
		<description><![CDATA[A diario nos encontramos con la necesidad de que nuestros proyectos soporten la generación de informes ordenados, con buena presentación y fácilmente legibles por los usuarios. Ya sea un informe de gastos, un informe de facturación,  una tabla que nos permita visualizar los datos de nuestros contactos o un informe de movimientos y solicitudes mensuales en nuestro [...]]]></description>
			<content:encoded><![CDATA[<p>A diario nos encontramos con la necesidad de que nuestros proyectos soporten la generación de informes ordenados, con buena presentación y fácilmente legibles por los usuarios. Ya sea un informe de gastos, un informe de facturación,  una tabla que nos permita visualizar los datos de nuestros contactos o un informe de movimientos y solicitudes mensuales en nuestro sitio web, una hoja de cálculo es la mejor opción a la hora de tener un informe entendible y flexible para el usuario.</p>
<p>xlwt es una librería de python creada por John Machin, que permite generar hojas de cálculo flexibles. compatibles con Office, OpenOffice, Calc, Gnumeric y con total soporte para Unicode, y a la vez permite personalizar los archivos generados. En este articulo enumeraremos algunas de las herramientas que nos brinda xlwt e iremos paso a paso, detallando el código para obtener un informe final con  nuestras preferencias de personalización.</p>
<p><strong>1. GENERANDO LIBRO</strong></p>
<p>La clase WorkBook() nos permite asignar a una variable las características de un archivo xls. Todo libro o archivo xls debe contar con al menos una hoja de cálculo. Las hojas de cálculo se crean por medio del método  <em>add_sheet(&#8216;nombre_de_la_hoja&#8217;)</em>. A continuación, se describe el código básico para generar un libro de trabajo llamado <em>first_book.xls</em>, con dos hojas de calculo vacías<em>(first_sheet y second_sheet).</em></p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">from</span> xlwt <span style="color: #ff7700;font-weight:bold;">import</span> Workbook
&nbsp;
<span style="color: #ff7700;font-weight:bold;">def</span> first_book<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>:
    <span style="color: #808080; font-style: italic;"># Workbook asing</span>
    first_book=Workbook<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #808080; font-style: italic;"># Sheets definition</span>
    first_book.<span style="color: black;">add_sheet</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'first_sheet'</span><span style="color: black;">&#41;</span>
    first_book.<span style="color: black;">add_sheet</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'second_sheet'</span><span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #808080; font-style: italic;"># Saving file</span>
    first_book.<span style="color: black;">save</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'first_book.xls'</span><span style="color: black;">&#41;</span></pre></div></div>

<p>Para manipular las distintas hojas de cálculo y así definir los contenidos deseados para cada una de ellas, asignamos variables a estas, de la siguiente forma:</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">from</span> xlwt <span style="color: #ff7700;font-weight:bold;">import</span> Workbook
&nbsp;
<span style="color: #ff7700;font-weight:bold;">def</span> first_book<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>:
    <span style="color: #808080; font-style: italic;"># Workbook asing</span>
    first_book=Workbook<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #808080; font-style: italic;"># Sheets definition</span>
    ws1 = first_book.<span style="color: black;">add_sheet</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'first_sheet'</span><span style="color: black;">&#41;</span>
    ws2 = first_book.<span style="color: black;">add_sheet</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'second_sheet'</span><span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #808080; font-style: italic;"># Saving file</span>
    first_book.<span style="color: black;">save</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'first_book.xls'</span><span style="color: black;">&#41;</span></pre></div></div>

<p><strong>2. IMPRIMIENDO DATOS</strong></p>
<p>Las hojas de cálculo cuentan con el método <em>write</em>, que nos permite introducir contenido en las celdas. Los parámetros que recibe son la posición (celda) y contenido. La posición se introduce de la forma (fila, columna), empezando por la posición (0, 0), equivalente en nuestra hoja a la celda A1.</p>
<p>En la siguiente modificación a nuestra función, se introduce, en la hoja de trabajo <em>first_sheet, </em>en la posición A1, el texto <em>&#8220;Content 1, sheet 1&#8243;, </em>y en la posición B1, el texto <em>&#8220;Content 2, sheet 1&#8243;</em>. De la misma forma, en la hoja de cálculo <em>second_sheet,</em> se introduce, en la posición A2, el texto <em>&#8220;Content 1, sheet 2</em>&#8220;, y en la posición B2, el texto<em> &#8221;Content 2, sheet 2&#8243;</em>.</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">from</span> xlwt <span style="color: #ff7700;font-weight:bold;">import</span> Workbook
&nbsp;
<span style="color: #ff7700;font-weight:bold;">def</span> first_book<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>:
    <span style="color: #808080; font-style: italic;"># Workbook asing</span>
    first_book=Workbook<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #808080; font-style: italic;"># Sheets definition</span>
    ws1 = first_book.<span style="color: black;">add_sheet</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'first_sheet'</span><span style="color: black;">&#41;</span>
    ws2 = first_book.<span style="color: black;">add_sheet</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'second_sheet'</span><span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #808080; font-style: italic;"># content per sheets</span>
    ws1.<span style="color: black;">write</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">0</span>, <span style="color: #ff4500;">0</span>, <span style="color: #483d8b;">'Content 1, sheet 1'</span><span style="color: black;">&#41;</span>
    ws1.<span style="color: black;">write</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">0</span>, <span style="color: #ff4500;">1</span>, <span style="color: #483d8b;">'Content 2, sheet 1'</span><span style="color: black;">&#41;</span>
    ws2.<span style="color: black;">write</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">1</span>, <span style="color: #ff4500;">0</span>, <span style="color: #483d8b;">'Content 1, sheet 2'</span><span style="color: black;">&#41;</span>
    ws2.<span style="color: black;">write</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">1</span>, <span style="color: #ff4500;">1</span>, <span style="color: #483d8b;">'Content 2, sheet 2'</span><span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #808080; font-style: italic;"># Saving file</span>
    first_book.<span style="color: black;">save</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'first_book.xls'</span><span style="color: black;">&#41;</span></pre></div></div>

<p>Pero introducir uno a uno el contenido de cada una de las celdas resultaría ser el proceso mas ineficiente posible a la hora de generar un informe xls. Por tal razón, utilizaremos los bucles de python para imprimir estos contenidos de forma automática.<br />
Ahora generaremos una sola hoja de cálculo, en la cual imprimiremos una tabla que relaciona <em>nombre</em> y <em>edad</em> de una sería de personas que se han definido previamente en un diccionario llamado <em>ages</em>.</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">from</span> xlwt <span style="color: #ff7700;font-weight:bold;">import</span> Workbook
&nbsp;
ages=<span style="color: black;">&#123;</span>
        <span style="color: #483d8b;">'Peter'</span>: <span style="color: #ff4500;">20</span>,
        <span style="color: #483d8b;">'Karen'</span>: <span style="color: #ff4500;">19</span>,
        <span style="color: #483d8b;">'Jessie'</span>: <span style="color: #ff4500;">43</span>,
        <span style="color: #483d8b;">'Leonard'</span>: <span style="color: #ff4500;">56</span>,
        <span style="color: #483d8b;">'Robert'</span>: <span style="color: #ff4500;">30</span>,
        <span style="color: #483d8b;">'Nina'</span>: <span style="color: #ff4500;">23</span>,
    <span style="color: black;">&#125;</span>
&nbsp;
number_of_elements = <span style="color: #008000;">len</span><span style="color: black;">&#40;</span>ages<span style="color: black;">&#41;</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">def</span> first_book<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>:
    first_book=Workbook<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #808080; font-style: italic;"># Sheet definition</span>
    ws1 = first_book.<span style="color: black;">add_sheet</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'first_sheet'</span><span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #808080; font-style: italic;"># Header definition</span>
    ws1.<span style="color: black;">write</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">0</span>, <span style="color: #ff4500;">0</span>, <span style="color: #483d8b;">'Name'</span><span style="color: black;">&#41;</span>
    ws1.<span style="color: black;">write</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">0</span>, <span style="color: #ff4500;">1</span>, <span style="color: #483d8b;">'Years old'</span><span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #808080; font-style: italic;"># Represents the first row in the iteration</span>
    i = <span style="color: #ff4500;">1</span> 
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">for</span> name, years <span style="color: #ff7700;font-weight:bold;">in</span> ages.<span style="color: black;">items</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>:
        ws1.<span style="color: black;">write</span><span style="color: black;">&#40;</span>i, <span style="color: #ff4500;">0</span>, name<span style="color: black;">&#41;</span>
        ws1.<span style="color: black;">write</span><span style="color: black;">&#40;</span>i, <span style="color: #ff4500;">1</span>, years<span style="color: black;">&#41;</span>
        i += <span style="color: #ff4500;">1</span>
        <span style="color: #ff7700;font-weight:bold;">if</span> i == number_of_elements+<span style="color: #ff4500;">1</span>: <span style="color: #808080; font-style: italic;"># For display the latest element</span>
            <span style="color: #ff7700;font-weight:bold;">break</span>
&nbsp;
    <span style="color: #808080; font-style: italic;"># Saving file</span>
    first_book.<span style="color: black;">save</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'first_book.xls'</span><span style="color: black;">&#41;</span></pre></div></div>

<p>Primero definimos el <em>header</em> de la tabla. Asignamos como contenido a la celda A1 (posición 0, 0) el texto &#8220;<em>Name&#8221;, </em>y a la celda B1 (posición 0, 1) el texto <em>&#8220;Years old&#8221;</em>. A continuación definimos la variable <em>i, </em>que representa el número de la fila desde la cual vamos a empezar a imprimir la información de las personas de nuestro diccionario. En este caso, como la fila 1 se encuentra ocupada con el <em>header</em> de la tabla, debemos empezar a introducir los datos desde la fila 2, es decir, desde la posición (1, #-columna).</p>
<p>Con un bucle <em>for </em>en el que iteramos el diccionario <em>ages</em>, introducimos de forma ordenada los datos de las personas en nuestra tabla. Por cada ciclo aumentamos el valor de <em>i</em> en 1, y de esta forma imprimimos los datos de cada persona del diccionario en una fila distinta.<br />
Previamente habíamos definido la variable number_of_elements, asignándole como valor el número equivalente a la cantidad de elementos del diccionario <em>ages</em>. Esta variable es de gran importancia en este ejemplo, ya que es la clave para salir del bucle y evitar errores de sobre-escritura en las celdas de nuestro archivo first_book.xls.</p>
<p>Rompemos el bucle cuando la variable <em>i </em>sea igual a <em>number_of_elements + 1</em>.¿Porque?&#8230; La cantidad de elementos en nuestro diccionario es 6 y el valor inicial de la variable <em>i</em> es 1. Por lo tanto, si rompemos el bucle cuando la variable <em>i</em> sea igual a 6, solo estaríamos repitiendo el ciclo 5 veces, es decir, perderíamos el último elemento de nuestro diccionario.</p>
<p><strong>3. PERSONALIZANDO LA PRESENTACIÓN</strong></p>
<p>haciendo uso de las clases Font, XFStyle y Borders, podemos añadir preferencias de visualización para nuestras celdas y sus contenidos. A continuación se muestra como personalizar nuestra hoja de cálculo mediante el uso de solo unas pocas de las muchas opciones que brinda xlwt.</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">from</span> xlwt <span style="color: #ff7700;font-weight:bold;">import</span> Workbook
<span style="color: #ff7700;font-weight:bold;">from</span> xlwt <span style="color: #ff7700;font-weight:bold;">import</span> Font
<span style="color: #ff7700;font-weight:bold;">from</span> xlwt <span style="color: #ff7700;font-weight:bold;">import</span> XFStyle
<span style="color: #ff7700;font-weight:bold;">from</span> xlwt <span style="color: #ff7700;font-weight:bold;">import</span> Borders
&nbsp;
ages=<span style="color: black;">&#123;</span>
        <span style="color: #483d8b;">'Peter'</span>: <span style="color: #ff4500;">20</span>,
        <span style="color: #483d8b;">'Karen'</span>: <span style="color: #ff4500;">19</span>,
        <span style="color: #483d8b;">'Jessie'</span>: <span style="color: #ff4500;">43</span>,
        <span style="color: #483d8b;">'Leonard'</span>: <span style="color: #ff4500;">56</span>,
        <span style="color: #483d8b;">'Robert'</span>: <span style="color: #ff4500;">30</span>,
        <span style="color: #483d8b;">'Nina'</span>: <span style="color: #ff4500;">23</span>,
    <span style="color: black;">&#125;</span>
&nbsp;
number_of_elements = <span style="color: #008000;">len</span><span style="color: black;">&#40;</span>ages<span style="color: black;">&#41;</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">def</span> first_book<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>:
    first_book=Workbook<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #808080; font-style: italic;"># Sheet definition</span>
    ws1 = first_book.<span style="color: black;">add_sheet</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'first_sheet'</span><span style="color: black;">&#41;</span>
&nbsp;
    header_font = Font<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
    body_font = Font<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #808080; font-style: italic;"># Header font preferences</span>
    header_font.<span style="color: black;">name</span> = <span style="color: #483d8b;">'Times New Roman'</span>
    header_font.<span style="color: black;">height</span> = <span style="color: #ff4500;">20</span> <span style="color: #66cc66;">*</span> <span style="color: #ff4500;">15</span>
    header_font.<span style="color: black;">bold</span> = <span style="color: #008000;">True</span>
&nbsp;
    <span style="color: #808080; font-style: italic;"># Body font preferences</span>
    body_font.<span style="color: black;">name</span> = <span style="color: #483d8b;">'Arial'</span>
    body_font.<span style="color: black;">italic</span> = <span style="color: #008000;">True</span>
&nbsp;
    <span style="color: #808080; font-style: italic;"># Header Cells style definition</span>
    header_style = XFStyle<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
    header_style.<span style="color: black;">font</span> = header_font 
&nbsp;
    borders = Borders<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
    borders.<span style="color: black;">left</span> = <span style="color: #ff4500;">1</span>
    borders.<span style="color: black;">right</span> = <span style="color: #ff4500;">1</span>
    borders.<span style="color: black;">top</span> = <span style="color: #ff4500;">1</span>
    borders.<span style="color: black;">bottom</span> = <span style="color: #ff4500;">1</span>
    header_style.<span style="color: black;">borders</span> = borders
&nbsp;
    <span style="color: #808080; font-style: italic;"># body cell name style definition</span>
    body_style = XFStyle<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
    body_style.<span style="color: black;">font</span> = body_font 
&nbsp;
    <span style="color: #808080; font-style: italic;"># Header definition</span>
    ws1.<span style="color: black;">write</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">0</span>, <span style="color: #ff4500;">0</span>, <span style="color: #483d8b;">'Name'</span>, header_style <span style="color: black;">&#41;</span>
    ws1.<span style="color: black;">write</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">0</span>, <span style="color: #ff4500;">1</span>, <span style="color: #483d8b;">'Years old'</span>, header_style <span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #808080; font-style: italic;"># Represents the first row in the iteration</span>
    i = <span style="color: #ff4500;">1</span> 
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">for</span> name, years <span style="color: #ff7700;font-weight:bold;">in</span> ages.<span style="color: black;">items</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>:
        ws1.<span style="color: black;">write</span><span style="color: black;">&#40;</span>i, <span style="color: #ff4500;">0</span>, name, body_style<span style="color: black;">&#41;</span>
        ws1.<span style="color: black;">write</span><span style="color: black;">&#40;</span>i, <span style="color: #ff4500;">1</span>, years<span style="color: black;">&#41;</span>
        i += <span style="color: #ff4500;">1</span>
        <span style="color: #ff7700;font-weight:bold;">if</span> i == number_of_elements+<span style="color: #ff4500;">1</span>: <span style="color: #808080; font-style: italic;"># For display the latest element</span>
            <span style="color: #ff7700;font-weight:bold;">break</span>
&nbsp;
    <span style="color: #808080; font-style: italic;"># Saving file</span>
    first_book.<span style="color: black;">save</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'first_book.xls'</span><span style="color: black;">&#41;</span></pre></div></div>

<p>El parámetro <em>height </em>que representa el tamaño de la fuente, se debe incluir multiplicado por un factor de 20. Es decir, si el tamaño de fuente deseado es 15, entonces se debe incluir el valor 300, o si el tamaño deseado es 20, entonces se debe introducir el valor 400.</p>
<p>Una vez definidas nuestras preferencias de personalización, el resultado se envía como el tercer parámetro en el constructor de la celda. Así, en este caso, para las celdas del <em>header</em> enviamos el parámetro <em>header_style</em>, y para las celdas que contienen los nombres de nuestro diccionario enviamos el parámetro <em>body_style</em></p>
<p><strong>4. COMBINANDO CELDAS</strong></p>
<p>Otra funcionalidad muy común a la hora de trabajar con hojas de cálculo, es la posibilidad de combinar celdas. <em>xlwt </em>permite hacer esto de una forma muy simple. A continuación, insertaremos una imagen en el encabezado de la tabla. Para hacer esto, combinaremos una serie de celdas. La forma de hacerlo es <em>sheet_name.write_merge(fila_inicial, fila_final, columna_inicial, columna_final,)</em>. Así, se combinarán las celdas comprendidas en el rango indicado. En este caso, combinaremos las celdas comprendidas entre la posición A1 a la B11.  El rango de celdas combinadas y el ancho de las columnas los ajustamos según el tamañ de la imagén a insertar (Este ejemplo esta ajustado para una imagen de <em>273&#215;180 px</em> ). Este cambio implica mover nuestros datos tantas filas hacia abajo como filas se combinaron para el encabezado. Así, las celdas del <em>header, (Name y years old)</em>, se deben ubicar en la fila 12. Nuestra función <em>first_book</em> quedará de la siguiente manera:</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">def</span> first_book<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>:
    first_book=Workbook<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #808080; font-style: italic;"># Sheet definition</span>
    ws1 = first_book.<span style="color: black;">add_sheet</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'first_sheet'</span><span style="color: black;">&#41;</span>
&nbsp;
    header_font = Font<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
    body_font = Font<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #808080; font-style: italic;"># Header font preferences</span>
    header_font.<span style="color: black;">name</span> = <span style="color: #483d8b;">'Times New Roman'</span>
    header_font.<span style="color: black;">height</span> = <span style="color: #ff4500;">20</span> <span style="color: #66cc66;">*</span> <span style="color: #ff4500;">15</span>
    header_font.<span style="color: black;">bold</span> = <span style="color: #008000;">True</span>
&nbsp;
    <span style="color: #808080; font-style: italic;"># Body font preferences</span>
    body_font.<span style="color: black;">name</span> = <span style="color: #483d8b;">'Arial'</span>
    body_font.<span style="color: black;">italic</span> = <span style="color: #008000;">True</span>
&nbsp;
    <span style="color: #808080; font-style: italic;"># Header Cells style definition</span>
    header_style = XFStyle<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
    header_style.<span style="color: black;">font</span> = header_font 
&nbsp;
    borders = Borders<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
    borders.<span style="color: black;">left</span> = <span style="color: #ff4500;">1</span>
    borders.<span style="color: black;">right</span> = <span style="color: #ff4500;">1</span>
    borders.<span style="color: black;">top</span> = <span style="color: #ff4500;">1</span>
    borders.<span style="color: black;">bottom</span> = <span style="color: #ff4500;">1</span>
    header_style.<span style="color: black;">borders</span> = borders
&nbsp;
    <span style="color: #808080; font-style: italic;"># body cell name style definition</span>
    body_style = XFStyle<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
    body_style.<span style="color: black;">font</span> = body_font 
&nbsp;
    <span style="color: #808080; font-style: italic;"># Header definition</span>
    ws1.<span style="color: black;">write_merge</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">0</span>, <span style="color: #ff4500;">10</span>, <span style="color: #ff4500;">0</span>, <span style="color: #ff4500;">1</span>,<span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #808080; font-style: italic;"># # Adjust columns width acording to the image size</span>
&nbsp;
    ws1.<span style="color: black;">col</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">0</span><span style="color: black;">&#41;</span>.<span style="color: black;">width</span> = <span style="color: #ff4500;">8</span> <span style="color: #66cc66;">*</span> <span style="color: #ff4500;">625</span>
    ws1.<span style="color: black;">col</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">1</span><span style="color: black;">&#41;</span>.<span style="color: black;">width</span> = <span style="color: #ff4500;">8</span> <span style="color: #66cc66;">*</span> <span style="color: #ff4500;">625</span>
&nbsp;
    <span style="color: #808080; font-style: italic;"># Insert image</span>
    ws1.<span style="color: black;">insert_bitmap</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'logo.bmp'</span>, <span style="color: #ff4500;">0</span>, <span style="color: #ff4500;">0</span><span style="color: black;">&#41;</span>
&nbsp;
    ws1.<span style="color: black;">write</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">11</span>, <span style="color: #ff4500;">0</span>, <span style="color: #483d8b;">'Name'</span>, header_style <span style="color: black;">&#41;</span>
    ws1.<span style="color: black;">write</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">11</span>, <span style="color: #ff4500;">1</span>, <span style="color: #483d8b;">'Years old'</span>, header_style <span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #808080; font-style: italic;"># Represents the first row in the iteration</span>
    i = <span style="color: #ff4500;">12</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">for</span> name, years <span style="color: #ff7700;font-weight:bold;">in</span> ages.<span style="color: black;">items</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>:
        ws1.<span style="color: black;">write</span><span style="color: black;">&#40;</span>i, <span style="color: #ff4500;">0</span>, name, body_style<span style="color: black;">&#41;</span>
        ws1.<span style="color: black;">write</span><span style="color: black;">&#40;</span>i, <span style="color: #ff4500;">1</span>, years<span style="color: black;">&#41;</span>
        i += <span style="color: #ff4500;">1</span>
        <span style="color: #ff7700;font-weight:bold;">if</span> i == number_of_elements+<span style="color: #ff4500;">12</span>: <span style="color: #808080; font-style: italic;"># For display the latest element</span>
            <span style="color: #ff7700;font-weight:bold;">break</span>
&nbsp;
    <span style="color: #808080; font-style: italic;"># Saving file</span>
    first_book.<span style="color: black;">save</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'first_book.xls'</span><span style="color: black;">&#41;</span></pre></div></div>

<p><strong>5. INSERTANDO FORMULAS</strong></p>
<p>Ahora, introduciremos el código para implementar una formula que calcule la suma total de las edades de las personas en nuestra tabla. Debemos exportar la clase &#8220;<em>Formula&#8221;</em> y definir las celdas que se van a operar.</p>
<p>En este caso, se muestra el código para explicar el funcionamiento de las formulas en xlwt, aunque en realidad sería mas sencillo hacer el cálculo en nuestro código y enviar el resultado como parámetro de contenido a una celda determinada. Se deben introducir las celdas a operar por su posición en el formato como se identifican las celdas en los archivos xls (ej:A1, B1).<br />
El código quedaría como sigue:</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">from</span> xlwt <span style="color: #ff7700;font-weight:bold;">import</span> Workbook
<span style="color: #ff7700;font-weight:bold;">from</span> xlwt <span style="color: #ff7700;font-weight:bold;">import</span> Font
<span style="color: #ff7700;font-weight:bold;">from</span> xlwt <span style="color: #ff7700;font-weight:bold;">import</span> XFStyle
<span style="color: #ff7700;font-weight:bold;">from</span> xlwt <span style="color: #ff7700;font-weight:bold;">import</span> Borders
<span style="color: #ff7700;font-weight:bold;">from</span> xlwt impor Formula
&nbsp;
ages=<span style="color: black;">&#123;</span>
        <span style="color: #483d8b;">'Peter'</span>: <span style="color: #ff4500;">20</span>,
        <span style="color: #483d8b;">'Karen'</span>: <span style="color: #ff4500;">19</span>,
        <span style="color: #483d8b;">'Jessie'</span>: <span style="color: #ff4500;">43</span>,
        <span style="color: #483d8b;">'Leonard'</span>: <span style="color: #ff4500;">56</span>,
        <span style="color: #483d8b;">'Robert'</span>: <span style="color: #ff4500;">30</span>,
        <span style="color: #483d8b;">'Nina'</span>: <span style="color: #ff4500;">23</span>,
    <span style="color: black;">&#125;</span>
&nbsp;
number_of_elements = <span style="color: #008000;">len</span><span style="color: black;">&#40;</span>ages<span style="color: black;">&#41;</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">def</span> first_book<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>:
    first_book=Workbook<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #808080; font-style: italic;"># Sheet definition</span>
    ws1 = first_book.<span style="color: black;">add_sheet</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'first_sheet'</span><span style="color: black;">&#41;</span>
&nbsp;
    header_font = Font<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
    body_font = Font<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #808080; font-style: italic;"># Header font preferences</span>
    header_font.<span style="color: black;">name</span> = <span style="color: #483d8b;">'Times New Roman'</span>
    header_font.<span style="color: black;">height</span> = <span style="color: #ff4500;">20</span> <span style="color: #66cc66;">*</span> <span style="color: #ff4500;">15</span>
    header_font.<span style="color: black;">bold</span> = <span style="color: #008000;">True</span>
&nbsp;
    <span style="color: #808080; font-style: italic;"># Body font preferences</span>
    body_font.<span style="color: black;">name</span> = <span style="color: #483d8b;">'Arial'</span>
    body_font.<span style="color: black;">italic</span> = <span style="color: #008000;">True</span>
&nbsp;
    <span style="color: #808080; font-style: italic;"># Header Cells style definition</span>
    header_style = XFStyle<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
    header_style.<span style="color: black;">font</span> = header_font 
&nbsp;
    borders = Borders<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
    borders.<span style="color: black;">left</span> = <span style="color: #ff4500;">1</span>
    borders.<span style="color: black;">right</span> = <span style="color: #ff4500;">1</span>
    borders.<span style="color: black;">top</span> = <span style="color: #ff4500;">1</span>
    borders.<span style="color: black;">bottom</span> = <span style="color: #ff4500;">1</span>
    header_style.<span style="color: black;">borders</span> = borders
&nbsp;
    <span style="color: #808080; font-style: italic;"># body cell name style definition</span>
    body_style = XFStyle<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
    body_style.<span style="color: black;">font</span> = body_font 
&nbsp;
    <span style="color: #808080; font-style: italic;"># Header definition</span>
    ws1.<span style="color: black;">write_merge</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">0</span>, <span style="color: #ff4500;">10</span>, <span style="color: #ff4500;">0</span>, <span style="color: #ff4500;">1</span>,<span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #808080; font-style: italic;"># # Adjust columns width acording to the image size</span>
&nbsp;
    ws1.<span style="color: black;">col</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">0</span><span style="color: black;">&#41;</span>.<span style="color: black;">width</span> = <span style="color: #ff4500;">8</span> <span style="color: #66cc66;">*</span> <span style="color: #ff4500;">625</span>
    ws1.<span style="color: black;">col</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">1</span><span style="color: black;">&#41;</span>.<span style="color: black;">width</span> = <span style="color: #ff4500;">8</span> <span style="color: #66cc66;">*</span> <span style="color: #ff4500;">625</span>
&nbsp;
    <span style="color: #808080; font-style: italic;"># Insert image</span>
    ws1.<span style="color: black;">insert_bitmap</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'logo.bmp'</span>, <span style="color: #ff4500;">0</span>, <span style="color: #ff4500;">0</span><span style="color: black;">&#41;</span>
&nbsp;
    ws1.<span style="color: black;">write</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">11</span>, <span style="color: #ff4500;">0</span>, <span style="color: #483d8b;">'Name'</span>, header_style <span style="color: black;">&#41;</span>
    ws1.<span style="color: black;">write</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">11</span>, <span style="color: #ff4500;">1</span>, <span style="color: #483d8b;">'Years old'</span>, header_style <span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #808080; font-style: italic;"># Represents the first row in the iteration</span>
    i = <span style="color: #ff4500;">12</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">for</span> name, years <span style="color: #ff7700;font-weight:bold;">in</span> ages.<span style="color: black;">items</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>:
        ws1.<span style="color: black;">write</span><span style="color: black;">&#40;</span>i, <span style="color: #ff4500;">0</span>, name, body_style<span style="color: black;">&#41;</span>
        ws1.<span style="color: black;">write</span><span style="color: black;">&#40;</span>i, <span style="color: #ff4500;">1</span>, years<span style="color: black;">&#41;</span>
        i += <span style="color: #ff4500;">1</span>
        <span style="color: #ff7700;font-weight:bold;">if</span> i == number_of_elements+<span style="color: #ff4500;">12</span>: <span style="color: #808080; font-style: italic;"># For display the latest element</span>
            <span style="color: #ff7700;font-weight:bold;">break</span>
&nbsp;
    <span style="color: #808080; font-style: italic;"># Total cell style</span>
    total_font = Font<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
    total_font.<span style="color: black;">bold</span> = <span style="color: #008000;">True</span>
    total_style = XFStyle<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
    total_style.<span style="color: black;">font</span> = total_font 
&nbsp;
    ws1.<span style="color: black;">write</span><span style="color: black;">&#40;</span>i, <span style="color: #ff4500;">0</span>, <span style="color: #483d8b;">'Total'</span>, total_style<span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #808080; font-style: italic;"># Formula</span>
    ws1.<span style="color: black;">write</span><span style="color: black;">&#40;</span>i, <span style="color: #ff4500;">1</span>, Formula<span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;SUM(B13:B18)&quot;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #808080; font-style: italic;"># Saving file</span>
    first_book.<span style="color: black;">save</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'first_book.xls'</span><span style="color: black;">&#41;</span></pre></div></div>

]]></content:encoded>
			<wfw:commentRss>http://axiacore.com/2012/04/generando-hojas-de-calculo-flexibles-con-python/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Instalación de PIL en OSX Lion</title>
		<link>http://axiacore.com/2011/12/instalacion-de-pil-en-osx-lion/</link>
		<comments>http://axiacore.com/2011/12/instalacion-de-pil-en-osx-lion/#comments</comments>
		<pubDate>Thu, 08 Dec 2011 22:43:30 +0000</pubDate>
		<dc:creator>Camilo Nova</dc:creator>
				<category><![CDATA[Desarrollo]]></category>
		<category><![CDATA[OSX]]></category>
		<category><![CDATA[Python]]></category>

		<guid isPermaLink="false">http://axiacore.com/?p=2189</guid>
		<description><![CDATA[PIL es una libreria necesaria para el manejo de imagenes en python, trabajando en entornos virtuales es necesario instalarla con el soporte necesario para tipos de archivos como jpeg y png. PIL al ser compilado intenta obtener las librerías necesarias desde el sistema y para eso es necesario instalarlas, en el caso de OSX lion [...]]]></description>
			<content:encoded><![CDATA[<p>PIL es una libreria necesaria para el manejo de imagenes en python, trabajando en entornos virtuales es necesario instalarla con el soporte necesario para tipos de archivos como jpeg y png.</p>
<p>PIL al ser compilado intenta obtener las librerías necesarias desde el sistema y para eso es necesario instalarlas, en el caso de OSX lion solo hace falta la libreria para los archivos jpeg, las demás ya vienen pre-instaladas.</p>
<p>Haciendo uso de homebrew:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
</pre></td><td class="code"><pre class="bash" style="font-family:monospace;">brew <span style="color: #c20cb9; font-weight: bold;">install</span> jpeg</pre></td></tr></table></div>

<p>Tendremos la libreria faltante, así cuando instalemos PIL tendremos pleno soporte:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
</pre></td><td class="code"><pre class="bash" style="font-family:monospace;">pip <span style="color: #c20cb9; font-weight: bold;">install</span> pil
...
    <span style="color: #660033;">---</span> TKINTER support available
    <span style="color: #660033;">---</span> JPEG support available
    <span style="color: #660033;">---</span> ZLIB <span style="color: #7a0874; font-weight: bold;">&#40;</span>PNG<span style="color: #000000; font-weight: bold;">/</span>ZIP<span style="color: #7a0874; font-weight: bold;">&#41;</span> support available</pre></td></tr></table></div>

<p>Espero les sea de ayuda.</p>
]]></content:encoded>
			<wfw:commentRss>http://axiacore.com/2011/12/instalacion-de-pil-en-osx-lion/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Monitoreando sistemas de archivos en Linux</title>
		<link>http://axiacore.com/2011/04/monitoreando-sistemas-de-archivos-en-linux/</link>
		<comments>http://axiacore.com/2011/04/monitoreando-sistemas-de-archivos-en-linux/#comments</comments>
		<pubDate>Tue, 26 Apr 2011 23:53:30 +0000</pubDate>
		<dc:creator>Juan Pablo Romero Bernal</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[monitoreo]]></category>
		<category><![CDATA[NFS]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[Samba]]></category>

		<guid isPermaLink="false">http://axiacore.com/?p=2023</guid>
		<description><![CDATA[¿Quién borró ese archivo ? ¿ Cuando lo borraron ? son preguntas recurrentes entre los usuarios y más aún cuando se mantienen directorios y archivos compartidos en una red. La situación se complica cuando se quiere llevar una trazabilidad de las operaciones que los usuarios realizan sobre los archivos, (aclaro que no me refiero al [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;"><a href="http://axiacore.com/wp-content/uploads/2011/04/overlord59-tux-fbi-1712.png" rel="lightbox[2023]" title="overlord59-tux-fbi-1712"><img class="size-full wp-image-2026 alignleft" title="overlord59-tux-fbi-1712" src="http://axiacore.com/wp-content/uploads/2011/04/overlord59-tux-fbi-1712.png" alt="Tux FBI" width="256" height="256" /></a>¿Quién borró ese archivo ? ¿ Cuando lo borraron ? son preguntas recurrentes entre los usuarios y más aún cuando se mantienen directorios y archivos compartidos en una red. La situación se complica cuando se quiere llevar una trazabilidad de las operaciones que los usuarios realizan sobre los archivos, (aclaro que no me refiero al historial de cambios), quién modificó el archivo x y cuando lo hizo. Mantener ese &#8220;historial&#8221; es una tarea un tanto complicada y que depende en gran parte del sistema de archivos utilizado para el almacenamiento. En muchas organizaciones se ha extendido el uso de carpetas compartidas a través de algún sistema como <a href="http://www.samba.org/">SAMBA</a> o <a href="http://en.wikipedia.org/wiki/Network_File_System_(protocol)">NFS</a> (por lo regular sistemas que actúan como <a href="http://en.wikipedia.org/wiki/Primary_Domain_Controller">PDC</a>), con Linux como servidor y clientes Windows.  En muchas ocasiones dichos directorios compartidos requieren de permisos especiales (sólo lectura para determinados grupos o modificación para determinado usuario del dominio), cuestión que es relativamente sencilla de solucionar trabajando con el esquema de permisos de Unix y listas de control de acceso. Sin embargo cuando se requiere mantener un historial de operaciones sobre los archivos (quién hizo qué) los logs de samba no son suficientes, además de que son muy engorrosos de analizar. ¿ Qué solución hay entonces ?.</p>
<p style="text-align: justify;">Pues bien, como lo mencioné anteriormente esta situación está directamente relacionada con el sistema de archivos, dado que las operaciones que nos interesan capturar se realizan sobre los archivos mismos (creación. modificación, cambio de atributos, etc). Desde la versión 2.6.13 del kernel Linux se integró una característica muy interesante llamada <a href="http://www.linuxjournal.com/article/8478">inotify</a> el cual es un sistema que notifica cambios en los archivos (una descripción más detallada de la implementación y uso (desde C) se encuentra en un <a href="http://www.linuxjournal.com/article/8478">artículo muy interesante de los autores en Linux Journal</a>).  Con inotify tenemos un sistema que permite capturar eventos sobre los archivos y directorios como: acceso, modificación, modificación y cierre, borrado, renombrado entre otros. Al ser un componente del kernel Linux su extensión se realiza a través de C (incluyendo la cabeceras inotify.h y inotify-syscalls.h) y compilando &#8230;. cóooomo compilar ? dirán algunos para los que desarrollar en C como compilar es una labor un tanto tediosa y de hecho lo es. Afortunadamente existe un wrapper desarrollado en python que nos facilita mucho la vida se llama: <a href="http://pyinotify.sourceforge.net/">pyinotify</a> (un nombre muy original). Con este wrapper es posible en pocas líneas de código monitorear un directorio de archivos de forma muy sencilla, escribiendo a un log todos los eventos que ocurren o notificando a una aplicación.</p>
<h2 style="text-align: justify;">¿ Cómo usar pyinotify ?</h2>
<p>Primero que todo se deben seguir las instrucciones de instalación que se pueden encontrar en la <a href="http://pyinotify.sourceforge.net/">página del proyecto</a> o en <a href="https://github.com/seb-m/pyinotify">github</a>.   Una vez se haya instalado correctamente el módulo podemos empezar a realizar pequeños ensayos para conocer un poco más. Aquí va un pequeño ejemplo (basado en los de la página de pyinotify):</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #808080; font-style: italic;"># -*- coding: utf-8 -*-</span>
<span style="color: #808080; font-style: italic;"># Archivo example1.py</span>
<span style="color: #ff7700;font-weight:bold;">import</span> pyinotify
&nbsp;
<span style="color: #ff7700;font-weight:bold;">class</span> EventHandler<span style="color: black;">&#40;</span>pyinotify.<span style="color: black;">ProcessEvent</span><span style="color: black;">&#41;</span>:
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> process_IN_CREATE<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, event<span style="color: black;">&#41;</span>:
    	<span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">&quot;Creacion del archivo :&quot;</span>, event.<span style="color: black;">pathname</span>
&nbsp;
wm = pyinotify.<span style="color: black;">WatchManager</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
mask = pyinotify.<span style="color: black;">IN_CREATE</span>
&nbsp;
handler = EventHandler<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
notifier = pyinotify.<span style="color: black;">Notifier</span><span style="color: black;">&#40;</span>wm, handler<span style="color: black;">&#41;</span>
wdd = wm.<span style="color: black;">add_watch</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'/tmp'</span>, mask, rec=<span style="color: #008000;">True</span><span style="color: black;">&#41;</span>
notifier.<span style="color: black;">loop</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span></pre></div></div>

<p>Si ejecutamos este script desde la terminal de comandos:</p>
<pre>$ python example1.py</pre>
<p style="text-align: justify;">&nbsp;</p>
<p style="text-align: justify;">Cada vez que se agregue un nuevo archivo al directorio /tmp se imprimirá la cadena &#8220;Creación del archivo &#8230;&#8221; junto con la ruta absoluta del archivo creado. De esa misma forma se pueden escuchar otro tipo de eventos (<a href="https://github.com/seb-m/pyinotify/wiki/Events-types">ver listado completo</a>) y ejecutar la acción requerida (escribir a un log, enviar una notificación, un llamado a sistema, etc). En el wiki del proyecto en github hay numerosos ejemplos de como utilizar pyinotify, desde cuestiones sencillas hasta como construir un pequeño servicio de notificación.  En AxiaCore hemos usado pyinotify en conjunto con rsync para la sincronización de archivos y monitoreo y registro de acciones sobre sistemas de archivos (usando el módulo logging) con buenos resultados y facilidad de implementación.</p>
<p style="text-align: justify;">Es importante mencionar que el monitoreo solamente esta disponible para sistemas de archivos nativos en Linux como la familia ext2-3-4. Los sistemas de archivos como ntfs o vfat (fat32) no se encuentran soportados.</p>
<p style="text-align: justify;">Bien, hasta aquí con esta corta introducción al uso de pyinotify. Espero que haya sido de utilidad.</p>
<p style="text-align: justify;">&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://axiacore.com/2011/04/monitoreando-sistemas-de-archivos-en-linux/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Documentación con Sphinx para Django usando Virtualenv</title>
		<link>http://axiacore.com/2011/01/documentacion-con-sphinx-para-django-usando-virtualenv/</link>
		<comments>http://axiacore.com/2011/01/documentacion-con-sphinx-para-django-usando-virtualenv/#comments</comments>
		<pubDate>Fri, 28 Jan 2011 13:45:51 +0000</pubDate>
		<dc:creator>Camilo Nova</dc:creator>
				<category><![CDATA[Desarrollo]]></category>
		<category><![CDATA[Codigo Fuente]]></category>
		<category><![CDATA[Django]]></category>
		<category><![CDATA[Python]]></category>

		<guid isPermaLink="false">http://axiacore.com/?p=1932</guid>
		<description><![CDATA[Recientemente hemos comenzado a usar Sphinx para la documentación de los proyectos de AxiaCore, en especial funciona muy bien con Django, pero tuve algunos problemas al hacer funcionar la extensión autodoc que permite obtener las cadenas de documentación del código fuente, esto porque los proyectos ahora los manejamos con virtualenv. La manera en que lo [...]]]></description>
			<content:encoded><![CDATA[<p>Recientemente hemos comenzado a usar <a href="http://sphinx.pocoo.org/">Sphinx</a> para la documentación de los proyectos de AxiaCore, en especial funciona muy bien con <a href="http://www.djangoproject.com/">Django</a>, pero tuve algunos problemas al hacer funcionar la extensión <a href="http://sphinx.pocoo.org/ext/autodoc.html?highlight=autodoc#sphinx.ext.autodoc">autodoc</a> que permite obtener las cadenas de documentación del código fuente, esto porque los proyectos ahora los manejamos con <a href="http://pypi.python.org/pypi/virtualenv">virtualenv</a>.</p>
<p>La manera en que lo hice funcionar fue con el siguiente script hecho en casa:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
</pre></td><td class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">#!/bin/bash</span>
&nbsp;
<span style="color: #7a0874; font-weight: bold;">export</span> <span style="color: #007800;">PYTHONPATH</span>=<span style="color: #007800;">$PYTHONPATH</span>:<span style="color: #800000;">${PWD%/*/*}</span>:<span style="color: #800000;">${PWD%/*}</span>
<span style="color: #7a0874; font-weight: bold;">export</span> <span style="color: #007800;">DJANGO_SETTINGS_MODULE</span>=miproyecto.settings
<span style="color: #c20cb9; font-weight: bold;">make</span> html <span style="color: #007800;">SPHINXBUILD</span>=<span style="color: #ff0000;">'../../bin/sphinx-build'</span></pre></td></tr></table></div>

<p>Para mi configuración, yo tengo una carpeta doc en la raíz del proyecto donde reside mis archivos de sphinx, allí debe haber un archivo Makefile, allí debes crear el script y al correrlo, el utilizará el sphinx de virtualenv y habilitará las variables necesarias para obtener la documentación del código fuente.</p>
<p>Espero les sea de ayuda.</p>
]]></content:encoded>
			<wfw:commentRss>http://axiacore.com/2011/01/documentacion-con-sphinx-para-django-usando-virtualenv/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Paginacion en django estilo digg</title>
		<link>http://axiacore.com/2010/01/paginacion-en-django-estilo-digg/</link>
		<comments>http://axiacore.com/2010/01/paginacion-en-django-estilo-digg/#comments</comments>
		<pubDate>Fri, 29 Jan 2010 17:20:57 +0000</pubDate>
		<dc:creator>Camilo Nova</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[Codigo Fuente]]></category>
		<category><![CDATA[Django]]></category>
		<category><![CDATA[Python]]></category>

		<guid isPermaLink="false">http://axiacore.com/blog/?p=800</guid>
		<description><![CDATA[La Paginación en django es excelente, permite una flexibilidad importante para solucionar muchos problemas que se presentan al paginar resultados, por ejemplo el problema del cacheo, que se presenta al realizar una consulta que pide todos los datos sabiendo que solo vamos a mostrar unos pocos. Gracias a la excelente documentación podemos encontrar toda la [...]]]></description>
			<content:encoded><![CDATA[<p>La Paginación en django es excelente, permite una flexibilidad importante para solucionar muchos problemas que se presentan al paginar resultados, por ejemplo el problema del cacheo, que se presenta al realizar una consulta que pide todos los datos sabiendo que solo vamos a mostrar unos pocos.</p>
<p>Gracias a la excelente documentación podemos encontrar toda la información aquí: <a href="http://docs.djangoproject.com/en/1.1/topics/pagination/#topics-pagination">http://docs.djangoproject.com/en/1.1/topics/pagination/#topics-pagination</a></p>
<p>Sin embargo, cuando se trabajan volúmenes grandes de información, digamos mas de 50 paginas, se hace dispendioso pasar entre paginas hasta llegar a la que buscamos, por eso es muy útil tener una paginación al estilo Digg que muestra algunas paginas adicionales y no solo el enlace a la anterior y la siguiente.<span id="more-800"></span></p>
<p>Tomando como base este excelente trabajo: <a href="http://krisje8.com/blog/2009/jul/02/django-pagination-template-tag-digg-style/ ">http://krisje8.com/blog/2009/jul/02/django-pagination-template-tag-digg-style/ </a>realice algunas modificaciones para que muestre &#8216;&#8230;&#8217; entre las paginas iniciales y la pagina actual, para darle una mejor ubicación al usuario sobre donde se encuentra.</p>
<p>Tenemos el siguiente <a href="http://docs.djangoproject.com/en/dev/howto/custom-template-tags/">template_tag</a>:</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #808080; font-style: italic;">#! /usr/bin/env python</span>
<span style="color: #808080; font-style: italic;"># -*- coding: utf8 -*-</span>
<span style="color: #808080; font-style: italic;"># render_paginator.py</span>
<span style="color: #ff7700;font-weight:bold;">from</span> django.<span style="color: black;">template</span> <span style="color: #ff7700;font-weight:bold;">import</span> Library
&nbsp;
register = Library<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">def</span> render_paginator<span style="color: black;">&#40;</span>context, first_last_amount=<span style="color: #ff4500;">2</span>, before_after_amount=<span style="color: #ff4500;">4</span><span style="color: black;">&#41;</span>:
    page_obj = context<span style="color: black;">&#91;</span><span style="color: #483d8b;">'page_obj'</span><span style="color: black;">&#93;</span>
    paginator = context<span style="color: black;">&#91;</span><span style="color: #483d8b;">'paginator'</span><span style="color: black;">&#93;</span>
    page_numbers = <span style="color: black;">&#91;</span><span style="color: black;">&#93;</span>
&nbsp;
    <span style="color: #808080; font-style: italic;"># Pages before current page</span>
    <span style="color: #ff7700;font-weight:bold;">if</span> page_obj.<span style="color: black;">number</span> <span style="color: #66cc66;">&amp;</span>gt<span style="color: #66cc66;">;</span> first_last_amount + before_after_amount:
        <span style="color: #ff7700;font-weight:bold;">for</span> i <span style="color: #ff7700;font-weight:bold;">in</span> <span style="color: #008000;">range</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">1</span>, first_last_amount + <span style="color: #ff4500;">1</span><span style="color: black;">&#41;</span>:
            page_numbers.<span style="color: black;">append</span><span style="color: black;">&#40;</span>i<span style="color: black;">&#41;</span>
&nbsp;
        page_numbers.<span style="color: black;">append</span><span style="color: black;">&#40;</span><span style="color: #008000;">None</span><span style="color: black;">&#41;</span>
&nbsp;
        <span style="color: #ff7700;font-weight:bold;">for</span> i <span style="color: #ff7700;font-weight:bold;">in</span> <span style="color: #008000;">range</span><span style="color: black;">&#40;</span>page_obj.<span style="color: black;">number</span> - before_after_amount, page_obj.<span style="color: black;">number</span><span style="color: black;">&#41;</span>:
            page_numbers.<span style="color: black;">append</span><span style="color: black;">&#40;</span>i<span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">else</span>:
        <span style="color: #ff7700;font-weight:bold;">for</span> i <span style="color: #ff7700;font-weight:bold;">in</span> <span style="color: #008000;">range</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">1</span>, page_obj.<span style="color: black;">number</span><span style="color: black;">&#41;</span>:
            page_numbers.<span style="color: black;">append</span><span style="color: black;">&#40;</span>i<span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #808080; font-style: italic;"># Current page and pages after current page</span>
    <span style="color: #ff7700;font-weight:bold;">if</span> page_obj.<span style="color: black;">number</span> + first_last_amount + before_after_amount <span style="color: #66cc66;">&amp;</span>lt<span style="color: #66cc66;">;</span> paginator.<span style="color: black;">num_pages</span>:
        <span style="color: #ff7700;font-weight:bold;">for</span> i <span style="color: #ff7700;font-weight:bold;">in</span> <span style="color: #008000;">range</span><span style="color: black;">&#40;</span>page_obj.<span style="color: black;">number</span>, page_obj.<span style="color: black;">number</span> + before_after_amount + <span style="color: #ff4500;">1</span><span style="color: black;">&#41;</span>:
            page_numbers.<span style="color: black;">append</span><span style="color: black;">&#40;</span>i<span style="color: black;">&#41;</span>
&nbsp;
        page_numbers.<span style="color: black;">append</span><span style="color: black;">&#40;</span><span style="color: #008000;">None</span><span style="color: black;">&#41;</span>
&nbsp;
        <span style="color: #ff7700;font-weight:bold;">for</span> i <span style="color: #ff7700;font-weight:bold;">in</span> <span style="color: #008000;">range</span><span style="color: black;">&#40;</span>paginator.<span style="color: black;">num_pages</span> - first_last_amount + <span style="color: #ff4500;">1</span>, paginator.<span style="color: black;">num_pages</span> + <span style="color: #ff4500;">1</span><span style="color: black;">&#41;</span>:
            page_numbers.<span style="color: black;">append</span><span style="color: black;">&#40;</span>i<span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">else</span>:
        <span style="color: #ff7700;font-weight:bold;">for</span> i <span style="color: #ff7700;font-weight:bold;">in</span> <span style="color: #008000;">range</span><span style="color: black;">&#40;</span>page_obj.<span style="color: black;">number</span>, paginator.<span style="color: black;">num_pages</span> + <span style="color: #ff4500;">1</span><span style="color: black;">&#41;</span>:
            page_numbers.<span style="color: black;">append</span><span style="color: black;">&#40;</span>i<span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: black;">&#123;</span>
        <span style="color: #483d8b;">'paginator'</span>: paginator,
        <span style="color: #483d8b;">'page_obj'</span>: page_obj,
        <span style="color: #483d8b;">'page_numbers'</span>: page_numbers
    <span style="color: black;">&#125;</span>
&nbsp;
register.<span style="color: black;">inclusion_tag</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'layout/pagination.html'</span>, takes_context=<span style="color: #008000;">True</span><span style="color: black;">&#41;</span><span style="color: black;">&#40;</span>render_paginator<span style="color: black;">&#41;</span></pre></div></div>

<p>Con la siguiente plantilla:</p>

<div class="wp_syntax"><div class="code"><pre class="html" style="font-family:monospace;">{% if page_obj.has_previous %}
  &lt;a href=&quot;?page={{ page_obj.previous_page_number }}&quot;&gt;Previous&lt;/a&gt;
{% endif %}
{% for page in page_numbers %}
  {% if page %}
    {% ifequal page page_obj.number %}
      &lt;strong&gt;{{ page }}&lt;/strong&gt;
    {% else %}
      &lt;a href=&quot;?page={{ page }}&quot;&gt;{{ page }}&lt;/a&gt;
    {% endifequal %}
  {% else %}
    ...
  {% endif %}
{% endfor %}
{% if page_obj.has_next %}
  &lt;a href=&quot;?page={{ page_obj.next_page_number }}&quot;&gt;Next&lt;/a&gt;
{% endif %}</pre></div></div>

<p>Para usarlo se coloca el siguiente codigo en cualquiera de las plantillas que queramos paginar:</p>

<div class="wp_syntax"><div class="code"><pre class="html" style="font-family:monospace;">    {% if is_paginated %}
      {% load render_paginator %}
      {% render_paginator 2 3 %}
    {% endif %}</pre></div></div>

<p>Lo que genera un código como:</p>

<div class="wp_syntax"><div class="code"><pre class="html" style="font-family:monospace;">Previous  1  2  ... 5  6  7  8  9  10  11  ... 25  26  Next</pre></div></div>

<p>Lo mejor de todo es que no necesita ningún componente adicional ni interfiere con la paginación por defecto que traen las vistas genéricas en django.</p>
]]></content:encoded>
			<wfw:commentRss>http://axiacore.com/2010/01/paginacion-en-django-estilo-digg/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>Trabajando con Symfony en forma interactiva</title>
		<link>http://axiacore.com/2009/11/trabajando-con-symfony-en-forma-interactiva/</link>
		<comments>http://axiacore.com/2009/11/trabajando-con-symfony-en-forma-interactiva/#comments</comments>
		<pubDate>Mon, 09 Nov 2009 06:23:33 +0000</pubDate>
		<dc:creator>Juan Pablo Romero Bernal</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[Php]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[Symfony]]></category>
		<category><![CDATA[Web]]></category>

		<guid isPermaLink="false">http://axiacore.com/blog/?p=781</guid>
		<description><![CDATA[Para algunos desarrolladores nos es muy cómodo trabajar desde la línea de comandos, ya que diez dedos hacen más que dos. De hecho cuando se desarrollan aplicaciones con Symfony, el uso de la terminal de comandos es fundamental para muchas tareas (generación del modelo, creación de esquemas de base de datos, limpiar la cache, etc,.) [...]]]></description>
			<content:encoded><![CDATA[<p>Para algunos desarrolladores nos es muy cómodo trabajar desde la línea de comandos, ya que diez dedos hacen más que dos. De hecho cuando se desarrollan aplicaciones con Symfony, el uso de la terminal de comandos es fundamental para muchas tareas (generación del modelo, creación de esquemas de base de datos, limpiar la cache, etc,.) que simplifican el trabajo significativamente.<span id="more-781"></span></p>
<p>Desde luego, todo esto es gracias a la interfaz en línea de comandos del ínterprete php (más conocido como php-cli), que en algunos casos se queda corto para ejecutar algunas pruebas: ver el estado de un objeto, insertar datos en la base de datos,  probar métodos de manera interactiva, etc,. Sé que algunos dirán que php-cli tiene un modo interactivo, pero en realidad desde mi punto de vista es muy limitado.  Sería muy interesante contar con algo similar a la terminal interactiva de python y desde luego que se pueda trabajar con nuestros proyectos en Symfony.</p>
<p>Lo mejor de todo, es que la gente de facebook liberó bajo licencia BSD una shell interactiva para php y como sus mismos credadores dicen: &#8220;&#8230; irónicamente escrita en python &#8230;.&#8221;; se llama <a href="http://www.phpsh.org/">phpsh</a> y realmente es un gran trabajo. He realizado algunas pruebas de integración con Symfony y creo que puede ser de gran apoyo para pruebas y aún más para las personas que están aprendiendo a trabajar con el framework.</p>
<p>A continuación van algunos de los sencillos experimentos realizados:</p>
<p>Una vez se haya instalado phpsh (leer el README), podemos trabajar  con sentencias de php y usar las funciones:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;">test$ phpsh
Starting php
type <span style="color: #0000ff;">'h'</span> or <span style="color: #0000ff;">'help'</span> to see instructions <span style="color: #339933;">&amp;</span>amp<span style="color: #339933;">;</span> features
php<span style="color: #339933;">&amp;</span>gt<span style="color: #339933;">;</span> <span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">&quot;Hola mundo&quot;</span>
Hola mundo
php<span style="color: #339933;">&amp;</span>gt<span style="color: #339933;">;</span> <span style="color: #000088;">$a</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">2</span><span style="color: #339933;">+</span><span style="color: #cc66cc;">3</span><span style="color: #339933;">;</span> <span style="color: #b1b100;">echo</span> <span style="color: #000088;">$a</span>
<span style="color: #cc66cc;">5</span></pre></div></div>


<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;">php<span style="color: #339933;">&amp;</span>gt<span style="color: #339933;">;</span> <span style="color: #000088;">$f</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'uno'</span> <span style="color: #339933;">=&amp;</span>gt<span style="color: #339933;">;</span> <span style="color: #cc66cc;">1</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'dos'</span> <span style="color: #339933;">=&amp;</span>gt<span style="color: #339933;">;</span> <span style="color: #cc66cc;">2</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'tres'</span> <span style="color: #339933;">=&amp;</span>gt<span style="color: #339933;">;</span> <span style="color: #cc66cc;">3</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
php<span style="color: #339933;">&amp;</span>gt<span style="color: #339933;">;</span> <span style="color: #b1b100;">foreach</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$f</span> <span style="color: #b1b100;">as</span> <span style="color: #000088;">$n</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span> <span style="color: #b1b100;">echo</span> <span style="color: #000088;">$n</span><span style="color: #339933;">;</span> <span style="color: #009900;">&#125;</span>
<span style="color: #cc66cc;">123</span>
php<span style="color: #339933;">&amp;</span>gt<span style="color: #339933;">;</span> <span style="color: #b1b100;">foreach</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$f</span> <span style="color: #b1b100;">as</span> <span style="color: #000088;">$n</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span> <span style="color: #b1b100;">echo</span> <span style="color: #000088;">$n</span><span style="color: #339933;">.</span><span style="color: #0000ff;">&quot;<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">;</span> <span style="color: #009900;">&#125;</span>
<span style="color: #cc66cc;">1</span>
<span style="color: #cc66cc;">2</span>
<span style="color: #cc66cc;">3</span></pre></div></div>


<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;">php<span style="color: #339933;">&amp;</span>gt<span style="color: #339933;">;</span> <span style="color: #b1b100;">foreach</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$f</span> <span style="color: #b1b100;">as</span> <span style="color: #000088;">$n</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
<span style="color: #339933;">...</span> <span style="color: #b1b100;">echo</span> <span style="color: #000088;">$n</span><span style="color: #339933;">.</span><span style="color: #0000ff;">&quot;<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">;</span>
<span style="color: #339933;">...</span> <span style="color: #009900;">&#125;</span>
<span style="color: #cc66cc;">1</span>
<span style="color: #cc66cc;">2</span>
<span style="color: #cc66cc;">3</span>
php<span style="color: #339933;">&amp;</span>gt<span style="color: #339933;">;</span> <span style="color: #b1b100;">echo</span> <span style="color: #990000;">count</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$f</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #cc66cc;">3</span></pre></div></div>

<p>Bien, pero ahora viene algo un poco más interesante: usar a través del shell interactivo nuestra aplicación hecha en Symfony.</p>
<p>No requiere ninguna configuración especial, simplemente cargar un archivo y listo; se trata del controlador frontal de nuestra aplicación (alguno de los que se encuentra en web), así:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;">test$ phpsh web<span style="color: #339933;">/</span>index<span style="color: #339933;">.</span>php
Starting php with extra includes<span style="color: #339933;">:</span> <span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'web/index.php'</span><span style="color: #009900;">&#93;</span>
&nbsp;
  <span style="color: #339933;">.......................</span>
&nbsp;
php<span style="color: #339933;">&amp;</span>gt<span style="color: #339933;">;</span></pre></div></div>

<p>Para obviar la salida html, podemos crear una copia de ese archivo y evitar la llamada al método dispatch(), así:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #b1b100;">require_once</span><span style="color: #009900;">&#40;</span><span style="color: #990000;">dirname</span><span style="color: #009900;">&#40;</span><span style="color: #009900; font-weight: bold;">__FILE__</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">.</span><span style="color: #0000ff;">'/config/ProjectConfiguration.class.php'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000088;">$configuration</span> <span style="color: #339933;">=</span> ProjectConfiguration<span style="color: #339933;">::</span><span style="color: #004000;">getApplicationConfiguration</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'frontend'</span><span style="color: #339933;">,</span><span style="color: #0000ff;">'prod'</span><span style="color: #339933;">,</span> <span style="color: #009900; font-weight: bold;">false</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
sfContext<span style="color: #339933;">::</span><span style="color: #004000;">createInstance</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$configuration</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Ahora, de nuevo lo cargamos (ese archivo lo he llamado shell.php):</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;">test$ phpsh shell<span style="color: #339933;">.</span>php
Starting php with extra includes<span style="color: #339933;">:</span> <span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'shell.php'</span><span style="color: #009900;">&#93;</span>
type <span style="color: #0000ff;">'h'</span> or <span style="color: #0000ff;">'help'</span> to see instructions <span style="color: #339933;">&amp;</span>amp<span style="color: #339933;">;</span> features
php<span style="color: #339933;">&amp;</span>gt<span style="color: #339933;">;</span> <span style="color: #000088;">$c</span> <span style="color: #339933;">=</span> CiudadPeer<span style="color: #339933;">::</span><span style="color: #004000;">doSelect</span><span style="color: #009900;">&#40;</span><span style="color: #000000; font-weight: bold;">new</span> Criteria<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
php<span style="color: #339933;">&amp;</span>gt<span style="color: #339933;">;</span> <span style="color: #b1b100;">foreach</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$c</span> <span style="color: #b1b100;">as</span> <span style="color: #000088;">$ciudad</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
 <span style="color: #339933;">...</span> <span style="color: #b1b100;">echo</span> <span style="color: #000088;">$ciudad</span><span style="color: #339933;">.</span><span style="color: #0000ff;">&quot;<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">;</span>
 <span style="color: #339933;">...</span> <span style="color: #009900;">&#125;</span>
Barranquilla
Bogota
Constantinopla
Medellin
&nbsp;
php<span style="color: #339933;">&amp;</span>gt<span style="color: #339933;">;</span></pre></div></div>

<p>Como se puede ver, puedo acceder a las clases de mi modelo (disculpas a los usuarios de Doctrine) y desde luego a las clases que nos proporciona Symfony, por ejemplo si mi archivo <strong>apps/frontend/config/app.yml</strong> es:</p>

<div class="wp_syntax"><div class="code"><pre class="yml" style="font-family:monospace;">all:
 resultados_por_pagina: 15
 sf_phpmailer:
   mailer:                    true
   smtp_auth:                 true
   smtp_secure:               &quot;ssl&quot;
   host:                      &quot;smtp.mihost&quot;
   port:                      600
   username:                  &quot;miusuario&quot;
   password:                  &quot;miclave&quot;
   from:                      &quot;nosesabe@example.com&quot;
   from_name:                 &quot;Anonimo&quot;</pre></div></div>


<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;">test$ phpsh shell<span style="color: #339933;">.</span>php
Starting php with extra includes<span style="color: #339933;">:</span> <span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'shell.php'</span><span style="color: #009900;">&#93;</span>
type <span style="color: #0000ff;">'h'</span> or <span style="color: #0000ff;">'help'</span> to see instructions <span style="color: #339933;">&amp;</span>amp<span style="color: #339933;">;</span> features
php<span style="color: #339933;">&amp;</span>gt<span style="color: #339933;">;</span> <span style="color: #000088;">$conf</span> <span style="color: #339933;">=</span> sfConfig<span style="color: #339933;">::</span><span style="color: #004000;">get</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'app_sf_phpmailer_port'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
php<span style="color: #339933;">&amp;</span>gt<span style="color: #339933;">;</span> <span style="color: #b1b100;">echo</span> <span style="color: #000088;">$conf</span><span style="color: #339933;">;</span>
<span style="color: #cc66cc;">600</span>
php<span style="color: #339933;">&amp;</span>gt<span style="color: #339933;">;</span> <span style="color: #b1b100;">echo</span> sfConfig<span style="color: #339933;">::</span><span style="color: #004000;">get</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'app_resultados_por_pagina'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #cc66cc;">15</span>
php<span style="color: #339933;">&amp;</span>gt<span style="color: #339933;">;</span></pre></div></div>

<p>Bueno, esos han sido los experimentos que he alcanzado a realizar. Espero trabajar más en detalle y publicar los resultados. Hasta una próxima.</p>
]]></content:encoded>
			<wfw:commentRss>http://axiacore.com/2009/11/trabajando-con-symfony-en-forma-interactiva/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Mostrar numero de version en django</title>
		<link>http://axiacore.com/2009/11/mostrar-numero-de-version-en-django/</link>
		<comments>http://axiacore.com/2009/11/mostrar-numero-de-version-en-django/#comments</comments>
		<pubDate>Tue, 03 Nov 2009 13:31:17 +0000</pubDate>
		<dc:creator>Camilo Nova</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[Desarrollo]]></category>
		<category><![CDATA[Django]]></category>
		<category><![CDATA[Python]]></category>

		<guid isPermaLink="false">http://axiacore.com/blog/?p=776</guid>
		<description><![CDATA[En AxiaCore utilizamos subversion para llevar el control de versiones de los proyectos, junto a nuestro esquema de desarrollo ágil manejamos ciclos cortos de lanzamiento de nuevas funcionalidades, por eso para nosotros es necesario conocer el numero de revisión del SVN y publicarlo en un lugar fácilmente accesible para los usuarios, de tal forma que [...]]]></description>
			<content:encoded><![CDATA[<p>En AxiaCore utilizamos subversion para llevar el control de versiones de los proyectos, junto a nuestro esquema de desarrollo ágil manejamos ciclos cortos de lanzamiento de nuevas funcionalidades, por eso para nosotros es necesario conocer el numero de revisión del SVN y publicarlo en un lugar fácilmente accesible para los usuarios, de tal forma que rápidamente nos puedan indicar la versión que están utilizando.<span id="more-776"></span></p>
<p>La aproximación inicial es tener un parámetro donde se indique un numero de versión de la aplicación, pero esta fue rápidamente descartada porque no es flexible y se tendría que cambiar la versión manualmente en cada nuevo cambio, así que decidimos manejar el numero de revisión del repositorio como el indicador de la versión. Ahora bien, se necesita una manera automática de obtener dicho numero y publicarlo en una plantilla HTML para verlo en la interfaz de usuario.</p>
<p>Lo resolvimos así:</p>
<p>Partimos de la plantilla donde básicamente django nos permite lo siguiente:</p>

<div class="wp_syntax"><div class="code"><pre class="html" style="font-family:monospace;">{% load version_tag %}
&nbsp;
Version: {% get_version %}</pre></div></div>

<p>Entonces cargamos un &#8216;custom tag&#8217; que nos retorna la versión actual de la aplicación, el cual es:</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #808080; font-style: italic;">#! /usr/bin/env python</span>
<span style="color: #808080; font-style: italic;"># -*- coding: utf8 -*-</span>
<span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">subprocess</span>
<span style="color: #ff7700;font-weight:bold;">from</span> django <span style="color: #ff7700;font-weight:bold;">import</span> template
<span style="color: #ff7700;font-weight:bold;">from</span> django.<span style="color: black;">core</span>.<span style="color: black;">cache</span> <span style="color: #ff7700;font-weight:bold;">import</span> cache
&nbsp;
register = template.<span style="color: black;">Library</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
&nbsp;
@register.<span style="color: black;">simple_tag</span>
<span style="color: #ff7700;font-weight:bold;">def</span> get_version<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>:
    <span style="color: #483d8b;">&quot;&quot;&quot;
    Retorna el numero de version para la aplicacion y lo almacena en
    cache para evitar ser llamado multiples veces y mejorar el rendimiento
    de la aplicacion.
    &quot;&quot;&quot;</span>
    <span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: #ff7700;font-weight:bold;">not</span> cache.<span style="color: black;">get</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'version'</span><span style="color: black;">&#41;</span>:
        comando = <span style="color: #483d8b;">'svn info | grep Rev | head -1'</span>
        <span style="color: #ff7700;font-weight:bold;">try</span>:
            proc = <span style="color: #dc143c;">subprocess</span>.<span style="color: black;">Popen</span><span style="color: black;">&#40;</span>comando, shell=<span style="color: #008000;">True</span>,
                stdout=<span style="color: #dc143c;">subprocess</span>.<span style="color: black;">PIPE</span>, stderr=<span style="color: #dc143c;">subprocess</span>.<span style="color: black;">PIPE</span>
            <span style="color: black;">&#41;</span>
            line = proc.<span style="color: black;">communicate</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><span style="color: black;">&#91;</span><span style="color: #ff4500;">0</span><span style="color: black;">&#93;</span>
            version = line<span style="color: black;">&#91;</span>line.<span style="color: black;">find</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot; &quot;</span><span style="color: black;">&#41;</span>+<span style="color: #ff4500;">1</span>:<span style="color: black;">&#93;</span>.<span style="color: black;">rstrip</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: black;">&#41;</span>
        <span style="color: #ff7700;font-weight:bold;">except</span>:
            version = <span style="color: #483d8b;">'---'</span>
&nbsp;
        tiempo = <span style="color: #ff4500;">24</span> <span style="color: #66cc66;">*</span> <span style="color: #ff4500;">60</span> <span style="color: #66cc66;">*</span> <span style="color: #ff4500;">60</span>   <span style="color: #808080; font-style: italic;">#Tiempo en segundos de un dia</span>
        cache.<span style="color: #008000;">set</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'version'</span>, version, tiempo<span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">return</span> cache.<span style="color: black;">get</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'version'</span><span style="color: black;">&#41;</span></pre></div></div>

<p>Este archivo (version_tag.py) debe estar dentro de una carpeta llamada &#8216;templatetags&#8217; de alguna aplicación del proyecto.</p>
<p>Lo interesante de esta solución es:</p>
<ol>
<li>Obtiene el numero de versión por el comando &#8216;svn info&#8217;</li>
<li>Reduce las llamadas al comando ubicando la información en cache durante un día</li>
<li>Es totalmente desacoplado del proyecto y se puede reutilizar fácilmente</li>
<li>Se puede adaptar para otros sistemas de control de versiones</li>
</ol>
<p>Que les parece?</p>
]]></content:encoded>
			<wfw:commentRss>http://axiacore.com/2009/11/mostrar-numero-de-version-en-django/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Cambiar el QuerySet de un ForeingKey de un modelo en Django</title>
		<link>http://axiacore.com/2009/01/cambiar-el-queryset-de-un-foreingkey-de-un-modelo-en-django/</link>
		<comments>http://axiacore.com/2009/01/cambiar-el-queryset-de-un-foreingkey-de-un-modelo-en-django/#comments</comments>
		<pubDate>Wed, 21 Jan 2009 17:07:05 +0000</pubDate>
		<dc:creator>Camilo Nova</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[Codigo Fuente]]></category>
		<category><![CDATA[Django]]></category>
		<category><![CDATA[Python]]></category>

		<guid isPermaLink="false">http://axiacore.com/blog/?p=628</guid>
		<description><![CDATA[Es posible declarar tipos ForeignKey en un modelo de datos de Django, pero puede que necesitemos filtrar los valores de esta relación, para efectuar tal cambio necesitamos recurrir al Form que muestra ese modelo y modificar el método __init__ de la siguiente manera: 1 2 3 4 class MyModelForm&#40;forms.Form&#41;: def __init__&#40;self, *args, **kwargs&#41;: super&#40;MyModelForm, self&#41;.__init__&#40;*args, [...]]]></description>
			<content:encoded><![CDATA[<p>Es posible declarar tipos ForeignKey en un modelo de datos de Django, pero puede que necesitemos filtrar los valores de esta relación, para efectuar tal cambio necesitamos recurrir al Form que muestra ese modelo y modificar el método __init__ de la siguiente manera:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
</pre></td><td class="code"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">class</span> MyModelForm<span style="color: black;">&#40;</span>forms.<span style="color: black;">Form</span><span style="color: black;">&#41;</span>:
    <span style="color: #ff7700;font-weight:bold;">def</span> <span style="color: #0000cd;">__init__</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, <span style="color: #66cc66;">*</span>args, <span style="color: #66cc66;">**</span>kwargs<span style="color: black;">&#41;</span>:
        <span style="color: #008000;">super</span><span style="color: black;">&#40;</span>MyModelForm, <span style="color: #008000;">self</span><span style="color: black;">&#41;</span>.<span style="color: #0000cd;">__init__</span><span style="color: black;">&#40;</span><span style="color: #66cc66;">*</span>args, <span style="color: #66cc66;">**</span>kwargs<span style="color: black;">&#41;</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">fields</span><span style="color: black;">&#91;</span><span style="color: #483d8b;">&quot;myFKField&quot;</span><span style="color: black;">&#93;</span>.<span style="color: black;">queryset</span> = MyModel.<span style="color: black;">objects</span>.<span style="color: #008000;">all</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span></pre></td></tr></table></div>

<p>Esto permite cambiar los datos que son mostrados por el campo en el Form por unos filtrados que nosotros queramos, existe tambien la posibilidad de trabajar con limit_choices_to de ForeignKey pero esta solución me funciono de inmediato.</p>
]]></content:encoded>
			<wfw:commentRss>http://axiacore.com/2009/01/cambiar-el-queryset-de-un-foreingkey-de-un-modelo-en-django/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Adicionar o Sustraer Dias en Python</title>
		<link>http://axiacore.com/2009/01/adicionar-o-sustraer-dias-en-python/</link>
		<comments>http://axiacore.com/2009/01/adicionar-o-sustraer-dias-en-python/#comments</comments>
		<pubDate>Tue, 20 Jan 2009 20:22:02 +0000</pubDate>
		<dc:creator>Camilo Nova</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[Codigo Fuente]]></category>
		<category><![CDATA[Python]]></category>

		<guid isPermaLink="false">http://axiacore.com/blog/?p=624</guid>
		<description><![CDATA[Para agregar o sustraer días a una fecha determinada en python lo mejor es hacerlo así: 1 2 3 4 5 from datetime import date, timedelta #Agregar d=date.today&#40;&#41;+timedelta&#40;days=dias&#41; #Sustraer d=date.today&#40;&#41;-timedelta&#40;days=dias&#41; La operación respeta los días al cambiar de mes y funciona perfecto.]]></description>
			<content:encoded><![CDATA[<p>Para agregar o sustraer días a una fecha determinada en python lo mejor es hacerlo así:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
</pre></td><td class="code"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">from</span> <span style="color: #dc143c;">datetime</span> <span style="color: #ff7700;font-weight:bold;">import</span> date, timedelta
<span style="color: #808080; font-style: italic;">#Agregar</span>
d=date.<span style="color: black;">today</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>+timedelta<span style="color: black;">&#40;</span>days=dias<span style="color: black;">&#41;</span>
<span style="color: #808080; font-style: italic;">#Sustraer</span>
d=date.<span style="color: black;">today</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>-timedelta<span style="color: black;">&#40;</span>days=dias<span style="color: black;">&#41;</span></pre></td></tr></table></div>

<p>La operación respeta los días al cambiar de mes y funciona perfecto.</p>
]]></content:encoded>
			<wfw:commentRss>http://axiacore.com/2009/01/adicionar-o-sustraer-dias-en-python/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Desarrollo Agil de Software</title>
		<link>http://axiacore.com/2008/12/desarrollo-agil-de-software/</link>
		<comments>http://axiacore.com/2008/12/desarrollo-agil-de-software/#comments</comments>
		<pubDate>Tue, 02 Dec 2008 13:53:21 +0000</pubDate>
		<dc:creator>Camilo Nova</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[Codigo Fuente]]></category>
		<category><![CDATA[Desarrollo]]></category>
		<category><![CDATA[Django]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[Software]]></category>

		<guid isPermaLink="false">http://axiacore.com/blog/?p=551</guid>
		<description><![CDATA[Llego al final aquella epoca dorada en la cual uno destinaba 6 meses para desarrollar un proyecto de software, con muchos recursos y tareas repetitivas, junto con un elevado costo. Hoy en dia los frameworks son mas agiles y permiten una produccion mucho mayor de funcionalidad con menos codigo fuente, esta tendencia provoca que los [...]]]></description>
			<content:encoded><![CDATA[<p>Llego al final aquella epoca dorada en la cual uno destinaba 6 meses para desarrollar un proyecto de software, con muchos recursos y tareas repetitivas, junto con un elevado costo.</p>
<p>Hoy en dia los frameworks son mas agiles y permiten una produccion mucho mayor de funcionalidad con menos codigo fuente, esta tendencia provoca que los desarrollos tomen mucho menos tiempo y recursos, lo que implica a su vez que los costos sean menores y que esta industria cada vez sea mas agil.</p>
<p>Yo sigo sorprendido con django, es muy poco el codigo que se debe escribir, basicamente la tarea es de arquitectura y no de codificación, por ahora estoy desarrollando una aplicacion muy sencilla y me ha tomado una tercera parte de lo que me hubiera costado realizarlo en java, creo que he acertado en la tendencia de lenguajes de programacion y esta vez python sigue ganando la batalla.</p>
]]></content:encoded>
			<wfw:commentRss>http://axiacore.com/2008/12/desarrollo-agil-de-software/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

