<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">

  <title><![CDATA[Reinaldo Junior]]></title>
  <link href="http://blog.reinaldojunior.net/atom.xml" rel="self"/>
  <link href="http://blog.reinaldojunior.net/"/>
  <updated>2012-01-10T21:44:43-02:00</updated>
  <id>http://blog.reinaldojunior.net/</id>
  <author>
    <name><![CDATA[Reinaldo Junior]]></name>
    
  </author>
  <generator uri="http://octopress.org/">Octopress</generator>

  
  <entry>
    <title type="html"><![CDATA[Migrando o blog para Octopress]]></title>
    <link href="http://blog.reinaldojunior.net/2012/01/05/migrando-o-blog-para-octopress/"/>
    <updated>2012-01-05T10:34:00-02:00</updated>
    <id>http://blog.reinaldojunior.net/2012/01/05/migrando-o-blog-para-octopress</id>
    <content type="html"><![CDATA[<p>O Ano novo sempre traz a intenção (promessa) de fazer melhor. E para manter a tradição: ano novo, blog novo.</p>

<h2>Histórico</h2>

<p>Já usei o <a href="http://wordpress.org/">WordPress</a>, tanto hospedado pessoalmente quanto compartilhado no wordpress.com. O problema era: atualizar a versão do Wordpress, atualizar os plugins, acessar o painel pra postar e usar o editor WYSIWYG pra formatar. Muito trabalho.</p>

<p>Em 2011, usei o <a href="http://www.blogger.com">Blogger</a>. Poucas opções pra customizar, e o mesmo workflow: acessar painel, usar editor WYSIWYG, alternar entre o código-fonte e o visual pra formatar. Muito trabalho.</p>

<h2>Os problemas</h2>

<ol>
<li><p><strong>HTML sux</strong><br/>
Usar uma linguagem de marcação tão verbosa (<code>&lt;strong&gt;</code> e <code>&lt;/strong&gt;</code> pra negrito, p.e.) e com tanto ruido atrapalha a escrita. As tags começam a quebrar a leitura (e as idéias) e no final você tem que ligar o seu interpretador de HTML cerebral pra expressar as idéias.<br/>
<strong>Muito esforço.</strong> Por isso é <strong>muito ruim</strong> escrever tudo em HTML</p></li>
<li><p><strong>O workflow envolve muitos passos online/offline</strong><br/>
Por causa do problema (1) eu era forçado a usar o seginte workflow:</p>

<ul>
<li>Rascunhar os posts &#8220;offline&#8221;, escrevendo num arquivo .txt. Essa parte demora.</li>
<li>Acessar o painel do blog &#8220;online&#8221;, criar o post</li>
<li>Formatar o post &#8220;online&#8221;, olhar como ficou no editor WYSIWYG, repetir.</li>
<li>Colocar color highlight nos códigos, disponibilizar os códigos pra download, etc.</li>
</ul>


<p>A questão não é a parte dos &#8220;muitos passos&#8221; e sim &#8220;online/offline&#8221;.</p></li>
</ol>


<p>O problema real é que as plataformas de blogging se baseiam no HTML (afinal de contas, se você pode publicar em HTML pode publicar qualquer coisa). <strong>Eu não quero fazer qualquer coisa que eu quiser. Quero fazer apenas o que eu preciso.</strong></p>

<h2>Solução</h2>

<p>A solução seria uma plataforma de blogging que me fornecesse (por padrão) algo mais legível (mesmo que mais restrito) que HTML e que oferecesse &#8220;suporte&#8221; a HTML. O que eu queria era uma plataforma que suportasse <a href="http://daringfireball.net/projects/markdown/syntax">Markdown</a>.</p>

<p>No final de 2011, ainda tentei usar o <a href="https://posterous.com/">Posterous</a> pela promessa de <a href="http://blog.posterous.com/announcing-markdown-support">suporte a Markdown</a> mas ainda assim era um grande <code>#fail</code>: precisava de um comentário HTML no topo do post pra indicar que eu tava escrevendo em Markdown e depois pra editar, era no editor visual deles, arghhhh&#8230; <strong>Gambi</strong>.</p>

<h2>Octopress</h2>

<p>No final do ano, por acaso, conheci o <a href="http://octopress.org/">Octopress</a> - um framework de blog baseado no <a href="http://github.com/mojombo/jekyll">Jekyll</a> (um gerador estático de website).</p>

<h3>Instalando</h3>

<p>A instalação foi muito simples, é só seguir a <a href="http://octopress.org/docs/">documentação</a>. Em seguida, configurei o deploy para ser feito no <a href="http://octopress.org/docs/deploying/github/">Github Pages</a>. Isso é MUITO maneiro.</p>

<h3>Importando do Blogger</h3>

<p>Pra importar os posts do Blogger eu <a href="https://gist.github.com/1564581">modifiquei um script</a> que eu achei.<br/>
<strong>Cuidado:</strong> ele vai limpar sua pasta <code>_posts</code>. O melhor é criar um diretorio <code>import</code>, jogar o script e o .xml do seu blogger nele, executar a importação e depois copiar de <code>import/_posts</code> para <code>_posts</code> do seu Octopress.</p>

<h3>Workflow</h3>

<p>Agora meu workflow é simples:</p>

<ol>
<li>Criar o rascunho em .txt (na verdade em .markdown)</li>
<li>Escrever e formatar ao mesmo tempo</li>
<li>Dar uma conferida na formatação:

<ul>
<li>Quando tô no Mac, uso o app <a href="http://itunes.apple.com/us/app/marked/id448925439?mt=12">Marked</a></li>
<li>Independente de onde estou, dá pra usar <code>rake generate &amp;&amp; rake preview</code> e visualizar o blog em <code>localhost:4000</code></li>
</ul>
</li>
<li><code>rake generate</code></li>
<li><code>rake deploy</code></li>
</ol>

]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[How to build GStreamer from source]]></title>
    <link href="http://blog.reinaldojunior.net/2011/12/10/how-to-build-gstreamer-from-source/"/>
    <updated>2011-12-10T09:09:00-02:00</updated>
    <id>http://blog.reinaldojunior.net/2011/12/10/how-to-build-gstreamer-from-source</id>
    <content type="html"><![CDATA[<p>This post shows how to build and install <a href="http://gstreamer.freedesktop.org/">GStreamer</a> from source. It targets building GStreamer for Mac OS X Lion. The procedure is quite similar if you want to build GStreamer for Linux.</p>

<p>The GStreamer is organized into <a href="http://gstreamer.freedesktop.org/modules/">several modules</a>. The required modules are <strong>gstreamer</strong>, <strong>gst-plugins-base</strong> and <strong>gst-plugins-good</strong> (if you want to do anything useful). This post will show how to build also <strong>gst-plugins-bad</strong> and <strong>qt-gstreamer</strong> modules.</p>

<h3>Pre-requisites</h3>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'>brew update
</span><span class='line'>brew install gettext pkg-config glib
</span><span class='line'>
</span><span class='line'><span class="c">#autopoint is missing on Lion</span>
</span><span class='line'><span class="nv">PATH</span><span class="o">=</span><span class="s2">&quot;$PATH:`brew --prefix gettext`/bin/&quot;</span>
</span><span class='line'>
</span><span class='line'><span class="c">#Required libs provided by homebrew</span>
</span><span class='line'>brew install libiconv libffi
</span></code></pre></td></tr></table></div></figure>


<h3>Environment</h3>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'><span class="nv">BUILD_ROOT</span><span class="o">=</span>~/gstreamer-src
</span><span class='line'><span class="nv">BUILD_TARGET</span><span class="o">=</span>~/gstreamer
</span><span class='line'>
</span><span class='line'>mkdir <span class="nv">$BUILD_TARGET</span>
</span><span class='line'>mkdir <span class="nv">$BUILD_ROOT</span> <span class="o">&amp;&amp;</span> <span class="nb">cd</span> <span class="nv">$BUILD_ROOT</span>
</span></code></pre></td></tr></table></div></figure>


<h3>Getting the source</h3>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'>git clone git://anongit.freedesktop.org/gstreamer/gstreamer
</span><span class='line'>git clone git://anongit.freedesktop.org/gstreamer/gst-plugins-base
</span><span class='line'>git clone git://anongit.freedesktop.org/gstreamer/gst-plugins-good
</span><span class='line'>git clone git://anongit.freedesktop.org/gstreamer/gst-plugins-bad
</span><span class='line'>git clone git://anongit.freedesktop.org/gstreamer/qt-gstreamer
</span></code></pre></td></tr></table></div></figure>


<h2>Building the base module (gstreamer)</h2>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'><span class="nb">cd</span> <span class="nv">$BUILD_ROOT</span>/gstreamer
</span><span class='line'>
</span><span class='line'><span class="nv">GST_CONFIG_PATH</span><span class="o">=</span><span class="s2">&quot;`brew --prefix libiconv`/lib/pkgconfig:`brew --prefix libffi`/lib/pkgconfig:`brew --prefix gettext`/lib/pkgconfig&quot;</span>
</span><span class='line'>
</span><span class='line'>./autogen.sh --noconfigure
</span><span class='line'>./configure --disable-gtk-doc --disable-debug --with-pkg-config-path<span class="o">=</span><span class="nv">$GST_CONFIG_PATH</span> --prefix<span class="o">=</span><span class="nv">$BUILD_TARGET</span>
</span><span class='line'>
</span><span class='line'>make
</span><span class='line'>make install
</span><span class='line'>
</span><span class='line'><span class="c"># Required</span>
</span><span class='line'><span class="nv">GSTP_CONFIG_PATH</span><span class="o">=</span><span class="s2">&quot;$BUILD_TARGET/lib/pkgconfig&quot;</span>
</span></code></pre></td></tr></table></div></figure>


<h2>Building the plugin base module (gst-plugins-base)</h2>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'><span class="c"># liborc support</span>
</span><span class='line'><span class="c"># http://code.entropywave.com/projects/orc/</span>
</span><span class='line'>brew install orc
</span><span class='line'>
</span><span class='line'><span class="c"># Vorbis support</span>
</span><span class='line'>brew install libvorbis
</span><span class='line'>
</span><span class='line'><span class="nb">cd</span> <span class="s2">&quot;$BUILD_ROOT/gst-plugins-base&quot;</span>
</span><span class='line'>./autogen.sh --noconfigure
</span><span class='line'>./configure --disable-gtk-doc --disable-debug --with-pkg-config-path<span class="o">=</span><span class="nv">$GSTP_CONFIG_PATH</span> --prefix<span class="o">=</span><span class="nv">$BUILD_TARGET</span>
</span><span class='line'>
</span><span class='line'>make
</span><span class='line'>make install
</span></code></pre></td></tr></table></div></figure>


<h2>Building the &#8220;good&#8221; plugins (gst-plugins-good)</h2>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'><span class="nb">cd</span> <span class="s2">&quot;$BUILD_ROOT/gst-plugins-good&quot;</span>
</span><span class='line'>./autogen.sh --noconfigure
</span><span class='line'>./configure --disable-gtk-doc --disable-debug --disable-goom --disable-libpng --with-pkg-config-path<span class="o">=</span><span class="nv">$GSTP_CONFIG_PATH</span> --prefix<span class="o">=</span><span class="nv">$BUILD_TARGET</span>
</span><span class='line'>
</span><span class='line'>make
</span><span class='line'>make install
</span></code></pre></td></tr></table></div></figure>


<h2>Building the &#8220;bad&#8221; plugind (gst-plugins-bad)</h2>

<p><strong>Note</strong>: <em>osxvideosrc</em> and <em>qtwrapper</em> are disabled because they use deprecated APIs (<a href="http://code.google.com/p/ossbuild/wiki/MacBuild">more info</a>).</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'><span class="c"># dependencies</span>
</span><span class='line'>brew install rtmpdump libvpx libmms faac faad2
</span><span class='line'>
</span><span class='line'><span class="nb">cd</span> <span class="s2">&quot;$BUILD_ROOT/gst-plugins-bad&quot;</span>
</span><span class='line'>./autogen.sh --noconfigure
</span><span class='line'>./configure --disable-gtk-doc --disable-debug --disable-apexsink --with-pkg-config-path<span class="o">=</span><span class="nv">$GSTP_CONFIG_PATH</span> --prefix<span class="o">=</span><span class="nv">$BUILD_TARGET</span>
</span><span class='line'>
</span><span class='line'>make
</span><span class='line'>make install
</span></code></pre></td></tr></table></div></figure>

]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Deploy automatizado de aplicações Rails com Capistrano e Github]]></title>
    <link href="http://blog.reinaldojunior.net/2011/07/11/deploy-automatizado-de-aplicacoes-rails/"/>
    <updated>2011-07-11T00:00:00-03:00</updated>
    <id>http://blog.reinaldojunior.net/2011/07/11/deploy-automatizado-de-aplicacoes-rails</id>
    <content type="html"><![CDATA[<div class='post'>
Nesse tutorial irei abordar a realização de deploy automatizado de uma aplicação Rails (3.0.X) utilizando o Github como repositório. A idéia é utilizar o capistrano para automatizar (e organizar) as tarefas de deployment. Para isso, irei criar um usuário no servidor que utilizará minha chave privada (cadastrada no Github) para fazer o deployment da aplicação.<br /><br /><h2>Configurando o servidor</h2>No servidor, crie um usuário que será utilizado para realizar o deploy. Eu utilizei uma senha gerada aleatóriamente (um MD5 de um arquivo, por exemplo). Em seguida, adicionei minha chave privada (a que eu uso para acessar meus repositórios no Github) ao arquivo authorized_keys do usuário de deploy.<br /><br /><b>Na máquina local</b><br /><span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"><br />scp ~/.ssh/id_rsa.pub reinaldo@servidor:/home/reinaldo/my_key.pub<br />ssh reinaldo@servidor<br /></span><br /><br /><b>No servidor</b><br /><span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"><br />sudo adduser deploy<br />MY_PUBLIC_KEY=/home/reinaldo/my_key.pub<br />sudo mkdir -p /home/deploy/.ssh<br />sudo cat $MY_PUBLIC_KEY&nbsp;&gt;&gt; /home/deploy/.ssh/authorized_keys &amp;&amp; rm&nbsp;$MY_PUBLIC_KEY<br />sudo chmod 600 /home/deploy/.ssh/authorized_keys<br />sudo chmod 700 /home/deploy/.ssh<br />sudo chown deploy:deploy -R /home/deploy</span><br /><br /><h2>Configurando a aplicação</h2>Adicione a gem capistrano no seu <b>Gemfile</b><br /><span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;">gem &#8216;capistrano&#8217;</span><br /><br />Em seguida, no diretório da aplicação<br /><span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"><br />bundle install<br />capify .<br />echo &#8220;.bundle\n&#8221; &gt;&gt; .gitignore<br /></span><br /><br />Isso vai criar o arquivo <b>config/deploy.rb</b> onde serão armazenadas as configurações de deploy, bem como as tasks.<br /><br />Meu arquivo ficou assim:<br /><script src="https://gist.github.com/1076956.js"> </script><br /><br />Pra finalizar, você precisa criar os diretórios no servidor. Para isso simplesmente execute (no diretorio da aplicação)<br /><span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;">cap deploy:setup</span><br /><br /><h2>Realizando o Deploy</h2><br />Depois disso, você poderá realizar seu deploy automático executando o comando:<br /><span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;">cap deploy</span></div>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Deploy automatizado de aplicações Rails com Capistrano e Github]]></title>
    <link href="http://blog.reinaldojunior.net/2011/07/11/deploy-automatizado-de-aplicacoes-rails/"/>
    <updated>2011-07-11T00:00:00-03:00</updated>
    <id>http://blog.reinaldojunior.net/2011/07/11/deploy-automatizado-de-aplicacoes-rails</id>
    <content type="html"><![CDATA[<p>Nesse tutorial irei abordar a realização de deploy automatizado de uma aplicação Rails (3.0.X) utilizando o Github como repositório. A idéia é utilizar o capistrano para automatizar (e organizar) as tarefas de deployment. Para isso, irei criar um usuário no servidor que utilizará minha chave privada (cadastrada no Github) para fazer o deployment da aplicação.</p>

<h2>Configurando o servidor</h2>

<p>No servidor, crie um usuário que será utilizado para realizar o deploy. Eu utilizei uma senha gerada aleatóriamente (um MD5 de um arquivo, por exemplo). Em seguida, adicionei minha chave privada (a que eu uso para acessar meus repositórios no Github) ao arquivo <code>authorized_keys</code> do usuário de <code>deploy</code>.</p>

<p><strong>Na máquina local</strong></p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class='console'><span class='line'><span class="go">scp ~/.ssh/id_rsa.pub reinaldo@servidor:/home/reinaldo/my_key.pub</span>
</span><span class='line'><span class="go">ssh reinaldo@servidor</span>
</span></code></pre></td></tr></table></div></figure>


<p><strong>No servidor</strong></p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
</pre></td><td class='code'><pre><code class='console'><span class='line'><span class="go">sudo adduser deploy</span>
</span><span class='line'><span class="go">MY_PUBLIC_KEY=/home/reinaldo/my_key.pub</span>
</span><span class='line'><span class="go">sudo mkdir -p /home/deploy/.ssh</span>
</span><span class='line'><span class="go">sudo cat $MY_PUBLIC_KEY &gt;&gt; /home/deploy/.ssh/authorized_keys &amp;&amp; rm $MY_PUBLIC_KEY</span>
</span><span class='line'><span class="go">sudo chmod 600 /home/deploy/.ssh/authorized_keys</span>
</span><span class='line'><span class="go">sudo chmod 700 /home/deploy/.ssh</span>
</span><span class='line'><span class="go">sudo chown deploy:deploy -R /home/deploy</span>
</span></code></pre></td></tr></table></div></figure>


<h2>Configurando a aplicação</h2>

<p>Adicione a gem capistrano no seu <em>Gemfile</em></p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="n">gem</span> <span class="s1">&#39;capistrano&#39;</span>
</span></code></pre></td></tr></table></div></figure>


<p>Em seguida, no diretório da aplicação</p>

<figure class='code'><figcaption><span>&#8220;Capistrando&#8221; a aplicação  </span></figcaption>
 <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='console'><span class='line'><span class="go">bundle install</span>
</span><span class='line'><span class="go">capify .</span>
</span><span class='line'><span class="go">echo &quot;.bundle\n&quot; &gt;&gt; .gitignore</span>
</span></code></pre></td></tr></table></div></figure>


<p>Isso vai criar o arquivo <em>config/deploy.rb</em> onde serão armazenadas as configurações de deploy, bem como as tasks.</p>

<p>Meu arquivo ficou assim:</p>

<script src="https://gist.github.com/1076956.js"> </script>


<p>Pra finalizar, você precisa criar os diretórios no servidor. Para isso simplesmente execute (no diretorio da aplicação) <code>cap deploy:setup</code>.</p>

<h2>Realizando o Deploy</h2>

<p>Depois disso, você poderá realizar seu deploy automático executando o comando: <code>cap deploy</code>.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Playing with Droid]]></title>
    <link href="http://blog.reinaldojunior.net/2011/07/04/playing-with-droid/"/>
    <updated>2011-07-04T00:00:00-03:00</updated>
    <id>http://blog.reinaldojunior.net/2011/07/04/playing-with-droid</id>
    <content type="html"><![CDATA[<div class='post'>
During the last weeks I&#8217;ve been working on the Droid DSL. Now I&#8217;m proud to announce that it is working!<br /><br />Since the <a href="http://blog.reinaldojunior.net/2011/05/droid-dsl.html">last blog post</a>, the DSL had changed. In order to simplify the DSL some concepts have been removed, for example, ImageButton, Link and ImageLink. These concepts are still available at the Button concept, so a Button with and &#8220;src&#8221; property is a ImageButton and a Button with a &#8220;target&#8221; property is a &#8220;Link&#8221;.<br /><br />Another significant change in the DSL is the merging of the Activity and Layout concepts in a single concept: Screen (although the layout concept is still existing). This made easier to write a simple application. The screen&#8217;s widgets can now be placed inside the screen (you don&#8217;t need anymore to create a layout to put the widgets and set the activity to show the created layout).<br /><br />So what used to be the simplest Droid example:<br /><pre>application "Hello, Android!" com.example.android.hellodroid {<br /><br /> string hello = "Hello, Android! I am a string resource!"<br /><br /> activity HelloDroid {<br />  =&gt; show main<br /> }<br /><br /> layout main {<br />  textView: @string hello<br /> }<br />}<br /></pre><br />Now is even simpler:<br /><pre>application "Hello, Android!" =&gt; com.example.android.hellodroid {<br /><br /> string hello = "Hello, Android! I am a string resource!"<br /><br /> screen HelloDroid {<br />  # textView: @string hello<br /> }<br />}<br /></pre><br />In order to play with the Droid DSL, you need to install some plugins:<br /><ol><li>Install the ADT Eclipse plugin. The target of the DSL is creating Android applications, so you must to install the ADT. The Android <a href="http://developer.android.com/resources/tutorials/hello-world.html">Hello World</a> tutorial is all you need to have your environment ready to the work.</li><li>Install the Droid plugins, located at this Update Site:&nbsp;<a href="http://reinaldojunior.net/eclipse-amalgamation-tutorials/">http://reinaldojunior.net/eclipse-amalgamation-tutorials/</a></li></ol><h3>Creating your first Droid Project</h3>A Droid project is an Eclipse Android Project that has automatic code generation from a droid model. The droid model is inferred from a .droid file (a textual representation of the model).<br /><br />To create a Droid project you must to:<br /><ol><li>Create an Android Project (following the instructions at the Hello World tutorial)</li><li>Create a &#8217;<i>model</i>&#8216;&nbsp;folder&nbsp;inside the project</li><li>Create a &#8217;<i>src-gen</i>&#8217; folder inside the project</li><li>Right-click the &#8217;<i>src-gen</i>&#8217; folder and select &#8220;Build Path&#8221; &gt; &#8220;Use as source folder&#8221;</li><li>You can delete the content of the &#8217;<i>src</i>&#8217; folder as it will have a generated Activity stub.</li></ol><div>Now you are ready to start playing with the Droid DSL.&nbsp;Inside&nbsp;the &#8217;<i>model</i>&#8217; folder, create a .droid file and open it. The file will be opened with the DSL textual editor (generated with&nbsp;Xtext).</div><div><br /></div><div>You can use this sample code to test your environment:</div><pre>application "SimpleWizard" =&gt; org.eclipse.amalgam.tutorials.android.simplewizard {<br /> <br /> screen First {<br />  # textView: "This is the first screen" {}<br />  # button: "Next &gt;" to Second {}<br /> }<br /> <br /> screen Second {<br />  # textView: "And this is the second screen" {}<br />  # button: "&lt; Back" to First {}<br />  # button: "Next &gt;" to Third {}<br /> }<br /><br /> screen Third {<br />  # textView: "Now, the last one" {}<br />  # button: "&lt; Back" to Second {}<br /> }<br />}</pre><h3>Generating the code</h3><ol><li>Right-click in the .droid file</li><li>Select &#8220;Acceleo Model to Text&#8221; &gt; &#8220;Generate Android Code&#8221;</li><li>The generated code will be available at the &#8217;<i>src-gen</i>&#8217; folder and at the &#8217;<i>res</i>&#8217; folder.</li></ol>In order to run the generated application, I recommend to use an Android 2.3.3 virtual device.<br /><ol></ol></div>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[The Droid DSL]]></title>
    <link href="http://blog.reinaldojunior.net/2011/05/29/droid-dsl/"/>
    <updated>2011-05-29T00:00:00-03:00</updated>
    <id>http://blog.reinaldojunior.net/2011/05/29/droid-dsl</id>
    <content type="html"><![CDATA[<div class='post'>
The first part of <a href="http://www.google-melange.com/gsoc/project/google/gsoc2011/juniorz/10001">my GSoC project</a> is creating a DSL (<a href="http://en.wikipedia.org/wiki/Domain-specific_language">Domain Specific Language</a>) targeting the development of <a href="http://www.android.com/">Android</a> applications. The main objective is the building of a DSL which can be used as the basis to the development of the Amalgamation Tutorials (the project&#8217;s final objective).<br /><br />The DSL&#8217;s abstract syntax [1] (an <a href="http://wiki.eclipse.org/Ecore">Ecore</a> metamodel) was created from the definition of a concrete syntax &nbsp;(a Xtext grammar [2]). To this part, I used&nbsp;<a href="http://www.eclipse.org/Xtext/">Xtext</a>. Before that, I and my mentor had discussed about what granularity level should be used to choose what concepts should be expressed in the DSL. A too fine granularity level could lead to a very detailed DSL but would take too much time to complete, while a too coarse one could lead to an very constrained DSL (and maybe useless).<br /><a name='more'></a><br /><br />Considering this, I chose the following concepts as main concepts to the DSL:<br /><ul><li><b>Application</b> - The main concept. We&#8217;re talking about Android Applications.</li><li><b>Activity</b> - Represents an application screen and the user interface displayed.</li><li><b>Layout</b> - Represents a collection of UI elements</li><li><b>Widget</b> - Represents the various UI elements</li><li><b>Resource</b> - Represents values which can be assigned to widgets properties. They have a type and can be serialized to a resource file (XML)&nbsp;</li></ul>The following example ilustrates the <a href="http://developer.android.com/resources/tutorials/hello-world.html">Hello World</a> sample application (provided by Android) written using the Droid DSL (there are more Hello World examples available [3])<br /><br /><script src="https://gist.github.com/998290.js"></script><br /><br />In order to have some direction in the creation of the tutorials, I started to create a code-generator using a Model-to-Text transformation. The transformation [4] can generate the <a href="http://developer.android.com/guide/topics/manifest/manifest-intro.html">AndroidManifest.xml</a> file that describes the application, the Activity Java class, the Layout XML file and the String resource XML file.<br />To make this I used the <a href="http://www.eclipse.org/acceleo/">Acceleo</a>.<br /><br />If you want to play with this DSL you just need to install the <a href="https://github.com/eclipse-soc/amalgamation-examples/tree/master/deploy/plugins">generated plugins</a> in your Eclipse and create a new file with the <i>.droid</i> extension.&nbsp;For more information check the <a href="https://github.com/eclipse-soc/amalgamation-examples">project repository</a> at GitHub.<br /><div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"><br /></div><b><i>References</i></b>:<br /><br /><ol><li>Harel, D., &amp; Rumpe, B. (2000). <a href="http://citeseer.ist.psu.edu/viewdoc/summary?doi=10.1.1.10.1512">Modeling Languages: Syntax, Semantics and All That Stuff Part I: The Basic Stuff</a>. Citeseer. doi: 10.1.1.10.1512.</li><li>To more info, see:&nbsp;<a href="https://github.com/eclipse-soc/amalgamation-examples/blob/master/xtext/plugins/org.eclipse.amalgam.tutorials.xtext/src/org/eclipse/amalgam/tutorials/xtext/Droid.xtext">Droid.xtext</a></li><li>Some of the Hello Views tutorials are available:&nbsp;<a href="https://gist.github.com/998350">Relative Layout</a>&nbsp;and&nbsp;<a href="https://gist.github.com/998349">Linear Layout</a>.</li><li>Available under&nbsp;<a href="https://github.com/eclipse-soc/amalgamation-examples/tree/master/acceleo/plugins/org.eclipse.amalgam.tutorials.acceleo/src/org/eclipse/amalgam/tutorials/acceleo/files">this path</a></li></ol></div>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Xtext Editor unexpectedly stopped working]]></title>
    <link href="http://blog.reinaldojunior.net/2011/05/15/xtext-editor-unexpectedly-stopped/"/>
    <updated>2011-05-15T00:00:00-03:00</updated>
    <id>http://blog.reinaldojunior.net/2011/05/15/xtext-editor-unexpectedly-stopped</id>
    <content type="html"><![CDATA[<div class='post'>
Working on my GSoC project, I noted that the generated Xtext Editor simply stopped to work. Looking at the logs I found the message:<br /><blockquote>!MESSAGE Unable to create editor ID org.eclipse.amalgam.tutorials.xtext.Droid: No editor descriptor for id org.eclipse.amalgam.tutorials.xtext.Droid</blockquote>And when I launched the &#8220;Eclipse Application&#8221; run configuration, the resulting Eclipse warned:<br /><blockquote>Could not open the editor: No editor descriptor for id org.eclipse.amalgam.tutorials.xtext.Droid</blockquote>After some time cursing Xtext, I discovered that in order to launch the &#8220;Eclipse Application&#8221; run configuration, <b>you must to have all the generated projects opened in the package explorer</b>&nbsp;(that means both <i>.generator</i> and <i>.ui</i> projects must be open).</div>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[O que é o Google Summer of Code?]]></title>
    <link href="http://blog.reinaldojunior.net/2011/04/26/o-que-e-o-google-summer-of-code/"/>
    <updated>2011-04-26T00:00:00-03:00</updated>
    <id>http://blog.reinaldojunior.net/2011/04/26/o-que-e-o-google-summer-of-code</id>
    <content type="html"><![CDATA[<div class='post'>
<blockquote>Google Summer of Code (GSoC) é um programa que oferece a desenvolvedores estudantes <a href="http://pt.wikipedia.org/wiki/Estip%C3%AAndio">estipêndios</a> para escrever código para vários projetos opensource. [<a href="http://www.google-melange.com/document/show/gsoc_program/google/gsoc2011/faqs#what_is">1</a>]</blockquote><br /><div>É comum nos Estados Unidos os estudantes aproveitarem as férias (no verão) para arrumar um emprego e pegar uma grana. O objetivo do estipêndio é motivar os alunos a não pegarem um trabalho de verão e ao invés disso colaborarem para um projeto opensource.<br /><br />Entretanto, o objetivo final é beneficiar projetos opensource, incentivar jovens desenvolvedores a participarem de desenvolvimento opensource. Os projetos saem ganhando porque tem novas funcionalidades sendo inseridas. Os estudantes saem ganhando porque ganham experiência (e dinheiro). Além disso os dados podem ser utilizados para recrutar alunos para o time do Google.<br /><br />O Google funciona como financiador dos alunos e das organizações bem como um catalisador de projetos opensource.</div><a name='more'></a><br /><h3>Como funciona o Google Summer of Code?</h3><br /><div>Uma <b>organização</b> é um grupo que está fazendo um projeto opensource. Para participar do GSoC uma organização não precisa necessariamente ser uma entidade legal (como as Foundations de Software Livre que existem). Elas apenas precisam disponibilizar software sob uma <a href="http://www.google.com/url?q=http%3A%2F%2Fwww.opensource.org%2Flicenses&amp;sa=D&amp;sntz=1&amp;usg=AFQjCNF9cc5VYE678rAcvxFhrLKX1rdOtQ">licença Open Source aprovada</a>. A cada ano o Google escolhe, dentre as organizações que se candidatarem, aquelas que irão participar do programa. Cada organização publica uma <b>lista de idéias&nbsp;</b>que é uma lista de sugestões de propostas que seriam interessantes para o projeto.</div><br /><div>Os <b>estudantes</b> enviam para as organizações suas <b>propostas</b>. Uma proposta tanto pode ser simplesmente uma idéia tirada da lista fornecida pela organização quanto uma idéia totalmente nova tirada da própria cabeça. Não precisa ser algo totalmente inovador ou revolucionário para o projeto. O mais importante é demostrar capacidade, disponibilidade, interesse e utilidade.</div><div>Cada estudante pode enviar até 20 propostas diferentes, entretanto apenas uma será aceita.<br /><br />Uma vez aceita, uma proposta deve receber um <b>mentor</b>, que é uma pessoa associada à organização e que possui capacidade de coordenar o trabalho do estudante provendo direcionamento e orientação.<br /><br />As organizações não são obrigadas a incorporar o código do estudante em seu projeto, e independente disso o estudante ainda vai receber o dinheiro.<br /><br />Toda essa mecânica Google-Organizações-Mentores-Estudantes é mediada pelo sistema do GSoC.</div><br /><h3>Avaliação</h3><div>Os estudantes serão avaliados pelos mentores que deverão preencher um formulário de avaliação (na metade e no final do programa). Da mesma forma os mentores são avaliados pelos estudantes. Os pagamentos só serão realizados mediante uma avaliação positiva.</div><br /><h3>Quanto tempo dura o programa?</h3><br /><div>Esse ano o programa vai durar aproximadamente 6 meses. Todos os anos o programa segue um cronograma semelhante a esse:</div><div><ul><li>28/Fev - 11/Mar (2 semanas)<br />Organizações se candidatam</li><li>14-18/Mar (1 semana)<br />Google escolhe as organizações e anuncia quais foram aceitas.</li><li>18-27/Mar (1 semana)<br />Estudantes discutem as idéias das organizações com as próprias organizações. Seria um periodo para amadurecer a idéia junto com a comunidade OpenSource.</li><li>28/Mar - 8/Abr (2 semanas)<br />Estudantes enviam suar propostas.</li><li>8-25 Abr (2 semanas)<br />Organizações vão receber do Google um numero máximo de estudantes que eles podem aceitar. A organização decide quais propostas vai aceitar. para isso tem que atribuir um mentor a cada proposta.</li><li>25 Abr<br />Anuncio das propostas aceitas</li><li>26/Abr - 22/Mai (4 semanas)<br />&#8220;Community Bounding&#8221;. Espera-se que nesse período o aluno esteja em contato com o mentor e a comunidade para se preparar para o trabalho em equipe.</li><li>23/Mai - 15/Ago (12 semanas)<br />Estudantes trabalham em seus projetos com a orientação de seus mentores</li><li>16/Ago - 22/Ago (1 semana)<br />Estudantes já devem ter terminado suas tarefas e vão ter essa semana para polir os resultados (documentação, teste, etc)</li><li>22/Ago - 26/Ago (1 semana)<br />Mentores e organizações vão avaliar os resultados e reportar ao Google.</li><li>29/Ago<br />Anúncio final do GSoC 2011</li></ul></div><div><b>Em resumo</b>: as organizações se candidatam e são aceitas; os estudantes se candidatam e são aceitos; os estudantes trabalham sob a supervisão dos mentores; os estudantes e mentores são avaliados; os estudantes finalizam seu trabalho; e os estudantes e mentores são avaliados novamente.</div><br /><h3>E o dinheiro?</h3><div>O valor do estipêndio é de U$ 5000 para o aluno e U$ 500 para a organização.&nbsp;Os estudantes recebem o dinheiro em parcelas:</div><br /><div><ul><li>U$ 500 logo após o início do trabalho (23/Mai)</li><li>U$ 2250 se passarem na primeira avaliação (15/Jul)</li><li>U$ 2250 se passarem na avaliação final (26/Ago)</li></ul></div><h3>E a camisa?</h3><div>No final do programa se você fez tudo certinho vai receber uma camisa do GSoC para poder tirar onda, além de um certificado do Google.</div></div>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Google Summer of Code 2011: Agora é pra valer]]></title>
    <link href="http://blog.reinaldojunior.net/2011/04/26/google-summer-of-code-2001-agora-e-pra/"/>
    <updated>2011-04-26T00:00:00-03:00</updated>
    <id>http://blog.reinaldojunior.net/2011/04/26/google-summer-of-code-2001-agora-e-pra</id>
    <content type="html"><![CDATA[<div class='post'>
<div>Saiu a <a href="http://google-opensource.blogspot.com/2011/04/students-announced-for-2011-google.html">lista dos 1116 estudantes</a> que tiveram seus projetos aceitos para o Google Summer of Code (GSoC) 2011. Para minha surpresa a&nbsp;<a href="http://blog.reinaldojunior.net/2011/04/proposta-para-o-google-summer-of-code.html">minha proposta</a>, que envolve o projeto <a href="http://www.eclipse.org/modeling/amalgam/">Eclipse Amalgamation</a>, foi aceita! No total foram aceitas 17 propostas para o projeto Eclipse. Em meu projeto irei trabalhar com as tecnologias de modelagem (e metamodelagem) fornecidas pelo projeto Eclipse.<br /><a name='more'></a><br />No ano passado eu não havia sido aceito. Em parte o motivo foi porque eu comi mosca e perdi o prazo. Simples assim. Me inscrevi na primeira semana mas não recebi uma resposta dos mentores envolvidos até o fim da semana seguinte. Então acreditei que eu seria notificado quando eles entrassem em contato comigo. Mas isso não aconteceu, e no penúltimo dia ví que tinha uma pergunta do mentor e acabou não dando tempo. Esse ano minha página inicial no Safari foi a minha proposta.</div><br />Não sou um <i>committer</i> de nenhum projeto opensource, tampouco sou um gênio da programação. Mesmo assim fui aceito para o programa. Então&nbsp;qual é a dica para ter seu projeto aceito? Acho que o ponto principal é ter interesse e disponibilidade, além de ter uma noa proposta. Essa era minha principal preocupação: será que minha proposta está boa? ou como saber se minha proposta é boa?<br /><br />Claro que é necessário ter um conhecimento sobre o projeto e alguma experiência vai te ajudar. Mas posso dizer que sou um exemplo de um anônimo que teve seu projeto aceito.<br /><br />Uma coisa que é essencial para ser claro em sua proposta fornecendo informações detalhadas sobre o que você pretende desenvolver. &nbsp;Você deve ser claro dizendo o que pretende fazer, como você vai fazer isso e como isso poderá ser usado. Não basta apenas dizer que vai implementar um <a href="http://dev.eclipse.org/mhonarc/lists/soc-dev/msg01607.html">recurso de digitação fácil</a> sem explicar o que é isso.<br /><br />Agora que fui aceito, começa o período chamado &#8221;<a href="http://googlesummerofcode.blogspot.com/2007/04/so-what-is-this-community-bonding-all.html">Community Bonding</a>&#8221; onde espera-se que eu conheça um pouco mais do projeto Eclipse e sobre a comunidade. Além disso esse período vai servir para que os estudantes e mentores se conheçam. Depois disso, no dia 23 de Maio, é mão na massa!<br /><br />Além disso <a href="http://dev.eclipse.org/mhonarc/lists/soc-dev/msg01603.html">é esperado (pelo menos pelo projeto Eclipse)</a> que os estudantes bloguem a respeito de seus projetos e seu progresso, além de se reportarem semanalmente na lista de discussão criada para o programa.</div>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Gerenciamento de Memória em Objective-C]]></title>
    <link href="http://blog.reinaldojunior.net/2011/04/09/gerenciamento-de-memoria-em-objective-c/"/>
    <updated>2011-04-09T00:00:00-03:00</updated>
    <id>http://blog.reinaldojunior.net/2011/04/09/gerenciamento-de-memoria-em-objective-c</id>
    <content type="html"><![CDATA[<div class='post'>
O gerenciamento de memória em Objective-C é feito por meio de <b>contagem de referências</b>. Cada objeto possui um &#8221;<b>retain count</b>&#8221; que representa quantos <b>outros objetos estão interessados nele</b>.<br /><br />Um objeto é <b>desalocado</b> (e a memória ocupada por ele é liberada) quando <b>não há nenhum outro objeto interessado nele</b>. Para impedir que ele seja desalocado um outro objeto deve demonstrar seu interesse enviando ao objeto-alvo a mensagem <b><i>retain</i></b>. Uma vez que um objeto não tenha mais nenhum interesse no objeto-alvo ele deve notificar o objeto por meio da mensagem <b><i>release</i></b>.<br /><br /><b>Resumindo</b>: <i>um sujeito retém (retain) objetos que ele está interessado e libera (release) objetos quando ele não está mais interessado</i>.<br /><a name='more'></a><br />A <a href="http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/MemoryMgmt/Articles/mmObjectOwnership.html%23//apple_ref/doc/uid/20000043-SW2">dinâmica da gerência de memória</a> e da coleta de lixo é feita assim:<br /><ul><li>Quando um objeto é <b>criado</b> o retain count = 1 (quem criou está interessado nele, senão não teria criado =D).</li><li>Quando um objeto recebe uma mensagem <b><i>retain</i></b> o seu <i>retain count</i> é <b>incrementado</b> em 1 (o invocador da mensagem é mais um objeto interessado nele).</li><li>Quando um objeto recebe uma mensagem <b><i>release</i></b> o seu <i>retain count</i> é <b>decrementado</b> em 1 (o invocador da mensagem não está mais interessado nele).</li><li>Quando um objeto recebe uma mensagem <b><i>autorelease</i></b> o seu <i>retain count</i> <b>será decrementado</b> em 1 num futuro próximo (o invocador da mensagem não estará interessado no objeto depois do escopo atual). Para isso será utilizado um <a href="http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/MemoryMgmt/Articles/mmAutoreleasePools.html%23//apple_ref/doc/uid/20000047-CJBFBEDI">Autorelease Pool</a>.</li><li>Quando um objeto tem seu <i>retain count</i> reduzido a <b>0 (zero)</b> ele será <b>desalocado</b>.</li></ul>Quando um objeto <b>incrementa</b> o <i>retain count</i> de outro objeto (por meio da mensagem <i>retain</i>, por exemplo) ele é responsável por esse retain. Na terminologia do Objective-C esse objeto (<i><b>owner</b></i>) passa a ter posse (<i><b>ownership</b></i>) sobre o outro objeto. Essa posse só é revogada quando o <i>owner</i> <b>decrementa</b> o <i>retain count</i> do objeto possuído (por meio das mensagens <i>release</i> ou <i>autorelease</i>).<br /><br />Um objeto toma posse de outro quando:<br /><ul><li><b>Cria o objeto</b> - usando mensagens que o nome comece com &#8221;<i>alloc</i>&#8221;, &#8221;<i>new</i>&#8221;, &#8221;<i>copy</i>&#8221;, &#8221;<i>mutableCopy</i>&#8221;</li><li><b>Retém o objeto</b> - enviando a mensagem &#8221;<i>retain</i>&#8221;</li></ul><br />Com base nesses conceitos a <a href="http://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/MemoryMgmt/Articles/mmRules.html#//apple_ref/doc/uid/20000994-BAJHFBGH">regra da gerência de memória</a> para as aplicações é:<br /><blockquote><b>Teorema</b>: Você só deve liberar (<i>release</i>) objetos que você possua (<i>ownership</i>).</blockquote><blockquote><b>Corolário</b>: Se você precisa armazenar um objeto recebido, você deve tomar posse dele. Geralmente você delega essa responsabilidade aos métodos accessors (<i>@property</i>/<i>@synthetize</i>).</blockquote><b>TODO</b>: Falar sobre Autorelease Pools e Copy.<br /><br /><b>Disclaimer</b>: Todas essas informações foram retiradas do <a href="http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/MemoryMgmt/MemoryMgmt.html">Memory Management Programming Guide</a> e não tem como objetivo ser uma tradução desse guia. Esse documento é apenas um resumo de um estudo pessoal.</div>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Proposta para o Google Summer of Code 2011]]></title>
    <link href="http://blog.reinaldojunior.net/2011/04/05/proposta-para-o-google-summer-of-code/"/>
    <updated>2011-04-05T00:00:00-03:00</updated>
    <id>http://blog.reinaldojunior.net/2011/04/05/proposta-para-o-google-summer-of-code</id>
    <content type="html"><![CDATA[<div class='post'>
Esse ano mais uma vez estou me &#8221;<a href="http://www.google-melange.com/gsoc/proposal/review/google/gsoc2011/juniorz/1">candidatando</a>&#8221; ao Google Summer of Code.&nbsp;No ano passado eu já havia enviado uma proposta, mas perdi os prazos para responder aos mentores e não dei prosseguimento.<br /><br /><a href="http://wiki.eclipse.org/Google_Summer_of_Code_2011_Ideas#Amalgamation_-_Modeling_Example">A idéia</a> é pegar os exemplos que acompanham o livro <a href="http://www.informit.com/store/product.aspx?isbn=0321534077">Eclipse Modeling Project: A Domain-Specific Language (DSL) Toolkit</a>&nbsp;e atualizá-los para funcionar na versão mais recente das ferramentas do Eclipse que compõem o pacote Amalgamation. No fundo vou usar as ferramentas de <a href="http://en.wikipedia.org/wiki/Model-driven_architecture">MDA</a> fornecidas pelo projeto Eclipse Modeling (EMF, OCL, etc).<br /><a name='more'></a><br />A principal motivação é poder trabalhar junto com uma equipe mundial que faz opensource. Além disso como já tenho familiaridade<br /><br />Como parte do teste inicial, foi me pedido que fizesse algumas tarefas para provar minha aptidão a contribuir em um projeto opensource:<br /><br /><ol><li>Fazer um checkout do código do projeto Amalgamation</li><li>Fornecer um patch</li><li>Criar um pequeno exemplo com as ferramentas</li></ol><br /><h3>Checkout do projeto</h3>Como um bom projeto, as <a href="http://www.eclipse.org/projects/project_summary.php?projectid=modeling.amalgam">informações para contribuições</a> estão muito fáceis de encontrar. O problema é que eles ainda usam CVS e eu uso GIT. Também não foi muito difícil encontrar uma maneira de resolver esse problema e <a href="http://maymay.net/blog/2008/04/15/how-to-import-cvs-code-repositories-into-git-using-git-cvsimport/">importar o repositório CVS para o GIT</a>. O inconveniente foi a terrível demora para fazer checkout de todo o projeto - consequência de um repositório bem movimentado. Por isso escolhi só um pedaço do repositório. Para isso:<br /><blockquote><span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;">$ git cvsimport -v -d :pserver:anonymous@dev.eclipse.org:/cvsroot/modeling org.eclipse.amalgam/docs/org.eclipse.amalgam.dsltk.doc</span></blockquote>E funcionou que é uma beleza. O objetivo da tarefa era apenas saber se eu sou capaz de fazer checkout de um repositório de código.&nbsp;Caso eu não soubesse, era só eu pesquisar, perguntar no IRC e aprender como faz.<br /><br /><h3>Fornecer um patch</h3>Mais uma vez uma tarefa com o objetivo de nivelar conhecimento/interesse. Um simples <span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;">git diff</span> já me deu o patch.<br /><script src="https://gist.github.com/902903.js"> </script><br /><h3>Pequeno exemplo</h3>Simplesmente revisei um trabalho que eu já havia feito para a disciplina <a href="http://nemo.inf.ufes.br/jpalmeida/ensino/2011-01-mdd">MDD</a> na UFES. O <a href="http://reinaldojunior.net/pub/gsoc-2011/php_metamodel.zip">exemplo</a> é um metamodelo de um fragmento da linguagem PHP.<br /><br />Até o momento me parece que não é algo impossível ser aceito para o GSoC, a preocupação dos mentores é saber se você não é uma anta e vai ter uma mínima condição (e interesse) de levar a proposta adiante.</div>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Kindle: muito mais que apenas ler]]></title>
    <link href="http://blog.reinaldojunior.net/2011/03/18/kindle-muito-mais-que-apenas-ler/"/>
    <updated>2011-03-18T00:00:00-03:00</updated>
    <id>http://blog.reinaldojunior.net/2011/03/18/kindle-muito-mais-que-apenas-ler</id>
    <content type="html"><![CDATA[<div class='post'>
<div style="text-align: justify;">Nesse fim de ano investi as economias do ano em um novo gadget: o <a href="http://www.amazon.com/gp/product/B002Y27P3M/ref=r_kdia_h_i_gl">Kindle</a> da Amazon. Quando explico aos amigos que ele serve apenas para ler livros, sempre recebo uma careta como resposta. Nesse post digo porque eu continuo sorrindo com esse dispositivo.</div><br /><a name='more'></a><br /><ol><li style="text-align: justify;"><b>Facilidade de leitura</b> - Apesar da tela ser de apenas 6&#8221; a leitura no Kindle é muito boa. Utilizando documentos no formato <i>mobi</i> você tem uma grande liberdade de configuração do texto, podendo mudar o tamanho da fonte (desde minúscula até gigante), espaçamento entre linhas, palavras por linha. Independente das configurações você lê os livros de maneira linear (de cima pra baixo) e apenas avança (ou retrocede) a página. E se você quiser, ainda pode ouvir o texto (em inglês) e aperfeiçoar o idioma.</li><li style="text-align: justify;"><b>Não me cansa</b>&nbsp;-&nbsp;O Kindle usa na sua tela a tecnologia <a href="http://en.wikipedia.org/wiki/E_Ink#E_Ink_Pearl">E Ink Pearl</a>. Por isso a tela não emite luz, o que faz com que a experiência de leitura seja muito semelhante aos livros de papel. O único inconveniente é que você precisa de uma fonte de luz para ler (um abajur ou uma lanterninha já é suficiente).</li><li style="text-align: justify;"><b>Portabilidade</b> - O Kindle é muito leve, e por isso eu sempre carrego ele pra todo lado. No dia-a-dia ando sempre de mochila e ele fica imperceptível. Como ando muito de ônibus, sempre tive o costume de aproveitar as longas viagens Casa-Trabalho para ler. O maior incômodo era carregar os livros comigo na mochila (e meus livros de interesse - tecnologia - sempre são tão grossos quanto os de medicina). Com o Kindle eu leio a qualquer momento e em qualquer lugar: na fila do ônibus, dentro do ônibus (sentado ou em pé), nos intervalos das aulas e durante as aulas mais chatas. Claro que algumas vezes a leitura não é de alta qualidade (no que diz respeito ao aproveitamento), mas do ponto de vista informativo o Kindle é ótimo (explico adiante).</li><li style="text-align: justify;"><b>Turbina o aprendizado</b> - Como consequência da portabilidade e do Kindle não me cansar, tenho conseguido terminar de ler mais livros. Tenho uma memória muito boa para informações (nomes, rostos, como as coisas funcionam). Por isso o Kindle tem me ajudado a turbinar esse tipo de aprendizado. Por exemplo, se leio um livro sobre Cocoa no ônibus talvez eu não me lembre de todos os detalhes do livro, mas ainda assim eu termino o dia me lembrando muito bem de que Cocoa tem Bindings assim como o Adobe Flex e que ele funciona por meio de Key-value Observing (KVO) e que Key-value Coding (KVC) é o que torna isso possível. Também lembro que Cocoa tem Blocos semelhante a Ruby. Para mim que trabalho com (e gosto de) tecnologia é uma ferramenta fantástica.</li><li style="text-align: justify;"><b>Tempo de uso prolongado</b> - Eu leio todo dia e ainda assim a bateria dura muito tempo. Isso porque a tela não emite luz, e assim só gasta energia para desenhar a página.&nbsp;</li><li style="text-align: justify;"><b>Mercado de livros digitais</b> - Com o Kindle passei a comprar muito mais livros porque realmente passei a ler muito mais livros. Um recurso muito interessante é a possibilidade de enviar &#8220;Sample Chapters&#8221; gratuitamente da Kindle Store direto para o seu aparelho. Desse modo no momento que encontro um livro interessante, eu já peço um sample pra dar uma avaliada. Se gostar, adiciono a lista de futuras leituras, e acabo comprando. Seria perfeito se as bibliotecas emprestassem livros no formato digital. Além disso, também tenho trocado alguns livros com uns amigos o que é muito legal para o bolso.</li><li style="text-align: justify;"><b>Aparência</b> - O Kindle é um dispositivo discreto (o meu é na cor grafite, e mesmo lendo no ônibus ele passa muitas vezes desapercebido) e não tenho nenhum receio de ser roubado ao usá-lo em lugares públicos.</li></ol><br />Mas nem tudo são flores. O Kindle poderia ser muito mais perfeito se tivesse:<br /><br /><ol><li style="text-align: justify;"><b>Melhor suporte a PDF</b> - ler PDF no Kindle é MUITO inconveniente. Tem que ficar dando zoom, e se movendo na página verticalmente e horizontalmente.</li><li style="text-align: justify;"><b>Número real de página e melhor navegação por capítulos</b> - não consigo voltar para o início de um capítulo nem pular para uma página específica e como a transição de página é ligeiramente demorada é um pouco desagradável voltar mais do que 2-3 páginas para reler um trecho.</li><li style="text-align: justify;"><b>Conversão entre formatos de maneira facilitada</b> - poderia solucionar as inconveniências ao usar PDFs. Há aplicativos que permitem a conversão (como o <a href="http://calibre-ebook.com/">Calibre</a>), mas PDFs também não ficam tão bom a menos que eles sejam simples (apenas texto corrido, como artigos científicos, ou textos de websites impressos em pdf).</li><li style="text-align: justify;"><b>API pública para desenvolvimento de Aplicativos</b></li><li style="text-align: justify;"><b>Livros digitais realmente mais baratos que os impressos</b></li><li style="text-align: justify;"><b>Mercado brasileiro de livros digitais mais significativo</b></li></ol><div>Mesmo servindo &#8220;apenas&#8221; para ler livros, o Kindle é um grande dispositivo.</div></div>
]]></content>
  </entry>
  
</feed>

