<?xml version='1.0' encoding='UTF-8'?><rss xmlns:atom="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearchrss/1.0/" xmlns:blogger="http://schemas.google.com/blogger/2008" xmlns:georss="http://www.georss.org/georss" xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr="http://purl.org/syndication/thread/1.0" version="2.0"><channel><atom:id>tag:blogger.com,1999:blog-3140509662250705880</atom:id><lastBuildDate>Thu, 29 Aug 2024 10:06:27 +0000</lastBuildDate><category>grails</category><category>groovy</category><category>javascript</category><category>rails</category><category>svn</category><category>bases de datos</category><category>firefox</category><category>j2me</category><category>java</category><category>jquery</category><category>project management</category><category>prototipar</category><category>slicehost</category><category>ubuntu</category><title>Obrero del software</title><description>Recopilación de experiencias extraidas de la difícil vida de un obrero del software</description><link>http://obrerodelsoftware.blogspot.com/</link><managingEditor>noreply@blogger.com (el_obrero)</managingEditor><generator>Blogger</generator><openSearch:totalResults>17</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><item><guid isPermaLink="false">tag:blogger.com,1999:blog-3140509662250705880.post-7054892459358222285</guid><pubDate>Sat, 28 Mar 2009 23:25:00 +0000</pubDate><atom:updated>2009-03-28T20:53:51.975-03:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">rails</category><title>Adjuntando archivos en rails</title><description>En el proyecto que estoy trabajando ahora, una aplicación para la administración de bienes raíces utilizando rails, me he topado con tener que agregar fotos a mi modelo &quot;propiedad&quot;.&lt;br /&gt;No solo necesitaba agregar imágenes, sino generar thumbnails de al menos 2 tamaños distintos.&lt;br /&gt;&lt;br /&gt;Por suerte me topé con &lt;a href=&quot;http://www.thoughtbot.com/projects/paperclip&quot;&gt;Paperclip&lt;/a&gt; que facilita infinitamente trabajar con archivos dentro de Rails. A continuación les presento un tutorial básico de su instalación y configuración:&lt;br /&gt;&lt;br /&gt;Paperclip es un plugin de Rails, se pueden descargar la última versión de &lt;a href=&quot;http://github.com/thoughtbot/paperclip/tree/master&quot;&gt;acá&lt;/a&gt; y extraerla en la carpeta /vendor/plugins de su proyecto. Ahora supongamos que queremos agregar una foto a nuestro modelo Usuario, para ello utilizamos&lt;span style=&quot;font-style: italic;&quot;&gt; has_attached_file&lt;/span&gt; de la siguiente forma:&lt;br /&gt;&lt;pre&gt;  class Usuario &lt; ActiveRecord::Base&lt;br /&gt;   has_attached_file :foto, :styles =&gt; {&lt;br /&gt;               :mediana =&gt; &quot;300x300&gt;&quot;,&lt;br /&gt;               :thumb =&gt; &quot;100x100&gt;&quot; }&lt;br /&gt; end&lt;br /&gt;&lt;/pre&gt;Como podemos ver, en el array &lt;span style=&quot;font-style: italic;&quot;&gt;:styles&lt;/span&gt; le pasamos las medidas de nuestros thumbnails, por lo que cuando subamos una foto, Paperclip generará 3 versiones: la original, una mediana de 300x300 y un thumnail de 100x100. Ambas operaciones de re-dimensionamiento mantendrán las proporciones de la imágen. Si se quiere cortar la imagen a redimiensionar hay que especificar el tamaño de esta forma: &quot;100x100#&quot;.&lt;br /&gt;&lt;br /&gt;Ahora necesitamos crear una migración para agregar los campos necesarios a nuestra tabla usuarios.&lt;br /&gt;&lt;pre&gt;class AgregarFotoDeUsuario &lt; ActiveRecord::Migration&lt;br /&gt;   def self.up&lt;br /&gt;     add_column :usuarios, :foto_file_name,    :string&lt;br /&gt;     add_column :usuarios, :foto_content_type, :string&lt;br /&gt;     add_column :usuarios, :foto_file_size,    :integer&lt;br /&gt;     add_column :usuarios, :foto_updated_at,   :datetime&lt;br /&gt;   end&lt;br /&gt;&lt;br /&gt;   def self.down&lt;br /&gt;     remove_column :usuarios, :foto_file_name&lt;br /&gt;     remove_column :usuarios, :foto_content_type&lt;br /&gt;     remove_column :usuarios, :foto_file_size&lt;br /&gt;     remove_column :usuarios, :foto_updated_at&lt;br /&gt;   end&lt;br /&gt; end&lt;br /&gt;&lt;/pre&gt;Corremos las migraciones:&lt;br /&gt;&lt;pre&gt;rake db:migrate&lt;/pre&gt; El siguiente paso es modificar nuestro form de Usuario para subir una imágen.&lt;br /&gt;&lt;pre&gt;&lt;% form_for :usuario, @usuario, :url =&gt; usuario_path,&lt;br /&gt;              :html =&gt; { :multipart =&gt; true } do |form| %&gt;&lt;br /&gt;   &lt;%= form.file_field :foto %&gt;&lt;br /&gt;&lt;% end %&gt;&lt;br /&gt;&lt;/pre&gt;No olvidarse de &quot;&lt;span style=&quot;font-style: italic;&quot;&gt;multipart =&gt; true&lt;/span&gt;&quot; ya que es lo que permite al form subir la imágen en el post.&lt;br /&gt;Por suerte no tenemos que tocar nuestro controlador.&lt;br /&gt;&lt;br /&gt;Para mostrar la foto en las vistas:&lt;br /&gt;&lt;pre&gt;  &lt;%= image_tag @usuario.foto.url %&gt; #muestra la original&lt;br /&gt; &lt;%= image_tag @usuario.foto.url(:mediana) %&gt; #muestra la mediana&lt;br /&gt; &lt;%= image_tag @usuario.foto.url(:thumb) %&gt; #muestra el thumb&lt;br /&gt;&lt;/pre&gt;</description><link>http://obrerodelsoftware.blogspot.com/2009/03/adjuntando-archivos-en-rails.html</link><author>noreply@blogger.com (el_obrero)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-3140509662250705880.post-3519857505064576398</guid><pubDate>Sun, 01 Mar 2009 01:38:00 +0000</pubDate><atom:updated>2009-02-28T23:47:17.544-02:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">grails</category><category domain="http://www.blogger.com/atom/ns#">groovy</category><title>Timestamps en Grails</title><description>Para clases del dominio, necesitamos a veces utilizar fechas de creación y modificación. En Rails ya vienen los timestamps por defecto en las migraciones. Grails, para no quedarse atrás lo hace bastante sencillo.&lt;br /&gt;Para cualquier clase del dominio que quieras agregarle los timestamps de creación y modificación debes usar los siguientes atributos:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;class Usuario{&lt;br /&gt;    String nombre&lt;br /&gt;    String documento&lt;br /&gt;    //demas atributos...&lt;br /&gt;    Date dateCreated //fecha de creación&lt;br /&gt;    Date lastUpdated //ultima actualización&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Recuerda que para que no te cree el campo al generar las vistas, debes poner esto en las constraints:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;static constraints ={&lt;br /&gt;        lastUpdated(display:false)&lt;br /&gt;       dateCreated(display:false)&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Espero que sirva!</description><link>http://obrerodelsoftware.blogspot.com/2009/02/timestamps-en-grails.html</link><author>noreply@blogger.com (el_obrero)</author><thr:total>1</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-3140509662250705880.post-6072948465464060202</guid><pubDate>Mon, 08 Sep 2008 23:05:00 +0000</pubDate><atom:updated>2008-09-08T20:26:07.157-03:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">grails</category><category domain="http://www.blogger.com/atom/ns#">groovy</category><title>Grails - Objetos Command</title><description>Hay veces que necesitamos mapear propiedades para actualizar una clase del dominio que no necesariamente se corresponden con el mismo, o tenemos interacciones que ni siquiera utilizan una clase. &lt;div&gt;Incluso en estos casos nos facilita la tarea las validaciones y data bindings de grails. Para utilizar estas facilidades debemos recurrir a las clases &lt;span class=&quot;Apple-style-span&quot; style=&quot;font-style: italic;&quot;&gt;Command&lt;/span&gt;.&lt;/div&gt;&lt;div&gt;En el siguiente ejemplo usaremos un objeto &lt;span class=&quot;Apple-style-span&quot; style=&quot;font-style: italic;&quot;&gt;Command &lt;/span&gt;para cambiar un password en el ámbito de un controlador de &lt;span class=&quot;Apple-style-span&quot; style=&quot;font-style: italic;&quot;&gt;Usuario&lt;/span&gt;.&lt;/div&gt;&lt;div&gt;El primer paso es crear una clase &lt;span class=&quot;Apple-style-span&quot; style=&quot;font-style: italic;&quot;&gt;PasswordCommand &lt;/span&gt;(podemos incluso crearla dentro del mismo archivo en donde tenemos nuestro controlador).&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;  style=&quot;font-size:small;&quot;&gt;class PasswordCommand {&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;  style=&quot;font-size:small;&quot;&gt;    String password_actual&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;  style=&quot;font-size:small;&quot;&gt;    String password_nuevo&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;  style=&quot;font-size:small;&quot;&gt;    String password_confirmacion    &lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;  style=&quot;font-size:small;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;&lt;span class=&quot;Apple-style-span&quot;  style=&quot;font-size:small;&quot;&gt; &lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;Apple-style-span&quot;  style=&quot;font-size:small;&quot;&gt;static constraints = {&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;&lt;span class=&quot;Apple-style-span&quot;  style=&quot;font-size:small;&quot;&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;Apple-style-span&quot;  style=&quot;font-size:small;&quot;&gt;password_nuevo(blank:false, minSize:6)&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;&lt;span class=&quot;Apple-style-span&quot;  style=&quot;font-size:small;&quot;&gt; &lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;Apple-style-span&quot;  style=&quot;font-size:small;&quot;&gt;}&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;  style=&quot;font-size:small;&quot;&gt;}&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Esa clase es como cualquiera del dominio, podemos definir las costraints que queramos. Luego sólo falta utilizarla en la acción que necesitemos, en este caso en la acción &lt;span class=&quot;Apple-style-span&quot; style=&quot;font-style: italic;&quot;&gt;cambiarPassword&lt;/span&gt;:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;white-space: normal; &quot;&gt;&lt;span class=&quot;Apple-style-span&quot;  style=&quot;font-family:georgia;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot;  style=&quot;font-size:small;&quot;&gt;class UsuarioController{&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;Apple-style-span&quot;  style=&quot;font-family:georgia;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot;  style=&quot;font-size:small;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;&lt;span class=&quot;Apple-style-span&quot;  style=&quot;font-size:small;&quot;&gt; &lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;Apple-style-span&quot;  style=&quot;font-size:small;&quot;&gt;def cambiarPassword = {PasswordCommand cmd -&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;&lt;span class=&quot;Apple-style-span&quot;  style=&quot;font-size:small;&quot;&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;Apple-style-span&quot;  style=&quot;font-size:small;&quot;&gt;if(!cmd.hasErrors()){&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;&lt;span class=&quot;Apple-style-span&quot;  style=&quot;font-size:small;&quot;&gt;   &lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;Apple-style-span&quot;  style=&quot;font-size:small;&quot;&gt;//procesar&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;&lt;span class=&quot;Apple-style-span&quot;  style=&quot;font-size:small;&quot;&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;Apple-style-span&quot;  style=&quot;font-size:small;&quot;&gt;}&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;&lt;span class=&quot;Apple-style-span&quot;  style=&quot;font-size:small;&quot;&gt; &lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;Apple-style-span&quot;  style=&quot;font-size:small;&quot;&gt;}&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;  style=&quot;font-size:small;&quot;&gt;}&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;Al definir así nuestra acción, Grails creará una instancia de &lt;span class=&quot;Apple-style-span&quot; style=&quot;font-style: italic;&quot;&gt;PasswordCommand&lt;/span&gt;, haciendo binding de las propiedades que vienen en el request.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Como verán no es un trabajo muy complicado y nos ahorra el trabajo de validar &quot;manualmente&quot; esos parámetros que quedan fuera del dominio.&lt;/div&gt;&lt;/div&gt;</description><link>http://obrerodelsoftware.blogspot.com/2008/09/grails-objetos-command.html</link><author>noreply@blogger.com (el_obrero)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-3140509662250705880.post-4742562762467126601</guid><pubDate>Fri, 01 Aug 2008 23:17:00 +0000</pubDate><atom:updated>2008-08-01T20:40:55.067-03:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">grails</category><title>Exportar a Excel en Grails</title><description>En mi último proyecto en &lt;span class=&quot;blsp-spelling-error&quot; id=&quot;SPELLING_ERROR_0&quot;&gt;Grails&lt;/span&gt;, el cliente quería exportar a &lt;span class=&quot;blsp-spelling-error&quot; id=&quot;SPELLING_ERROR_1&quot;&gt;excel&lt;/span&gt; muchas de las consultas que proporcionaba el programa.&lt;br /&gt;Como no encontré mucha información por ahí, les cuento lo que se me ocurrió a mi.&lt;br /&gt;&lt;div style=&quot;text-align: left;&quot;&gt;Antes que nada, utilicé &lt;a href=&quot;http://jexcelapi.sourceforge.net/&quot;&gt;&lt;span class=&quot;blsp-spelling-error&quot; id=&quot;SPELLING_ERROR_2&quot;&gt;JExcelApi&lt;/span&gt;&lt;/a&gt; para generar los archivos &lt;span class=&quot;blsp-spelling-error&quot; id=&quot;SPELLING_ERROR_3&quot;&gt;excel&lt;/span&gt;. Recuerden que en &lt;span class=&quot;blsp-spelling-error&quot; id=&quot;SPELLING_ERROR_4&quot;&gt;Grails&lt;/span&gt; podemos utilizar cualquier librería Java existente.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Primer paso, colocar el &lt;span class=&quot;blsp-spelling-error&quot; id=&quot;SPELLING_ERROR_5&quot;&gt;jar&lt;/span&gt; (&lt;span class=&quot;blsp-spelling-error&quot; id=&quot;SPELLING_ERROR_6&quot;&gt;jxl&lt;/span&gt;.&lt;span class=&quot;blsp-spelling-error&quot; id=&quot;SPELLING_ERROR_7&quot;&gt;jar&lt;/span&gt; en nuestro caso) de la &lt;span class=&quot;blsp-spelling-corrected&quot; id=&quot;SPELLING_ERROR_8&quot;&gt;librería&lt;/span&gt; en la carpeta &quot;&lt;span class=&quot;blsp-spelling-error&quot; id=&quot;SPELLING_ERROR_9&quot;&gt;lib&lt;/span&gt;&quot; de nuestro proyecto.&lt;br /&gt;Ya que tenía varios métodos para exportar, decidí crear un servicio en &lt;span class=&quot;blsp-spelling-error&quot; id=&quot;SPELLING_ERROR_10&quot;&gt;grails&lt;/span&gt; que encapsulara a los mismos . Lo único que hay que hacer es agregar los &lt;span class=&quot;blsp-spelling-error&quot; id=&quot;SPELLING_ERROR_11&quot;&gt;imports&lt;/span&gt; correspondientes a las clases que utilicemos para nuestro &lt;span class=&quot;blsp-spelling-error&quot; id=&quot;SPELLING_ERROR_12&quot;&gt;excel&lt;/span&gt;.&lt;br /&gt;&lt;pre&gt;&lt;span class=&quot;blsp-spelling-error&quot; id=&quot;SPELLING_ERROR_13&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;blsp-spelling-error&quot; id=&quot;SPELLING_ERROR_14&quot;&gt;jxl&lt;/span&gt;.*;&lt;br /&gt;&lt;span class=&quot;blsp-spelling-error&quot; id=&quot;SPELLING_ERROR_15&quot;&gt;import&lt;/span&gt; jxl.write.*;&lt;br /&gt;&lt;/pre&gt;Lo que nos queda es implementar nuestros métodos usando &lt;span class=&quot;blsp-spelling-error&quot; id=&quot;SPELLING_ERROR_16&quot;&gt;JExcelApi&lt;/span&gt; (ejemplos en otra ocasión) y llamar al servicio desde nuestro controlador.&lt;br /&gt;&lt;br /&gt;Para agregar el servicio a nuestro controlador sólo debemos definir una variable del mismo nombre y será &quot;inyectada&quot; automáticamente a través de &lt;span class=&quot;blsp-spelling-error&quot; id=&quot;SPELLING_ERROR_17&quot;&gt;Spring&lt;/span&gt;. En mi caso el servicio se llamaba &lt;span class=&quot;blsp-spelling-error&quot; id=&quot;SPELLING_ERROR_18&quot;&gt;Report&lt;/span&gt;, entonces&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class=&quot;blsp-spelling-error&quot; id=&quot;SPELLING_ERROR_19&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;blsp-spelling-error&quot; id=&quot;SPELLING_ERROR_20&quot;&gt;reportService&lt;/span&gt;&lt;/pre&gt;Hay que tener en cuenta que a los métodos de reportes les pasé como parámetro el &lt;span style=&quot;font-style: italic;&quot;&gt;response&lt;/span&gt;, así escribimos en el mismo y al cliente le aparecerá el diálogo para bajar un archivo &lt;span class=&quot;blsp-spelling-error&quot; id=&quot;SPELLING_ERROR_21&quot;&gt;XLS&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;en el controlador:&lt;br /&gt;&lt;pre&gt;response.&lt;span class=&quot;blsp-spelling-error&quot; id=&quot;SPELLING_ERROR_22&quot;&gt;setHeader&lt;/span&gt;(&quot;&lt;span class=&quot;blsp-spelling-error&quot; id=&quot;SPELLING_ERROR_23&quot;&gt;Content&lt;/span&gt;-&lt;span class=&quot;blsp-spelling-error&quot; id=&quot;SPELLING_ERROR_24&quot;&gt;disposition&lt;/span&gt;&quot;,&lt;br /&gt;          &quot;&lt;span class=&quot;blsp-spelling-error&quot; id=&quot;SPELLING_ERROR_25&quot;&gt;attachment&lt;/span&gt;; &lt;span class=&quot;blsp-spelling-error&quot; id=&quot;SPELLING_ERROR_26&quot;&gt;filename&lt;/span&gt;=Clientes.&lt;span class=&quot;blsp-spelling-error&quot; id=&quot;SPELLING_ERROR_27&quot;&gt;xls&lt;/span&gt;&quot;)&lt;br /&gt;response.&lt;span class=&quot;blsp-spelling-error&quot; id=&quot;SPELLING_ERROR_28&quot;&gt;contentType&lt;/span&gt; = &quot;&lt;span class=&quot;blsp-spelling-error&quot; id=&quot;SPELLING_ERROR_29&quot;&gt;application&lt;/span&gt;/&lt;span class=&quot;blsp-spelling-error&quot; id=&quot;SPELLING_ERROR_30&quot;&gt;vnd&lt;/span&gt;.&lt;span class=&quot;blsp-spelling-error&quot; id=&quot;SPELLING_ERROR_31&quot;&gt;ms&lt;/span&gt;-&lt;span class=&quot;blsp-spelling-error&quot; id=&quot;SPELLING_ERROR_32&quot;&gt;excel&lt;/span&gt;&quot;       &lt;br /&gt;//&quot;clientes&quot; es una lista de objetos del dominio&lt;br /&gt;reportService.exportClientes(response.outputStream, clientes)&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;en el reporte:&lt;br /&gt;&lt;pre&gt;&lt;span class=&quot;blsp-spelling-error&quot; id=&quot;SPELLING_ERROR_33&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;blsp-spelling-error&quot; id=&quot;SPELLING_ERROR_34&quot;&gt;workbook&lt;/span&gt; = &lt;span class=&quot;blsp-spelling-error&quot; id=&quot;SPELLING_ERROR_35&quot;&gt;Workbook&lt;/span&gt;.&lt;span class=&quot;blsp-spelling-error&quot; id=&quot;SPELLING_ERROR_36&quot;&gt;createWorkbook&lt;/span&gt;(&lt;span class=&quot;blsp-spelling-error&quot; id=&quot;SPELLING_ERROR_37&quot;&gt;outputStream&lt;/span&gt;);&lt;/pre&gt;Y eso es todo. Tal vez más adelante ponga &lt;span class=&quot;blsp-spelling-corrected&quot; id=&quot;SPELLING_ERROR_38&quot;&gt;algún&lt;/span&gt; ejemplo de como utilizar &lt;span class=&quot;blsp-spelling-error&quot; id=&quot;SPELLING_ERROR_39&quot;&gt;JXL&lt;/span&gt;, pero es trivial.</description><link>http://obrerodelsoftware.blogspot.com/2008/08/exportar-excel-en-grails.html</link><author>noreply@blogger.com (el_obrero)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-3140509662250705880.post-8377956013241830957</guid><pubDate>Sun, 06 Jul 2008 03:25:00 +0000</pubDate><atom:updated>2008-07-06T00:44:17.235-03:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">project management</category><category domain="http://www.blogger.com/atom/ns#">rails</category><title>Clocking IT - Project Management</title><description>Hace ya casi un mes que estoy utilizando &lt;a href=&quot;http://www.clockingit.com/&quot;&gt;ClockingIT&lt;/a&gt;, un sistema muy interesante para los que nos gusta tener organizado nuestros proyectos, tareas y tener un registro de las horas trabajadas.&lt;br /&gt;&lt;br /&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiLSvIawhm2roOHdAM7UMoGoBVlqcZcJfSbdH8qsB0lUOyx-0IQV-_4yR6RQ5lw-9zuoaY1W2VnydmKLxnmUm31z9-F3dJCEjAbQlcJlzJBK4ufngqSNDrxrYQxmd_aFhO0BIqaTlLDrIEg/s1600-h/logo.gif&quot;&gt;&lt;img style=&quot;margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiLSvIawhm2roOHdAM7UMoGoBVlqcZcJfSbdH8qsB0lUOyx-0IQV-_4yR6RQ5lw-9zuoaY1W2VnydmKLxnmUm31z9-F3dJCEjAbQlcJlzJBK4ufngqSNDrxrYQxmd_aFhO0BIqaTlLDrIEg/s320/logo.gif&quot; alt=&quot;&quot; id=&quot;BLOGGER_PHOTO_ID_5219738139291164034&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;Lo bueno de esta aplicación es que es GRATIS!, si gratis e incluso los propios creadores se encargan del hosting.  Resumiendo un poco lo que nos permite :&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Manejo de Clientes&lt;/li&gt;&lt;li&gt;Manejo de Proyectos &lt;/li&gt;&lt;li&gt;Manejo de Hitos&lt;/li&gt;&lt;li&gt;Manejo de Tareas&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Manejo de Usuarios y permisos sobre los proyectos (permite asignar tareas a otros usuarios)&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Notificaciones (email, rss)&lt;/li&gt;&lt;li&gt;Reportes&lt;/li&gt;&lt;li&gt;Y si, esta disponible en español&lt;/li&gt;&lt;li&gt;muchas más cosas que todavía no utilicé...&lt;/li&gt;&lt;/ul&gt;ClockingIT fue desarrollado en Rails por dos personas, que querían aprender esta nueva tecnología (y la verdad que les quedó muy bueno).&lt;br /&gt;Si todo esto no los convence, pueden bajar el código fuente, modificarlo a gusto y configurarlo en su propio hosting.</description><link>http://obrerodelsoftware.blogspot.com/2008/07/clocking-it-project-management.html</link><author>noreply@blogger.com (el_obrero)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiLSvIawhm2roOHdAM7UMoGoBVlqcZcJfSbdH8qsB0lUOyx-0IQV-_4yR6RQ5lw-9zuoaY1W2VnydmKLxnmUm31z9-F3dJCEjAbQlcJlzJBK4ufngqSNDrxrYQxmd_aFhO0BIqaTlLDrIEg/s72-c/logo.gif" height="72" width="72"/><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-3140509662250705880.post-4504890894210116604</guid><pubDate>Fri, 23 May 2008 00:05:00 +0000</pubDate><atom:updated>2008-05-22T21:13:33.244-03:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">svn</category><title>Comentarios - control de versiones</title><description>Me encontré con este &lt;a href=&quot;http://www.redbitbluebit.com/post/Subversion-Check-in-Comment---Great-Practices.aspx&quot;&gt;artículo&lt;/a&gt; que propone un formato bastate interesante para los comentarios en los commits, ya sea Subversion o CVS.&lt;br /&gt;Me pareció interesante ya que suele suceder en los proyectos que debemos hacer un rollback de un cambio, o solucionar un bug y vamos al historial del repositorio ya que muchas veces ese cambio no lo hicimos nosotros.&lt;br /&gt;El formato que se propone ayuda mucho a identificar que se realizó en cada commit.&lt;br /&gt;&lt;br /&gt;En el artículo se proponen estos &quot;tags&quot; para agrupar la información del los comentarios:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;ADDED - descripción de que se agregó&lt;br /&gt;&lt;/li&gt;&lt;li&gt;CHANGED - descripción de lo que se cambió&lt;/li&gt;&lt;li&gt;FIXED - bugs que se corrigieron (se propone poner un link al bug)&lt;/li&gt;&lt;li&gt;DELETED - lo que se borró&lt;/li&gt;&lt;/ul&gt;</description><link>http://obrerodelsoftware.blogspot.com/2008/05/comentarios-control-de-versiones.html</link><author>noreply@blogger.com (el_obrero)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-3140509662250705880.post-1199970470451221530</guid><pubDate>Mon, 12 May 2008 20:50:00 +0000</pubDate><atom:updated>2008-05-12T18:51:21.992-03:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">javascript</category><title>Trim sencillo en Javascript</title><description>Usando la propiedad &lt;span style=&quot;font-style: italic;&quot;&gt;prototype&lt;/span&gt;, en este caso para la clase String, podemos hacer una función de trim para los Strings.&lt;br /&gt;&lt;pre&gt;String.prototype.trim = function() {&lt;br /&gt;  return(this.replace(/^\s+/,&#39;&#39;).replace(/\s+$/,&#39;&#39;));&lt;br /&gt;}&lt;/pre&gt;Luego para cualquier String hacemos:&lt;br /&gt;&lt;pre&gt;var texto = &quot; He aquí un texto   &quot;;&lt;br /&gt;texto = texto.trim(); //retorna el texto sin espacios delante o detrás&lt;/pre&gt;</description><link>http://obrerodelsoftware.blogspot.com/2008/05/trim-sencillo-en-javascript.html</link><author>noreply@blogger.com (el_obrero)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-3140509662250705880.post-4239679917703977459</guid><pubDate>Fri, 09 May 2008 23:10:00 +0000</pubDate><atom:updated>2008-05-09T20:16:32.973-03:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">bases de datos</category><title>Sphinx - mejorar búsquedas full-text en MySQL</title><description>&lt;p&gt;&lt;a href=&quot;http://www.sphinxsearch.com/&quot;&gt;Sphinx&lt;/a&gt; es un motor de búsquedas full-text open-source.&lt;/p&gt;&lt;p&gt;Llegué a él gracias a la pobre performance de MySQL (gracias!), ya que en una tabla de 2 millones de registros, hacer una búsqueda por keywords tardaba 10seg. Este tiempo para una aplicación online no era nada bueno.&lt;/p&gt;&lt;p&gt;Luego de intentar mejorar la performance de MySQL me rendí y me puse a buscar. Me acordaba que existía Lucene, pero para Java (aunque debe existir algún port a PHP). De ahí fue que llegué a Sphinx e investigando un poquito parecía que servía. ¿Siguiente paso? probarlo obviamente, nunca hay que quedarse con lo que dicen los blogs, incluyendo este :)&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;Los siguientes pasos los probé en un ubuntu dapper, pero debería ser similar para otras distribuciones.&lt;br /&gt;&lt;br /&gt;Primero instalar dependecias para compilar Sphinx&lt;br /&gt;&lt;pre&gt;$ sudo apt-get install build-essential libmysql++-dev&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Bajar el .tar.gz y extraer:&lt;br /&gt;&lt;pre&gt;$ tar -xf sphinx-0.9.8-rc2.tar.gz&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Compilar&lt;br /&gt;&lt;pre&gt;$ cd sphinx-0.9.8-rc2&lt;br /&gt;$ sh ./configure&lt;br /&gt;$ make&lt;br /&gt;$ sudo make install&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Listo. Sphinx está instalado, ahora a configurarlo.&lt;br /&gt;&lt;span class=&quot;boldcode&quot;&gt;Para este ejemplo (muy simple) sólo utilizaremos una tabla, que contiene entradas de un blog. Así sería la tabla:&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;pre class=&quot;displaycode&quot;&gt;CREATE TABLE Post (&lt;br /&gt;id int(10) unsigned NOT NULL auto_increment,&lt;br /&gt;titulo varchar(7) NOT NULL,&lt;br /&gt;post varchar(256) NOT NULL,&lt;br /&gt;PRIMARY KEY (id)&lt;br /&gt;) ;&lt;/pre&gt;&lt;br /&gt;&lt;span class=&quot;boldcode&quot;&gt;&lt;br /&gt;&lt;/span&gt;Creamos el archivo de configuración&lt;br /&gt;&lt;pre&gt;$ sudo gedit &lt;span class=&quot;boldcode&quot;&gt;/usr/local/etc/sphinx.conf&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Primeramente vamos a crear una fuente de datos, en este caso MySQL pero tambíen soporta PostgreSQL, XML y otras hierbas.&lt;br /&gt;&lt;pre class=&quot;displaycode&quot;&gt;source blog&lt;br /&gt;{&lt;br /&gt;type                            = mysql&lt;br /&gt;sql_host                        = localhost&lt;br /&gt;sql_user                        = blog_user&lt;br /&gt;sql_pass                        = passwd&lt;br /&gt;sql_db                          = blog&lt;br /&gt;&lt;br /&gt;# indexer query&lt;br /&gt;# document_id MUST be the very first field&lt;br /&gt;# document_id MUST be positive (non-zero, non-negative)&lt;br /&gt;# document_id MUST fit into 32 bits&lt;br /&gt;# document_id MUST be unique&lt;br /&gt;&lt;br /&gt;sql_query                       = \&lt;br /&gt;      SELECT \&lt;br /&gt;              id, titulo, post \&lt;br /&gt;      FROM \&lt;br /&gt;              Post;&lt;br /&gt;&lt;br /&gt;# document info query&lt;br /&gt;# ONLY used by search utility to display document information&lt;br /&gt;# MUST be able to fetch document info by its id, therefore&lt;br /&gt;# MUST contain &#39;$id&#39; macro&lt;br /&gt;# Esta parte se utiliza para devolver los resultados de la busqueda&lt;br /&gt;# a partir de la consulta. Por cada resultado encontrado, realiza esa&lt;br /&gt;# consulta y retorna los datos de la misma.&lt;br /&gt;sql_query_info          = SELECT * FROM Post WHERE id=$id&lt;br /&gt;}&lt;/pre&gt;&lt;span class=&quot;boldcode&quot;&gt;&lt;br /&gt;Luego  agregamos la definición de nuestro índice:&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;pre class=&quot;displaycode&quot;&gt;index posts&lt;br /&gt;{&lt;br /&gt;source                  = blog&lt;br /&gt;# ruta donde se guarda el indice&lt;br /&gt;path                    = /var/data/sphinx/catalog&lt;br /&gt;&lt;br /&gt;# tamaño minimo de palabra para indexar&lt;br /&gt;min_word_len            = 3&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;Finalmente agregamos los datos para el demonio de sphinx (que vamos a necesitar cuando usemos algun API)&lt;br /&gt;&lt;pre class=&quot;displaycode&quot;&gt;searchd&lt;br /&gt;{&lt;br /&gt;port    = 3312&lt;br /&gt;log     = /var/log/searchd/searchd.log&lt;br /&gt;query_log   = /var/log/searchd/query.log&lt;br /&gt;pid_file   = /var/log/searchd/searchd.pid&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;Guardamos el archivo y creamos la carpeta para guardar los índices:&lt;br /&gt;&lt;pre&gt;$ sudo mkdir -p /var/data/sphinx&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/code&gt;&lt;span class=&quot;boldcode&quot;&gt;Creamos el índice:&lt;br /&gt;&lt;/span&gt;&lt;pre class=&quot;displaycode&quot;&gt;$ &lt;span class=&quot;boldcode&quot;&gt;sudo /usr/local/bin/indexer --config /usr/local/etc/sphinx.conf --all&lt;/span&gt;&lt;/pre&gt;Probamos la búsqueda, en este ejemplo buscamos la palabra &quot;Java&quot;:&lt;br /&gt;&lt;pre class=&quot;displaycode&quot;&gt;&lt;span class=&quot;boldcode&quot;&gt;$ /usr/local/bin/search --config /usr/local/etc/sphinx.conf Java&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;span class=&quot;boldcode&quot;&gt;Esto sólamente es un ejemplo muy simple de lo que se puede hacer con Sphinx, para mas detalles de esta mágica aplicación, incluyendo integración con PHP o Rails: &lt;a href=&quot;http://www.sphinxsearch.com/&quot;&gt;http://www.sphinxsearch.com/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;¿Alguna otra experiencia con búsquedas fulltext?</description><link>http://obrerodelsoftware.blogspot.com/2008/05/sphinx-mejorar-bsquedas-full-text-en.html</link><author>noreply@blogger.com (el_obrero)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-3140509662250705880.post-2277450022468567931</guid><pubDate>Thu, 08 May 2008 22:13:00 +0000</pubDate><atom:updated>2008-05-08T19:14:29.257-03:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">java</category><title>Fechas en Java</title><description>Algunos snippets para el manejo de fechas en Java.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;    Date fecha = new Date();&lt;br /&gt;&lt;br /&gt;    //Fecha simple 01/12/2001&lt;br /&gt;    SimpleDateFormat formateadorFecha =&lt;br /&gt;  new SimpleDateFormat(&quot;dd/MM/yyyy&quot;);&lt;br /&gt;    String fechaSimple = formateadorFecha.format(fecha);&lt;br /&gt;    System.out.println(&quot;(dd/MM/yyyy) -&gt; &quot; + fechaSimple);&lt;br /&gt;&lt;br /&gt;    //Fecha con hora 01/12/2001 22:35 (formato 24hrs)&lt;br /&gt;    formateadorFecha = new SimpleDateFormat(&quot;dd/MM/yyyy HH:mm&quot;);&lt;br /&gt;    fechaSimple = formateadorFecha.format(fecha);&lt;br /&gt;    System.out.println(&quot;(dd/MM/yyyy) -&gt; &quot; + fechaSimple);&lt;br /&gt;&lt;br /&gt;    //Agregar dias a una fecha&lt;br /&gt;    Calendar cal = Calendar.getInstance();&lt;br /&gt;    cal.add(Calendar.DATE, 2); //se agregan 2 dias&lt;br /&gt;    fechaSimple = formateadorFecha.format(cal.getTime());&lt;br /&gt;    System.out.println(&quot;(+2 dias) -&gt; &quot; + fechaSimple);&lt;br /&gt;&lt;br /&gt;    //Substraer minutos&lt;br /&gt;    cal = Calendar.getInstance();&lt;br /&gt;    cal.add(Calendar.MINUTE, -20); //se quitan 20min&lt;br /&gt;    fechaSimple = formateadorFecha.format(cal.getTime());&lt;br /&gt;    System.out.println(&quot;(-10 min) -&gt; &quot; + fechaSimple);       &lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Espero que sea útil.</description><link>http://obrerodelsoftware.blogspot.com/2008/05/fechas-en-java.html</link><author>noreply@blogger.com (el_obrero)</author><thr:total>2</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-3140509662250705880.post-7523291829672239128</guid><pubDate>Wed, 07 May 2008 21:55:00 +0000</pubDate><atom:updated>2008-05-07T18:55:30.207-03:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">firefox</category><title>Mejorar rendimiento de firefox</title><description>Googleando por ahi me encontré con estos simples cambios que podemos hacerle a firefox para que aumente su rendimiento. Lo primero que hay que hacer es escribir about:config en la barra de direcciones y dar enter.&lt;br /&gt;Se nos muestra un diálogo como el siguiente:&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;http://2.bp.blogspot.com/_Kt1DsL-R7Do/SBz1LfBy3cI/AAAAAAAAAWE/RbT5FMez5M8/s1600-h/Untitled-1.jpg&quot;&gt;&lt;img style=&quot;margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;&quot; src=&quot;http://2.bp.blogspot.com/_Kt1DsL-R7Do/SBz1LfBy3cI/AAAAAAAAAWE/RbT5FMez5M8/s320/Untitled-1.jpg&quot; alt=&quot;&quot; id=&quot;BLOGGER_PHOTO_ID_5196297647735102914&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;En este diálogo se listan los parámetros de configuración del Firefox, vamos a ajustar los siguientes:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;network.http.pipelining.maxrequests – 100&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;network.http.max-connections – 48&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;network.http.max-connections-per-server – 16&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;network.http.max-persistent-connections-per-proxy – 8&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;network.http.max-persistent-connections-per-server – 4&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;network.http.request.timeout – 300&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;network.http.pipelining – true&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;network.http.proxy.pipelining – true&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Reiniciar Firefox y listo.</description><link>http://obrerodelsoftware.blogspot.com/2008/05/mejorar-rendimiento-de-firefox.html</link><author>noreply@blogger.com (el_obrero)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/_Kt1DsL-R7Do/SBz1LfBy3cI/AAAAAAAAAWE/RbT5FMez5M8/s72-c/Untitled-1.jpg" height="72" width="72"/><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-3140509662250705880.post-984429892888463978</guid><pubDate>Tue, 06 May 2008 23:24:00 +0000</pubDate><atom:updated>2008-05-06T20:34:10.351-03:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">slicehost</category><title>Slicehost</title><description>Hace un tiempo, un cliente estaba necesitando un servidor &lt;span class=&quot;blsp-spelling-error&quot; id=&quot;SPELLING_ERROR_0&quot;&gt;VPS&lt;/span&gt; fuera del país (debido al pobrismo ancho de banda de salida a Internet). Me pidió una investigación de las opciones disponibles, fue ahí que me topé con &lt;a href=&quot;http://www.slicehost.com/&quot;&gt;&lt;span class=&quot;blsp-spelling-error&quot; id=&quot;SPELLING_ERROR_1&quot;&gt;Slicehost&lt;/span&gt;&lt;/a&gt;.&lt;br /&gt;&lt;span class=&quot;blsp-spelling-error&quot; id=&quot;SPELLING_ERROR_2&quot;&gt;Slicehost&lt;/span&gt; es un proveedor de &lt;span class=&quot;blsp-spelling-error&quot; id=&quot;SPELLING_ERROR_3&quot;&gt;hosting&lt;/span&gt; &lt;span class=&quot;blsp-spelling-error&quot; id=&quot;SPELLING_ERROR_4&quot;&gt;VPS&lt;/span&gt;, lo que me gustó ni bien llegué al sitio, fue la simplicidad en las configuraciones que brindan. Ellos tratan a los servidores virtuales como &quot;&lt;span class=&quot;blsp-spelling-error&quot; id=&quot;SPELLING_ERROR_5&quot;&gt;slices&lt;/span&gt;&quot; que sería algo así como una &quot;tajada&quot;.&lt;br /&gt;&lt;br /&gt;El &lt;span class=&quot;blsp-spelling-error&quot; id=&quot;SPELLING_ERROR_6&quot;&gt;slice&lt;/span&gt; más barato ($20 x mes) viene con 256&lt;span class=&quot;blsp-spelling-error&quot; id=&quot;SPELLING_ERROR_7&quot;&gt;MB&lt;/span&gt; de RAM, 10&lt;span class=&quot;blsp-spelling-error&quot; id=&quot;SPELLING_ERROR_8&quot;&gt;GB&lt;/span&gt; de almacenamiento y 100&lt;span class=&quot;blsp-spelling-error&quot; id=&quot;SPELLING_ERROR_9&quot;&gt;GB&lt;/span&gt; de transferencia. El más caro viene con 4&lt;span class=&quot;blsp-spelling-error&quot; id=&quot;SPELLING_ERROR_10&quot;&gt;GB&lt;/span&gt; de RAM 160&lt;span class=&quot;blsp-spelling-error&quot; id=&quot;SPELLING_ERROR_11&quot;&gt;GB&lt;/span&gt; y 1600&lt;span class=&quot;blsp-spelling-error&quot; id=&quot;SPELLING_ERROR_12&quot;&gt;GB&lt;/span&gt; de transferencia por unos módicos $280. Te cobran los 3 primeros meses juntos y luego te cobran mes a mes, por lo que puedes cancelarlo cuando quieras y no quedar atado a un contrato.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;http://4.bp.blogspot.com/_Kt1DsL-R7Do/SCDqy_By3eI/AAAAAAAAAWU/V0VaaW0al-8/s1600-h/Screenshot-Slicehost+-+VPS+Hosting+-+Mozilla+Firefox.png&quot;&gt;&lt;img style=&quot;margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;&quot; src=&quot;http://4.bp.blogspot.com/_Kt1DsL-R7Do/SCDqy_By3eI/AAAAAAAAAWU/V0VaaW0al-8/s320/Screenshot-Slicehost+-+VPS+Hosting+-+Mozilla+Firefox.png&quot; alt=&quot;&quot; id=&quot;BLOGGER_PHOTO_ID_5197412131618872802&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;br /&gt;En mi caso concreto fuimos por el de 1&lt;span class=&quot;blsp-spelling-error&quot; id=&quot;SPELLING_ERROR_13&quot;&gt;GB&lt;/span&gt; de RAM. Luego de ingresar los datos de la tarjeta de crédito, en 2 minutos ya estaba el &lt;span class=&quot;blsp-spelling-error&quot; id=&quot;SPELLING_ERROR_14&quot;&gt;slice&lt;/span&gt; pronto (con su &lt;span class=&quot;blsp-spelling-error&quot; id=&quot;SPELLING_ERROR_15&quot;&gt;IP&lt;/span&gt; y todo).&lt;br /&gt;Cuatro minutos después ya tenía instalado &lt;span class=&quot;blsp-spelling-error&quot; id=&quot;SPELLING_ERROR_16&quot;&gt;ubuntu&lt;/span&gt; a través del administrador de &lt;span class=&quot;blsp-spelling-error&quot; id=&quot;SPELLING_ERROR_17&quot;&gt;slices&lt;/span&gt;, desde donde se pueden ver estadísticas, reinstalar el SO e incluso reiniciar el &lt;span class=&quot;blsp-spelling-error&quot; id=&quot;SPELLING_ERROR_18&quot;&gt;slice&lt;/span&gt;, como si fuera un servidor dedicado. También ofrece una consola &lt;span class=&quot;blsp-spelling-error&quot; id=&quot;SPELLING_ERROR_19&quot;&gt;ajax&lt;/span&gt; para manejar el &lt;span class=&quot;blsp-spelling-error&quot; id=&quot;SPELLING_ERROR_20&quot;&gt;slice&lt;/span&gt; (obviamente la usé hasta instalar &lt;span class=&quot;blsp-spelling-error&quot; id=&quot;SPELLING_ERROR_21&quot;&gt;SSH&lt;/span&gt;).&lt;br /&gt;&lt;br /&gt;El servicio es tan bueno que permite incluso hacer un &quot;&lt;span class=&quot;blsp-spelling-error&quot; id=&quot;SPELLING_ERROR_22&quot;&gt;upgrade&lt;/span&gt;&quot; del &lt;span class=&quot;blsp-spelling-error&quot; id=&quot;SPELLING_ERROR_23&quot;&gt;slice&lt;/span&gt; sin tener que borrar los datos y reconfigurar un &lt;span class=&quot;blsp-spelling-error&quot; id=&quot;SPELLING_ERROR_24&quot;&gt;server&lt;/span&gt;.&lt;br /&gt;Si están buscando un servidor &lt;span class=&quot;blsp-spelling-error&quot; id=&quot;SPELLING_ERROR_25&quot;&gt;VPS&lt;/span&gt;, les recomiendo &lt;a href=&quot;http://www.slicehost.com/&quot;&gt;&lt;span class=&quot;blsp-spelling-error&quot; id=&quot;SPELLING_ERROR_26&quot;&gt;Slicehost&lt;/span&gt;.&lt;/a&gt;</description><link>http://obrerodelsoftware.blogspot.com/2008/05/slicehost.html</link><author>noreply@blogger.com (el_obrero)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/_Kt1DsL-R7Do/SCDqy_By3eI/AAAAAAAAAWU/V0VaaW0al-8/s72-c/Screenshot-Slicehost+-+VPS+Hosting+-+Mozilla+Firefox.png" height="72" width="72"/><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-3140509662250705880.post-7354645775726393300</guid><pubDate>Sun, 04 May 2008 20:32:00 +0000</pubDate><atom:updated>2008-05-07T19:23:23.453-03:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">javascript</category><category domain="http://www.blogger.com/atom/ns#">jquery</category><title>JQuery - Eventos dinámicos</title><description>Un tiempo atrás me encontré haciendo una página &lt;span class=&quot;blsp-spelling-error&quot; id=&quot;SPELLING_ERROR_0&quot;&gt;PHP&lt;/span&gt; con el &lt;span class=&quot;blsp-spelling-error&quot; id=&quot;SPELLING_ERROR_1&quot;&gt;frontend&lt;/span&gt; bastante complejo, mucho &lt;span class=&quot;blsp-spelling-error&quot; id=&quot;SPELLING_ERROR_2&quot;&gt;AJAX&lt;/span&gt; y muchos cambios en la página.&lt;br /&gt;En el proyecto estábamos utilizando &lt;a href=&quot;http://jquery.com/&quot;&gt;&lt;span class=&quot;blsp-spelling-error&quot; id=&quot;SPELLING_ERROR_3&quot;&gt;JQuery&lt;/span&gt;&lt;/a&gt;, que es una librería javascript. Me topé con la funcionalidad de cambiar los eventos de un botón dinámicamente:&lt;br /&gt;&lt;br /&gt;HTML:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&amp;amp;&lt;span class=&quot;blsp-spelling-error&quot; id=&quot;SPELLING_ERROR_4&quot;&gt;lt&lt;/span&gt;;&lt;span class=&quot;blsp-spelling-error&quot; id=&quot;SPELLING_ERROR_5&quot;&gt;input&lt;/span&gt; &lt;span class=&quot;blsp-spelling-error&quot; id=&quot;SPELLING_ERROR_6&quot;&gt;type&lt;/span&gt;=&quot;&lt;span class=&quot;blsp-spelling-error&quot; id=&quot;SPELLING_ERROR_7&quot;&gt;button&lt;/span&gt;&quot; &lt;span class=&quot;blsp-spelling-error&quot; id=&quot;SPELLING_ERROR_8&quot;&gt;name&lt;/span&gt;=&quot;&lt;span class=&quot;blsp-spelling-error&quot; id=&quot;SPELLING_ERROR_9&quot;&gt;botonDinamico&lt;/span&gt;&quot; id=&quot;&lt;span class=&quot;blsp-spelling-error&quot; id=&quot;SPELLING_ERROR_10&quot;&gt;botonDinamico&lt;/span&gt;&quot;&lt;br /&gt;&lt;span class=&quot;blsp-spelling-error&quot; id=&quot;SPELLING_ERROR_11&quot;&gt;onclick&lt;/span&gt;=&quot;&lt;span class=&quot;blsp-spelling-error&quot; id=&quot;SPELLING_ERROR_12&quot;&gt;funcionInicial&lt;/span&gt;()&quot;&amp;amp;&lt;span class=&quot;blsp-spelling-error&quot; id=&quot;SPELLING_ERROR_13&quot;&gt;gt&lt;/span&gt;;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Javascript:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;$(&quot;#&lt;span class=&quot;blsp-spelling-error&quot; id=&quot;SPELLING_ERROR_14&quot;&gt;botonDinamico&lt;/span&gt;&quot;).unbind().click(function (){&lt;br /&gt;&lt;span class=&quot;blsp-spelling-error&quot; id=&quot;SPELLING_ERROR_15&quot;&gt;funcionDos&lt;/span&gt;();&lt;br /&gt;});&lt;br /&gt;&lt;/pre&gt;Al hacer &quot;&lt;a href=&quot;http://docs.jquery.com/Events/unbind#typedata&quot;&gt;&lt;span style=&quot;font-style: italic;&quot;&gt;&lt;span class=&quot;blsp-spelling-error&quot; id=&quot;SPELLING_ERROR_16&quot;&gt;unbind&lt;/span&gt;()&lt;/span&gt;&lt;/a&gt;&quot; se quitan los eventos a los que está enlazado. Luego se enlaza uno nuevo a través de la función &quot;&lt;a href=&quot;http://docs.jquery.com/Events/click#fn&quot;&gt;&lt;span style=&quot;font-style: italic;&quot;&gt;&lt;span class=&quot;blsp-spelling-error&quot; id=&quot;SPELLING_ERROR_17&quot;&gt;click&lt;/span&gt;()&lt;/span&gt;&lt;/a&gt;&quot;</description><link>http://obrerodelsoftware.blogspot.com/2008/05/jquery-eventos-dinmicos.html</link><author>noreply@blogger.com (el_obrero)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-3140509662250705880.post-8058961915553987511</guid><pubDate>Sat, 03 May 2008 23:34:00 +0000</pubDate><atom:updated>2008-05-03T22:04:34.198-03:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">ubuntu</category><title>Screencast en Ubuntu</title><description>Varias veces he tenido que realizar alguna demo para un cliente y lo que más me ha resultado han sido los &quot;screencasts&quot;. El impacto sobre el cliente es mucho mayor si la demo tiene &quot;movimiento&quot; y no son simplemente unas imágenes y una simple PPT.&lt;br /&gt;&lt;br /&gt;A continuación un simple tutorial para crear nuestro screencast en ubuntu (probado en gutsy-7.10):&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Bajar e instalar los paquetes .deb desde &lt;a href=&quot;http://www.getdeb.net/app.php?name=RecordMyDesktop&quot;&gt;aquí&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Luego de instalar nos queda un acceso directo en &quot;Sound and Video&quot;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Abrirlo y a disfrutar!!&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;http://2.bp.blogspot.com/_Kt1DsL-R7Do/SB0IkPBy3dI/AAAAAAAAAWM/AsbijiNHbK4/s1600-h/Screenshot-recordMyDesktop.png&quot;&gt;&lt;img style=&quot;margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;&quot; src=&quot;http://2.bp.blogspot.com/_Kt1DsL-R7Do/SB0IkPBy3dI/AAAAAAAAAWM/AsbijiNHbK4/s320/Screenshot-recordMyDesktop.png&quot; alt=&quot;&quot; id=&quot;BLOGGER_PHOTO_ID_5196318963657792978&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;Por defecto graba todo nuestro escritorio, pero tiene la opción de seleccionar una ventana para reducir el área de grabación, así como la calidad de audio y de video.&lt;br /&gt;Nos deja un icono al lado del reloj de forma de poder parar la grabación(click derecho) o pausar la misma (click izquierdo).&lt;br /&gt;&lt;br /&gt;La salida es en formato &lt;a href=&quot;http://en.wikipedia.org/wiki/Ogg&quot;&gt;.ogg&lt;/a&gt; pero se puede convertir &lt;a href=&quot;http://ubuntuforums.org/showthread.php?t=481778&quot;&gt;fácilmente&lt;/a&gt; con ffmpeg.&lt;br /&gt;&lt;br /&gt;Por mas info sobre esta maravillosa app&lt;br /&gt;&lt;a href=&quot;http://recordmydesktop.iovar.org/about.php&quot;&gt;http://recordmydesktop.iovar.org/about.php&lt;/a&gt;</description><link>http://obrerodelsoftware.blogspot.com/2008/05/screencast-en-ubuntu.html</link><author>noreply@blogger.com (el_obrero)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/_Kt1DsL-R7Do/SB0IkPBy3dI/AAAAAAAAAWM/AsbijiNHbK4/s72-c/Screenshot-recordMyDesktop.png" height="72" width="72"/><thr:total>1</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-3140509662250705880.post-7422398533140658786</guid><pubDate>Sat, 03 May 2008 01:33:00 +0000</pubDate><atom:updated>2008-05-02T21:09:10.946-03:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">j2me</category><title>Grabar video en J2ME</title><description>Snippet para grabar video en J2ME&lt;span style=&quot;font-family:monospace;&quot;&gt;:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;public void grabarVideo(){&lt;br /&gt;//se inicializa un player&lt;br /&gt;Player player = Manager.createPlayer(&quot;capture://video&quot;);&lt;br /&gt;player.realize();&lt;br /&gt;&lt;br /&gt;//se obtiene el control del video del player&lt;br /&gt;VideoControl videoControl =&lt;br /&gt;(VideoControl)(player.getControl(&quot;VideoControl&quot;));&lt;br /&gt;videoControl.initDisplayMode(&lt;br /&gt; VideoControl.USE_DIRECT_VIDEO, this);&lt;br /&gt;videoControl.setDisplayFullScreen(true);&lt;br /&gt;videoControl.setVisible(true);&lt;br /&gt;player.start(); //comienza la grabación&lt;br /&gt;&lt;br /&gt;/* Se obtiene el control de grabación y se graba&lt;br /&gt; por 10 segundos Los resultados son guardados en&lt;br /&gt; un array de Bytes, pude guardarse también&lt;br /&gt;en un archivo&lt;br /&gt;*/&lt;br /&gt;ByteArrayOutputStream output = new ByteArrayOutputStream();  &lt;br /&gt;&lt;br /&gt;RecordControl recordControl =&lt;br /&gt;(RecordControl)(player.getControl(&quot;RecordControl&quot;));&lt;br /&gt;recordControl.setRecordStream(output);  &lt;br /&gt;recordControl.startRecord();&lt;br /&gt;try {&lt;br /&gt;Thread.sleep(10000);//graba durante 10 segundos&lt;br /&gt;} catch (InterruptedException ex) {&lt;br /&gt;//manejo de la excepción&lt;br /&gt;}&lt;br /&gt;try {&lt;br /&gt;//se llama al commit para finalizar la grabación&lt;br /&gt;recordControl.commit();&lt;br /&gt;output.flush(); //flush de los datos dentro del buffer&lt;br /&gt;} catch (IOException ex) {&lt;br /&gt;//manejo de la excepción&lt;br /&gt;}&lt;br /&gt;//se cargan los bytes en el array video&lt;br /&gt;byte[] video = output.toByteArray();&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;El problema con la grabación de video (y audio también) en J2ME es que hay que parar la grabación para poder obtener los datos de la misma. O sea, hasta no llamar al método &lt;span style=&quot;font-style: italic;&quot;&gt;commit()&lt;/span&gt;, no se cargan los bytes en el buffer, pero a su vez, éste método &lt;span style=&quot;font-style: italic;&quot;&gt;&lt;/span&gt;llama implícitamente al método &lt;span style=&quot;font-style: italic;&quot;&gt;stopRecording() &lt;/span&gt;por lo que la grabación se ve interrumpida.</description><link>http://obrerodelsoftware.blogspot.com/2008/04/grabar-video-en-j2me.html</link><author>noreply@blogger.com (el_obrero)</author><thr:total>1</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-3140509662250705880.post-3821442167094487446</guid><pubDate>Tue, 29 Apr 2008 21:56:00 +0000</pubDate><atom:updated>2008-04-29T19:10:41.903-03:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">svn</category><title>SVN - línea de comandos</title><description>Hace poco tuve que trabajar con SVN desde Ubuntu. Acostumbrado (mal) al TortoiseSVN de windoze, no encontré un entorno gráfico decente, así que sólo me quedó la vieja y querida línea de comandos. He aquí algunos comandos útiles.&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Checkout &lt;pre&gt;svn co http://url/al/repositorio&lt;/pre&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Para ver el estado de sincronización &lt;pre&gt;svn status&lt;/pre&gt;&lt;br /&gt;&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Los resultados muestran (M) modificado, (?)  no está bajo el control de versiones&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;Para agregar archivos (por ejemplo los que están marcados con (?)) &lt;pre&gt;svn add /ruta/al/archivo.txt&lt;/pre&gt;&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Tener en cuenta que esto solo lo agrega al SVN localmente, hasta no hacer commit no estará disponible en el servidor&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;Para realizar commit &lt;pre&gt;svn commit -m &quot;comentario del commit&quot;&lt;/pre&gt;&lt;/li&gt;&lt;li&gt;Para hacer update simplemente &lt;pre&gt;svn update&lt;span style=&quot;font-family:Georgia,serif;&quot;&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/li&gt;&lt;/ul&gt;Espero que sirva de ayuda. Más comandos &lt;a href=&quot;http://svnbook.red-bean.com/en/1.1/ch09.html&quot;&gt;acá.&lt;/a&gt;</description><link>http://obrerodelsoftware.blogspot.com/2008/04/svn-lnea-de-comandos.html</link><author>noreply@blogger.com (el_obrero)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-3140509662250705880.post-1275285841435286641</guid><pubDate>Tue, 29 Apr 2008 01:19:00 +0000</pubDate><atom:updated>2008-04-28T22:42:45.071-03:00</atom:updated><title>TODO&#39;s matinales</title><description>&lt;span class=&quot;blsp-spelling-error&quot; id=&quot;SPELLING_ERROR_0&quot;&gt;Pucha&lt;/span&gt; que está complicada esta profesión!. Hay que estar actualizado o los pendejos te pasan por arriba. Mi paseo matutino antes de empezar con la rutina incluye estos sitios:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;http://www.dzone.com/&quot;&gt;&lt;span class=&quot;blsp-spelling-error&quot; id=&quot;SPELLING_ERROR_1&quot;&gt;dZone&lt;/span&gt; &lt;/a&gt;- recopilación de &lt;span class=&quot;blsp-spelling-corrected&quot; id=&quot;SPELLING_ERROR_2&quot;&gt;artículos&lt;/span&gt; de todo tipo y color (Java, &lt;span class=&quot;blsp-spelling-error&quot; id=&quot;SPELLING_ERROR_3&quot;&gt;PHP&lt;/span&gt;, &lt;span class=&quot;blsp-spelling-error&quot; id=&quot;SPELLING_ERROR_4&quot;&gt;Ruby&lt;/span&gt;, .&lt;span class=&quot;blsp-spelling-error&quot; id=&quot;SPELLING_ERROR_5&quot;&gt;NET&lt;/span&gt;, etc, etc)&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://www.infoq.com/&quot;&gt;&lt;span class=&quot;blsp-spelling-error&quot; id=&quot;SPELLING_ERROR_6&quot;&gt;InfoQ&lt;/span&gt; &lt;/a&gt;-  Buenos artículos sobretodo lo que tiene que ver con &lt;span class=&quot;blsp-spelling-error&quot; id=&quot;SPELLING_ERROR_7&quot;&gt;enterprise&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://www.theserverside.com/&quot;&gt;&lt;span class=&quot;blsp-spelling-error&quot; id=&quot;SPELLING_ERROR_8&quot;&gt;TheServerSide&lt;/span&gt; &lt;/a&gt;- Artículos de &lt;span class=&quot;blsp-spelling-error&quot; id=&quot;SPELLING_ERROR_9&quot;&gt;Enterprise&lt;/span&gt; Java&lt;/li&gt;&lt;/ul&gt;Esta rutina la estoy haciendo desde hace alrededor de 2 años y da resultado. Sólo con mirar por arriba los artículos todos los días uno esta más o menos actualizado con los temas importantes y nuevas tecnologías. Me ha pasado varias veces que un cliente viene con algún proyecto y sale el famoso: &quot;...no se si conocen &lt;span class=&quot;blsp-spelling-error&quot; id=&quot;SPELLING_ERROR_10&quot;&gt;XYZ&lt;/span&gt;, es nuevo, está muy bueno...&quot; y siempre es una muy buena respuesta el: &quot;Si, la conocemos, tiene tal y tal ventaja y (seguido del clásico &lt;span class=&quot;blsp-spelling-error&quot; id=&quot;SPELLING_ERROR_11&quot;&gt;futerío&lt;/span&gt;)...&quot;.&lt;br /&gt;&lt;br /&gt;Uno que me olvidaba es &lt;a href=&quot;http://www.parleys.com/&quot;&gt;&lt;span class=&quot;blsp-spelling-error&quot; id=&quot;SPELLING_ERROR_12&quot;&gt;Parleys&lt;/span&gt;&lt;/a&gt;, que es una &lt;span class=&quot;blsp-spelling-error&quot; id=&quot;SPELLING_ERROR_13&quot;&gt;web&lt;/span&gt; de un grupo de usuarios java de Bélgica. Hay &lt;span class=&quot;blsp-spelling-error&quot; id=&quot;SPELLING_ERROR_14&quot;&gt;interesantísimos&lt;/span&gt; &lt;span class=&quot;blsp-spelling-error&quot; id=&quot;SPELLING_ERROR_15&quot;&gt;videos&lt;/span&gt; de charlas, muy recomendadas para los que tengan un &lt;span class=&quot;blsp-spelling-error&quot; id=&quot;SPELLING_ERROR_16&quot;&gt;tiempito&lt;/span&gt; libre.</description><link>http://obrerodelsoftware.blogspot.com/2008/04/todos-matinales.html</link><author>noreply@blogger.com (el_obrero)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-3140509662250705880.post-4413960346993219439</guid><pubDate>Sat, 26 Apr 2008 23:13:00 +0000</pubDate><atom:updated>2008-04-26T20:52:11.967-03:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">prototipar</category><title>Define:Factibilidad</title><description>Si si, tan simple como el titulo del post y la ayuda del famoso Google.&lt;br /&gt;&lt;br /&gt;Algo que yo pensaba era tan obvio antes de comenzar un proyecto, como el realizar un análisis de factibilidad, parece que no lo es. Mi pensamiento fue errado, incluso tomando en cuenta que toda una pequeña empresa se juega sus fichas en un proyecto, incluso que la gente a cargo de la empresa son profesionales, incluso que ya tienen experiencia sacando otros proyectos adelante.&lt;br /&gt;&lt;br /&gt;Imaginen un proyecto donde está la idea del negocio, los morlacos e incluso los contactos con los potenciales clientes y a nadie se le ocurre realizar un análisis de factibilidad. ¡Ni siquiera antes de venderles humo a los clientes!&lt;br /&gt;&lt;br /&gt;Se da el caso, que el análisis de factibilidad  en este proyecto era muy simple: un &lt;strong&gt;prototipo&lt;/strong&gt;. Lo rescatable es que se intentó realizar, pero luego de meses se llegó a 1/16  de lo que se le estaba vendiendo a los clientes.&lt;br /&gt;Indudablemente llegó el punto crítico, las demostraciones de funcionalidad a los clientes (estos clientes no eran unos flacos cualquiera, hablo de multinacionales en su mayoría), la desesperación de hacer en 4 días lo que no se había podido hacer en 4 meses (intentando con alrededor de 5 programadores diferentes).&lt;br /&gt;&lt;br /&gt;El proyecto llegó a mis manos y a las de mis socios en este estado, deplorable, y luego de dos días de investigación (llamese googlear 16 millones de combinaciones que describen el problema) cayó el balde de agua fría al que nos contrató: &quot;Valor, esto así no se puede hacer&quot;. Admito que debe ser la primera vez que la tecnología nos pone trabas, pero bueno, es una muy nueva y no hay vuelta que darle.&lt;br /&gt;&lt;br /&gt;Como termina esta historia: cambiando las reglas del juego y renegociando con los clientes (básicamente : &quot;mira lo que te prometí no lo va a hacer, en realidad va a hacer esto otro...&quot;)&lt;br /&gt;&lt;br /&gt;Moraleja: PROTOTIPAR!! (a pesar que esta palabra parece no existir en el diccionario)</description><link>http://obrerodelsoftware.blogspot.com/2008/04/definefactibilidad.html</link><author>noreply@blogger.com (el_obrero)</author><thr:total>0</thr:total></item></channel></rss>