<?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>v.codeweblog &#187; problemas</title>
	<atom:link href="http://weblog.v-code.org/tag/problemas/feed/" rel="self" type="application/rss+xml" />
	<link>http://weblog.v-code.org</link>
	<description>Blog personal de Victor Rodriguez sobre programación y mis aficiones</description>
	<lastBuildDate>Mon, 06 Sep 2010 11:54:01 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>Crop de imágenes JPG con Java Advanced Imaging API (JAI)</title>
		<link>http://weblog.v-code.org/2010/05/crop-de-imagenes-jpg-con-java-advanced-imaging-api-jai/</link>
		<comments>http://weblog.v-code.org/2010/05/crop-de-imagenes-jpg-con-java-advanced-imaging-api-jai/#comments</comments>
		<pubDate>Thu, 20 May 2010 11:42:51 +0000</pubDate>
		<dc:creator>VictorR</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[ejemplos]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[problemas]]></category>
		<category><![CDATA[Soluciones]]></category>
		<category><![CDATA[tutoriales]]></category>

		<guid isPermaLink="false">http://weblog.v-code.org/?p=340</guid>
		<description><![CDATA[Hoy la entrada será de nuevo una solución a un problema encontrado en el proyecto en el que trabajo actualmente. Y es que cuando quieres editar imágenes con Java las alternativas no son muchas y tampoco fáciles. Nosotros nos decidimos por utilizar Java Advanced Imaging API, una librería que no se actualiza desde 2007&#8230; bueno, [...]]]></description>
			<content:encoded><![CDATA[<p>Hoy la entrada será de nuevo una solución a un problema encontrado en el proyecto en el que trabajo actualmente. Y es que cuando quieres editar imágenes con Java las alternativas no son muchas y tampoco fáciles. Nosotros nos decidimos por utilizar <a href="http://java.sun.com/javase/technologies/desktop/media/jai/">Java Advanced Imaging API</a>, una librería que no se actualiza desde 2007&#8230; bueno, no toca entrar a discutir este tema.</p>
<p>Vamos a entrar en materia. El código:</p>
<div class="codecolorer-container java default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="java codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000066; font-weight: bold;">byte</span><span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span> cropImage<span style="color: #009900;">&#40;</span><span style="color: #003399;">InputStream</span> is, <span style="color: #000066; font-weight: bold;">int</span> topLeftmx, <span style="color: #000066; font-weight: bold;">int</span> topLeftmy, <span style="color: #000066; font-weight: bold;">int</span> roiWidth, <span style="color: #000066; font-weight: bold;">int</span> roiHeight, <span style="color: #003399;">String</span> tipoImagen<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; <span style="color: #666666; font-style: italic;">// 1 - generar el crop</span><br />
&nbsp; &nbsp; SeekableStream s <span style="color: #339933;">=</span> SeekableStream.<span style="color: #006633;">wrapInputStream</span><span style="color: #009900;">&#40;</span>is, <span style="color: #000066; font-weight: bold;">true</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; RenderedOp image <span style="color: #339933;">=</span> JAI.<span style="color: #006633;">create</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;stream&quot;</span>, s<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span>OpImage<span style="color: #009900;">&#41;</span>image.<span style="color: #006633;">getRendering</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span>.<span style="color: #006633;">setTileCache</span><span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">null</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <span style="color: #003399;">ParameterBlock</span> pb <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #003399;">ParameterBlock</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; pb.<span style="color: #006633;">addSource</span><span style="color: #009900;">&#40;</span>image<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; pb.<span style="color: #006633;">add</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">float</span><span style="color: #009900;">&#41;</span>topLeftmx<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; pb.<span style="color: #006633;">add</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">float</span><span style="color: #009900;">&#41;</span>topLeftmy<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; pb.<span style="color: #006633;">add</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">float</span><span style="color: #009900;">&#41;</span>roiWidth<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; pb.<span style="color: #006633;">add</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">float</span><span style="color: #009900;">&#41;</span>roiHeight<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; image <span style="color: #339933;">=</span> JAI.<span style="color: #006633;">create</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;crop&quot;</span>,pb<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; <span style="color: #666666; font-style: italic;">// 2 - codificar la imagen resultado del crop</span><br />
&nbsp; &nbsp; <span style="color: #003399;">ByteArrayOutputStream</span> baos <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #003399;">ByteArrayOutputStream</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; JAI.<span style="color: #006633;">create</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;encode&quot;</span>, image, baos, tipoImagen, <span style="color: #000066; font-weight: bold;">null</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// 3</span><br />
&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">return</span> baos.<span style="color: #006633;">toByteArray</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<span style="color: #009900;">&#125;</span></div></div>
<p>Básicamente esta función tiene 2 partes, la primera (1) donde se genera el crop de la imagen, y la segunda (2) donde se codifica la imagen resultado del crop realizado. Es decir, informar si la imagen es JPEG, PNG, TIFF&#8230;</p>
<p>Cuál es el problema que nos encontramos, si vamos a la línea marcada (3):</p>
<div class="codecolorer-container java default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="java codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">JAI.<span style="color: #006633;">create</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;encode&quot;</span>, image, baos, tipoImagen, <span style="color: #000066; font-weight: bold;">null</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// 3</span></div></div>
<p>estamos creando la codificación, indicando con la variable tipoImagen si se trata de una &#8220;JPEG&#8221; (&#8220;JPG&#8221; no funciona), &#8220;PNG&#8221;, &#8220;TIFF&#8221; o demás formatos soportados.</p>
<p>Funcionar funciona correctamente con cada uno de los tipos de imagen que le pasemos, excepto con &#8220;JPEG&#8221;. Con este tipo las coordenadas elegidas para realizar el crop sobre la imagen simplemente se pierden. No se porqué, pero se pierden.</p>
<p>La solución encontrada en <a href="http://forums.java.net/">java.net Forums</a>, <a href="http://forums.java.net/jive/thread.jspa?messageID=393038&#393038">Thread: The crop operation seems to ignore (x,y) offset</a> es la siguiente:</p>
<div class="codecolorer-container java default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="java codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">JAI.<span style="color: #006633;">create</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;encode&quot;</span>, image.<span style="color: #006633;">getAsBufferedImage</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>, baos, tipoImagen, <span style="color: #000066; font-weight: bold;">null</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// 3</span></div></div>
<p>La solución es pasar la variable image (de tipo RenderedOp) a tipo BufferedImage en la función create de la clase JAI. Milagrosamente todo vuelve a funcionar, incluido el tipo &#8220;JPEG&#8221;.</p>
]]></content:encoded>
			<wfw:commentRss>http://weblog.v-code.org/2010/05/crop-de-imagenes-jpg-con-java-advanced-imaging-api-jai/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>El Triángulo Imposible</title>
		<link>http://weblog.v-code.org/2008/12/el-triangulo-imposible/</link>
		<comments>http://weblog.v-code.org/2008/12/el-triangulo-imposible/#comments</comments>
		<pubDate>Sun, 28 Dec 2008 17:21:10 +0000</pubDate>
		<dc:creator>VictorR</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[problemas]]></category>
		<category><![CDATA[Proyectos]]></category>
		<category><![CDATA[Soluciones]]></category>

		<guid isPermaLink="false">http://weblog.v-code.org/?p=142</guid>
		<description><![CDATA[Hace algunos años, cuando en una empresa, cuyo nombre no quiero recordar, estaba en pleno proceso de formación, aprendí lo que era el triángulo imposible. Algo que parece tan obvio y tan evidente como que las cosas se tienen que hacer bien, no lo es tanto a ojos de un cliente obsesionado con el tiempo [...]]]></description>
			<content:encoded><![CDATA[<p><img class="alignleft" title="Triángulo Imposible" src="http://www.v-code.org/images/trianguloImposible.jpg" alt="" width="300" height="177" /></p>
<p>Hace algunos años, cuando en una empresa, cuyo nombre no quiero recordar, estaba en pleno proceso de formación, aprendí lo que era el triángulo imposible. Algo que parece tan obvio y tan evidente como que las cosas se tienen que hacer bien, no lo es tanto a ojos de un cliente obsesionado con el tiempo y la fecha de &#8220;entrega&#8221; del proyecto. Lo digo por experiencia.</p>
<p>Según el triángulo imposible puedes seleccionar sólo 2 de sus 3 opciones, es decir 2 de sus 3 vértices. Estas opciones son dinero, calidad y tiempo.</p>
<p>Y las combinaciones posibles son las siguientes:</p>
<p>Si seleccionas que el producto sea <strong>bueno</strong> y <strong>barato</strong> el proceso de desarrollo <strong>no</strong> puede ser <strong>rápido</strong>.<br />
Si seleccionas <strong>bueno</strong> y <strong>rápido</strong> <strong>no</strong> puede ser <strong>barato</strong>.<br />
Y si seleccionas <strong>rápido</strong> y <strong>barato</strong> <strong>no</strong> puede ser <strong>bueno</strong>.</p>
<p><strong>Por favor, no elijas la última! nunca!</strong></p>
]]></content:encoded>
			<wfw:commentRss>http://weblog.v-code.org/2008/12/el-triangulo-imposible/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Proyectos a dos partes.</title>
		<link>http://weblog.v-code.org/2007/11/proyectos-a-dos-partes/</link>
		<comments>http://weblog.v-code.org/2007/11/proyectos-a-dos-partes/#comments</comments>
		<pubDate>Fri, 23 Nov 2007 13:41:23 +0000</pubDate>
		<dc:creator>VictorR</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[problemas]]></category>
		<category><![CDATA[Proyectos]]></category>

		<guid isPermaLink="false">http://weblog.v-code.org/proyectos-a-dos-partes/</guid>
		<description><![CDATA[Una situación, un ejemplo. Qué pasa cuando un proyecto depende de dos empresas distintas? y además, la fecha de entrega está muy cerca? pues que estas empiezan una guerra de a ver quién lo hace peor que la otra. Ya no se trata de acabar el trabajo a tiempo (porque no se va a conseguir), [...]]]></description>
			<content:encoded><![CDATA[<p>Una situación, un ejemplo.</p>
<p>Qué pasa cuando un proyecto depende de dos empresas distintas? y además, la fecha de entrega está muy cerca? pues que estas empiezan una guerra de a ver quién lo hace peor que la otra. Ya no se trata de acabar el trabajo a tiempo (porque no se va a conseguir), se trata de hacer ver al cliente que el trabajo no ha sido acabado a tiempo por culpa de la otra empresa.</p>
<p>Y cómo conseguirlo? Buscando el fallo ajeno hasta encontrarlo y entonces publicarlo hasta en <a href="http://en.wikipedia.org/wiki/La_Vanguardia" target="_blank">La Vanguardia</a>.</p>
<p>Es triste, pero entonces se entra en una borágine de dimes y diretes que no hace más que enrarecer el ambiente de trabajo, y lo que debería ser un trabajo entre dos equipos se convierte en una guerra.</p>
<p>Esto es lo que me acaba de pasar. El proyecto en el que trabajo actualmente depende del desarrollo de otra empresa, y como no llegan a tiempo a la fecha de entrega buscan el escudo necesario para que no les salpique la mierda.</p>
<p>Yo no soy perfecto, ni creo que mi trabajo haya sido tan perfecto como para que a estas alturas no tenga ningún problema. Los tiene. Pero, si el cliente ha aguantado lo que ha aguantado, lleva ya aguantándolos solo en este proyecto 9 meses, para algo que se debería haber acabado en como mucho 3, no creo que le venga de una semana más. El cliente es suficientemente listo como para darse cuenta de lo que pasa y ha pasado, está de sobras enterado. Lo único que pido es no ser tan canalla y no acabar con el trabajo a bombazos.</p>
<p>Esto es solo un ejemplo, no quiero decir que siempre tenga que pasar lo mismo en otros casos. Pero quería desahograme y recordar un post que he leído recientemente en <a href="http://weblog.linkingpaths.com/2007/11/21/el-factor-humano/trackback" target="_blank">Linked: El factor humano</a> aunque aquí los tiros van por otro lado.</p>
<p>Hasta la próxima.</p>
]]></content:encoded>
			<wfw:commentRss>http://weblog.v-code.org/2007/11/proyectos-a-dos-partes/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Aprendiendo a ser paciente… o no!</title>
		<link>http://weblog.v-code.org/2007/07/aprendiendo-a-ser-paciente-o-no/</link>
		<comments>http://weblog.v-code.org/2007/07/aprendiendo-a-ser-paciente-o-no/#comments</comments>
		<pubDate>Mon, 16 Jul 2007 10:31:36 +0000</pubDate>
		<dc:creator>VictorR</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[problemas]]></category>
		<category><![CDATA[Proyectos]]></category>
		<category><![CDATA[v.code]]></category>

		<guid isPermaLink="false">http://www.v-code.org/blog/aprendiendo-a-ser-paciente-o-no/</guid>
		<description><![CDATA[No se si muchos de vosotros os habréis encontrado en la situación de desarrollar un proyecto a medias con otra empresa para un mismo cliente. Bueno, ese es mi estado actual, en eterno desarrollo de una primera fase de un proyecto que debía durar algo más de dos semanas, hace más de tres meses. En [...]]]></description>
			<content:encoded><![CDATA[<p>No se si muchos de vosotros os habréis encontrado en la situación de desarrollar un proyecto a medias con otra empresa para un mismo cliente. Bueno, ese es mi estado actual, en eterno desarrollo de una primera fase de un proyecto que debía durar algo más de dos semanas, hace más de tres meses.</p>
<p>En todo este tiempo se ha puesto de manifiesto un absoluto “pasotismo” por parte de “los compañeros” de desarrollo aludiendo a que tienen que desarrollar otros proyectos, por lo que me he encontrado en situaciones de las que no sabía cómo salir o seguir con el desarrollo hasta que algún peso pesado del cliente no les ha llamado la atención. Esto es un gran problema, no solo por la inseguridad que a mi me ocasiona (saber o no saber qué, cómo y cuándo se va a hacer aquello y lo otro) cuando dependes de ese trabajo, si no que además retrasa el proyecto que crea una ansiedad en el cliente que puede llegar a ser incontrolable algún día (y eso no son buenas noticias).</p>
<p>El problema, sinceramente, no creo que sea únicamente de esta otra empresa que no dedica el tiempo necesario al desarrollo y colaboración con mi empresa, cada empresa da prioridad a lo que más le interesa (para algunas el lema de &#8220;al enemigo ni agua&#8221;). Creo que el permitir que esto suceda por parte del cliente tiene buena parte de culpa, y soluciones (como las brujas) “haberlas haylas…”</p>
<p>Y es aquí cuando tienes que aprender que las cosas de palacio van despacio, y que si algo no depende de uno mismo por más que se hagan reuniones, con buenas intenciones por todas partes, y calendarios de entrega, estos últimos son papel mojado. ¡Qué triste!</p>
<p>¿Alguna vez os habéis encontrado en una situación similar?</p>
]]></content:encoded>
			<wfw:commentRss>http://weblog.v-code.org/2007/07/aprendiendo-a-ser-paciente-o-no/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
	</channel>
</rss>
