<?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/"
	>

<channel>
	<title>El blog de Carlos Ble</title>
	<atom:link href="http://www.carlosble.com/?feed=rss2" rel="self" type="application/rss+xml" />
	<link>http://www.carlosble.com</link>
	<description>BrainStream.Write(Posts)</description>
	<pubDate>Sun, 22 Aug 2010 10:55:47 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.7</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Mercurial and Codebase work fine</title>
		<link>http://www.carlosble.com/?p=684</link>
		<comments>http://www.carlosble.com/?p=684#comments</comments>
		<pubDate>Sun, 22 Aug 2010 10:55:47 +0000</pubDate>
		<dc:creator>Carlos Ble</dc:creator>
		
		<category><![CDATA[Software Development]]></category>

		<guid isPermaLink="false">http://www.carlosble.com/?p=684</guid>
		<description><![CDATA[Some posts ago I was complaining about how big Git learning curve is and some other inconveniences that we had been facing. Some of them were just kind of flaming, I know.
The thing is that we switched to Mercurial and CodeBaseHq.com instead of Git and Github.com and are quite happy with the change.
CodeBase surprised me [...]]]></description>
			<content:encoded><![CDATA[<p>Some posts ago I was complaining about how big Git learning curve is and some other inconveniences that we had been facing. Some of them were just kind of flaming, I know.</p>
<p>The thing is that we switched to Mercurial and CodeBaseHq.com instead of Git and Github.com and are quite happy with the change.</p>
<p><div id="attachment_685" class="wp-caption alignleft" style="width: 310px"><a href="http://www.carlosble.com/?attachment_id=685" rel="attachment wp-att-685"><img src="http://www.carlosble.com/wp-content/uploads/s8000034-300x225.jpg" alt="Stuff they send to customers (manuals and more)" title="CodeBaseHQ" width="300" height="225" class="size-medium wp-image-685" /></a><p class="wp-caption-text">Stuff they send to customers (manuals and more)</p></div></p>
<p>CodeBase surprised me when I got a letter from the UK the day after making the payment. They send a manual and some other stuff that you can see in the picture, to every customer, no matter what kind of customer you are. The letter took just one single day to arrive from UK to Canary Islands, which is a record. The tools provided by CodeBase in the website are great, even better than Github.com</p>
<p>Now, regarding Mercurial, I believe it is what we were looking for. The concepts are pretty much the same than apply to Git, so the learning curve has been shorter because we already knew basic things. However, I'd say it is more user friendly. From the very moment you clone a repository from the main repo (CodeBase for us), everything gets configured, you can start working without telling Mercurial where do you want to push or pull, nor managing any configuration file. Straightforward. Every repository keeps its own revisions count. So commits are identified by a hash, but they got also a revision number that humans understand better. I like that because we don't have many branches, we work mainly against the central repository.<br />
Merges and conflicts are easy to work around. We haven't had to deal with any weird issue. The "incoming" and "outgoing" feature is very nice, together with the fact that the working directory doesn't change when you bring changes from other repo, till you decide you want it to be updated. Cloning local repos is fast, so you can clone when "incoming" reveals big changes or  merge goes crazy and can step back quickly recovering your local changes.<br />
Regarding the log, you get the sample problem than with Git, merges are difficult to read in the log. However, the "hg pull --rebase" make it work as SVN, merge does not appear in the log, so it keeps clean and readable. We know now that Git has also a rebase command, but we fond it naturally in Mercurial documentation and not in Git. Yeah, that is probably our fault, but the fact is that we found a solution sooner.</p>
<p>So far so good with Mercurial. It is very similar to Git, but those small things that annoy me, are easy and natural in Mercurial. Documentation is better in my opinion.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.carlosble.com/?feed=rss2&amp;p=684</wfw:commentRss>
		</item>
		<item>
		<title>MVC, CRUD and TDD</title>
		<link>http://www.carlosble.com/?p=674</link>
		<comments>http://www.carlosble.com/?p=674#comments</comments>
		<pubDate>Sat, 14 Aug 2010 22:18:15 +0000</pubDate>
		<dc:creator>Carlos Ble</dc:creator>
		
		<category><![CDATA[Software Development]]></category>

		<category><![CDATA[Test Driven Development]]></category>

		<guid isPermaLink="false">http://www.carlosble.com/?p=674</guid>
		<description><![CDATA[Some people ask me how Test Driven Development fits in MVC Frameworks like Django, Ruby on Rails, and all this kind of frameworks that use convention over configuration, and offer powerful tools for CRUD (Create-Read-Update-Delete) operations.
Well, the solution always depends on the kind of problem you face. If all your application needs to do is [...]]]></description>
			<content:encoded><![CDATA[<p>Some people ask me how Test Driven Development fits in MVC Frameworks like Django, Ruby on Rails, and all this kind of frameworks that use convention over configuration, and offer powerful tools for CRUD (Create-Read-Update-Delete) operations.<br />
Well, the solution always depends on the kind of problem you face. If all your application needs to do is CRUD, then, the framework is perfect. You don't need TDD at all. You just write some entities (known as models) and let the framework create all kinds of scaffolding to let the user create and retrieve data. Everything is created for you automatically.<br />
You even don't need system tests because the framework has already been tested. </p>
<p>However, none of my applications are so simple. They go beyond CRUD. They got business logic which I need to test drive. </p>
<p>The big mistake in my opinion is to clutter the controller with the business logic. In the development of MavenCharts.com, we never have business logic within a controller.  The mission of the controller, is to get the input from the user, call the application core, get the response, render a view and send it back to the user. The controller should not even manage entities (models if you want). It just gets inputs and send outputs. </p>
<p><div id="attachment_675" class="wp-caption alignleft" style="width: 310px"><a href="http://www.carlosble.com/?attachment_id=675" rel="attachment wp-att-675"><img src="http://www.carlosble.com/wp-content/uploads/web_mvc_tdd-300x146.png" alt="Web MVC and TDD" title="web_mvc_tdd" width="300" height="146" class="size-medium wp-image-675" /></a><p class="wp-caption-text">Web MVC and TDD</p></div></p>
<p>If you test drive your code, you manage the dependencies using injection. Creating a business class might not be easy. For that reason we use factories. The factory might use an IoC container in order to get instances. In the case of languages like Python or Ruby, I believe that IoC container is not necessary, so we just use static factory methods (functions defined in the global namespace of a module). </p>
<p>The code of an action in the controller should be something as simple as this:</p>
<pre class="python">&nbsp;
@render_error_if_method_is_not<span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;POST&quot;</span><span style="color: black;">&#41;</span>
@login_required<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
<span style="color: #ff7700;font-weight:bold;">def</span> save_new_profession<span style="color: black;">&#40;</span>request<span style="color: black;">&#41;</span>:
    <span style="color: #dc143c;">logging</span>.<span style="color: black;">info</span><span style="color: black;">&#40;</span><span style="color: #008000;">str</span><span style="color: black;">&#40;</span>request<span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
    profs = request.<span style="color: black;">POST</span>.<span style="color: black;">getlist</span><span style="color: black;">&#40;</span>dom_constants.<span style="color: black;">PROFESSION</span><span style="color: black;">&#41;</span>
    info = __get_basic_info<span style="color: black;">&#40;</span>request<span style="color: black;">&#41;</span>
    <span style="color: #dc143c;">user</span> = info<span style="color: black;">&#91;</span><span style="color: #483d8b;">'user'</span><span style="color: black;">&#93;</span>
    factory.<span style="color: black;">get_user_updater</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>.<span style="color: black;">add_professions</span><span style="color: black;">&#40;</span>
                                    <span style="color: #dc143c;">user</span>, profs<span style="color: black;">&#41;</span>
    <span style="color: #ff7700;font-weight:bold;">return</span> HttpResponseRedirect<span style="color: black;">&#40;</span>reverse<span style="color: black;">&#40;</span>my_professions<span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
&nbsp;</pre>
<p>The "add_professions" method is implemented regardless the MVC framework. It can run in the console. We test drive it with the xUnit framework as easy as always.<br />
The common mistake people make is to implement that method in the controller itself, making it hard to reuse, develop and test. </p>
<p>The controller might still contain defects. For that reason we write one test for every action (controller method), using WebDriver. But we don't test all the cases through the controller, just one case. Other cases were designed with TDD even before writing the controller.</p>
<p>MVC frameworks are great but they are dangerous when we want them to solve all our problems. Their mission is to help with plumbing, help avoid writing same tools once again. </p>
<p>For those starting with Django, it is worth noting that names are confusing. They call Views what should be named Controllers, and they call Templates, what really are Views. Eventually, they call Models, what should be entities, but that is something everybody does.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.carlosble.com/?feed=rss2&amp;p=674</wfw:commentRss>
		</item>
		<item>
		<title>Optional arguments are evil (II)</title>
		<link>http://www.carlosble.com/?p=669</link>
		<comments>http://www.carlosble.com/?p=669#comments</comments>
		<pubDate>Tue, 03 Aug 2010 19:01:17 +0000</pubDate>
		<dc:creator>Carlos Ble</dc:creator>
		
		<category><![CDATA[Software Development]]></category>

		<guid isPermaLink="false">http://www.carlosble.com/?p=669</guid>
		<description><![CDATA[Time ago I wrote about the perils of optional parameters in Python. Now I've found another reason why they are dangerous, although we still need them. 
What we have realized today is that, default values for optional arguments might share its state among multiple calls. You might have a Borg pattern where you don't want [...]]]></description>
			<content:encoded><![CDATA[<p>Time ago <a href="http://www.carlosble.com/?p=331">I wrote</a> about the perils of optional parameters in Python. Now I've found another reason why they are dangerous, although we still need them. </p>
<p>What we have realized today is that, default values for optional arguments might share its state among multiple calls. You might have a Borg pattern where you don't want it, and that is dangerous:</p>
<pre class="python">&nbsp;
<span style="color: #ff7700;font-weight:bold;">def</span> my_func_with_optional_list<span style="color: black;">&#40;</span>arg1, arg2=<span style="color: black;">&#91;</span><span style="color: black;">&#93;</span><span style="color: black;">&#41;</span>:
    arg2.<span style="color: black;">append</span><span style="color: black;">&#40;</span>arg1<span style="color: black;">&#41;</span>
    <span style="color: #ff7700;font-weight:bold;">return</span> arg2
&nbsp;
<span style="color: #ff7700;font-weight:bold;">def</span> my_func_with_optional_dict<span style="color: black;">&#40;</span>arg1, arg2=<span style="color: black;">&#123;</span><span style="color: black;">&#125;</span><span style="color: black;">&#41;</span>:
    arg2<span style="color: black;">&#91;</span>arg1<span style="color: black;">&#93;</span> = arg1
    <span style="color: #ff7700;font-weight:bold;">return</span> arg2
&nbsp;
<span style="color: #ff7700;font-weight:bold;">if</span> __name__ == <span style="color: #483d8b;">'__main__'</span>:
   <span style="color: #ff7700;font-weight:bold;">print</span> my_func_with_optional_list<span style="color: black;">&#40;</span><span style="color: #ff4500;">1</span><span style="color: black;">&#41;</span>
   <span style="color: #ff7700;font-weight:bold;">print</span> my_func_with_optional_list<span style="color: black;">&#40;</span><span style="color: #ff4500;">1</span><span style="color: black;">&#41;</span>
   <span style="color: #ff7700;font-weight:bold;">print</span> my_func_with_optional_dict<span style="color: black;">&#40;</span><span style="color: #483d8b;">'carlos'</span><span style="color: black;">&#41;</span>
   <span style="color: #ff7700;font-weight:bold;">print</span> my_func_with_optional_dict<span style="color: black;">&#40;</span><span style="color: #483d8b;">'oscar'</span><span style="color: black;">&#41;</span>
&nbsp;</pre>
<p>Can you see anything that could keep the state between calls? I can't, however, this is the output:</p>
<pre class="python">&nbsp;
<span style="color: black;">&#91;</span><span style="color: #ff4500;">1</span><span style="color: black;">&#93;</span>
<span style="color: black;">&#91;</span><span style="color: #ff4500;">1</span>, <span style="color: #ff4500;">1</span><span style="color: black;">&#93;</span>
<span style="color: black;">&#123;</span><span style="color: #483d8b;">'carlos'</span>: <span style="color: #483d8b;">'carlos'</span><span style="color: black;">&#125;</span>
<span style="color: black;">&#123;</span><span style="color: #483d8b;">'oscar'</span>: <span style="color: #483d8b;">'oscar'</span>, <span style="color: #483d8b;">'carlos'</span>: <span style="color: #483d8b;">'carlos'</span><span style="color: black;">&#125;</span>
&nbsp;</pre>
<p>What happen? My understanding is that, because the list and dictionary objects are mutable and they are defined along with the function itself, python creates them in the global namespace.</p>
<p>We are now reviewing again every function we've written searching for this pattern.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.carlosble.com/?feed=rss2&amp;p=669</wfw:commentRss>
		</item>
		<item>
		<title>Por qué dejamos Git</title>
		<link>http://www.carlosble.com/?p=665</link>
		<comments>http://www.carlosble.com/?p=665#comments</comments>
		<pubDate>Sat, 31 Jul 2010 23:04:41 +0000</pubDate>
		<dc:creator>Carlos Ble</dc:creator>
		
		<category><![CDATA[Software Development]]></category>

		<guid isPermaLink="false">http://www.carlosble.com/?p=665</guid>
		<description><![CDATA[Hemos decidido pasar de Git a Mercurial, pese a que no tenemos ninguna experiencia con el segundo. Despues de meses usando Git, concluyo que la experiencia es totalmente insatisfactoria como usuario. 
Los sistema de control de versiones de dos niveles, tambien llamados distribuidos, tienen la ventaja de que el desarrollador cuanta con un repositorio completo [...]]]></description>
			<content:encoded><![CDATA[<p>Hemos decidido pasar de Git a Mercurial, pese a que no tenemos ninguna experiencia con el segundo. Despues de meses usando Git, concluyo que la experiencia es totalmente insatisfactoria como usuario. </p>
<p>Los sistema de control de versiones de dos niveles, tambien llamados distribuidos, tienen la ventaja de que el desarrollador cuanta con un repositorio completo en su propia máquina y puede tomar instantáneas del código en cualquier momento (commits), sin que eso afecte necesariamente a los builds. Esto es estupendo, ya que uno tiene la libertad de guardar el estado de su codigo cada vez que lo necesita sin que afecte al resto del equipo. Llegado el momento de integrar el código con el resto de compañeros, se realiza la mezcla.</p>
<p>Nos decidimos por Git, gracias a Github.com, que ofrece hosting de pago para proyectos cerrados. Para mí era cómodo porque se hacen cargo de copias de seguridad y disponibilidad, ademas de una agradable interfaz web.<br />
Sin embargo, Git ha sido un dolor desde que lo empezamos a usar.</p>
<p>La documentación se limita a páginas tipo man de unix. Las páginas man son la documentación más inútil que conozco. Tienes la información de todos los flags de cada cosa pero no hay un maldito ejemplo. Ni siquiera está explicado el caso más sencillo y típico que uno quiere hacer.<br />
En Github.com hay algo de info para casos sencillos, pero muy poca info sobre cómo resolver conflictos, hacer branches y cosas asi. </p>
<p>La sintaxis es totalmente inhumana, imposible de recordar para mí. </p>
<p>En la mayoría de los casos, la gente quiere integrar el código de todo el mundo en un punto central, en el servidor de integración contínua. Eso de que cada uno tenga su rama y sea dueño de su repositorio, estará bien en un proyecto como Linux, pero en mis proyectos queremos integrar contínuamente. Git por defecto no está preparado para esta configuracion. Para usar Github.com como repo central, tuvimos que buscar por internet cómo crear el fichero de configuracion. Su contenido es este:<br />
<code lang="bash"><br />
[core]<br />
        repositoryformatversion = 0<br />
        filemode = true<br />
        bare = false<br />
        logallrefupdates = true<br />
[remote "origin"]<br />
        url = git@github.com:carlosble/repo<br />
        fetch = +refs/heads/*:refs/remotes/origin/*<br />
[branch "master"]<br />
        remote = origin<br />
        merge = refs/heads/master<br />
[gui]<br />
        wmstate = normal<br />
        geometry = 1024x651+0+56 207 294<br />
[remote "carlos_1"]<br />
        url = git@github.com:carlosble/repo.git<br />
        fetch = +refs/heads/*:refs/remotes/carlos_1/*<br />
</code></p>
<p>Por más que lo leo no lo entiendo. Lo de "origin" y "remote" nunca lo he terminado de entender. Es más fácil entender un código perl ofuscado.</p>
<p>Bueno, una vez tuvimos este fichero, trabajar como si usaramos SVN, parecía fácil. Haces commit cuando quieres una instantánea y luego cuando quieres subir codigo haces "git pull" (svn update) y "git push) (svn commit). Te descargas el código del repo central y si no hay conflictos, subes el tuyo. Parece fácil, parece de puta madre.<br />
El problema lo tienes cuando hay conflictos.<br />
Si al hacer "git pull" hay un conflicto, el código del repo central no se termina de descargar en tu máquina. Se queda cortado a la mitad, o algo asi entiendo. Tienes que resolver el conflicto, hacer commit y volver a intentar terminar de mezclar el código del repo. En ese punto, Git cree que los ficheros que todavia no ha mezclado son cambios que tú has hecho, aun cuando no es asi. Al intentar resolver y concluir la mezcla te pueden ocurrir cosas rocambolescas como que de repente te situas en "ningun branch" (no-branch) y entonces haces commit pero ya no lo haces en el master (head). Dependiendo de la complejidad de la mezcla, puede ser un infierno que finalmente llegues a subir tus cambios al repo central.<br />
En estos casos nos ha ocurrido que tras subir los cambios, vemos que algunos cambios que había subido otro compañero antes, se han perdido, porque Git entendió que tu versión, es más nueva, aun cuando tú no has tocado esos ficheros.<br />
El problema basicamente es que Git intenta hacer automerge y no solo se arma lío cuando dos personas tocan el mismo fichero, sino cuando uno subió un nuevo fichero que el otro no tiene.<br />
El resultado es que despues de cada mezcla que resulta conflictiva, tenemos que revisar todo el equipo, que ningun cambio ha sido sobreescrito y descartado.<br />
Cuando no sabíamos que esto ocurría, nos llegó a pasar que incluso un bug corregido, volvío a estar en producción.<br />
Incluso cuando no hay conflictos, te acojonas con los automerges que hace el tipo.</p>
<p>Por supuesto, interpretar el log de Git es tambien un puzzle. Cuando haces push despues de un merge, Git dice que tú eres el autor de cambios que hizo un compañero tuyo. Así que miras el log de un commit concreto y realmente no sabes quién es el autor de los cambios. Git te los atribuye a tí. Asi que intentar conocer el historial del proyecto por el log de Git, es imposible. Todo lo que te queda es marcar con tags las releases que van a producción para poder bajartelas en algun momento concreto. </p>
<p>Ahora veámos cómo es la sintaxis para crear un branch y ponerlo tambien en el repo central, Github:</p>
<p><code lang="bash"><br />
git branch bname # create the branch<br />
   git checkout bname # switch to the branch<br />
   git remote add bname_1 git@github.com:carlosble/repo.git  # create a remote "folder" remotely<br />
   git fetch bname_1 # initialized the remofe "folder" locally<br />
   git push bname_1 bname:refs/heads/bname # initialize the remote "folder" remotely<br />
   git config branch.bname.remote bname_1 # add lines to .config file<br />
   git config branch.bname.merge refs/heads/bname # add lines to .config file<br />
</code></p>
<p>Los comentarios no son necesariamente ciertos, son lo que yo he interpretado que estaba haciendo. De nuevo la sintaxis es absolutamente disparatada. No la voy a recordar en la vida.</p>
<p>Pensaba que al crear el branch, metería el código de mi máquina en él y lo subiría a github. Sin embargo, lo que hace es subir el último código que me bajé y no añade los últimos cambios que acabo de hacer. No he conseguido averiguar cómo poner los ultimos cambios que tengo, y que los suba otra persona.<br />
Para bajar el código de mi branch, otro compañero tardó media hora en averiguarlo.</p>
<p>En cuanto a hacer mezclas entre compañeros sin pasar por el repo central, tampoco lo hemos conseguido hacer. Estuvimos media hora intentandolo con git-daemon, es decir, levantando un demonio en un puerto para que la otra persona se trajese los cambios de uno y finalmente lo dejamos por imposible. La página man de git-daemon tiene 0 ejemplos de cómo hacer al menos el caso más normal.</p>
<p>Git será superpotente, pero es un infierno. Para un proyecto donde queremos integrar contínuamente, no nos sirve. No puede ser que cada vez que mezclamos tengamos que encender una vela.</p>
<p>Lógicamente si conociera Git tanto como quienes lo han parido, no tendría estos problemas, pero es que a mi me da igual cómo está implementado Git. Quiero una herramienta que incremente mi productividad, no que me obligue a hacer horas extras para aprender cómo pensó el desgraciado que ideó su maldita sintaxis.<br />
A estas alturas y después de años usando Subversion, no puede ser que la curva de aprendizaje de un control de versiones sea tan fuerte. Es inaceptable.<br />
Si por la naturaleza del kernel linux, necesitan una cosa tan compleja, me parece estupendo, pero nuestros proyectos no son precisamente el kernel linux.</p>
<p>Estoy seguro de que todos los que habeis dicho por twitter que Git es muy fácil, trabajais en solitario. Seguro que no habeis trabajado con Git en un proyecto con 3 o 4 desarrolladores ni habeis tenido que controlar las releases ni crear branches.</p>
<p>Se dice que Mercurial tiene mucha menos funcionalidad pero es mucho más fácil de usar. Vamos a ver si con Mercurial nos ahorramos tantos quebraderos de cabeza y podemos tener nuestro branch de desarrollo y nuestro branch de producción. Algo que parece tan sencillo y que no hemos sido capaces de hacer con Git. </p>
<p>Crucemos dedos :-S</p>
]]></content:encoded>
			<wfw:commentRss>http://www.carlosble.com/?feed=rss2&amp;p=665</wfw:commentRss>
		</item>
		<item>
		<title>MavenCharts.com abierto a inversores</title>
		<link>http://www.carlosble.com/?p=663</link>
		<comments>http://www.carlosble.com/?p=663#comments</comments>
		<pubDate>Tue, 27 Jul 2010 09:34:33 +0000</pubDate>
		<dc:creator>Carlos Ble</dc:creator>
		
		<category><![CDATA[Investment]]></category>

		<guid isPermaLink="false">http://www.carlosble.com/?p=663</guid>
		<description><![CDATA[Hemos tomado la decisión de abrir MavenCharts.com a pequeños y grandes inversores. Ahora que el producto está puesto en producción y que estamos lanzando releases con frecuencia, solo nos falta hacerlo bien en marketing. Que no es poco. Ademas para la gestión de los contenidos en otras lenguas y el soporte, necesitamos contratar profesionales en [...]]]></description>
			<content:encoded><![CDATA[<p>Hemos tomado la decisión de abrir MavenCharts.com a pequeños y grandes inversores. Ahora que el producto está puesto en producción y que estamos lanzando releases con frecuencia, solo nos falta hacerlo bien en marketing. Que no es poco. Ademas para la gestión de los contenidos en otras lenguas y el soporte, necesitamos contratar profesionales en esas lenguas. En definitiva, llegamos al momento en que para crecer, hay que invertir.</p>
<p>Estamos buscando grandes inversores en EEUU pero tambien queremos intentarlo en España. </p>
<p>Aquí va nuestra oferta para pequeños y grandes inversores:</p>
<ul>
<li>La inversión mínima es de 100€</li>
<li>Cuando empiece a haber beneficio, cada inversor recibirá el doble de lo que invirtió</li>
<li>El pago a los inversores se realizará por orden: El primero en invertir (por fecha) es el primero en cobrar</li>
<li>Los inversores tendrán acceso a las cuentas anuales de manera que sabrán cuándo hay beneficio y qué inversores están recibiendo su dinero de retorno</li>
<li>Los inversores estarán informados de los planes de negocio y de las nuevas funciones de la web. Tendrán acceso a un foro interno donde se debatirán decisiones estratégicas</li>
<li>Los inversores que pongan más dinero tendrán más peso en las decisiones estratégicas </li>
</ul>
<p>¿Cuándo se espera que tengamos beneficio? Estimamos que a partir de los 100.000 inscritos empezaremos a facturar. Si lees el <a href="http://blog-es.mavencharts.com">blog de MavenCharts</a> verás que el modelo de negocio gira en torno a los micropagos (SMS) y en un futuro muy proximo, tambien a micropagos por acceso a funcionalidades extra para usuarios que lo demandan.</p>
<p>Intentaremos tener presencia en tantos paises como la economia nos permita. Por lo pronto USA, UK, Irlanda y Australia serán los primeros. Luego implantaremos en paises con otras lenguas.</p>
<p>Trabajaremos en MavenCharts mientras seamos capaces de generar sueldo para ello. Si llegase el momento en que no conseguimos pagar el sueldo del equipo que trabaja en el proyecto, se declararía fracasado y los inversores perderían su dinero.</p>
<p>Como ves las posibilidades son muchas y el riesgo el que cada uno quiera asumir. La apuesta es doble o nada. Nosotros ya llevamos un año de inversión, aproximadamente 40.000 euros. Y tu... ¿te animas?</p>
]]></content:encoded>
			<wfw:commentRss>http://www.carlosble.com/?feed=rss2&amp;p=663</wfw:commentRss>
		</item>
		<item>
		<title>Ha llegado MavenCharts.com</title>
		<link>http://www.carlosble.com/?p=641</link>
		<comments>http://www.carlosble.com/?p=641#comments</comments>
		<pubDate>Mon, 12 Jul 2010 17:07:55 +0000</pubDate>
		<dc:creator>Carlos Ble</dc:creator>
		
		<category><![CDATA[Agile]]></category>

		<category><![CDATA[Google App Engine]]></category>

		<category><![CDATA[Test Driven Development]]></category>

		<category><![CDATA[iExpertos]]></category>

		<guid isPermaLink="false">http://www.carlosble.com/?p=641</guid>
		<description><![CDATA[Git dice que hice el primer commit en el repositorio el dia 2 de diciembre de 2009. Sin embargo la idea se me ocurrió hace 3 años. Aquello de que el día a día no te deja, retrasó el proyecto hasta hace poco. La unica manera de poderlo llevar hacia adelante ha sido dedicarme a [...]]]></description>
			<content:encoded><![CDATA[<p>Git dice que hice el primer commit en el repositorio el dia 2 de diciembre de 2009. Sin embargo la idea se me ocurrió hace 3 años. Aquello de que el día a día no te deja, retrasó el proyecto hasta hace poco. La unica manera de poderlo llevar hacia adelante ha sido dedicarme a ello exclusivamente, primero en solitario y luego con un equipo de desarrolladores vocacionales como el que somos ahora. Oscar se unió al proyecto hace unos 3 meses y Dani todavía no ha hecho el mes. Curso a curso he ido pagando el alquiler y las facturas para ponerlo todo en este desarrollo. Se ha llevado a cabo usando Test Driven Development al 100% en el backend. Para el frontend, no hemos hecho tests automaticos del javascript. Realmente es el mejor código que he escrito en mi vida. Y estamos tranquilos de que podemos hacer cambios con velocidad sin perder estabilidad. Menos mal, porque Google App Engine lo pone muy dificil.</p>
<p>Cuando empecé a escribir código en diciembre, planeaba tener lista la version que ha salido ahora, en abril. O sea que nos hemos retrasado 3 meses, practicamente el doble de la previsión. Calculo que trabajando sobre un sistema SQL tradicional y un servidor web como Apache, hubiesemos de verdad terminado en abril o mayo a más tardar. Realmente desarrollar sobre GAE ha sido un dolor. En primer lugar porque es NoSQL y eso significa que tienes que aprender a acceder a datos de otra manera. Tienes que pensar diferente. En segundo lugar, porque el Datastore (la base de datos) tiene tal cantidad de restricciones que hacer consultas medio complejas es muy muy complejo. Las consultas del buscador de MavenCharts son complicadas sin duda. Esto ha hecho que haya más tests de integración de los que hubiesen sido deseables.<br />
Por otro lado, cargar la base de datos con las poblaciones de España tambien ha sido complejo. Primero habia que buscar los datos, tratarlos y subirlos. Los tenemos georeferenciados vía google maps para las nuevas funciones en las que estamos trabajando. Eso también llevó su trabajo.<br />
GAE no te permite hacer ningun request que dure mas de 30 segundos, lo interrumpe con un error 500. Entonces te las tienes que ingeniar para dividir la tarea. Menos mal que hemos usado python y los scripts se hacen rápido porque hemos automatizado mil cosas de ese tipo. Para subir datos no puedes hacer un dump de SQL, todo lo que tienes es CSVs, que puedes subir si te programas las clases que los saben interpretar. Te lo tienes que hacer todo tu.<br />
Otro problema importante es que el entorno de desarrollo de GAE en el pc local no es igual que el de la nube, y los tests de integracion que te van bien en local, luego arriba petan por falta de indices en la BD y cosas asi. Gracias a WebDriver, el cual hemos manejado desde Java, hemos podido automatizar las pruebas de integracion mas intensivas y complicadas.</p>
<p>El otro gran problema que nos supuso 3 semanas de retraso y unas 1500 lineas de código tiradas a la basura, fue el de la gestion de cache de datos. GAE te permita usar memcache. La gran pregunta es... ¿cómo gestionas la cache cuando tienes datos que actualizar? Despues de intentar mil cosas hemos adoptado la politica de Google, es decir, el buscador no refresca los datos inmediatamente sino que necesita unas horas. En nuestro caso unas 24 horas. Francamente es lo más optimo que se puede hacer. Todo lo demas, no escala. Realmente no vale con usar GAE para que tu aplicacion escale, sino que tienes que tener en cuenta mil cosas mas, y pensar que, cada peticion a la web, podria ser arrancada en una instancia distinta, en un servidor distinto, y si tenias un singleton por ahí, tienes un gran problema. Todo esto lo hemos ido aprendiendo a bofetadas. Menos mal que nuestras baterias de tests estaban ahí, porque sino, el caos nos hubiera ganado.</p>
<p>Finalmente, como todo el mundo sabe, la maquetación ha sido muy dura por aquello de que cada n<a style="padding:10px;" rel="attachment wp-att-643" href="http://www.carlosble.com/?attachment_id=643"><img class="alignleft size-thumbnail wp-image-643" title="equipo_maven" src="http://www.carlosble.com/wp-content/uploads/equipo_maven-150x150.jpg" alt="equipo_maven" width="202" height="202" /></a>avegador (sobre todo Internet Explorer) pinta las cosas como quiere. Hemos cometido el error de dejar toda la maquetacion para el final pensando que seria sencilla, y no lo ha sido. En lo sucesivo iremos armando las pantallas a medida que el backend esté hecho. De hecho ahora hay que darle un gran refactoring a las css, pero al menos ya se ve bien en casi todos los sitios.</p>
<p>En la foto teneis al equipo de MavenCharts 1.0. En desarrollo, Oscar Moreno, Dani Latorre y un servidor. En diseño Lucas Carmona, Carlos Sosa y Pedro Gracia. En QA tenemos a Dácil a la cabeza de un grupo de amigos y colaboradores.</p>
<p>Ya tenemos la web internacionalizada y todo listo para soportar más paises e idiomas, asi que en las próximas semanas vamos a intentar salir en EEUU y en varios paises europeos, a la par que ir abriendo más funcionalidad. Hay ya cientos de lineas de codigo esperando a ser puestas en produccion <img src='http://www.carlosble.com/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
<p>Nos hacen falta 4 buenos desarrolladores pero por desgracia todavia no hay pelas para contratar. Ojala podamos seguir creciendo pronto.</p>
<p>Tenemos mucha ilusión y estamos poniendo mucho esfuerzo en este proyecto. Cualquier feedback es bienvenido. Gracias a todos los que lo habeis retuiteado y lo comentais en facebook.</p>
<p>Seguimos trabajando <img src='http://www.carlosble.com/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
<p><a href="http://www.mavencharts.com">http://www.MavenCharts.com</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.carlosble.com/?feed=rss2&amp;p=641</wfw:commentRss>
		</item>
		<item>
		<title>Proximos destinos: Zaragoza y Madrid</title>
		<link>http://www.carlosble.com/?p=638</link>
		<comments>http://www.carlosble.com/?p=638#comments</comments>
		<pubDate>Mon, 31 May 2010 15:54:26 +0000</pubDate>
		<dc:creator>Carlos Ble</dc:creator>
		
		<category><![CDATA[Software Development]]></category>

		<guid isPermaLink="false">http://www.carlosble.com/?p=638</guid>
		<description><![CDATA[Esta semana viajo a Zaragoza para impartir un curso abierto de TDD los dias 2 y 3 (miercoles y jueves). Han sobrado muchas plazas por un malentendido que hubo con el curso de Scrum asi que si todavia alguien se quiere apuntar, puede hacerlo entre hoy y mañana.
Pocos dias despues, 10 y 11 de Junio [...]]]></description>
			<content:encoded><![CDATA[<p>Esta semana viajo a Zaragoza para impartir un curso abierto de TDD los dias 2 y 3 (miercoles y jueves). Han sobrado muchas plazas por un malentendido que hubo con el curso de Scrum asi que si todavia alguien se quiere apuntar, puede hacerlo entre hoy y mañana.</p>
<p>Pocos dias despues, 10 y 11 de Junio estaré en Madrid en la <a href="http://conferencia2010.agile-spain.com">Conferencia Agile Spain 2010</a>. Allí tengo una sesion con <a href="http://agilizar.es/blog/">Juan Guitiérrez</a> y un taller de introduccion a TDD con <a href="http://eclijava.blogspot.com">Gregorio Mena</a>. La sesion es de entrada libre para los asistentes a la conferencia y el taller es de pago. Sera una version resumida del curso de TDD, con algunos ejemplos distintos para ir mas rapido. Recomendable para las personas que no pudieron venir al curso de TDD.<br />
Gracias a <a href="http://www.plainconcepts.com/">Plain Concepts</a>, dispondremos de 50 ejemplares impresos del <a href="http://dirigidoportests.com/el-libro">libro de TDD</a> en su stand, que se venderán a 15 euros. Precio de costo.</p>
<p>He estado en la lista de coordinacion del evento, aunque no he participado y estoy impresionado con el trabajo tan grande que los organizadores han hecho para que salga adelante. Quiero dar las gracias a las personas que durante los ultimos 5 meses han dedicado unas 4 horas a la semana para que esto sea realidad. En los ultimos dias me consta que han sido muchas mas de 4 horas. En fin, es un esfuerzo abrumador que agradezco mucho.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.carlosble.com/?feed=rss2&amp;p=638</wfw:commentRss>
		</item>
		<item>
		<title>Github comming from svn</title>
		<link>http://www.carlosble.com/?p=635</link>
		<comments>http://www.carlosble.com/?p=635#comments</comments>
		<pubDate>Thu, 27 May 2010 12:24:41 +0000</pubDate>
		<dc:creator>Carlos Ble</dc:creator>
		
		<category><![CDATA[Software Development]]></category>

		<guid isPermaLink="false">http://www.carlosble.com/?p=635</guid>
		<description><![CDATA[Git Config:
To get ready with git add these lines to .git/config (/home/USER/project/.git/config)
      [core]
	    repositoryformatversion = 0
	    filemode = true
	    bare = false
	    logallrefupdates = true
      [branch "master"]
       [...]]]></description>
			<content:encoded><![CDATA[<p><strong>Git Config:</strong><br />
To get ready with git add these lines to .git/config (/home/USER/project/.git/config)</p>
<p>      [core]<br />
	    repositoryformatversion = 0<br />
	    filemode = true<br />
	    bare = false<br />
	    logallrefupdates = true<br />
      [branch "master"]<br />
            remote = origin<br />
            merge = refs/heads/master</p>
<p>      [remote "origin"]<br />
	    url = git@github.com:username/project.git<br />
	    fetch = +refs/heads/*:refs/remotes/origin/*<br />
      [gui]<br />
	    geometry = 1018x659+9+104 382 207</p>
<p><strong>Branches</strong></p>
<p>   1.<strong>Create a branch</strong>:</p>
<p>   git branch bname # create the branch<br />
   git checkout bname # switch to the branch<br />
   git remote add bname_1 git@github.com:username/project.git  # create a remote "folder" remotely<br />
   git fetch bname_1 # initialized the remofe "folder" locally<br />
   git push bname_1 bname:refs/heads/bname # initialize the remote "folder" remotely<br />
   git config branch.bname.remote bname_1 # add lines to .config file<br />
   git config branch.bname.merge refs/heads/bname # add lines to .config file</p>
<p>   2.<strong>Switch branch</strong>:</p>
<p>   git checkout bname  # switches to bname<br />
   git checkout master # switches to master</p>
<p>   3.<strong>Which branch am I on?</strong>:</p>
<p>   git branch</p>
<p>   4.<strong>Get branch from github</strong>:</p>
<p>   git checkout --track -b bname origin/bname</p>
<p>   5. <strong>Download a everything from github</strong>:</p>
<p>   git clone git@github.com:username/project.git<br />
   cd project<br />
   git checkout --track -b bname origin/bname</p>
<p><strong>Tags</strong></p>
<p>   git tag "v0.2"<br />
   git push --tags</p>
]]></content:encoded>
			<wfw:commentRss>http://www.carlosble.com/?feed=rss2&amp;p=635</wfw:commentRss>
		</item>
		<item>
		<title>Virtual Alt.Net sobre Test Driven Development</title>
		<link>http://www.carlosble.com/?p=632</link>
		<comments>http://www.carlosble.com/?p=632#comments</comments>
		<pubDate>Mon, 17 May 2010 08:55:50 +0000</pubDate>
		<dc:creator>Carlos Ble</dc:creator>
		
		<category><![CDATA[Test Driven Development]]></category>

		<guid isPermaLink="false">http://www.carlosble.com/?p=632</guid>
		<description><![CDATA[El mes pasado, el grupo Alt.Net hispano me invitó a participar en una reunión virtual sobre Test Driven Development. Gracias a Jorge Gamba disponemos ahora de la grabacación con una calidad de sonido y video aceptable. 

En mi opinión la parte más interesante es la última hora, donde hacemos un pequeño ejercicio práctico.
Por cierto, aprovecho [...]]]></description>
			<content:encoded><![CDATA[<p>El mes pasado, el grupo <a href="http://altnet-hispano.pbworks.com/Historial-de-reuniones">Alt.Net hispano</a> me invitó a participar en una reunión virtual sobre Test Driven Development. Gracias a <a href="http://gambasoft.net/">Jorge Gamba</a> disponemos ahora de la grabacación con una calidad de sonido y video aceptable. </p>
<p><object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" width="437" height="304" id="viddler_e3f231d6"><param name="movie" value="http://www.viddler.com/player/e3f231d6/" /><param name="allowScriptAccess" value="always" /><param name="allowFullScreen" value="true" /><embed src="http://www.viddler.com/player/e3f231d6/" width="437" height="304" type="application/x-shockwave-flash" allowScriptAccess="always" allowFullScreen="true" name="viddler_e3f231d6"></embed></object></p>
<p>En mi opinión la parte más interesante es la última hora, donde hacemos un pequeño ejercicio práctico.</p>
<p>Por cierto, aprovecho la ocasión para recordar que los dias 2 y 3 de junio estaré en Zaragoza impartiendo el curso de TDD. <a href="http://www.iExpertos.com/es/blog">Todavia hay plazas para inscribirse</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.carlosble.com/?feed=rss2&amp;p=632</wfw:commentRss>
		</item>
		<item>
		<title>Resumen de los cursos en Valladolid y Barcelona</title>
		<link>http://www.carlosble.com/?p=617</link>
		<comments>http://www.carlosble.com/?p=617#comments</comments>
		<pubDate>Mon, 12 Apr 2010 17:59:11 +0000</pubDate>
		<dc:creator>Carlos Ble</dc:creator>
		
		<category><![CDATA[Uncategorized]]></category>

		<category><![CDATA[iExpertos]]></category>

		<guid isPermaLink="false">http://www.carlosble.com/?p=617</guid>
		<description><![CDATA[La semana pasada fue intensísima y dura pero muy fructífera. Tuvieron lugar dos cursos abiertos de TDD, uno en Valladolid y otro seguido en Barcelona. 
En Valladolid la acogida fue excepcional. Todo el mundo se esforzó a tope para que el curso saliese bien. Además Jorge Jiménez, Amalia Hernández y Pencho Herrero han sido unos [...]]]></description>
			<content:encoded><![CDATA[<p>La semana pasada fue intensísima y dura pero muy fructífera. Tuvieron lugar dos cursos abiertos de TDD, uno en Valladolid y otro seguido en Barcelona. </p>
<p>En Valladolid la acogida fue excepcional. Todo el mundo se esforzó a tope para que el curso saliese bien. Además <a href="http://twitter.com/semurat">Jorge Jiménez</a>, <a href="http://twitter.com/amaliahern">Amalia Hernández</a> y <a href="http://twitter.com/execyl">Pencho Herrero</a> han sido unos anfitriones de lujo. Me enseñaron Valladolid e incluso pude ver lo contundente que es el Cocido Castellano. La ciudad y su gente me han conquistado.<br />
Además grabamos un <a href="http://www.podgramando.es/uncategorized/agilidad-y-herramientas-en-cyl">podcast</a> aprovechando que la gente tenía un nivelazo tremendo.<br />
Pencho me dió también la oportunidad de conocer a Pablo Santos de <a href="http://www.codicesoftware.com/xpfront.aspx">Plastic</a> y a Jacinto Canales de <a href="http://www.tecsidel.es">Tecsidel</a>, lo cual ha sido genial!<br />
Por si todo esto no fuera suficiente, Pencho ha escrito <a href="http://www.execyl.es/?p=870">este estupendo post</a> sobre el curso!<br />
Acabamos de colgar las fotos en <a href="http://www.facebook.com/album.php?id=337552505888&aid=154130&l=5799f10483&s=0&hash=09c24490b8b440311ab3e091819ab1d6">Facebook</a>.<br />
Espero poder volver pronto a Castilla <img src='http://www.carlosble.com/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
<p>En Barcelona fuimos pocos pero la cosa estuvo bien. No me dieron tregua. <a href="http://www.doubleyou.com/">DoubleYou</a> puso las instalaciones a cambio de algunas plazas para el curso y gracias a ello pudimos celebrarlo ya que no habíamos llegado a cubrir el minimo de plazas requeridas. No sabemos cual es el motivo de haber captado tan poca atención. Desde luego no acertamos con la campaña.<br />
Lo cierto es que lo pasamos muy bien y aproveché para conocer el bonito barrio de Gracia, donde se come muuuy bien. No tuve tiempo de hacer turismo pero afortunadamente ya he visto la ciudad otras veces (y me encanta). Grabamos <a href="http://www.podgramando.es/uncategorized/sistemas-de-control-de-versiones-y-mas-cosas">otro podcast</a> muy interesante y tuvimos tiempo de debatir-cerveza-en-mano bastantes cosas. Ha valido la pena el esfuerzo para conocer a gente tan interesante y tan profesional.</p>
<p>Ahora vuelta a casa, a programar a muerte, que en junio tenemos el lanzamiento de nuestro producto estrella <img src='http://www.carlosble.com/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://www.carlosble.com/?feed=rss2&amp;p=617</wfw:commentRss>
		</item>
	</channel>
</rss>
