<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>Georgios Valotasios</title>
    <link>https://valotas.com/</link>
    <description>Posts on software engineering by Georgios Valotasios.</description>
    <language>en</language>
    <lastBuildDate>Sun, 20 Mar 2022 12:00:00 GMT</lastBuildDate>
    <atom:link href="https://valotas.com/feed.xml" rel="self" type="application/rss+xml"/>
    <item>
      <title>Parcel 2 as static site generator</title>
      <link>https://valotas.com/parcel2-as-static-site-generator/</link>
      <guid isPermaLink="true">https://valotas.com/parcel2-as-static-site-generator/</guid>
      <pubDate>Sun, 20 Mar 2022 12:00:00 GMT</pubDate>
      <description>Felt like doing an update to my outdated website and ended up changing the whole generation of the static pages.</description>
      <content:encoded><![CDATA[<div data-testid="marked" class="prose"><div><p>Felt like doing an update to my outdated website and ended up changing the whole generation of the static pages.</p><h2>Why Parcel</h2><p>I&#x27;ve been working with parcel a lot at my daily job. Initially tried v1 out as a no config bundler and stuck with it. It just works. At least most of the times. Then I saw the following:</p><blockquote class="twitter-tweet"><p lang="en" dir="ltr">I&#x27;ve been working on a documentation site powered by Parcel 2. Turns out, Parcel is a pretty awesome static site generator! 😲<br/><br/>🚀 Super fast!<br/>😍 Statically rendered MDX at build time<br/>✨ Interactive client rendered examples<br/>🔄 Live reloading type docs extracted from the code <a href="https://t.co/dhzVz15W8V">pic.twitter.com/dhzVz15W8V</a></p>— Devon Govett (@devongovett) <a href="https://twitter.com/devongovett/status/1226954310161821696?ref_src=twsrc%5Etfw">February 10, 2020</a></blockquote><p>And this is what made me want to try such a solution. On top of that, it would also give me the advantage of familiarizing myself with it&#x27;s new plugin api.</p><p>The problem I am trying to solve is to transform a bunch of md files to html pages in a way that I can reuse the javascript that does the rendering on the server side. So, what I am looking for is an isomorphic static site generator. In order to do that, I will be using react to render the pages.</p><h2>Entry point</h2><p>Initially I just created a transformer for my md files and something like <code>parcel articles/**/*.md</code> was enough to create the http files. On top of that the generated http file would go through the parcel pipeline and get optimized. Additionally any script referenced in it would also get bundled/hashed correctly and common scripts across files would get properly shared. Suprisingly what seems to be complex enough by describing it, was fairly straight forward with parcel. All I had to do was to create a custom transformer that could accept md files and spit html out of it.</p><p>After I was done with that, I stumbled upon the actual problem. How to create an index file containing links to the generated html pages? In general I needed a way to create new pages making use of metadata of the pages that have been rendered. Went through some github issues and ended up with the following alternatives.</p><h3>Custom <a href="https://parceljs.org/plugin-system/reporter/">parcel reporter</a></h3><p>That can listen to pretty much any parcel event and at the very end it can create the index files that I am interested in. Yet, since plugins should be side effect free, I felt like that was not the right solution. Additionally I had doubts of the proper bundling of the exported file. For example I create an index.html referencing index.ts. Would that index.ts get properly transformed by parcel?</p><h3>Custom <code>index.md</code> file</h3><p>Another solution would be to have a custom (most probably empty) index.md file and instruct parcel to treat it differently than the rest of the md files. That is what <a href="https://raw.githubusercontent.com/adobe/react-spectrum/7ce2c89e7ba11463b74bfc4d92a60e2e933ba9b6/packages/dev/docs/pages/index.mdx">react-spectrum&#x27;s doc site</a> is doing for example. Yet, I had to also add more files to the final bundle like <code>robots.txt</code> and <code>sitemap.txt</code> and would prefer a solution where parcel would also know about them. And that made me think of the following.</p><h3><code>robots.txt</code> as entry</h3><p><code>sitemap.txt</code> that contains a list of all web pages of the specific domain. Basically in my case, all of the generated pages. Therefor all I need is a transformer for it to get a glob pattern as an input (in my case a <code>**/*.md</code>), resolve the files that are described by that, add them as a dependency to the build and adapt the content of sitemap.txt to contain the resolved files.</p><p>Since the files have been added as a dependency, parcel will then pick them up and transform them. So I would like to have a sitemap that looks like the following:</p><div class="code-block"><pre class="language-plain"><code class="language-plain">src/**/*.md</code></pre></div><p>and for each <code>.md</code> file get an output like</p><div class="code-block"><pre class="language-plain"><code class="language-plain">http://valotas.com/page1/
http://valotas.com/page2/
http://valotas.com/</code></pre></div><p>with <code>src/page1.md</code> and <code>src/page2.md</code> added to the bundle graph.</p><p>This leaves me though with another file that I need published but should not be included to sitemap.txt. That is <code>robots.txt</code>. Of course since I am anyway have to create a transformer for sitemap.txt, I can make it able to skip files referenced there. Yet, that did not feel good especially when robots.txt should reference sitemap. So, ended up using it as the entry point. So, I had the following:</p><div class="code-block"><pre class="language-plain"><code class="language-plain">Sitemap: ./sitemap.txt</code></pre></div><p>that should be transformed to</p><div class="code-block"><pre class="language-plain"><code class="language-plain">Sitemap: https://valotas.com/sitemap.txt</code></pre></div><p>adding sitemap.txt to the bundle graph, and from there on, continue with the transformation of sitemap.</p><h2>Implementation</h2><p>The implementation finally needed a <a href="https://parceljs.org/plugin-system/transformer/">transformer</a> for robots.txt, one for sitemap.txt, an md transformer and a transformer that could get the rendered body of a the last one and wrap it within a page skeleton.</p><p>That last thing, needed also a <a href="https://parceljs.org/plugin-system/resolver/">resolver</a> in order to let parcel know of files referenced to the html template used for wrapping the body.</p><p>Since I needed the whole thing to be isomorphic, I had to also create some metadata of each page that I was rendering available as a resource so that I could fetch it and render it without having the browser to do a full page request. That means that the sitemap transformer was also adding a json file to the dependency. So for each <code>name.md</code>, I had <code>/name/index.html</code> and <code>name/meta.json</code> added to the bundle graph.</p><p>Finally since I also wanted to make a folder for each given md file, a <a href="https://parceljs.org/plugin-system/namer/">namer</a> also needed. Was kinda afraid that this thing was not going to end, but eventually didn&#x27;t need anything else.</p><p>With a <code>.parcelrc</code> that looked like:</p><div class="code-block"><pre class="language-plain"><code class="language-plain">{
  "extends": "@parcel/config-default",
  "transformers": {
    "*.txt": ["@valotas/parcel-transformer-staticsite/txt"],
    "*.md": ["@valotas/parcel-transformer-staticsite/md"],
    "*.meta": ["@valotas/parcel-transformer-staticsite/meta"],
    "*.htmlbody": ["@valotas/parcel-transformer-staticsite/htmlbody"]
  },
  "resolvers": ["...", "@valotas/parcel-resolver-staticsite"],
  "namers": ["@valotas/parcel-namer-staticsite", "..."]
}</code></pre></div><p>was able to have a static site under <code>/dist</code> ready to be served.</p><h3>AWS uploading</h3><p>The only thing left was to upload the created assets to aws. That was the case where a <a href="https://parceljs.org/plugin-system/reporter/">reporter</a> seemed the right thing to do.</p><p>I was hoping to come up with something abstract enough but did not make it. Yet, the solution if it can inspire someone is available <a href="https://github.com/valotas/valotas.com">here</a>.</p></div></div>]]></content:encoded>
    </item>
    <item>
      <title>Promise.sequence</title>
      <link>https://valotas.com/promise-sequence/</link>
      <guid isPermaLink="true">https://valotas.com/promise-sequence/</guid>
      <pubDate>Mon, 08 May 2017 12:00:00 GMT</pubDate>
      <description>Lately I came across a problem for which the standard Promise's api wasn't enough. I needed something like Promise.all but I had to make sure that the…</description>
      <content:encoded><![CDATA[<div data-testid="marked" class="prose"><div><p>Lately I came across a problem for which the standard <a href="https://www.promisejs.org/"><code>Promise</code></a>&#x27;s api wasn&#x27;t enough. I needed something
like <code>Promise.all</code> but I had to make sure that the actions array will get executed in sequence</p><h2>Prerequisites</h2><p>There is no reason reading more if you can&#x27;t answer the question of <a href="https://pouchdb.com/2015/05/18/we-have-a-problem-with-promises.html">this blog post</a></p><h2>Promise.inSequence</h2><p>Ideally, I need a utility method that get as an input an array of actions. It executes the given actions one after the
other and every execution should wait for the previous one:</p><div class="code-block"><pre class="language-javascript"><code class="language-javascript"><span class="token function">inSequence</span><span class="token punctuation">(</span><span class="token punctuation">[</span>action1<span class="token punctuation">,</span> action2<span class="token punctuation">,</span> action3<span class="token punctuation">]</span><span class="token punctuation">)</span>
  <span class="token punctuation">.</span><span class="token function">then</span><span class="token punctuation">(</span><span class="token punctuation">(</span><span class="token parameter"><span class="token punctuation">[</span>result1<span class="token punctuation">,</span> result2<span class="token punctuation">,</span> result3<span class="token punctuation">]</span></span><span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token punctuation">{</span>
    <span class="token comment">// action1() should have been called first</span>
    <span class="token comment">// action2() should have been called only after action1 finished</span>
    <span class="token comment">// action3() should have been called only after action2 finished</span>
  <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span></code></pre></div><p>The solution was very simple googling, but I am not fan of copy &amp; paste development if I do not understand what am I
copying, so as an exercise I thought it would be a good idea to implement a solution myself. In order to attack the
problem, I&#x27;ll try to solve it with just 2 promises in the <strong>dumbest possible way</strong>:</p><div class="code-block"><pre class="language-javascript"><code class="language-javascript"><span class="token keyword">var</span> result <span class="token operator">=</span> <span class="token function">action1</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
  <span class="token punctuation">.</span><span class="token function">then</span><span class="token punctuation">(</span><span class="token keyword">function</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
    <span class="token keyword">return</span> <span class="token function">action2</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
  <span class="token punctuation">}</span><span class="token punctuation">)</span></code></pre></div><p>Now, the question is, how can I make that work with more than 2 actions. In order to do that, let&#x27;s start with the
<code>last</code> action, wait for it and once done execute the <code>next</code> one. Update the <code>last</code> reference with the combination of
both promises:</p><div class="code-block"><pre class="language-javascript"><code class="language-javascript"><span class="token keyword">var</span> last <span class="token operator">=</span> Promise<span class="token punctuation">.</span><span class="token function">resolve</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
actions<span class="token punctuation">.</span><span class="token function">forEach</span><span class="token punctuation">(</span><span class="token keyword">function</span> <span class="token punctuation">(</span><span class="token parameter">next</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
  last <span class="token operator">=</span> last<span class="token punctuation">.</span><span class="token function">then</span><span class="token punctuation">(</span><span class="token keyword">function</span> <span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
    <span class="token keyword">return</span> <span class="token function">next</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
  <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">return</span> last<span class="token punctuation">;</span></code></pre></div><p>This is the <strong>most common way of executing actions in a sequence with promises</strong>, Let&#x27;s create a function for it:</p><div class="code-block"><pre class="language-javascript"><code class="language-javascript"><span class="token keyword">function</span> <span class="token function">simpleInSequence</span><span class="token punctuation">(</span><span class="token parameter">actions</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
  <span class="token keyword">var</span> last <span class="token operator">=</span> Promise<span class="token punctuation">.</span><span class="token function">resolve</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
  actions<span class="token punctuation">.</span><span class="token function">forEach</span><span class="token punctuation">(</span><span class="token keyword">function</span> <span class="token punctuation">(</span><span class="token parameter">next</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
    last <span class="token operator">=</span> last<span class="token punctuation">.</span><span class="token function">then</span><span class="token punctuation">(</span><span class="token keyword">function</span> <span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
      <span class="token keyword">return</span> <span class="token function">next</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
  <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
  <span class="token keyword">return</span> last<span class="token punctuation">;</span>
<span class="token punctuation">}</span></code></pre></div><p>Now the question is, how am I going to keep track of the results too so that in the end I&#x27;ll get a Promise which&#x27;s
result will be something like <code>[result1, result2, ...]</code>. Since our actions are now executed in sequence, we can
just keep track of the results in an array:</p><div class="code-block"><pre class="language-javascript"><code class="language-javascript"><span class="token keyword">function</span> <span class="token function">inSequence</span><span class="token punctuation">(</span><span class="token parameter">actions</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
  <span class="token keyword">var</span> last <span class="token operator">=</span> Promise<span class="token punctuation">.</span><span class="token function">resolve</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
  <span class="token keyword">var</span> results <span class="token operator">=</span> <span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token punctuation">;</span>
  actions<span class="token punctuation">.</span><span class="token function">forEach</span><span class="token punctuation">(</span><span class="token keyword">function</span> <span class="token punctuation">(</span><span class="token parameter">next</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
    last <span class="token operator">=</span> last<span class="token punctuation">.</span><span class="token function">then</span><span class="token punctuation">(</span><span class="token keyword">function</span> <span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
      <span class="token keyword">return</span> <span class="token function">next</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token punctuation">}</span><span class="token punctuation">)</span>
    <span class="token punctuation">.</span><span class="token function">then</span><span class="token punctuation">(</span><span class="token keyword">function</span> <span class="token punctuation">(</span><span class="token parameter">result</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
      results<span class="token punctuation">.</span><span class="token function">push</span><span class="token punctuation">(</span>result<span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
  <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
  <span class="token keyword">return</span> last<span class="token punctuation">.</span><span class="token function">then</span><span class="token punctuation">(</span><span class="token keyword">function</span> <span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
    <span class="token keyword">return</span> results<span class="token punctuation">;</span>
  <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span></code></pre></div><p>Now we can slightly improve this by initializing a promise with an array and make sure that last will always resolve
to an array of the results:</p><div class="code-block"><pre class="language-javascript"><code class="language-javascript"><span class="token keyword">function</span> <span class="token function">inSequence</span><span class="token punctuation">(</span><span class="token parameter">actions</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
  <span class="token keyword">var</span> last <span class="token operator">=</span> Promise<span class="token punctuation">.</span><span class="token function">resolve</span><span class="token punctuation">(</span><span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
  actions<span class="token punctuation">.</span><span class="token function">forEach</span><span class="token punctuation">(</span><span class="token keyword">function</span> <span class="token punctuation">(</span><span class="token parameter">next</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
    last <span class="token operator">=</span> last<span class="token punctuation">.</span><span class="token function">then</span><span class="token punctuation">(</span><span class="token keyword">function</span> <span class="token punctuation">(</span><span class="token parameter">results</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
      <span class="token keyword">return</span> <span class="token function">next</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
        <span class="token punctuation">.</span><span class="token function">then</span><span class="token punctuation">(</span><span class="token keyword">function</span> <span class="token punctuation">(</span><span class="token parameter">result</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
          results<span class="token punctuation">.</span><span class="token function">push</span><span class="token punctuation">(</span>result<span class="token punctuation">)</span><span class="token punctuation">;</span>
          <span class="token keyword">return</span> results<span class="token punctuation">;</span>
        <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
  <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span></code></pre></div><p>or even make use of <code>Promise.all</code> to avoid nested <code>.then</code> calls:</p><div class="code-block"><pre class="language-javascript"><code class="language-javascript"><span class="token keyword">function</span> <span class="token function">inSequence</span><span class="token punctuation">(</span><span class="token parameter">actions</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
  <span class="token keyword">var</span> last <span class="token operator">=</span> Promise<span class="token punctuation">.</span><span class="token function">resolve</span><span class="token punctuation">(</span><span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
  actions<span class="token punctuation">.</span><span class="token function">forEach</span><span class="token punctuation">(</span><span class="token keyword">function</span> <span class="token punctuation">(</span><span class="token parameter">next</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
    last <span class="token operator">=</span> last<span class="token punctuation">.</span><span class="token function">then</span><span class="token punctuation">(</span><span class="token keyword">function</span> <span class="token punctuation">(</span><span class="token parameter">results</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
      <span class="token keyword">return</span> Promise<span class="token punctuation">.</span><span class="token function">all</span><span class="token punctuation">(</span><span class="token punctuation">[</span><span class="token function">next</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">,</span> results<span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token punctuation">}</span><span class="token punctuation">)</span>
    <span class="token punctuation">.</span><span class="token function">then</span><span class="token punctuation">(</span><span class="token keyword">function</span> <span class="token punctuation">(</span><span class="token parameter">combination</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
      <span class="token keyword">var</span> results <span class="token operator">=</span> combination<span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">;</span>
      <span class="token keyword">var</span> result <span class="token operator">=</span> combination<span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span>
      results<span class="token punctuation">.</span><span class="token function">push</span><span class="token punctuation">(</span>result<span class="token punctuation">)</span><span class="token punctuation">;</span>
      <span class="token keyword">return</span> results<span class="token punctuation">;</span>
    <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
  <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span></code></pre></div><h3>Working with arrays</h3><p>Now that we have a solution we can improve a little bit. When we have an array and we want to create a single
value out of it, we can use the <code>reduce</code> function of the array. We would like to reduce our array of actions
into one promise of arrays:</p><div class="code-block"><pre class="language-javascript"><code class="language-javascript"><span class="token keyword">function</span> <span class="token function">reduceInSequence</span><span class="token punctuation">(</span><span class="token parameter">actions</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
  <span class="token keyword">return</span> actions<span class="token punctuation">.</span><span class="token function">reduce</span><span class="token punctuation">(</span><span class="token keyword">function</span> <span class="token punctuation">(</span><span class="token parameter">last<span class="token punctuation">,</span> action</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
    <span class="token keyword">return</span> last<span class="token punctuation">.</span><span class="token function">then</span><span class="token punctuation">(</span><span class="token keyword">function</span> <span class="token punctuation">(</span><span class="token parameter">results</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
      <span class="token keyword">return</span> <span class="token function">action</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
        <span class="token punctuation">.</span><span class="token function">then</span><span class="token punctuation">(</span><span class="token keyword">function</span> <span class="token punctuation">(</span><span class="token parameter">result</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
            results<span class="token punctuation">.</span><span class="token function">push</span><span class="token punctuation">(</span>result<span class="token punctuation">)</span><span class="token punctuation">;</span>
            <span class="token keyword">return</span> results<span class="token punctuation">;</span>
        <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
  <span class="token punctuation">}</span><span class="token punctuation">,</span> Promise<span class="token punctuation">.</span><span class="token function">resolve</span><span class="token punctuation">(</span><span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span></code></pre></div><h3>Thinking more complex</h3><p>When I first tried to implement a solution I had in mind that I needed an implementation that could give me back a
Promise with an array of the results. I ended up using recursion for implementing it:</p><div class="code-block"><pre class="language-javascript"><code class="language-javascript"><span class="token keyword">function</span> <span class="token function">recursiveInSequence</span><span class="token punctuation">(</span><span class="token parameter">actions<span class="token punctuation">,</span> results</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
  results <span class="token operator">=</span> results <span class="token operator">||</span> <span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token punctuation">;</span>
  <span class="token keyword">var</span> action <span class="token operator">=</span> actions<span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span><span class="token punctuation">;</span>
  <span class="token keyword">return</span> <span class="token function">action</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
    <span class="token punctuation">.</span><span class="token function">then</span><span class="token punctuation">(</span><span class="token keyword">function</span> <span class="token punctuation">(</span><span class="token parameter">result</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
      results<span class="token punctuation">.</span><span class="token function">push</span><span class="token punctuation">(</span>result<span class="token punctuation">)</span><span class="token punctuation">;</span>
      <span class="token keyword">if</span> <span class="token punctuation">(</span>actions<span class="token punctuation">.</span>length <span class="token operator">===</span> <span class="token number">1</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
          <span class="token keyword">return</span> results<span class="token punctuation">;</span>
      <span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token punctuation">{</span>
          <span class="token keyword">return</span> <span class="token function">recursiveInSequence</span><span class="token punctuation">(</span>actions<span class="token punctuation">.</span><span class="token function">slice</span><span class="token punctuation">(</span><span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">,</span> results<span class="token punctuation">)</span><span class="token punctuation">;</span>
      <span class="token punctuation">}</span>
    <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span></code></pre></div><p>while the solution works just fine, it looks a little bit more complex, but I still have it written here as a reminder to
always split problems as much as possible.</p><h2>How to test it</h2><p>Really awesome work but without being able to test what we did, we are not falling in to the software engineers
category. To be honest, testing Promises is another challenge, but let&#x27;s give it a try. So what I want to test
is that two given actions has been called in sequence. Let&#x27;s create a factory of actions that can log their
result before returning a resolved promise:</p><div class="code-block"><pre class="language-javascript"><code class="language-javascript"><span class="token keyword">function</span> <span class="token function">action</span><span class="token punctuation">(</span><span class="token parameter">delay<span class="token punctuation">,</span> seq</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
  <span class="token keyword">return</span> <span class="token keyword">function</span> <span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
    <span class="token keyword">var</span> result <span class="token operator">=</span> <span class="token string">"delay-"</span> <span class="token operator">+</span> delay<span class="token punctuation">;</span>
    <span class="token keyword">return</span> <span class="token keyword">new</span> <span class="token class-name">Promise</span><span class="token punctuation">(</span><span class="token keyword">function</span> <span class="token punctuation">(</span><span class="token parameter">resolve</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
      seq<span class="token punctuation">.</span><span class="token function">push</span><span class="token punctuation">(</span>result<span class="token punctuation">)</span><span class="token punctuation">;</span>
      <span class="token function">resolve</span><span class="token punctuation">(</span>result<span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token punctuation">}</span><span class="token punctuation">,</span> delay<span class="token punctuation">)</span><span class="token punctuation">;</span>
  <span class="token punctuation">}</span>
<span class="token punctuation">}</span></code></pre></div><p>Now all I have to do is check the <code>seq</code> array:</p><div class="code-block"><pre class="language-javascript"><code class="language-javascript"><span class="token function">it</span><span class="token punctuation">(</span><span class="token string">"should work with an array of more than 2 actions"</span><span class="token punctuation">,</span> <span class="token keyword">function</span> <span class="token punctuation">(</span><span class="token parameter">done</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
  <span class="token keyword">var</span> seq <span class="token operator">=</span> <span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token punctuation">;</span>
  <span class="token function">inseq</span><span class="token punctuation">(</span><span class="token punctuation">[</span>
    <span class="token function">action</span><span class="token punctuation">(</span><span class="token number">50</span><span class="token punctuation">,</span> seq<span class="token punctuation">)</span><span class="token punctuation">,</span>
    <span class="token function">action</span><span class="token punctuation">(</span><span class="token number">10</span><span class="token punctuation">,</span> seq<span class="token punctuation">)</span><span class="token punctuation">,</span>
    <span class="token function">action</span><span class="token punctuation">(</span><span class="token number">11</span><span class="token punctuation">,</span> seq<span class="token punctuation">)</span><span class="token punctuation">,</span>
    <span class="token function">action</span><span class="token punctuation">(</span><span class="token number">5</span><span class="token punctuation">,</span> seq<span class="token punctuation">)</span>
  <span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">then</span><span class="token punctuation">(</span><span class="token keyword">function</span> <span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
    <span class="token function">expect</span><span class="token punctuation">(</span>seq<span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">toEqual</span><span class="token punctuation">(</span><span class="token punctuation">[</span>
      <span class="token string">"delay-50"</span><span class="token punctuation">,</span> <span class="token comment">// first action resolves after 50ms</span>
      <span class="token string">"delay-10"</span><span class="token punctuation">,</span> <span class="token comment">// second action resolves after 10ms</span>
      <span class="token string">"delay-11"</span><span class="token punctuation">,</span>
      <span class="token string">"delay-5"</span><span class="token punctuation">,</span>
    <span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token function">done</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
  <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span></code></pre></div><h2>TLDR</h2><p>Since code speaks itself, you can <a href="http://jsbin.com/gist/valotas/f785f29dff1502366554901ace772716?js,output">play with it</a>
or just have a look at it:</p><div class="code-block"><div class="code-title"><a href="https://gist.github.com/valotas/f785f29dff1502366554901ace772716#file-script-js" target="_blank">script.js</a></div><pre class="language-javascript"><code class="language-javascript"><span class="token keyword">function</span> <span class="token function">forEachinSequence</span><span class="token punctuation">(</span><span class="token parameter">actions</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
  <span class="token keyword">var</span> last <span class="token operator">=</span> Promise<span class="token punctuation">.</span><span class="token function">resolve</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
  actions<span class="token punctuation">.</span><span class="token function">forEach</span><span class="token punctuation">(</span><span class="token keyword">function</span> <span class="token punctuation">(</span><span class="token parameter">next</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
    last <span class="token operator">=</span> last<span class="token punctuation">.</span><span class="token function">then</span><span class="token punctuation">(</span><span class="token keyword">function</span> <span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
      <span class="token keyword">return</span> <span class="token function">next</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
  <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
  <span class="token keyword">return</span> last<span class="token punctuation">;</span>
<span class="token punctuation">}</span>

<span class="token keyword">function</span> <span class="token function">inSequence</span><span class="token punctuation">(</span><span class="token parameter">actions</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
  <span class="token keyword">var</span> last <span class="token operator">=</span> Promise<span class="token punctuation">.</span><span class="token function">resolve</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
  <span class="token keyword">var</span> results <span class="token operator">=</span> <span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token punctuation">;</span>
  actions<span class="token punctuation">.</span><span class="token function">forEach</span><span class="token punctuation">(</span><span class="token keyword">function</span> <span class="token punctuation">(</span><span class="token parameter">next</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
    last <span class="token operator">=</span> last<span class="token punctuation">.</span><span class="token function">then</span><span class="token punctuation">(</span><span class="token keyword">function</span> <span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
      <span class="token keyword">return</span> <span class="token function">next</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token punctuation">}</span><span class="token punctuation">)</span>
    <span class="token punctuation">.</span><span class="token function">then</span><span class="token punctuation">(</span><span class="token keyword">function</span> <span class="token punctuation">(</span><span class="token parameter">result</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
      results<span class="token punctuation">.</span><span class="token function">push</span><span class="token punctuation">(</span>result<span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
  <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
  <span class="token keyword">return</span> last<span class="token punctuation">.</span><span class="token function">then</span><span class="token punctuation">(</span><span class="token keyword">function</span> <span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
    <span class="token keyword">return</span> results<span class="token punctuation">;</span>
  <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>

<span class="token keyword">function</span> <span class="token function">recursiveInSequence</span><span class="token punctuation">(</span><span class="token parameter">actions<span class="token punctuation">,</span> results</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
  results <span class="token operator">=</span> results <span class="token operator">||</span> <span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token punctuation">;</span>
  <span class="token keyword">var</span> action <span class="token operator">=</span> actions<span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span><span class="token punctuation">;</span>
  <span class="token keyword">return</span> <span class="token function">action</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
    <span class="token punctuation">.</span><span class="token function">then</span><span class="token punctuation">(</span><span class="token keyword">function</span> <span class="token punctuation">(</span><span class="token parameter">result</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
      results<span class="token punctuation">.</span><span class="token function">push</span><span class="token punctuation">(</span>result<span class="token punctuation">)</span><span class="token punctuation">;</span>
      <span class="token keyword">if</span> <span class="token punctuation">(</span>actions<span class="token punctuation">.</span>length <span class="token operator">===</span> <span class="token number">1</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
          <span class="token keyword">return</span> results<span class="token punctuation">;</span>
      <span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token punctuation">{</span>
          <span class="token keyword">return</span> <span class="token function">recursiveInSequence</span><span class="token punctuation">(</span>actions<span class="token punctuation">.</span><span class="token function">slice</span><span class="token punctuation">(</span><span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">,</span> results<span class="token punctuation">)</span><span class="token punctuation">;</span>
      <span class="token punctuation">}</span>
    <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>

<span class="token keyword">function</span> <span class="token function">reduceInSequence</span><span class="token punctuation">(</span><span class="token parameter">actions</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
  <span class="token keyword">return</span> actions<span class="token punctuation">.</span><span class="token function">reduce</span><span class="token punctuation">(</span><span class="token keyword">function</span> <span class="token punctuation">(</span><span class="token parameter">last<span class="token punctuation">,</span> action</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
    <span class="token keyword">return</span> last<span class="token punctuation">.</span><span class="token function">then</span><span class="token punctuation">(</span><span class="token keyword">function</span> <span class="token punctuation">(</span><span class="token parameter">results</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
      <span class="token keyword">return</span> <span class="token function">action</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
        <span class="token punctuation">.</span><span class="token function">then</span><span class="token punctuation">(</span><span class="token keyword">function</span> <span class="token punctuation">(</span><span class="token parameter">result</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
            results<span class="token punctuation">.</span><span class="token function">push</span><span class="token punctuation">(</span>result<span class="token punctuation">)</span><span class="token punctuation">;</span>
            <span class="token keyword">return</span> results<span class="token punctuation">;</span>
        <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
  <span class="token punctuation">}</span><span class="token punctuation">,</span> Promise<span class="token punctuation">.</span><span class="token function">resolve</span><span class="token punctuation">(</span><span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>



<span class="token function">describe</span><span class="token punctuation">(</span><span class="token string">'Promise.inSequence'</span><span class="token punctuation">,</span> <span class="token keyword">function</span> <span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
  <span class="token keyword">function</span> <span class="token function">action</span><span class="token punctuation">(</span><span class="token parameter">delay<span class="token punctuation">,</span> seq</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
    <span class="token keyword">return</span> <span class="token keyword">function</span> <span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
      <span class="token keyword">var</span> result <span class="token operator">=</span> <span class="token string">"delay-"</span> <span class="token operator">+</span> delay<span class="token punctuation">;</span>    
      <span class="token keyword">return</span> <span class="token keyword">new</span> <span class="token class-name">Promise</span><span class="token punctuation">(</span><span class="token keyword">function</span> <span class="token punctuation">(</span><span class="token parameter">resolve</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
        <span class="token keyword">if</span> <span class="token punctuation">(</span>seq<span class="token punctuation">)</span> <span class="token punctuation">{</span>
          seq<span class="token punctuation">.</span><span class="token function">push</span><span class="token punctuation">(</span>result<span class="token punctuation">)</span><span class="token punctuation">;</span>
        <span class="token punctuation">}</span>
        <span class="token function">resolve</span><span class="token punctuation">(</span>result<span class="token punctuation">)</span><span class="token punctuation">;</span>
      <span class="token punctuation">}</span><span class="token punctuation">,</span> delay<span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token punctuation">}</span>
  <span class="token punctuation">}</span>
  
  <span class="token keyword">function</span> <span class="token function">test</span><span class="token punctuation">(</span><span class="token parameter">inseq<span class="token punctuation">,</span> name<span class="token punctuation">,</span> withResults</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
    <span class="token function">describe</span><span class="token punctuation">(</span>name<span class="token punctuation">,</span> <span class="token keyword">function</span> <span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
      <span class="token function">it</span><span class="token punctuation">(</span><span class="token string">"should work with an array of 2 actions"</span><span class="token punctuation">,</span> <span class="token keyword">function</span> <span class="token punctuation">(</span><span class="token parameter">done</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
        <span class="token keyword">var</span> seq <span class="token operator">=</span> <span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token punctuation">;</span>
        <span class="token function">inseq</span><span class="token punctuation">(</span><span class="token punctuation">[</span><span class="token function">action</span><span class="token punctuation">(</span><span class="token number">50</span><span class="token punctuation">,</span> seq<span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token function">action</span><span class="token punctuation">(</span><span class="token number">10</span><span class="token punctuation">,</span> seq<span class="token punctuation">)</span><span class="token punctuation">]</span><span class="token punctuation">)</span>
          <span class="token punctuation">.</span><span class="token function">then</span><span class="token punctuation">(</span><span class="token keyword">function</span> <span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
            <span class="token function">expect</span><span class="token punctuation">(</span>seq<span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">toEqual</span><span class="token punctuation">(</span><span class="token punctuation">[</span><span class="token string">"delay-50"</span><span class="token punctuation">,</span> <span class="token string">"delay-10"</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
            <span class="token function">done</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
          <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
      <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
      
      <span class="token function">it</span><span class="token punctuation">(</span><span class="token string">"should work with an array of more than 2 actions"</span><span class="token punctuation">,</span> <span class="token keyword">function</span> <span class="token punctuation">(</span><span class="token parameter">done</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
        <span class="token keyword">var</span> seq <span class="token operator">=</span> <span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token punctuation">;</span>
        <span class="token function">inseq</span><span class="token punctuation">(</span><span class="token punctuation">[</span>
          <span class="token function">action</span><span class="token punctuation">(</span><span class="token number">50</span><span class="token punctuation">,</span> seq<span class="token punctuation">)</span><span class="token punctuation">,</span> 
          <span class="token function">action</span><span class="token punctuation">(</span><span class="token number">10</span><span class="token punctuation">,</span> seq<span class="token punctuation">)</span><span class="token punctuation">,</span>
          <span class="token function">action</span><span class="token punctuation">(</span><span class="token number">11</span><span class="token punctuation">,</span> seq<span class="token punctuation">)</span><span class="token punctuation">,</span>
          <span class="token function">action</span><span class="token punctuation">(</span><span class="token number">5</span><span class="token punctuation">,</span> seq<span class="token punctuation">)</span><span class="token punctuation">]</span><span class="token punctuation">)</span>
          <span class="token punctuation">.</span><span class="token function">then</span><span class="token punctuation">(</span><span class="token keyword">function</span> <span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
            <span class="token function">expect</span><span class="token punctuation">(</span>seq<span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">toEqual</span><span class="token punctuation">(</span><span class="token punctuation">[</span>
              <span class="token string">"delay-50"</span><span class="token punctuation">,</span> 
              <span class="token string">"delay-10"</span><span class="token punctuation">,</span>
              <span class="token string">"delay-11"</span><span class="token punctuation">,</span>
              <span class="token string">"delay-5"</span><span class="token punctuation">,</span>
            <span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
            <span class="token function">done</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
          <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
      <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
      
      <span class="token keyword">if</span> <span class="token punctuation">(</span>withResults<span class="token punctuation">)</span> <span class="token punctuation">{</span>
        <span class="token function">it</span><span class="token punctuation">(</span><span class="token string">"should resolve to an array with all the results"</span><span class="token punctuation">,</span> <span class="token keyword">function</span> <span class="token punctuation">(</span><span class="token parameter">done</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
          <span class="token function">inseq</span><span class="token punctuation">(</span><span class="token punctuation">[</span>
            <span class="token function">action</span><span class="token punctuation">(</span><span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">,</span> 
            <span class="token function">action</span><span class="token punctuation">(</span><span class="token number">2</span><span class="token punctuation">)</span><span class="token punctuation">,</span>
            <span class="token function">action</span><span class="token punctuation">(</span><span class="token number">3</span><span class="token punctuation">)</span>
          <span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">then</span><span class="token punctuation">(</span><span class="token keyword">function</span> <span class="token punctuation">(</span><span class="token parameter">results</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
            <span class="token function">expect</span><span class="token punctuation">(</span>results<span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">toEqual</span><span class="token punctuation">(</span><span class="token punctuation">[</span>
              <span class="token string">"delay-1"</span><span class="token punctuation">,</span> 
              <span class="token string">"delay-2"</span><span class="token punctuation">,</span>
              <span class="token string">"delay-3"</span>
            <span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
            <span class="token function">done</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
          <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
        <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
      <span class="token punctuation">}</span>
    <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
  <span class="token punctuation">}</span>
  
  <span class="token function">test</span><span class="token punctuation">(</span>forEachinSequence<span class="token punctuation">,</span> <span class="token string">"forEachinSequence (ignoring results)"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
  <span class="token function">test</span><span class="token punctuation">(</span>inSequence<span class="token punctuation">,</span> <span class="token string">"inSequence"</span><span class="token punctuation">,</span> <span class="token boolean">true</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
  <span class="token function">test</span><span class="token punctuation">(</span>recursiveInSequence<span class="token punctuation">,</span> <span class="token string">"recursiveInSequence"</span><span class="token punctuation">,</span> <span class="token boolean">true</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
  <span class="token function">test</span><span class="token punctuation">(</span>reduceInSequence<span class="token punctuation">,</span> <span class="token string">"reduceInSequence"</span><span class="token punctuation">,</span> <span class="token boolean">true</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span></code></pre></div><h2>References</h2><ul><li><a href="https://www.promisejs.org/">Promise</a></li><li><a href="http://stackoverflow.com/questions/24586110/resolve-promises-one-after-another-i-e-in-sequence">http://stackoverflow.com/questions/24586110/resolve-promises-one-after-another-i-e-in-sequence</a></li></ul></div></div>]]></content:encoded>
    </item>
    <item>
      <title>Improving CSS skills</title>
      <link>https://valotas.com/improving-css-skills/</link>
      <guid isPermaLink="true">https://valotas.com/improving-css-skills/</guid>
      <pubDate>Wed, 08 Jun 2016 12:00:00 GMT</pubDate>
      <description>This website is for me a continuous effort of skills improvement. It started with a ready static website generator to end up to something completelly…</description>
      <content:encoded><![CDATA[<div data-testid="marked" class="prose"><div><p>This website is for me a continuous effort of skills improvement. It started with a ready static website generator to end up to something completelly custom made. One thing I did not touch though was the css stuff.</p><h2>The CSS journey</h2><p>When I first started this blog, I just used the blogger platform. After some years of inactivity I felt like <a href="https://valotas.com/migrated-to-assemble-io">moving forward</a> using <a href="http://getbootstrap.com/">bootstrap</a> that a friend of mine adapted for me.</p><p>As a &quot;proper&quot; developer I did not really touched css. Going a step further I moved to a <a href="https://valotas.com/revamp2016">rewrite</a> of the backend. Still the only affair I had with css was to optimise the bootstrap imports in order not to have to curry over all the thing that bootstrap provides but I never used.</p><p>After all the javascript related changes, I felt more obligated to work a little bit closer with css. Just like everytime I feel like improving somewhere, I set a simple goal. That was to get rid of bootstrap. Ofcourse I didn&#x27;t feel like creating something from the beginning, I ended up just trying to integrate <a href="http://foundation.zurb.com/sites.html">ZURB Foundation for sites</a>.</p><p>All in all, this site is now using a bootstrapized version of foundation framework, dropping the css file size from <code>61kb</code> to <code>42kb</code>.</p><h2>How is it done?</h2><p>Well, having an online version of the website, I just tried to make use of the foundation basics to make it look the same. So a new pipeline has been added to compile sass. The old less pipeline has been deleted and made use of the newly <strong>empty</strong> now <code>main.css</code>.</p><p>After the funny and socking time of working with a fully functional unstyled single page application, I started styling parts of the already structured site. Just by styling the header and the footer, I had something that I could see without getting scared. After that, all I had to do was to adapt the grid breakpoints to the ones bootstrap uses. On top of that I managed to also bring some stuff visually closer to what I liked more, without fighting with a frameworks defaults.</p><p>Most of the time the adaptation process for each block to be styled was like the following:</p><ul><li>Simplify html</li><li>Import needed foundation module</li><li>Provide a sass module with the rules needed for corresponding block</li></ul><p>Needles to say, I ended up using way less stuff of the framework. More specific, out of 40 sass modules I only used 5.</p><h2>What I learned</h2><p>Although I did not become an expert on anything and did not apply every single bit of what I read, I feel I improved my knowledge in terms of grid layout, <a href="http://webdesign.tutsplus.com/articles/7-css-units-you-might-not-know-about--cms-22573">measurement units</a>, <a href="https://developer.mozilla.org/en-US/docs/Web/CSS/Media_Queries/Using_media_queries">media queries</a> and a little bit of <a href="http://patternlab.io/">atomic design systems</a>.</p><p>It is really fantastic the amount of stuff that you can learn just by trying to understand some how something works with in a framework. For example you hear responsive and breakpoints. You have the classes you need to apply in order to be responsive but how does this work, will make use understand media queries and layouts (in general, or a grid in particular).</p><h2>To bootstrap or not</h2><p>There are a lot of articles out there prasing or demystifying bootstrap. The truth is you have something good looking with minimum effort. You pay a price though. That is, minimum knowledge input, small flexibility of customization and a website that looks like... bootstrap.</p><p>Sooner or later you&#x27;ll want something different. You can of course try to customise bootstrap. My main problem though was that I had to write html in a way that I can apply bootstrap. And this is how you end up having an html that is anything but semantic. I would love to provide a css with the very basics, but I did not want to rewrite a framework nor I feld that I could swim good enough in to the css world so that I could finish within a couple of hours. The intermediate solution was to use a customisable framework. I have to note though that bootstrap is customizable enough, but this time I wanted to learn something new and still I did not know if I could get rid of the html part of the bootstrap.</p><p>To be honest, I do not know if I would ever propose bootstrap as a framework for the frontend part of a website. Have in mind that twitter itself does not use it for their public website. Of course if within a team there is no person with serious css experience, I wouldn&#x27;t hesitate. I also believe that in any project with an absence of a styleguide, a framework (no matter how bad it is) should be used. In that case though just make sure that you do not fall in to the <a href="https://en.wikipedia.org/wiki/Not_invented_here">&quot;Not invented here syndrom&quot;</a> category.</p><h2>TL;RD</h2><p>Back to where I started. If you would like to improve your css skills, you have to write css. It is ok to use a framework or to start with it, but you must be willing to go above it, customise it, adapt some things and finally replace parts of it with custom made css.</p><p>Rule of thumb: replace framework stuff that can be implemented with a simple straight forward way.</p></div></div>]]></content:encoded>
    </item>
    <item>
      <title>Testing RxJS</title>
      <link>https://valotas.com/testing-rxjs/</link>
      <guid isPermaLink="true">https://valotas.com/testing-rxjs/</guid>
      <pubDate>Sat, 19 Mar 2016 12:00:00 GMT</pubDate>
      <description>When you hear for a new technology, all you want to do is just to use it. This is how my experience with RxJS started a while ago. It is for sure cool…</description>
      <content:encoded><![CDATA[<div data-testid="marked" class="prose"><div><p>When you hear for a new technology, all you want to do is just to use it. This is how my experience with <a href="https://github.com/ReactiveX/RxJS">RxJS</a> started a while ago. It is for sure cool, but also a new way of thinking. Just like anything else new, you are going sooner or later to hit a wall. After grasping myself to find which sequence of operators would do the trick, I tried to just test the thing.</p><h2>Async testing</h2><p>Well, no matter how close should streams be to normal iterables, they are in nature async. You have a stream and at a moment you subscribe to it. This &quot;one moment&quot; plays a crucial role to your testing code. Most of the times you would like to test the behaviour right before or/and right after a specific event. Being careful, will make you pass the first test successfully, but as soon as you might need a little bit more, you will pretty soon find yourself struggling with the setup of you test just to have something like the following at the very end of it.</p><div class="code-block"><pre class="language-javascript"><code class="language-javascript">someStream<span class="token punctuation">.</span><span class="token function">subscribe</span><span class="token punctuation">(</span><span class="token punctuation">(</span><span class="token parameter">val</span><span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token punctuation">{</span>
    <span class="token function">expect</span><span class="token punctuation">(</span>val<span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">toBeDefined</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token comment">//any other expectation</span>
<span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span></code></pre></div><h2>Marble tests</h2><p>If you have that problem, let me tell you a well hidden secret: <a href="https://github.com/ReactiveX/rxjs/blob/master/doc/writing-marble-tests.md">marble tests</a>. After finding that out, you are going to have yet another problem and that is the lack of documentation on how to use them. That means more baby steps, more source code reading(thanks god, the library is written in typescript) and more experimentation. Given that, I thought it would be better to also write down experiments.</p><p>After some reading and <a href="https://blog.hyphe.me/rxjs-testing-in-real-world-applications/">searching</a>, I found out that it is all about the <a href="https://github.com/ReactiveX/RxJS/blob/master/src/testing/TestScheduler.ts"><code>TestScheduler</code></a> class that is provided with the framework. Still not that clear on how to use it.</p><h3>Stream creation</h3><p>While in the <a href="https://github.com/ReactiveX/rxjs/blob/master/doc/writing-marble-tests.md">docu</a>, you have the <code>hot</code> and <code>cold</code> functions, there is no info on where to find them. It looks like they are actually part of the <code>TestScheduler</code>&#x27;s api:</p><ul><li><code>createHotObservable&lt;T&gt;(marbles: string, values?: any, error?: any): Subject&lt;T&gt;</code> creates a hot observable</li><li><code>createColdObservable&lt;T&gt;(marbles: string, values?: any, error?: any): Observable&lt;T&gt;</code> creates a cold observable</li></ul><p>My first attempt was to create a simple hot or cold observable and play with it:</p><div class="code-block"><div class="code-title"><a href="https://gist.github.com/valotas/09f8fabc1a1db4b108b3#file-create-hot-cold-observable-js" target="_blank">create-hot-cold-observable.js</a></div><pre class="language-javascript"><code class="language-javascript"><span class="token comment">/*eslint-env jasmine*/</span>

<span class="token keyword">import</span> Rx <span class="token keyword">from</span> <span class="token string">'rxjs'</span><span class="token punctuation">;</span>

<span class="token function">fdescribe</span><span class="token punctuation">(</span><span class="token string">'TestScheduler'</span><span class="token punctuation">,</span> <span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token punctuation">{</span>
  
  <span class="token function">describe</span><span class="token punctuation">(</span><span class="token string">'createHotObservable()'</span><span class="token punctuation">,</span> <span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token punctuation">{</span>
    <span class="token function">it</span><span class="token punctuation">(</span><span class="token string">'should create a hot observable emmiting the values given as marble strings'</span><span class="token punctuation">,</span> <span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token punctuation">{</span>
      <span class="token comment">//given</span>
      <span class="token keyword">const</span> scheduler <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Rx<span class="token punctuation">.</span>TestScheduler</span><span class="token punctuation">(</span><span class="token keyword">null</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
      <span class="token keyword">const</span> source <span class="token operator">=</span> scheduler<span class="token punctuation">.</span><span class="token function">createHotObservable</span><span class="token punctuation">(</span><span class="token string">'--a---b-cd-|'</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
      <span class="token keyword">const</span> expected <span class="token operator">=</span> <span class="token punctuation">[</span><span class="token string">'ab'</span><span class="token punctuation">,</span> <span class="token string">'cd'</span><span class="token punctuation">]</span><span class="token punctuation">;</span>
  
      <span class="token comment">//when</span>
      source
        <span class="token punctuation">.</span><span class="token function">bufferCount</span><span class="token punctuation">(</span><span class="token number">2</span><span class="token punctuation">)</span>
        <span class="token punctuation">.</span><span class="token function">map</span><span class="token punctuation">(</span><span class="token punctuation">(</span><span class="token parameter">array</span><span class="token punctuation">)</span> <span class="token operator">=></span> array<span class="token punctuation">.</span><span class="token function">join</span><span class="token punctuation">(</span><span class="token string">''</span><span class="token punctuation">)</span><span class="token punctuation">)</span>
        <span class="token punctuation">.</span><span class="token function">subscribe</span><span class="token punctuation">(</span><span class="token punctuation">(</span><span class="token parameter">val</span><span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token punctuation">{</span>
          <span class="token function">expect</span><span class="token punctuation">(</span>val<span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">toEqual</span><span class="token punctuation">(</span>expected<span class="token punctuation">.</span><span class="token function">shift</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
        <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
        
      scheduler<span class="token punctuation">.</span><span class="token function">flush</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
      <span class="token function">expect</span><span class="token punctuation">(</span>expected<span class="token punctuation">.</span>length<span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">toBe</span><span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
  <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
  
  <span class="token function">describe</span><span class="token punctuation">(</span><span class="token string">'createColdObservable()'</span><span class="token punctuation">,</span> <span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token punctuation">{</span>
    <span class="token function">it</span><span class="token punctuation">(</span><span class="token string">'should create a cold observable emmiting the values given as marble strings'</span><span class="token punctuation">,</span> <span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token punctuation">{</span>
      <span class="token comment">//given</span>
      <span class="token keyword">const</span> scheduler <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Rx<span class="token punctuation">.</span>TestScheduler</span><span class="token punctuation">(</span><span class="token keyword">null</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
      <span class="token keyword">const</span> source <span class="token operator">=</span> scheduler<span class="token punctuation">.</span><span class="token function">createColdObservable</span><span class="token punctuation">(</span><span class="token string">'--a---b|'</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
      <span class="token keyword">const</span> expected <span class="token operator">=</span> <span class="token punctuation">[</span><span class="token string">'a'</span><span class="token punctuation">,</span> <span class="token string">'b'</span><span class="token punctuation">]</span><span class="token punctuation">;</span>
  
      <span class="token comment">//when</span>
      source
        <span class="token punctuation">.</span><span class="token function">subscribe</span><span class="token punctuation">(</span><span class="token punctuation">(</span><span class="token parameter">val</span><span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token punctuation">{</span>
          <span class="token function">expect</span><span class="token punctuation">(</span>val<span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">toEqual</span><span class="token punctuation">(</span>expected<span class="token punctuation">.</span><span class="token function">shift</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
        <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
        
      scheduler<span class="token punctuation">.</span><span class="token function">flush</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
      <span class="token function">expect</span><span class="token punctuation">(</span>expected<span class="token punctuation">.</span>length<span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">toBe</span><span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
  <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span></code></pre></div><p>Being happy about the first achievement, let&#x27;s try to get one level up and subscribe to an observable after a period of time. Speaking in marbles, let&#x27;s say that I subscribe to the following sequence: <code>--a-^-b-c-|</code>. That means that subscription should be notified only for <code>b</code> and <code>c</code>:</p><div class="code-block"><pre class="language-javascript"><code class="language-javascript"><span class="token function">it</span><span class="token punctuation">(</span><span class="token string">'should schedule the subscription on the right time'</span><span class="token punctuation">,</span> <span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token punctuation">{</span>
    <span class="token comment">//given</span>
    <span class="token keyword">const</span> scheduler <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Rx<span class="token punctuation">.</span>TestScheduler</span><span class="token punctuation">(</span><span class="token keyword">null</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token keyword">const</span> source <span class="token operator">=</span> scheduler<span class="token punctuation">.</span><span class="token function">createHotObservable</span><span class="token punctuation">(</span><span class="token string">'--a-^-b-c|'</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token keyword">const</span> results <span class="token operator">=</span> <span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token punctuation">;</span>

    <span class="token comment">//when</span>
    source<span class="token punctuation">.</span><span class="token function">subscribe</span><span class="token punctuation">(</span><span class="token punctuation">(</span><span class="token parameter">val</span><span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token punctuation">{</span>
        results<span class="token punctuation">.</span><span class="token function">push</span><span class="token punctuation">(</span>val<span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token punctuation">}</span><span class="token punctuation">,</span> <span class="token keyword">null</span><span class="token punctuation">,</span> <span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token punctuation">{</span>
        results<span class="token punctuation">.</span><span class="token function">push</span><span class="token punctuation">(</span><span class="token string">'done'</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span>

    scheduler<span class="token punctuation">.</span><span class="token function">flush</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>

    <span class="token comment">//then</span>
    <span class="token function">expect</span><span class="token punctuation">(</span>results<span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">toEqual</span><span class="token punctuation">(</span><span class="token punctuation">[</span><span class="token string">'b'</span><span class="token punctuation">,</span> <span class="token string">'c'</span><span class="token punctuation">,</span> <span class="token string">'done'</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span></code></pre></div><p>Guess what. This does not work. <code>TestScheduler</code> initialization alone can not cope with time. After some searching around I found out how to let the scheduler schedule stuff and that is the <code>schedule</code> function. This accepts a closure where your time based part should be placed. Let&#x27;s see how to achieve that:</p><div class="code-block"><div class="code-title"><a href="https://gist.github.com/valotas/09f8fabc1a1db4b108b3#file-schedule-js" target="_blank">schedule.js</a></div><pre class="language-javascript"><code class="language-javascript"><span class="token comment">/*eslint-env jasmine*/</span>

<span class="token keyword">import</span> Rx <span class="token keyword">from</span> <span class="token string">'rxjs'</span><span class="token punctuation">;</span>

<span class="token function">describe</span><span class="token punctuation">(</span><span class="token string">'TestScheduler'</span><span class="token punctuation">,</span> <span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token punctuation">{</span>
  <span class="token function">describe</span><span class="token punctuation">(</span><span class="token string">'schedule()'</span><span class="token punctuation">,</span> <span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token punctuation">{</span>
    <span class="token function">it</span><span class="token punctuation">(</span><span class="token string">'should schedule the subscription on the right time'</span><span class="token punctuation">,</span> <span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token punctuation">{</span>
      <span class="token comment">//given</span>
      <span class="token keyword">const</span> scheduler <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Rx<span class="token punctuation">.</span>TestScheduler</span><span class="token punctuation">(</span><span class="token keyword">null</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
      <span class="token keyword">const</span> source <span class="token operator">=</span> scheduler<span class="token punctuation">.</span><span class="token function">createHotObservable</span><span class="token punctuation">(</span><span class="token string">'--a-^--b-c|'</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
      <span class="token keyword">const</span> results <span class="token operator">=</span> <span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token punctuation">;</span>

      <span class="token comment">//when</span>
      scheduler<span class="token punctuation">.</span><span class="token function">schedule</span><span class="token punctuation">(</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token punctuation">{</span>
        source<span class="token punctuation">.</span><span class="token function">subscribe</span><span class="token punctuation">(</span><span class="token punctuation">(</span><span class="token parameter">val</span><span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token punctuation">{</span>
          results<span class="token punctuation">.</span><span class="token function">push</span><span class="token punctuation">(</span>val<span class="token punctuation">)</span><span class="token punctuation">;</span>
        <span class="token punctuation">}</span><span class="token punctuation">,</span> <span class="token keyword">null</span><span class="token punctuation">,</span> <span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token punctuation">{</span>
          results<span class="token punctuation">.</span><span class="token function">push</span><span class="token punctuation">(</span><span class="token string">'done'</span><span class="token punctuation">)</span><span class="token punctuation">;</span>  
        <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
      <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
              
      scheduler<span class="token punctuation">.</span><span class="token function">flush</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
      <span class="token function">expect</span><span class="token punctuation">(</span>results<span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">toEqual</span><span class="token punctuation">(</span><span class="token punctuation">[</span><span class="token string">'b'</span><span class="token punctuation">,</span> <span class="token string">'c'</span><span class="token punctuation">,</span> <span class="token string">'done'</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    
    <span class="token function">it</span><span class="token punctuation">(</span><span class="token string">'should allow scheduling of non ending streams'</span><span class="token punctuation">,</span> <span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token punctuation">{</span>
      <span class="token comment">//given</span>
      <span class="token keyword">const</span> scheduler <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Rx<span class="token punctuation">.</span>TestScheduler</span><span class="token punctuation">(</span><span class="token keyword">null</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
      <span class="token keyword">const</span> source <span class="token operator">=</span> scheduler<span class="token punctuation">.</span><span class="token function">createHotObservable</span><span class="token punctuation">(</span><span class="token string">'--a-^--b-c'</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
      <span class="token keyword">const</span> results <span class="token operator">=</span> <span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token punctuation">;</span>

      <span class="token comment">//when</span>
      scheduler<span class="token punctuation">.</span><span class="token function">schedule</span><span class="token punctuation">(</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token punctuation">{</span>
        source<span class="token punctuation">.</span><span class="token function">subscribe</span><span class="token punctuation">(</span><span class="token punctuation">(</span><span class="token parameter">val</span><span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token punctuation">{</span>
          results<span class="token punctuation">.</span><span class="token function">push</span><span class="token punctuation">(</span>val<span class="token punctuation">)</span><span class="token punctuation">;</span>
        <span class="token punctuation">}</span><span class="token punctuation">,</span> <span class="token keyword">null</span><span class="token punctuation">,</span> <span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token punctuation">{</span>
          results<span class="token punctuation">.</span><span class="token function">push</span><span class="token punctuation">(</span><span class="token string">'done'</span><span class="token punctuation">)</span><span class="token punctuation">;</span>  
        <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
      <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
              
      scheduler<span class="token punctuation">.</span><span class="token function">flush</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
      <span class="token function">expect</span><span class="token punctuation">(</span>results<span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">toEqual</span><span class="token punctuation">(</span><span class="token punctuation">[</span><span class="token string">'b'</span><span class="token punctuation">,</span> <span class="token string">'c'</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
  <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span></code></pre></div><h3>Simplifying the expectations</h3><p>Although straight forward, it is a bit of code that you have to write in order to test a sequence of events and we haven&#x27;t a way of testing the actual time (frame) that an event took place. In the <a href="https://github.com/ReactiveX/rxjs/blob/master/doc/writing-marble-tests.md">docu</a>, you see the existence of <code>expectObservable</code> function, but still no info on where to find it. This time I went straight to <code>TestScheduler</code> and it looked like it had what I needed:</p><ul><li><code>expectObservable(observable: Observable&lt;any&gt;, unsubscriptionMarbles: string = null): ({ toBe: observableToBeFn })</code></li></ul><p>With that we can write expectations with marble strings just like we create the hot/cold observables, making testing much more easier.</p><p>It is though a little bit trickier to use, as we should first instanciate our scheduler with an assertion function. This will be used in order to assert the sequence of the events when <code>flush</code>ing the scheduler. That means that it should make our test fail. So either throw an exception or just use your testing framework:</p><div class="code-block"><pre class="language-javascript"><code class="language-javascript"><span class="token keyword">function</span> <span class="token function">assertEquals</span> <span class="token punctuation">(</span><span class="token parameter">actual<span class="token punctuation">,</span> expected</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
    <span class="token comment">//we will use jasmine's api for the assertion:</span>
    <span class="token function">expect</span><span class="token punctuation">(</span>actual<span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">toEqual</span><span class="token punctuation">(</span>expected<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>

<span class="token keyword">const</span> scheduler <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Rx<span class="token punctuation">.</span>TestScheduler</span><span class="token punctuation">(</span>assertEquals<span class="token punctuation">)</span><span class="token punctuation">;</span></code></pre></div><p>a full example would look like the following:</p><div class="code-block"><div class="code-title"><a href="https://gist.github.com/valotas/09f8fabc1a1db4b108b3#file-expectobservable-js" target="_blank">expectObservable.js</a></div><pre class="language-javascript"><code class="language-javascript"><span class="token comment">/*eslint-env jasmine*/</span>

<span class="token keyword">import</span> Rx <span class="token keyword">from</span> <span class="token string">'rxjs'</span><span class="token punctuation">;</span>

<span class="token keyword">function</span> <span class="token function">assertEquals</span> <span class="token punctuation">(</span><span class="token parameter">actual<span class="token punctuation">,</span> expected</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
    <span class="token comment">//we will use jasmine's api for the assertion:</span>
    <span class="token function">expect</span><span class="token punctuation">(</span>actual<span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">toEqual</span><span class="token punctuation">(</span>expected<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>

<span class="token function">describe</span><span class="token punctuation">(</span><span class="token string">'TestScheduler'</span><span class="token punctuation">,</span> <span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token punctuation">{</span>
  <span class="token function">describe</span><span class="token punctuation">(</span><span class="token string">'expectObservable()'</span><span class="token punctuation">,</span> <span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token punctuation">{</span>
    <span class="token function">it</span><span class="token punctuation">(</span><span class="token string">'should simplify the result check of given observables'</span><span class="token punctuation">,</span> <span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token punctuation">{</span>
      <span class="token comment">//given</span>
      <span class="token keyword">const</span> scheduler <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Rx<span class="token punctuation">.</span>TestScheduler</span><span class="token punctuation">(</span>assertEquals<span class="token punctuation">)</span><span class="token punctuation">;</span>
      <span class="token keyword">const</span> source <span class="token operator">=</span> scheduler<span class="token punctuation">.</span><span class="token function">createHotObservable</span><span class="token punctuation">(</span><span class="token string">'--a-^--b-c'</span><span class="token punctuation">)</span><span class="token punctuation">;</span>

      <span class="token comment">//then</span>
      scheduler<span class="token punctuation">.</span><span class="token function">expectObservable</span><span class="token punctuation">(</span>source<span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">toBe</span><span class="token punctuation">(</span><span class="token string">'---bc'</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
      
      scheduler<span class="token punctuation">.</span><span class="token function">flush</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
  <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span></code></pre></div><h2>Experimenting</h2><p>Finally if you feel like experimenting, which by the way is the only way of getting used to the library <a href="http://jsbin.com/gist/c71a7aa41de5d03197a2">this jsbin</a> should get you up and running as it contains all the test cases we&#x27;ve discussed on this post. If you are only interesting in the code, here it is:</p><div class="code-block"><div class="code-title"><a href="https://gist.github.com/valotas/c71a7aa41de5d03197a2#file-specs-js" target="_blank">specs.js</a></div><pre class="language-javascript"><code class="language-javascript"><span class="token function">describe</span><span class="token punctuation">(</span><span class="token string">'rxjs TestScheduler'</span><span class="token punctuation">,</span> <span class="token keyword">function</span> <span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
  <span class="token keyword">var</span> rx <span class="token operator">=</span> Rx<span class="token punctuation">.</span>KitchenSink<span class="token punctuation">;</span>
  
  <span class="token function">it</span><span class="token punctuation">(</span><span class="token string">'should be part of the Rx namespace'</span><span class="token punctuation">,</span> <span class="token keyword">function</span> <span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
    <span class="token function">expect</span><span class="token punctuation">(</span>rx<span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">toBeDefined</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token function">expect</span><span class="token punctuation">(</span>rx<span class="token punctuation">.</span>TestScheduler<span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">toBeDefined</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
  <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
  
  <span class="token function">describe</span><span class="token punctuation">(</span><span class="token string">'createHotObservable()'</span><span class="token punctuation">,</span> <span class="token keyword">function</span> <span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
    <span class="token function">it</span><span class="token punctuation">(</span><span class="token string">'should create a hot observable emmiting the values given as marble strings'</span><span class="token punctuation">,</span> <span class="token keyword">function</span> <span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
      <span class="token comment">//given</span>
      <span class="token keyword">var</span> scheduler <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">rx<span class="token punctuation">.</span>TestScheduler</span><span class="token punctuation">(</span><span class="token keyword">null</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
      <span class="token keyword">var</span> source <span class="token operator">=</span> scheduler<span class="token punctuation">.</span><span class="token function">createHotObservable</span><span class="token punctuation">(</span><span class="token string">'--a---b-cd-|'</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
      <span class="token keyword">var</span> results <span class="token operator">=</span> <span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token punctuation">;</span>

      <span class="token comment">//when</span>
      source
        <span class="token punctuation">.</span><span class="token function">bufferCount</span><span class="token punctuation">(</span><span class="token number">2</span><span class="token punctuation">)</span>
        <span class="token punctuation">.</span><span class="token function">map</span><span class="token punctuation">(</span><span class="token keyword">function</span> <span class="token punctuation">(</span><span class="token parameter">array</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
          <span class="token keyword">return</span> array<span class="token punctuation">.</span><span class="token function">join</span><span class="token punctuation">(</span><span class="token string">''</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
        <span class="token punctuation">}</span><span class="token punctuation">)</span>
        <span class="token punctuation">.</span><span class="token function">subscribe</span><span class="token punctuation">(</span><span class="token keyword">function</span> <span class="token punctuation">(</span><span class="token parameter">val</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
          results<span class="token punctuation">.</span><span class="token function">push</span><span class="token punctuation">(</span>val<span class="token punctuation">)</span><span class="token punctuation">;</span>
        <span class="token punctuation">}</span><span class="token punctuation">,</span> <span class="token keyword">null</span><span class="token punctuation">,</span> <span class="token keyword">function</span> <span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
          results<span class="token punctuation">.</span><span class="token function">push</span><span class="token punctuation">(</span><span class="token string">'done'</span><span class="token punctuation">)</span><span class="token punctuation">;</span>  
        <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
        
      scheduler<span class="token punctuation">.</span><span class="token function">flush</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
      <span class="token function">expect</span><span class="token punctuation">(</span>results<span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">toEqual</span><span class="token punctuation">(</span><span class="token punctuation">[</span><span class="token string">'ab'</span><span class="token punctuation">,</span> <span class="token string">'cd'</span><span class="token punctuation">,</span> <span class="token string">'done'</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    
    <span class="token function">it</span><span class="token punctuation">(</span><span class="token string">'should create a hot observable emmiting the values given as marble strings'</span><span class="token punctuation">,</span> <span class="token keyword">function</span> <span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
      <span class="token comment">//given</span>
      <span class="token keyword">var</span> scheduler <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">rx<span class="token punctuation">.</span>TestScheduler</span><span class="token punctuation">(</span><span class="token keyword">null</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
      <span class="token keyword">var</span> source <span class="token operator">=</span> scheduler<span class="token punctuation">.</span><span class="token function">createHotObservable</span><span class="token punctuation">(</span><span class="token string">'--a-^--b-c|'</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
      <span class="token keyword">var</span> results <span class="token operator">=</span> <span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token punctuation">;</span>

      <span class="token comment">//when</span>
      scheduler<span class="token punctuation">.</span><span class="token function">schedule</span><span class="token punctuation">(</span><span class="token keyword">function</span> <span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
        source<span class="token punctuation">.</span><span class="token function">subscribe</span><span class="token punctuation">(</span><span class="token keyword">function</span> <span class="token punctuation">(</span><span class="token parameter">val</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
          results<span class="token punctuation">.</span><span class="token function">push</span><span class="token punctuation">(</span>val<span class="token punctuation">)</span><span class="token punctuation">;</span>
        <span class="token punctuation">}</span><span class="token punctuation">,</span> <span class="token keyword">null</span><span class="token punctuation">,</span> <span class="token keyword">function</span> <span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
          results<span class="token punctuation">.</span><span class="token function">push</span><span class="token punctuation">(</span><span class="token string">'done'</span><span class="token punctuation">)</span><span class="token punctuation">;</span>  
        <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
      <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
              
      scheduler<span class="token punctuation">.</span><span class="token function">flush</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
      <span class="token function">expect</span><span class="token punctuation">(</span>results<span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">toEqual</span><span class="token punctuation">(</span><span class="token punctuation">[</span><span class="token string">'b'</span><span class="token punctuation">,</span> <span class="token string">'c'</span><span class="token punctuation">,</span> <span class="token string">'done'</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
  <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
  
  
  <span class="token function">describe</span><span class="token punctuation">(</span><span class="token string">'createColdObservable()'</span><span class="token punctuation">,</span> <span class="token keyword">function</span> <span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
    <span class="token function">it</span><span class="token punctuation">(</span><span class="token string">'should create a cold observable emmiting the values given as marble strings'</span><span class="token punctuation">,</span> <span class="token keyword">function</span> <span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
      <span class="token comment">//given</span>
      <span class="token keyword">var</span> scheduler <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">rx<span class="token punctuation">.</span>TestScheduler</span><span class="token punctuation">(</span><span class="token keyword">null</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
      <span class="token keyword">var</span> source <span class="token operator">=</span> scheduler<span class="token punctuation">.</span><span class="token function">createColdObservable</span><span class="token punctuation">(</span><span class="token string">'--a---b|'</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
      <span class="token keyword">var</span> results <span class="token operator">=</span> <span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token punctuation">;</span>

      <span class="token comment">//when</span>
      source<span class="token punctuation">.</span><span class="token function">subscribe</span><span class="token punctuation">(</span><span class="token keyword">function</span> <span class="token punctuation">(</span><span class="token parameter">val</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
        results<span class="token punctuation">.</span><span class="token function">push</span><span class="token punctuation">(</span>val<span class="token punctuation">)</span><span class="token punctuation">;</span>
      <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
        
      scheduler<span class="token punctuation">.</span><span class="token function">flush</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
      <span class="token function">expect</span><span class="token punctuation">(</span>results<span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">toEqual</span><span class="token punctuation">(</span><span class="token punctuation">[</span><span class="token string">'a'</span><span class="token punctuation">,</span> <span class="token string">'b'</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
  <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
  
  
  <span class="token function">it</span><span class="token punctuation">(</span><span class="token string">'should be reusable with time related operators'</span><span class="token punctuation">,</span> <span class="token keyword">function</span> <span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
    <span class="token comment">//given</span>
    <span class="token keyword">var</span> scheduler <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">rx<span class="token punctuation">.</span>TestScheduler</span><span class="token punctuation">(</span><span class="token keyword">null</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token keyword">var</span> source <span class="token operator">=</span> scheduler<span class="token punctuation">.</span><span class="token function">createHotObservable</span><span class="token punctuation">(</span><span class="token string">'a----bcd-f|'</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token keyword">var</span> results <span class="token operator">=</span> <span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token punctuation">;</span>
   
    <span class="token comment">//when</span>
    source
      <span class="token punctuation">.</span><span class="token function">bufferTime</span><span class="token punctuation">(</span><span class="token number">40</span><span class="token punctuation">,</span> <span class="token keyword">null</span><span class="token punctuation">,</span> scheduler<span class="token punctuation">)</span>
      <span class="token punctuation">.</span><span class="token function">map</span><span class="token punctuation">(</span><span class="token keyword">function</span> <span class="token punctuation">(</span><span class="token parameter">buffer</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
        <span class="token keyword">return</span> buffer<span class="token punctuation">.</span><span class="token function">join</span><span class="token punctuation">(</span><span class="token string">''</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
      <span class="token punctuation">}</span><span class="token punctuation">)</span>
      <span class="token punctuation">.</span><span class="token function">subscribe</span><span class="token punctuation">(</span><span class="token keyword">function</span> <span class="token punctuation">(</span><span class="token parameter">val</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
        results<span class="token punctuation">.</span><span class="token function">push</span><span class="token punctuation">(</span>val<span class="token punctuation">)</span><span class="token punctuation">;</span>
      <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
      
    scheduler<span class="token punctuation">.</span><span class="token function">flush</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    
    <span class="token comment">//then</span>
    <span class="token function">expect</span><span class="token punctuation">(</span>results<span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">toEqual</span><span class="token punctuation">(</span><span class="token punctuation">[</span><span class="token string">'a'</span><span class="token punctuation">,</span> <span class="token string">'bcd'</span><span class="token punctuation">,</span> <span class="token string">'f'</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
  <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
  
  
  <span class="token function">describe</span><span class="token punctuation">(</span><span class="token string">'schedule()'</span><span class="token punctuation">,</span> <span class="token keyword">function</span> <span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
    <span class="token function">it</span><span class="token punctuation">(</span><span class="token string">'should schedule the subscription on the right time'</span><span class="token punctuation">,</span> <span class="token keyword">function</span> <span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
      <span class="token comment">//given</span>
      <span class="token keyword">var</span> scheduler <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">rx<span class="token punctuation">.</span>TestScheduler</span><span class="token punctuation">(</span><span class="token keyword">null</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
      <span class="token keyword">var</span> source <span class="token operator">=</span> scheduler<span class="token punctuation">.</span><span class="token function">createHotObservable</span><span class="token punctuation">(</span><span class="token string">'--a-^--b-c|'</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
      <span class="token keyword">var</span> results <span class="token operator">=</span> <span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token punctuation">;</span>

      <span class="token comment">//when</span>
      scheduler<span class="token punctuation">.</span><span class="token function">schedule</span><span class="token punctuation">(</span><span class="token keyword">function</span>  <span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
        source<span class="token punctuation">.</span><span class="token function">subscribe</span><span class="token punctuation">(</span><span class="token keyword">function</span> <span class="token punctuation">(</span><span class="token parameter">val</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
          results<span class="token punctuation">.</span><span class="token function">push</span><span class="token punctuation">(</span>val<span class="token punctuation">)</span><span class="token punctuation">;</span>
        <span class="token punctuation">}</span><span class="token punctuation">,</span> <span class="token keyword">null</span><span class="token punctuation">,</span> <span class="token keyword">function</span> <span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
          results<span class="token punctuation">.</span><span class="token function">push</span><span class="token punctuation">(</span><span class="token string">'done'</span><span class="token punctuation">)</span><span class="token punctuation">;</span>  
        <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
      <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
              
      scheduler<span class="token punctuation">.</span><span class="token function">flush</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
      <span class="token function">expect</span><span class="token punctuation">(</span>results<span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">toEqual</span><span class="token punctuation">(</span><span class="token punctuation">[</span><span class="token string">'b'</span><span class="token punctuation">,</span> <span class="token string">'c'</span><span class="token punctuation">,</span> <span class="token string">'done'</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    
    <span class="token function">it</span><span class="token punctuation">(</span><span class="token string">'should allow scheduling of non ending streams'</span><span class="token punctuation">,</span> <span class="token keyword">function</span> <span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
      <span class="token comment">//given</span>
      <span class="token keyword">var</span> scheduler <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">rx<span class="token punctuation">.</span>TestScheduler</span><span class="token punctuation">(</span><span class="token keyword">null</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
      <span class="token keyword">var</span> source <span class="token operator">=</span> scheduler<span class="token punctuation">.</span><span class="token function">createHotObservable</span><span class="token punctuation">(</span><span class="token string">'--a-^--b-c'</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
      <span class="token keyword">var</span> results <span class="token operator">=</span> <span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token punctuation">;</span>

      <span class="token comment">//when</span>
      scheduler<span class="token punctuation">.</span><span class="token function">schedule</span><span class="token punctuation">(</span><span class="token keyword">function</span> <span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
        source<span class="token punctuation">.</span><span class="token function">subscribe</span><span class="token punctuation">(</span><span class="token keyword">function</span> <span class="token punctuation">(</span><span class="token parameter">val</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
          results<span class="token punctuation">.</span><span class="token function">push</span><span class="token punctuation">(</span>val<span class="token punctuation">)</span><span class="token punctuation">;</span>
        <span class="token punctuation">}</span><span class="token punctuation">,</span> <span class="token keyword">null</span><span class="token punctuation">,</span> <span class="token keyword">function</span> <span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
          results<span class="token punctuation">.</span><span class="token function">push</span><span class="token punctuation">(</span><span class="token string">'done'</span><span class="token punctuation">)</span><span class="token punctuation">;</span>  
        <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
      <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
              
      scheduler<span class="token punctuation">.</span><span class="token function">flush</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
      <span class="token function">expect</span><span class="token punctuation">(</span>results<span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">toEqual</span><span class="token punctuation">(</span><span class="token punctuation">[</span><span class="token string">'b'</span><span class="token punctuation">,</span> <span class="token string">'c'</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
  <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
  
      
  <span class="token keyword">function</span> <span class="token function">assertEquals</span> <span class="token punctuation">(</span><span class="token parameter">actual<span class="token punctuation">,</span> expected</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
    <span class="token function">expect</span><span class="token punctuation">(</span>actual<span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">toEqual</span><span class="token punctuation">(</span>expected<span class="token punctuation">)</span><span class="token punctuation">;</span>
  <span class="token punctuation">}</span>
  
  <span class="token function">describe</span><span class="token punctuation">(</span><span class="token string">'expectObservable()'</span><span class="token punctuation">,</span> <span class="token keyword">function</span> <span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
    <span class="token function">it</span><span class="token punctuation">(</span><span class="token string">'should simplify the result check of given observables'</span><span class="token punctuation">,</span> <span class="token keyword">function</span> <span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
      <span class="token comment">//given</span>
      <span class="token keyword">var</span> scheduler <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">rx<span class="token punctuation">.</span>TestScheduler</span><span class="token punctuation">(</span>assertEquals<span class="token punctuation">)</span><span class="token punctuation">;</span>
      <span class="token keyword">var</span> source <span class="token operator">=</span> scheduler<span class="token punctuation">.</span><span class="token function">createHotObservable</span><span class="token punctuation">(</span><span class="token string">'--a-^--b-c'</span><span class="token punctuation">)</span><span class="token punctuation">;</span>

      <span class="token comment">//then</span>
      scheduler<span class="token punctuation">.</span><span class="token function">expectObservable</span><span class="token punctuation">(</span>source<span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">toBe</span><span class="token punctuation">(</span><span class="token string">'---b-c'</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
      
      scheduler<span class="token punctuation">.</span><span class="token function">flush</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
  <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
  
  <span class="token function">describe</span><span class="token punctuation">(</span><span class="token string">'operators'</span><span class="token punctuation">,</span> <span class="token keyword">function</span> <span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
    <span class="token function">describe</span><span class="token punctuation">(</span><span class="token string">'fromPromise()'</span><span class="token punctuation">,</span> <span class="token keyword">function</span> <span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
      <span class="token function">it</span><span class="token punctuation">(</span><span class="token string">'should transform a Promise to an Observable'</span><span class="token punctuation">,</span> <span class="token keyword">function</span> <span class="token punctuation">(</span><span class="token parameter">done</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
        <span class="token keyword">var</span> promise <span class="token operator">=</span> Promise<span class="token punctuation">.</span><span class="token function">resolve</span><span class="token punctuation">(</span><span class="token string">'promise value'</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
        rx<span class="token punctuation">.</span>Observable<span class="token punctuation">.</span><span class="token function">fromPromise</span><span class="token punctuation">(</span>promise<span class="token punctuation">)</span>
          <span class="token punctuation">.</span><span class="token function">subscribe</span><span class="token punctuation">(</span><span class="token keyword">function</span> <span class="token punctuation">(</span><span class="token parameter">e</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
            <span class="token function">expect</span><span class="token punctuation">(</span>e<span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">toEqual</span><span class="token punctuation">(</span><span class="token string">'promise value'</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
          <span class="token punctuation">}</span><span class="token punctuation">,</span> done<span class="token punctuation">.</span>fail<span class="token punctuation">,</span> done<span class="token punctuation">)</span><span class="token punctuation">;</span>
      <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    
    <span class="token function">describe</span><span class="token punctuation">(</span><span class="token string">'mergeMap()'</span><span class="token punctuation">,</span> <span class="token keyword">function</span> <span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
      <span class="token function">it</span><span class="token punctuation">(</span><span class="token string">'should transform a Promise to an Observable'</span><span class="token punctuation">,</span> <span class="token keyword">function</span> <span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
        <span class="token comment">//given</span>
        <span class="token keyword">var</span> scheduler <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">rx<span class="token punctuation">.</span>TestScheduler</span><span class="token punctuation">(</span>assertEquals<span class="token punctuation">)</span><span class="token punctuation">;</span>
        <span class="token keyword">var</span> source <span class="token operator">=</span> scheduler<span class="token punctuation">.</span><span class="token function">createHotObservable</span><span class="token punctuation">(</span><span class="token string">'--a-^--b-c'</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
        <span class="token keyword">var</span> other <span class="token operator">=</span> scheduler<span class="token punctuation">.</span><span class="token function">createColdObservable</span><span class="token punctuation">(</span><span class="token string">'-d--e'</span><span class="token punctuation">)</span><span class="token punctuation">;</span>

        <span class="token comment">//then</span>
        scheduler<span class="token punctuation">.</span><span class="token function">expectObservable</span><span class="token punctuation">(</span>source<span class="token punctuation">.</span><span class="token function">mergeMap</span><span class="token punctuation">(</span><span class="token keyword">function</span> <span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
          <span class="token keyword">return</span> other<span class="token punctuation">;</span>
        <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">toBe</span><span class="token punctuation">(</span><span class="token string">'----d-de-e'</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
      
        scheduler<span class="token punctuation">.</span><span class="token function">flush</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
      <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
  <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span></code></pre></div><h2>References</h2><ul><li><a href="http://reactivex.io/rxjs/test.html">RxJs test api</a></li><li><a href="https://github.com/ReactiveX/RxJS">RxJs github repo</a></li><li><a href="https://github.com/ReactiveX/rxjs/blob/master/doc/writing-marble-tests.md">Writing marble tests</a></li></ul></div></div>]]></content:encoded>
    </item>
    <item>
      <title>Website revamp 2016</title>
      <link>https://valotas.com/revamp2016/</link>
      <guid isPermaLink="true">https://valotas.com/revamp2016/</guid>
      <pubDate>Mon, 11 Jan 2016 12:00:00 GMT</pubDate>
      <description>A mixed combination of react exploration, creativity and assemble's inactivity, forced me to pop the hood of this blog and make some serious changes that…</description>
      <content:encoded><![CDATA[<div data-testid="marked" class="prose"><div><p>A mixed combination of <a href="https://facebook.github.io/react/">react</a> exploration, creativity and <a href="http://assemble.io/">assemble</a>&#x27;s inactivity, forced me to pop
the hood of this blog and make some serious changes that I am happy to share with you (not that you care that much, but
anyway)</p><h2>Motivation</h2><p>I felt inactive for quite some time now, so the idea came to update this site. Being a software engineer, I cared mostly
about the things under the hood though. I do know that for a blog like this a static site generator is just fine. In fact
<a href="http://assemble.io/">assemble</a> did a great job but I was stuck with <a href="http://gruntjs.com/">Grunt</a> while I was desperatelly wanted to move to
<a href="http://gulpjs.com/">gulp</a>. Not that it has a big difference, but it is more fun to play with pipes rather than trying to configure
plugins.</p><p>I was waiting for the new version of <a href="http://assemble.io/">assemble</a> for a couple of months (more that a year actually) as it
supposed to add support for both building tools. Unfortunatelly the github repo seemed inactive the whole time so I
assumed that it was just another dead javascript project. It looks like there is some activity latelly but unfortunatelly
that was after I started working on the revamp of the site.</p><p>On top of the above I really wanted to explore gulp plugins. So I said, let&#x27;s create a set o minimal plugins that could
create my static website out of my markdown files. Ofcourse I could&#x27;t stop thinking about <a href="https://facebook.github.io/react/">react</a> and
<a href="http://www.typescriptlang.org/">typescript</a>, so inevitably there should be something based on that.</p><p>The typescript part was easy. All I had to do is to write my gulp plugins with that. But react being a client side framework
was not that straight forward to use it. Of course you could use it to create static markup but it is not it&#x27;s main application.
That was the reason I was forced to find a problem so that I could apply react on it. I did not have to think that much though.
The new big idea in javascript is the <a href="http://nerds.airbnb.com/isomorphic-javascript-future-web-apps/">isomorphic</a> application. Which means that you should have the same code on
the server and client. So I had pretty much what I needed.</p><h2>The plan</h2><p>Create a set of gulp plugins to transform the articles written in markdown to proper html files. The whole layout of that html
should be a react component (making use of other react components). Once the markup is created wrap it with the appropriate html
head and &quot;serve&quot; it. In our case, serve it, means store it for later use.</p><p>Once served, the html should bootstrap the same react component with the same input (markdown file) but intercept the links so
that there will be no need for further page reload. Next page should be one ajax call away.</p><p>At the end of the day I ended up with something like the following</p><div class="code-block"><pre class="language-javascript"><code class="language-javascript">module<span class="token punctuation">.</span><span class="token function-variable function">exports</span> <span class="token operator">=</span> <span class="token keyword">function</span> <span class="token punctuation">(</span><span class="token parameter">gulp</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
  <span class="token keyword">return</span> <span class="token keyword">function</span> <span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
    <span class="token keyword">var</span> plugin <span class="token operator">=</span> <span class="token function">require</span><span class="token punctuation">(</span><span class="token string">'../build/typescript/gulp'</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token keyword">return</span> gulp<span class="token punctuation">.</span><span class="token function">src</span><span class="token punctuation">(</span><span class="token punctuation">[</span>
        <span class="token string">'src/articles/**/*.md'</span>
      <span class="token punctuation">]</span><span class="token punctuation">)</span>
      <span class="token punctuation">.</span><span class="token function">pipe</span><span class="token punctuation">(</span>plugin<span class="token punctuation">.</span><span class="token function">mdFile</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token comment">//create metadata out of the *.md files</span>
      <span class="token punctuation">.</span><span class="token function">pipe</span><span class="token punctuation">(</span>plugin<span class="token punctuation">.</span><span class="token function">toArticle</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token comment">//convert the metadata to articles</span>
      <span class="token punctuation">.</span><span class="token function">pipe</span><span class="token punctuation">(</span>plugin<span class="token punctuation">.</span><span class="token function">addIndex</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token comment">//add an index of all articles</span>
      <span class="token punctuation">.</span><span class="token function">pipe</span><span class="token punctuation">(</span>plugin<span class="token punctuation">.</span><span class="token function">addMetafiles</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token comment">//add metadata files as json</span>
      <span class="token punctuation">.</span><span class="token function">pipe</span><span class="token punctuation">(</span>plugin<span class="token punctuation">.</span><span class="token function">adaptPaths</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token comment">//make sure all files are in a folder named after the title</span>
      <span class="token punctuation">.</span><span class="token function">pipe</span><span class="token punctuation">(</span>plugin<span class="token punctuation">.</span><span class="token function">wrapHtml</span><span class="token punctuation">(</span><span class="token string">'src/templates/index.jade'</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token comment">//wrap created html</span>
      <span class="token punctuation">.</span><span class="token function">pipe</span><span class="token punctuation">(</span>gulp<span class="token punctuation">.</span><span class="token function">dest</span><span class="token punctuation">(</span><span class="token string">'build'</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token comment">//write the output</span>
  <span class="token punctuation">}</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span><span class="token punctuation">;</span></code></pre></div><p>which I hope is self explanatory.</p><h3>Marked react</h3><p>Unfortunatelly I did not feel that good with using react&#x27;s <a href="https://facebook.github.io/react/tips/dangerously-set-inner-html.html"><code>dangerouslySetInnerHTML</code></a> so I had the idea
of making sure that markdown would directly get translated to react components. I was using <a href="https://www.npmjs.com/package/marked">marked</a> for my markdown and
luckily it allows you to provide custom renderer implementations. After some searching, I only found
<a href="https://github.com/christianalfoni/markdown-to-react-components/blob/master/src/index.js">markdown-to-react-components</a>. It looks like that (till now) it is the only renderer that would
actually translate markdown to react components.</p><p>Due to absence of tests and the fact that the code was making use of regexp to find inline component placeholders and replace
them with the actual components, forced me to try to implement my own renderer. Just like any adventure, you start with a &quot;how
hard can it be?&quot;. At the end of the day it took me more than I was expecting but managed to make <a href="https://github.com/valotas/valotas.com/blob/master/src/typescript/react/MarkedRenderer.ts">this</a> work for
my cases. It is not a complete renderer though as I had to skip some abbreviations I did not use.</p><p>After that I felt I could get rid of github requests for gists stuff when showing an article and download everything on the creation
of the page (having the gists as metadata).</p><h2>tl;rd</h2><p>All in all it was a very good excerise, with some performance benefits.</p><p>Ofcourse perfomance benefits is a little bit subjective as the initial page load costs now more but all the other requests are
superfast. The question is if a site like this needs such a thing, but as I said, it was a very good excerise.</p><p>The code can be found at <a href="https://github.com/valotas/valotas.com/tree/master/src/typescript">github</a>.</p></div></div>]]></content:encoded>
    </item>
    <item>
      <title>An overview of Devoxx 2015</title>
      <link>https://valotas.com/devoxx-2015/</link>
      <guid isPermaLink="true">https://valotas.com/devoxx-2015/</guid>
      <pubDate>Sun, 29 Nov 2015 12:00:00 GMT</pubDate>
      <description>This year's devoxx was once again an excuse to write a new blogpost.</description>
      <content:encoded><![CDATA[<div data-testid="marked" class="prose"><div><p>This year&#x27;s devoxx was once again an excuse to write a new blogpost.</p><h2>Before 2015</h2><p>I was lucky enough to attend the two previous conferences:</p><ul><li><a href="https://valotas.com/an-overview-of-devoxx-2013/">An overview of devoxx 2013</a></li><li><a href="https://valotas.com/devoxx-2014/">An overview of devoxx 2014</a></li></ul><p>Although that can be nothing compared to what other attendees attended, it gives me something to compare.</p><h2>tl;dr</h2><p>Based on the talks I saw last two times during the university days, I thought it would be better to just skip them. The rest of the conference gave me a bitter sweet taste, as I either did not see anything more than I expected or my expectations were not that big because of lack of big events during this year.</p><p>The most interesting talk for me, was <a href="https://www.youtube.com/watch?v=OUo3BFMwQFo">&quot;Graal.JS - high-performance JavaScript on the JVM&quot;</a>. The title is misleading here, as it has not to do with javascript on the JVM directly but with polyglotism on the JVM. Worth checking it out I believe.</p><p>A list of stuff worth watching in my opinion are the followings:</p><p>Last but not least, here are the talks I found interesting (event if I did not attend all of them) with no specific order:</p><ul><li><a href="https://www.youtube.com/watch?v=OUo3BFMwQFo">Graal.JS - high-performance JavaScript on the JVM</a></li><li><a href="https://www.youtube.com/watch?v=3wyd6J3yjcs">The Silver Bullet Syndrome</a></li></ul><p>Regarding the rest of the conference, let&#x27;s break it up to smaller pieces...</p><h2>University days</h2><p>As I said I did not attend them as I felt that they were too &quot;boring&quot; the last to years. The combination of 3 hours duration and lack of actual hands on programming, makes you wanting to change the topic as soon as possible. In other way, I can only remember just one of these talks. There, the speaker managed to time box different aspects of web development and speak for each one a couple of minutes. Which technically is more than one talk made by one guy.</p><p>It can of course that I&#x27;m just a little bit strange. The truth is that I haven&#x27;t heard either anything really positive regarding the university days except from this years ones. Some friend of mine told me that they found the first 2 days this year much more interesting. Maybe I am just unlucky.</p><p>Anyway, keeping someone interested for 3 hours is not an easy job, and this is why the days have been named University days. The attendant should be willing to stay and filter the information he gets.</p><p>So let&#x27;s get to the actual conference days...</p><h2>The bigger ever</h2><p>It looks like this year&#x27;s devoxx was the bigger ever. I think it was about 3500 attendees, or to put it by another way it was big enough to run out of neck wraps for the entrance tickets. Yes, this time there was no wrist wrap, but rather a simple neck wrap (if you were not late) with a printed bar code on it. Not that cool but for sure much faster as a process. At least this time I did not have to wait more than 3 minutes at the queue.</p><p>Apart from <a href="http://www.devoxx.be/">Devoxx Belgium</a>, there were also <a href="http://www.devoxx.co.uk/">Devoxx UK</a>, <a href="http://www.devoxx.pl/">Devoxx PL</a>, <a href="http://www.devoxx.fr/">Devoxx FR</a> and <a href="http://www.devoxx.ma/">Devoxx MA</a> along with bunch of <a href="https://voxxeddays.com/">voxxed days</a>, which I did not keep track of. It looks like the conference market is expanding and <a href="https://twitter.com/Stephan007">Stephan</a> make use of it.</p><p>Although the bigger devoxx ever, there were no major problems with overcrowded rooms (or should I say cinema halls?).</p><h2>The keynotes</h2><p>From the technology point of view, these were the poorest ever keynotes I&#x27;ve ever seen. No big announcements, which was kind of expected as no ground breaking technology made it into this year&#x27;s radar.</p><p>So it was mostly <a href="https://twitter.com/Stephan007">Stephan</a> announcing the end of <a href="https://www.parleys.com/">Parleys</a> and immediate use of Youtube/Vimeo for publishing conference videos. It is a pity for parleys but I got the feeling that the  whole conference got a huge marketing push as speakers could reference to their talks a couple of hours after it. This means that you can have now access to <a href="https://www.youtube.com/channel/UCCBVCTuk6uJrN3iFV_3vurg">all of the conference talks</a>.</p><p>Then <a href="http://mreinhold.org/">Mark Reinhold</a> took the step to talk about jdk9 and mostly about modulatity. Given the fact the we&#x27;ve been talking about it for the last 3 major Java releases, I did not see anyone extremely excited about it.</p><p>Finally theoretical physics professor <a href="https://twitter.com/LKrauss1">Lawrence M. Krauss</a> talked about how irrelevant what we were doing at devoxx was. I do not know if that is the best way to start a conference, but for sure it was the <a href="https://www.youtube.com/watch?v=T-Kf2dR_SrQ">best talk</a> of day one.</p><h2>Lack of advertisements talks</h2><p>I did tweet the following:</p><blockquote class="twitter-tweet" lang="en"><p lang="en" dir="ltr">No advertising talk till now at <a href="https://twitter.com/hashtag/devoxx2015?src=hash">#devoxx2015</a> either my filter works better or there is an improvement there!</p>— Yoryos Valotassios (@valotas) <a href="https://twitter.com/valotas/status/664743040448376832">November 12, 2015</a></blockquote><p>Although someone can argue that there were no marketing talks, I have to say that this time at least they were not that obvious. This is in my opinion a major improvement. I can understand the need for them but I do not see what they can bring in terms of marketing if there are only a couple of people watching them.</p><p>A very good example of such a talk in my opinion was <a href="https://www.youtube.com/watch?v=94PxlbuizCU">The Twelve Factor app: Best Practices for Java Deployment</a> where you at least got a couple of useful information regarding the <a href="http://12factor.net/">12 factor app</a> (which in my opinion is 12 rule of thumbs for creating microservices) and the only advertisement was that you could deploy that super easy with <a href="https://www.heroku.com/">heroku</a>.</p><p>As I said before there were not big news this year and maybe that is why there were no interest from big names to advertise anything.</p><h2>Trends</h2><p>Although there were no big news, there were some obvious trends. It looks like reactive programming and microservices are still the thing this year.</p><h3>Reactive programming</h3><p>Working with streams has been the thing for some years now. Unfortunately Microsoft who is I think the main player behind the whole reactive idea, did not present anything in the last 3 years at devoxx. But this is another topic...</p><p>Back to reactive, as I watched some talks on this topic the previous years, I skipped these talks this time. Unfortunately, Java has only recently added basic support for that with the changes of JDK8, which means that it lacks the apis on the EE side and not only.</p><p>There are solutions available. Mainly <a href="https://github.com/ReactiveX/RxJava">RxJava</a> and <a href="http://akka.io/">akka</a> based ones from typesafe. I still ask myself though if I&#x27;m going to depend for example on an sql server, how am I going to be reactive if I have to wait anyway for a response. I have to wrap the sql api to something &quot;reactive&quot;, but this is not the standard anymore. Not that it is bad (spring or hibernate never was the standard for example), but it lets us know that it will take a while till reactive will be widely adopted.</p><p>More about reactive can be found at <a href="http://reactivex.io/">reactivex.io</a>.</p><h3>Microservices</h3><p>Yes, microservices are still the trend. Unfortunately, the term is so abstract, that you can give your own description. For some reason I tend to agree with what Hadi Hariri said about them, at his funny talk: <a href="https://www.youtube.com/watch?v=3wyd6J3yjcs">The Silver Bullet Syndrome</a>. They are what SOAP used to be but, SOAP is so bad, you do not want to name them like that :)</p><p>Never the less, if you would like to play with microservices, I haven&#x27;t been to a talk on this topic without hearing once about <a href="http://projects.spring.io/spring-boot/">Spring boot</a>. It looks like it does the job just fine, but it doesn&#x27;t mean that there are no alternatives. Actually there is one offering pretty much exactly what Spring boot does by embedding an application server with your app which I think deserves a serious look at. It is no other than <a href="http://wildfly.org/swarm/">Wildfly Swarm</a> and you can guess which application server is used.</p><p>If you think that EE cannot be used for microservices, <a href="https://www.parleys.com/tutorial/pico-services-java-ee-7-java-8-docker">think again</a>. If you don&#x27;t like EE anymore, then there is what you can also check out:</p><ul><li><a href="http://www.grpc.io/">grpc</a> for communication</li><li><a href="http://sparkjava.com/">spark</a> for rest</li><li><a href="http://www.dropwizard.io/">dropwizard</a> for a little bit more than spark</li><li><a href="http://vertx.io/">vertx</a> which is kind of I can do everything framework</li></ul><p>After checking them all out, let me know what kind of database microservice you are going to use. Although this comment is kind of sarcastic, when you do something, you have to remember that it is all about the code. So, have a look at <a href="https://www.youtube.com/watch?v=O77777Zy_HE">Microservices and Modularity or the difference between treatment and cure!</a> and see how an EE application can be refactored to something osgi based (yes, it still lives).</p><h2>What about the JVM?</h2><p>Back to <a href="https://www.youtube.com/watch?v=OUo3BFMwQFo">Graal.js</a>...</p><p>When we are talking about Java, we are mostly referring to Java as a language. This wouldn&#x27;t be possible without that beast called JVM. I did not spot any JVM specific talks to be honest, but I did find one with a title that was giving you the impression that it was yet another javascript on the jvm implementation.</p><p>Apparently the talk was mostly about how mature the JVM became and how it can nowadays be used as a platform by other languages. Given the number of languages implemented on top of that, this is not new news, but the interoperability of them is. It&#x27;s worth having a look at the talk, to see how javascript code has been used from within <a href="https://www.r-project.org/">R code</a>.</p></div></div>]]></content:encoded>
    </item>
    <item>
      <title>Better $routeProvider for AngularJS</title>
      <link>https://valotas.com/better-angularjs-route/</link>
      <guid isPermaLink="true">https://valotas.com/better-angularjs-route/</guid>
      <pubDate>Mon, 13 Apr 2015 12:00:00 GMT</pubDate>
      <description>So, you just did your first angularjs webapp and are ready for production. And then comes the requirement that before initialization you have to do an…</description>
      <content:encoded><![CDATA[<div data-testid="marked" class="prose"><div><p>So, you just did your first angularjs webapp and are ready for production. And then comes the requirement that before initialization you have to do an ajax request. There should be an easy way to do that right?</p><h2>The problem</h2><p>Well, it looks like there is no straight forward way to solve this problem. And the funny think is that it is quite common practice to actually run some initialization code before you let your angularjs app start. Now, what this has to do with routing and why it is a problem?</p><p>Till now I haven&#x27;t seen a single angular webapp that is not using any kind of routing and the first out of the box solution is <code>ngRoute</code>. The thing is though that this module has been build with the idea that routes should be defined at the config phase. This looks like pretty logical except from the fact that you can only inject providers within the config phase.</p><p>That means that once your app starts, routing has already been defined. If you force the user to start with a specific route, the initialization of the app should not be a problem. But if your user tries to reach <code>/route/xxx</code> without reaching let&#x27;s say the root route (<code>/</code>) where all the initialization should take place, you have the problem of trying to use services and controllers depending on stuff that have not been properly initialized.</p><p>So a solution to the problem would be to have a way to always run some initialization code before defining the routes so that angular can continue with the routing after that. And it looks like this is not possible in your config phase, as no services are available there and during run phase no providers are available.</p><h2>A <code>$routeProvider</code> provider</h2><p>Now let&#x27;s try a naive hack and find a way to inject <code>$routeProvider</code> after the config phase. Then we can configure it lazily (let&#x27;s say after our initialization). It looks like <code>$provider</code> is a service available at the config phase and we can use it to register new services/factories. So, let&#x27;s try to register a <code>$routeProvider</code> service:</p><div class="code-block"><pre class="language-javascript"><code class="language-javascript"><span class="token punctuation">.</span><span class="token function">config</span><span class="token punctuation">(</span><span class="token keyword">function</span> <span class="token punctuation">(</span><span class="token parameter">$provide<span class="token punctuation">,</span> $routeProvider</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
  $provide<span class="token punctuation">.</span><span class="token function">factory</span><span class="token punctuation">(</span><span class="token string">'$routeProvider'</span><span class="token punctuation">,</span> <span class="token keyword">function</span> <span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
    <span class="token keyword">return</span> $routeProvider<span class="token punctuation">;</span>
  <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span><span class="token punctuation">)</span></code></pre></div><p>This allows us to directly use <code>$routeProvider</code> later on in our app. An example which uses this technique can be found <a href="http://jsbin.com/salini/edit">here</a>.</p><h2>The <code>lazyRoute</code> module</h2><p>As mentioned before such a solution would only be considered as a proof of concept. Having that working though can let us create a proper angularjs module which can make use of this technique.</p><p>So the requirement is to have at the end a route module that can be configured both on config and run phase. It should be able to initialize routes after a given promise is resolved. Ideally we would like something like the following:</p><div class="code-block"><pre class="language-javascript"><code class="language-javascript"><span class="token punctuation">.</span><span class="token function">config</span><span class="token punctuation">(</span><span class="token keyword">function</span> <span class="token punctuation">(</span><span class="token parameter">lazyRouteProvider</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
  lazyRouteProvider<span class="token punctuation">.</span><span class="token function">when</span><span class="token punctuation">(</span><span class="token string">'/'</span><span class="token punctuation">,</span> <span class="token punctuation">{</span><span class="token operator">...</span><span class="token punctuation">}</span><span class="token punctuation">)</span>
    <span class="token punctuation">.</span><span class="token function">when</span><span class="token punctuation">(</span><span class="token string">'/route'</span><span class="token punctuation">,</span> <span class="token punctuation">{</span><span class="token operator">...</span><span class="token punctuation">}</span><span class="token punctuation">)</span>
    <span class="token punctuation">.</span><span class="token function">lazyWhen</span><span class="token punctuation">(</span><span class="token string">'/route/after/init'</span><span class="token punctuation">,</span> <span class="token punctuation">{</span><span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span><span class="token punctuation">)</span>
<span class="token punctuation">.</span><span class="token function">run</span><span class="token punctuation">(</span><span class="token keyword">function</span> <span class="token punctuation">(</span><span class="token parameter">lazyRoute<span class="token punctuation">,</span> initService</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
  lazyRoute
    <span class="token punctuation">.</span><span class="token function">initAfter</span><span class="token punctuation">(</span>initService<span class="token punctuation">.</span><span class="token function">init</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span>
    <span class="token punctuation">.</span><span class="token function">with</span><span class="token punctuation">(</span><span class="token keyword">function</span> <span class="token punctuation">(</span><span class="token parameter">initServiceResult</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
      lazyRoute<span class="token punctuation">.</span><span class="token function">when</span><span class="token punctuation">(</span><span class="token string">'/another/route/after/init'</span><span class="token punctuation">,</span><span class="token punctuation">{</span>
        <span class="token comment">//config based on initServiceResult</span>
      <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span><span class="token punctuation">)</span></code></pre></div><p>So, let&#x27;s try to split it up in steps.</p><h3>Dummy <code>lazyRoute</code> that delegates to <code>$routeProvider</code></h3><p>As we need something that should be configurable at config time we should go with an <a href="https://docs.angularjs.org/guide/providers">angular provider</a>. Let&#x27;s see how it would look like:</p><div class="code-block"><pre class="language-javascript"><code class="language-javascript"><span class="token punctuation">.</span><span class="token function">provider</span><span class="token punctuation">(</span><span class="token string">'lazyRoute'</span><span class="token punctuation">,</span> <span class="token keyword">function</span> <span class="token punctuation">(</span><span class="token parameter">$routeProvider</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
  <span class="token keyword">this</span><span class="token punctuation">.</span><span class="token function-variable function">when</span> <span class="token operator">=</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token parameter">path<span class="token punctuation">,</span> route</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
    $routeProvider<span class="token punctuation">.</span><span class="token function">when</span><span class="token punctuation">(</span>path<span class="token punctuation">,</span> route<span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token keyword">return</span> <span class="token keyword">this</span><span class="token punctuation">;</span>
  <span class="token punctuation">}</span><span class="token punctuation">;</span>

  <span class="token keyword">this</span><span class="token punctuation">.</span><span class="token function-variable function">$get</span> <span class="token operator">=</span> <span class="token keyword">function</span> <span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
    <span class="token keyword">return</span> <span class="token punctuation">{</span>
      <span class="token function-variable function">initAfter</span><span class="token operator">:</span> <span class="token keyword">function</span> <span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> <span class="token keyword">this</span><span class="token punctuation">;</span> <span class="token punctuation">}</span><span class="token punctuation">,</span>
      <span class="token function-variable function">with</span><span class="token operator">:</span> <span class="token keyword">function</span> <span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> <span class="token keyword">this</span><span class="token punctuation">;</span> <span class="token punctuation">}</span><span class="token punctuation">,</span>
      <span class="token function-variable function">when</span><span class="token operator">:</span> <span class="token keyword">function</span> <span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> <span class="token keyword">this</span><span class="token punctuation">;</span> <span class="token punctuation">}</span>
    <span class="token punctuation">}</span>
  <span class="token punctuation">}</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span><span class="token punctuation">)</span></code></pre></div><h3>Implement <code>lazyWhen</code></h3><p>So, the idea here is to just keep track of the arguments passed to the <code>lazyWhen</code> function for later use:</p><div class="code-block"><pre class="language-javascript"><code class="language-javascript"><span class="token punctuation">.</span><span class="token function">provider</span><span class="token punctuation">(</span><span class="token string">'lazyRoute'</span><span class="token punctuation">,</span> <span class="token keyword">function</span> <span class="token punctuation">(</span><span class="token parameter">$routeProvider</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
  <span class="token keyword">var</span> lazyRoutes <span class="token operator">=</span> <span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token punctuation">;</span>

  <span class="token keyword">this</span><span class="token punctuation">.</span><span class="token function-variable function">when</span> <span class="token operator">=</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token parameter">path<span class="token punctuation">,</span> route</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
    $routeProvider<span class="token punctuation">.</span><span class="token function">when</span><span class="token punctuation">(</span>path<span class="token punctuation">,</span> route<span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token keyword">return</span> <span class="token keyword">this</span><span class="token punctuation">;</span>
  <span class="token punctuation">}</span><span class="token punctuation">;</span>

  <span class="token keyword">this</span><span class="token punctuation">.</span><span class="token function-variable function">lazyWhen</span> <span class="token operator">=</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token parameter">path<span class="token punctuation">,</span> route</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
    lazyRoutes<span class="token punctuation">.</span><span class="token function">push</span><span class="token punctuation">(</span><span class="token punctuation">{</span>
      <span class="token literal-property property">path</span><span class="token operator">:</span> path<span class="token punctuation">,</span>
      <span class="token literal-property property">route</span><span class="token operator">:</span> route
    <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token keyword">return</span> <span class="token keyword">this</span><span class="token punctuation">;</span>
  <span class="token punctuation">}</span><span class="token punctuation">;</span>

  <span class="token comment">//rest of the implementation skiped</span>
<span class="token punctuation">}</span><span class="token punctuation">)</span></code></pre></div><h3>Implement the lazyRoute module (<code>$get</code> function)</h3><p>Now, let&#x27;s try to implement our service which is what is returned by the <code>$get</code> function.</p><p>First of all the <code>when</code> function should delegate again to <code>$routeProvider</code>. On top of that, we should also <code>reload</code> the <code>$route</code> service as it has already been set up. Reloading for every new route definition is not so efficient but ok for our proof of concept.</p><div class="code-block"><pre class="language-javascript"><code class="language-javascript"><span class="token keyword">this</span><span class="token punctuation">.</span><span class="token function-variable function">$get</span> <span class="token operator">=</span> <span class="token keyword">function</span> <span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
  <span class="token keyword">return</span> <span class="token punctuation">{</span>
    <span class="token function-variable function">when</span><span class="token operator">:</span> <span class="token keyword">function</span> <span class="token punctuation">(</span><span class="token parameter">path<span class="token punctuation">,</span> route</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
      $routeProvider<span class="token punctuation">.</span><span class="token function">when</span><span class="token punctuation">(</span>path<span class="token punctuation">,</span> route<span class="token punctuation">)</span><span class="token punctuation">;</span>
      $route<span class="token punctuation">.</span><span class="token function">reload</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
      <span class="token keyword">return</span> <span class="token keyword">this</span><span class="token punctuation">;</span>
    <span class="token punctuation">}</span>
  <span class="token punctuation">}</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span><span class="token punctuation">;</span></code></pre></div><p>then we should also store the <code>with</code> function so that we can later use it within the <code>initAfter</code>. We wrap the <code>with</code> function into a promise. That way, we can make use of it directly within <code>initAfter</code> but it will get executed only when it is resolved:</p><div class="code-block"><pre class="language-javascript"><code class="language-javascript"><span class="token keyword">this</span><span class="token punctuation">.</span><span class="token function-variable function">$get</span> <span class="token operator">=</span> <span class="token keyword">function</span> <span class="token punctuation">(</span><span class="token parameter">$q</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
  <span class="token keyword">var</span> deferredWith <span class="token operator">=</span> $q<span class="token punctuation">.</span><span class="token function">defer</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>

  <span class="token keyword">return</span> <span class="token punctuation">{</span>
    <span class="token function-variable function">with</span><span class="token operator">:</span> <span class="token keyword">function</span> <span class="token punctuation">(</span><span class="token parameter">fn</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
      deferredWith<span class="token punctuation">.</span><span class="token function">resolve</span><span class="token punctuation">(</span>fn<span class="token punctuation">)</span><span class="token punctuation">;</span>
      <span class="token keyword">return</span> <span class="token keyword">this</span><span class="token punctuation">;</span>
    <span class="token punctuation">}</span>
  <span class="token punctuation">}</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span><span class="token punctuation">;</span></code></pre></div><p>finally we need within the <code>initAfter</code> to wait for the given init promise to get resolved and then setup the lazyRoutes and call the <code>withFn</code>:</p><div class="code-block"><pre class="language-javascript"><code class="language-javascript"><span class="token keyword">this</span><span class="token punctuation">.</span><span class="token function-variable function">$get</span> <span class="token operator">=</span> <span class="token keyword">function</span> <span class="token punctuation">(</span><span class="token parameter">$route</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
  <span class="token keyword">var</span> deferredWith <span class="token operator">=</span> $q<span class="token punctuation">.</span><span class="token function">defer</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>

  <span class="token keyword">return</span> <span class="token punctuation">{</span>
    <span class="token function-variable function">initAfter</span><span class="token operator">:</span> <span class="token keyword">function</span> <span class="token punctuation">(</span><span class="token parameter">initPromise</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
      $q<span class="token punctuation">.</span><span class="token function">all</span><span class="token punctuation">(</span><span class="token punctuation">{</span>
        <span class="token literal-property property">initPromise</span><span class="token operator">:</span> initPromise<span class="token punctuation">,</span>
        <span class="token literal-property property">withPromise</span><span class="token operator">:</span> deferredWith<span class="token punctuation">.</span>promise
      <span class="token punctuation">}</span><span class="token punctuation">)</span>
      <span class="token punctuation">.</span><span class="token function">then</span><span class="token punctuation">(</span><span class="token keyword">function</span> <span class="token punctuation">(</span><span class="token parameter">result</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
          <span class="token keyword">var</span> initPromise <span class="token operator">=</span> result<span class="token punctuation">.</span>initPromise<span class="token punctuation">,</span>
              withFn <span class="token operator">=</span> result<span class="token punctuation">.</span>withPromise<span class="token punctuation">;</span>

          angular<span class="token punctuation">.</span><span class="token function">forEach</span><span class="token punctuation">(</span>lazyRoutes<span class="token punctuation">,</span> <span class="token keyword">function</span> <span class="token punctuation">(</span><span class="token parameter">routeDefinition</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
            $routeProvider<span class="token punctuation">.</span><span class="token function">when</span><span class="token punctuation">(</span>routeDefinition<span class="token punctuation">.</span>path<span class="token punctuation">,</span> routeDefinition<span class="token punctuation">.</span>route<span class="token punctuation">)</span><span class="token punctuation">;</span>
          <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span>

          <span class="token function">withFn</span><span class="token punctuation">(</span>initPromise<span class="token punctuation">)</span><span class="token punctuation">;</span>
          <span class="token keyword">return</span> initPromise<span class="token punctuation">;</span>
        <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
      <span class="token keyword">return</span> <span class="token keyword">this</span><span class="token punctuation">;</span>
    <span class="token punctuation">}</span>
  <span class="token punctuation">}</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span><span class="token punctuation">;</span></code></pre></div><p>An example with the full solution can be found at: <a href="http://jsbin.com/jokibe">http://jsbin.com/jokibe</a></p><h2>tl;dr: Angular new Router</h2><p>Finally, it looks like the new angular&#x27;s <a href="https://github.com/angular/router">router</a> does not have the same problem as the injected service can be directly configured saving us from the encapsulation above. Diving into this though is a very good exercise for exploring promises, angularjs provider and the a little bit of the <code>$route</code> service.</p></div></div>]]></content:encoded>
    </item>
    <item>
      <title>An overview of Devoxx 2014</title>
      <link>https://valotas.com/devoxx-2014/</link>
      <guid isPermaLink="true">https://valotas.com/devoxx-2014/</guid>
      <pubDate>Sun, 16 Nov 2014 12:00:00 GMT</pubDate>
      <description>This year I was lucky enough to attend the devoxx conference yet another time. Here are what I saw/felt especially in regards to my previous visit.</description>
      <content:encoded><![CDATA[<div data-testid="marked" class="prose"><div><p>This year I was lucky enough to attend the <a href="http://devoxx.com">devoxx conference</a> yet another time. Here are what I saw/felt especially in regards to my <a href="https://valotas.com/an-overview-of-devoxx-2013">previous visit</a>.</p><h2>Java</h2><p>This year the conference was a lot more about java. There were some sessions for other stuff too but it did not have these 24 sessions for angularjs.</p><p>As it was about java, it was of course about java8 and its new features. So, as you may know lambdas have been introduced to java8 and this alone is enough to start building a lot more features on top of the platform.</p><p>So along with the lambdas, we had streams and a refined collections api that allows a more functional way of programming.</p><p>Having heard so much about lambda/streams, here are my thoughts. The feature brings ease and beauty to the language mostly by reducing boilerplate code. No one likes boilerplate but remember that this boilerplate is information/documentation to the user. Therefore I would suggest to make use of it with extreme caution as it is really easy to misuse it in the name of coolness. So please have a second thought before you go ahead and refine your api.</p><h2>Reactive programming</h2><p>Well, there is nothing new here as <a href="https://twitter.com/DevoxxBorat">Vlad</a> said...</p><blockquote class="twitter-tweet" lang="en"><p><a href="https://twitter.com/hashtag/Devoxx?src=hash">#Devoxx</a><a href="https://twitter.com/valotas">@valotas</a> is not new. Is we use with .niet in Azamat for centuries</p>— Born to be Borat. (@DevoxxBorat) <a href="https://twitter.com/DevoxxBorat/status/533363657024233472">November 14, 2014</a></blockquote><p>The thing is though that even with a delay of some years <a href="http://www.reactivemanifesto.org/">reactive programming</a> becomes a trend to Java too (and once again in software engineering in general). There were some libraries for reactive programming before but lambdas again can make the existing apis much more fluent.</p><p>I believe a very good answer to most of the newbies questions would be <a href="http://techblog.netflix.com/2013/02/rxjava-netflix-api.html">netflix&#x27;s article</a> regarding the use of a reactive programming model. Interestingly, I find this post a very good abstract of <a href="https://twitter.com/venkat_s">Venkat Subramaniam</a>&#x27;s <a href="http://cfp.devoxx.be/2014/talk/SUC-8683/Reactive_Programming:_creating_highly_responsive_applications">university session</a> which was the most popular session within the 5 days of the conference.</p><h2>Docker</h2><p>I do not think that there is much to say for this topic. <a href="https://www.docker.com/">Docker</a> can be described as a very lightweight linux base vm. Everybody seems to be using it and it looks like it is a matter of time before you&#x27;ll be using it. I do not believe that there is any question regarding its benefits and therefore just go for it as soon as possible.</p><p>As a side note. I do not know if it is java developers disliking system programming, but I did not hear a single thing regarding the background of the tool. It is a success story for <a href="https://golang.org/">Google&#x27;s golang</a> but nobody felt like mentioning it.</p><h2>Google, Microsoft and others</h2><p>Speaking of google, its presence this year at the conference was really quiet. The keynote was about material design, something that was of little to no interest to the developers. I do not know though how an audience accustomed to backwards compatibility would feel about the news that one of the <a href="https://angularjs.org/">last years&#x27; hot topic</a> will be a <a href="https://www.youtube.com/watch?v=gNmWybAyBHI">new thing</a> with no migration path.</p><p>So regarding the web. Everybody should now switch to this new thing (angular.js v2) or use the other cool thing called <a href="https://www.polymer-project.org/">polymer</a> which is focused on <a href="http://www.w3.org/TR/components-intro/">Web Components</a>. No big google logo anywhere, but still backed by it. And all that not mentioning the other new cool kid on the block, coming from facebook and called <a href="http://facebook.github.io/react/">react</a>. This fragmentation is driving me crazy!</p><p>Apart from that Microsoft&#x27;s target was once more the marketing of the Azure platform and nothing more. That is again sad considering the <a href="http://www.forbes.com/sites/benkepes/2014/11/14/how-the-worm-turns-microsoft-open-sources-net/">changes</a> that were made public during the devoxx days. I would really like to see some more programming centric stuff from Microsoft in such a conference.</p><p>Finally this years devoxx had more non programming related stuff. A bunch of startup related stuff among with a talk regarding <a href="http://thecreativedose.com/">creativity</a> by the Chief Creativity Evangelist (cool title) named Denise Jacobs. The talk was too American for my taste, but still a good addition to the conference.</p><h2>Devoxxed</h2><p>This year <a href="https://twitter.com/Stephan007">Stephan</a>&#x27;s idea was to get the first letters of the conference name and put them at the end of the remaining. Therefore something called <a href="https://www.voxxed.com/">voxxed</a> was born which had its first outage at the demo during the keynote. I do not know if it was a good sign or not. What I know is that it is not only a site aiming to be the new theserververside.com or a better <a href="http://java.dzone.com/">dzone</a>. There will be one day devoxx conferences around Europe with the name <a href="https://www.voxxed.com/voxxed-days/">voxxed days</a>.</p><p>I do not know if the idea of mini devoxx conferences came first or not but I do like the idea of having some decentralization. Unfortunately this seems not to be working as the conference this year was overbooked even though there are another 2 taking place in the UK and France.</p></div></div>]]></content:encoded>
    </item>
    <item>
      <title>Object oriented html</title>
      <link>https://valotas.com/object-oriented-html/</link>
      <guid isPermaLink="true">https://valotas.com/object-oriented-html/</guid>
      <pubDate>Sat, 11 Oct 2014 12:00:00 GMT</pubDate>
      <description>There is quite a buzz nowadays (2014) for functional programming and so we all try to move our thinking in a more functional way. Still, the object…</description>
      <content:encoded><![CDATA[<div data-testid="marked" class="prose"><div><p>There is quite a buzz nowadays (2014) for functional programming and so we all try to move our thinking in a more functional way. Still, the object oriented approach seems to be the easiest way to understand and so to program at the end. The object oriented programming can be applied to any structural schematic. One of that structures though that we tend to forget is <code>html</code>. So, let&#x27;s try to visualize it.</p><h2>What is an html object</h2><p>It is not that hard if you think of it as something that you allready know which is the <a href="http://en.wikipedia.org/wiki/Document_Object_Model"><code>DOM</code></a>. If you&#x27;ve written a little bit of javascript you&#x27;ve interacted with it in order to bind functionality to your presentation layer. But it is not only about javascript. To simplify things, think of every html tag as an object. <a href="http://en.wikipedia.org/wiki/Object_composition">Object composition</a> allows objects to contain other objects and there for you can have your <code>document</code> object to contain your paragraph object (<code>p</code>) which contains a banch of <code>text</code>.</p><p>Object signatures may differ based on the type of the html element they describe but they all share some functionality. We can easily find out that the interface below describes all the known html elements:</p><div class="code-block"><pre class="language-java"><code class="language-java"><span class="token keyword">interface</span> <span class="token class-name">Node</span> <span class="token punctuation">{</span>
  <span class="token function">getClassNames</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token operator">:</span> <span class="token class-name">List</span><span class="token generics"><span class="token punctuation">&lt;</span><span class="token class-name">String</span><span class="token punctuation">></span></span>
  <span class="token function">getChilds</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token operator">:</span> <span class="token class-name">List</span><span class="token generics"><span class="token punctuation">&lt;</span><span class="token class-name">Node</span><span class="token punctuation">></span></span>
  <span class="token function">getParent</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token operator">:</span> <span class="token class-name">Node</span>
<span class="token punctuation">}</span></code></pre></div><p>Now the way we represent markup to objects is straigh forward and is not the part of this article. What I am more interested in is this <code>getClassNames()</code> part which can be easily misunderstood. Every html element can have a <code>class</code> attribute where the user can put as many space separated classes as he wants. These classes are then accessible by this <code>getClassNames()</code> method.</p><h3>A css example</h3><p>This is the most important method for us, as developers, as it gives a binding point for styling and behaviour. This can be used in order to add css classes and define the style of the object. As an example, let&#x27;s look at this markup:</p><div class="code-block"><pre class="language-html"><code class="language-html"><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>div</span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>main article white<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>
  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>h1</span><span class="token punctuation">></span></span>The header of the article<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>h1</span><span class="token punctuation">></span></span>
  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>p</span><span class="token punctuation">></span></span>lorem ipsum<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>p</span><span class="token punctuation">></span></span>
<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>div</span><span class="token punctuation">></span></span></code></pre></div><p>In our pseudocode world, the result of the <code>mainArticleDiv.getClassNames()</code> would be the list: <code>[&#x27;main&#x27;, &#x27;article&#x27;, &#x27;white&#x27;]</code>. But this list is not just another attribute of our div. It describes some of the div&#x27;s functionality (styling) and therefor it looks more like metadata of the mainArticleDiv&#x27;s interface rather than data of the interface. Since it is metadata, a list within our class is not the right way to describe them.</p><p>Let&#x27;s make a pause here and go back to our computer science world and specifically to object oriented programming. There you can find the term <a href="http://en.wikipedia.org/wiki/Mixin">mixin</a> which is actually a way to describe a part of the functionality of an object. Assuming that the browser creates a mixin for every defined css class of ours and the fact that <code>Node</code> itself can be a mixin implemented by the browser, we can then describe our div with a class:</p><div class="code-block"><pre class="language-java"><code class="language-java"><span class="token keyword">class</span> <span class="token class-name">MainArticle</span> <span class="token keyword">extends</span> <span class="token class-name">Node</span><span class="token punctuation">,</span> <span class="token class-name">CssMain</span><span class="token punctuation">,</span> <span class="token class-name">CssArticle</span><span class="token punctuation">,</span> <span class="token class-name">CssWhite</span> <span class="token punctuation">{</span>
  <span class="token comment">//Nothing to implement</span>
<span class="token punctuation">}</span></code></pre></div><p>and our <code>Node</code> interface becomes simpler:</p><div class="code-block"><pre class="language-java"><code class="language-java"><span class="token keyword">interface</span> <span class="token class-name">Node</span> <span class="token punctuation">{</span>
  <span class="token function">getChilds</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token operator">:</span> <span class="token class-name">List</span><span class="token generics"><span class="token punctuation">&lt;</span><span class="token class-name">Node</span><span class="token punctuation">></span></span>
  <span class="token function">getParent</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token operator">:</span> <span class="token class-name">Node</span>
<span class="token punctuation">}</span></code></pre></div><p>Now everything looks simpler. You have to still write the metadata in html as we just did, but at least we now can give a representation of an html element in an object oriented way.</p><h3>Javascript: behaviour mixins</h3><p>Now that we can style our node with css mixins, what about adding some behaviour there? This is where javascript is comming. So let&#x27;s say that we have a <code>&lt;button/&gt;</code> that we would like to use in order to show an alert to the user. Assuming that our button is also styled, we can describe this button with the following pseudo class:</p><div class="code-block"><pre class="language-java"><code class="language-java"><span class="token keyword">class</span> <span class="token class-name">AlertMessageButton</span> <span class="token keyword">extends</span> <span class="token class-name">Node</span><span class="token punctuation">,</span> <span class="token class-name">CssButton</span><span class="token punctuation">,</span> <span class="token class-name">CssMessage</span><span class="token punctuation">,</span> <span class="token class-name">AlertMessageAction</span> <span class="token punctuation">{</span>
  <span class="token comment">//Nothing to implement</span>
<span class="token punctuation">}</span></code></pre></div><p>In html that would be something like the below:</p><div class="code-block"><pre class="language-html"><code class="language-html"><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>button</span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>button message action-alert-message<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>Alert!<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>button</span><span class="token punctuation">></span></span></code></pre></div><p>and now all we have to do is to somehow implement this AlertMessageAction mixin. And that would be kinda easy:</p><div class="code-block"><pre class="language-javascript"><code class="language-javascript"><span class="token keyword">function</span> <span class="token function">alertMessage</span><span class="token punctuation">(</span><span class="token parameter">msg</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
  window<span class="token punctuation">.</span><span class="token function">alert</span><span class="token punctuation">(</span>msg<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span></code></pre></div><p>Now all that left is to bind that mixin to the elements&#x27;s <code>action-alert-message</code> class. There is no standart way doing that but with jquery we can do it pretty easy:</p><div class="code-block"><pre class="language-javascript"><code class="language-javascript"><span class="token function">$</span><span class="token punctuation">(</span><span class="token string">'.action-alert-message'</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">click</span><span class="token punctuation">(</span>alertMessage<span class="token punctuation">)</span><span class="token punctuation">;</span></code></pre></div><p>But let&#x27;s pimp our example a little bit more. As you see our mixin needs a <code>msg</code> to show. That means that our <code>AlertMessageButtton</code> should implement a <code>getAlertMessage</code> method or have an <code>alertMessage</code> field (we do not care about how we represent that on the class base). Well what about tweaking a little bit our html:</p><div class="code-block"><pre class="language-html"><code class="language-html"><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>button</span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>button message action-alert-message<span class="token punctuation">"</span></span> <span class="token attr-name">data-alert-message</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>Hi!<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>Alert!<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>button</span><span class="token punctuation">></span></span></code></pre></div><p>And now we are done. We have the <code>classname</code> of our object, the mixins that it is implementing and also some fields with data. Sounds like a proper instance to me.</p><p>One last thing to take care would be the actuall binding of the mixins to the element. The styling is something that our browser takes care of, but the behaviour is something that we should deal with. For that we have to use the hooks provided by our browser and just add our behaviour. With jQuery that would be something like:</p><div class="code-block"><pre class="language-javascript"><code class="language-javascript"><span class="token function">$</span><span class="token punctuation">(</span><span class="token keyword">function</span> <span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">{</span> <span class="token comment">//on document load</span>

  <span class="token comment">// bind our function to the click event of the .action-alert-message</span>
  <span class="token function">$</span><span class="token punctuation">(</span>document<span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">on</span><span class="token punctuation">(</span><span class="token string">'click'</span><span class="token punctuation">,</span> <span class="token string">'.action-alert-message'</span><span class="token punctuation">,</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
    <span class="token keyword">var</span> msg <span class="token operator">=</span> <span class="token function">$</span><span class="token punctuation">(</span><span class="token keyword">this</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">data</span><span class="token punctuation">(</span><span class="token string">'alert-message'</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token function">alertMessage</span><span class="token punctuation">(</span>msg<span class="token punctuation">)</span><span class="token punctuation">;</span>
  <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span>

<span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span></code></pre></div><p>And I guess we are done! Do not try to hack stuff arround anymore. Use classes and mixins the way you should (even if they are kind of restrictive as they are in our html world).</p><h3>But why not to use <code>data</code> atributes as mixin names</h3><p>Well, I believe that this is an opiniated question and therefor I can only give an opiniated answer. Many frameworks are going that way, trying to let the user work with classes in a css central way. My answer to that is why not do the same with css? Why not use <code>data</code> attributes to style your elements?</p><p>As I can not find a straight answer to my question, let&#x27;s say that I just like to have everything properly grouped. Therefor I use the <code>class</code> attribute to define the characteristics of an element and <code>data</code> attribute to give actual data to the element. It just looks much more logical to me, but still opiniated.</p><h2>References</h2><ul><li><a href="http://en.wikipedia.org/wiki/Document_Object_Model">DOM</a></li><li><a href="http://en.wikipedia.org/wiki/Object_composition">Object composition</a></li><li><a href="http://code.tutsplus.com/tutorials/object-oriented-css-what-how-and-why--net-6986">Object-Oriented CSS: What, How, and Why</a></li><li><a href="http://en.wikipedia.org/wiki/Mixin">Mixin</a></li><li><a href="http://stackoverflow.com/questions/918380/abstract-classes-vs-interfaces-vs-mixins">Abstract classes vs. interfaces vs. mixins</a></li></ul></div></div>]]></content:encoded>
    </item>
    <item>
      <title>Unleash your creativity with Angular.JS</title>
      <link>https://valotas.com/ch-open-angularjs-workshop/</link>
      <guid isPermaLink="true">https://valotas.com/ch-open-angularjs-workshop/</guid>
      <pubDate>Sat, 13 Sep 2014 12:00:00 GMT</pubDate>
      <description>On 9th of September Gion Kunz and me ran a workshop for ch/open. The idea was to introduce the basics of angular js so that someone could start experiment…</description>
      <content:encoded><![CDATA[<div data-testid="marked" class="prose"><div><p>On 9th of September <a href="http://mindtheshift.wordpress.com/">Gion Kunz</a> and me ran a workshop for <a href="http://www.ch-open.ch/">ch/open</a>. The idea was to introduce the basics of angular js so that someone could start experiment with it. During the workshop we did some exercises with <a href="http://jsbin.com/">jsbin</a> and hacked together a <a href="https://github.com/gionkunz/md-chat-workshop">chat application</a>.</p><h2>Some notes for the workshop</h2><p>For me that was the first time trying to help people on a subject outside of my colleague/friends cycle. Of course I&#x27;m always more than excited to help, but when you are running a workshop, you always have some stress as the expectations are not the same. After all someone attending the workshop should take back what he came in for as you can not be next to him everyday.</p><p>This is how I started and although the workshop has been announced a little bit late, we tried hard to come up with something that would have been fun to program and educational enough in order to get something useful back.</p><h2>The workshop</h2><p>We started with a very basic introduction to the angular.js framework and an example covering all the aspects that we would talk about. The last was mostly to see how advanced/familiar was the audience with the framework in order to adapt our exercises.</p><h3>The basics</h3><p>This is one of the most difficult things to come up with. Mostly because people tend to have different opinions on what the basics of a framework are but most importantly because there is a huge difference in what you are about to describe in order to teach something. For example someone with a very strong programming background would consider the dependency injection and the providers of angular the basic stuff that someone should know about. After all DI is a fundamental thing in the backend and nowadays is taken for granted. Someone else would want to talk about the binding capabilities of the framework as it is one of the coolest things.</p><p>The problem with either approach though is that you end up explaining theory which takes all the joy of programming away. Therefore we defined as basics some directives that would help us to create something. So, the introduction to the angular world was the <code>ng-app</code>, <code>ng-init</code>,  <code>ng-repeat</code> directives (we considered ng-app a directive) along with expressions. Interestingly enough, all that can help you make a page more interactive. And that is what we did.</p><h3>Some more interesting stuff</h3><p>After that we introduced <code>$scope</code>, <code>ng-controller</code> and <code>ng-model</code> which are the fundamental elements to start creating something useful. To illustrate that we provided yet another todolist example: <a href="http://jsbin.com/cuqoc">http://jsbin.com/cuqoc</a>. Whoever is interested in, can try to do the exercises of the workshop:</p><ul><li>Clear the input after adding the todo to the list</li><li>Initialize the array with some tasks</li><li>Implement a way to clear all the tasks</li><li>Implement a way to delete a specific task</li></ul><p>The important thing here is to understand what is a controller, how is it used and how our model is somehow (or should I say automagically) bound to the html.</p><h3>Architecture. Or where you need DI</h3><p>When you are happy enough to create your own apps, you easily come to the point that your controllers are big enough to be completely unmaintainable. And this is where DI shines. Although a little bit difficult to illustrate the need, you at least can illustrate the coolness of it. That was the last exercise of the introduction to the framework. Modules and factories. We worked again on jsbin: <a href="http://jsbin.com/huguj">http://jsbin.com/huguj</a> and this time the exercises were:</p><ul><li>Modify the service in order to be able to add a task</li><li>Implement a <code>clearAll</code> method (just like the previous example)</li><li>Extract the <code>version</code> into a <code>commons</code> module and use it as a dependency (try it with both other modules)</li><li>Redefine the <code>version</code> value again on the footer module</li></ul><p>Here we would like to find out how we use modules as it is the basic ingredient for an angularjs application. Most of the getting started guides do not talk about it, but it is something the sooner you learn it the better. So we thought it would be better to directly write apps using modules and it is an advise I give to any newcommer to the framework.</p><h2>Markdown chat app</h2><p>Knowing all the above, we could dive more into an application. This time we created a <a href="https://github.com/gionkunz/md-chat-workshop">markdown chat application</a> based mostly on what we learned before. The development was splitted in steps which we could change with the use of <a href="http://git-scm.com/">git</a>. In addition to that we did before we also had the chance to also work with filters and touch the surface of angular.js directives.</p><p>As this example was a little bit bigger we also had the chance to talk about where code should be, something that could only be illustrated with a <a href="http://slides.com/gionkunz/workshop-angular-js#/2/10">graph</a>. But again, theory and practice are only the same in theory, right?</p><p>On top of that you can also see a real use case where DI shines as we jumped from an in memory chat application to a backend based one by just changing implementation of one service. Again for someone coming from the backend world, that would be obvious, but in javascript I never felt that there was something as close to what I&#x27;m used to have on the backend as Angular.</p><h2>What we did not do</h2><p>One thing that I was really uncomfortable with, was the fact that we did not talk about testing. Angular has been built with testing in mind providing you everything that you may need to proceed with that. Still, we could not find enough examples that would be easy enough on their testing part so that we could spend the right time on the actual code. We are working on some ideas though and hope that we&#x27;ll improve on that.</p><h2>References</h2><ul><li><a href="http://slides.com/gionkunz/workshop-angular-js#/">The slides from the presentation</a></li><li><a href="https://github.com/gionkunz/md-chat-workshop">The chat application at github</a></li><li><a href="http://www.ch-open.ch/wstage/workshop-tage/programm-2014/ws-20-unleash-your-creativity-with-angularjs/">ch/open: Unleash Your Creativity with Angular.js</a></li></ul></div></div>]]></content:encoded>
    </item>
    <item>
      <title>Migrated to assemble.io</title>
      <link>https://valotas.com/migrated-to-assemble-io/</link>
      <guid isPermaLink="true">https://valotas.com/migrated-to-assemble-io/</guid>
      <pubDate>Sat, 30 Aug 2014 12:00:00 GMT</pubDate>
      <description>It was about time to get rid of the blogger platform. It serves well up to the point that you feel like your page is overbloated with stuff that you do…</description>
      <content:encoded><![CDATA[<div data-testid="marked" class="prose"><div><p>It was about time to get rid of the <a href="https://www.blogger.com">blogger platform</a>. It serves well up to the point that you feel like your page is overbloated with stuff that you do not need.</p><h2>valotas.com</h2><p>The new home of the blog is now valotas.com and all traffic from blog.valotas.com has been redirected there. The funny thing is that this new home is &quot;hosted&quot; at a <a href="http://www.raspberrypi.org/">Raspberry Pi</a> at my living room. Of course there is a cdn in front of it just in case it goes down, but I do not think that anybody will really care that much if my blog goes down for some minutes/hours (hopefully not days).</p><p>Back to the <a href="https://www.blogger.com">blogger.com</a>. It is a decent platform and a lot have been improved especially on the backend, but this <a href="http://en.wikipedia.org/wiki/WYSIWYG">wysiwyg</a> editor is just killing me. I feel like it is poluting my text rather than transforming it to html. I would even add here proper html as it tends to wrap everything in to divs/spans with no reason. Having worked with <a href="http://daringfireball.net/projects/markdown/">markdown</a>, this thing looks like an overkill. You can always write simple html but then your writting stops being a writting and becomes something else.</p><p>I tried to ignore that, which is not so easy. Having your articles in simple text files is really concice and can be transfered wherever you want. Still as I tend to forget stuff, having everything in one place as an &quot;article repository&quot; (<a href="https://www.blogger.com">blogger</a> in this case) was really handy. Having that in mind I tried to just write my stuff in simple html to keep everything clean. After all I do not write that often. So the authoring part worked pretty ok.</p><p>Then it comes the frontend. I am by no means an html designer, but still I do like simple stuff and the blogger layouts are by no means simple. Creating custom layout looks more like a hack where you have to always conform yourself with what blogger provides you. On top of that you have that javascript stuff that goes with your text that I never felt like checking what they do. Although I did not check, I was visiting my blog regularly from a pc and/or mobile and had some interesting lag. That should not happen at a simple html page right?</p><p>Back to the &quot;article repository&quot;. I felt ok with blogger hosting my articles up to the point that <a href="http://git-scm.com/">git</a> made it&#x27;s debut in to my life. Combine that with <a href="https://github.com/">github</a> and/or <a href="https://bitbucket.org/">bitbucket</a> which both provide a service for git and some how this centralized article repository I had before, stoped being an advantage. In fact the decentralized one started to be more natural to what I had. On top of that you get versioning for free!</p><h2>assmeble.io</h2><p>Having all the above was enough to make me change to something else, but I could not find that something else. <a href="https://pages.github.com/">Github pages</a> would have been a solution, but <a href="http://jekyllrb.com/">jekyll&#x27;s</a> language (<a href="https://www.ruby-lang.org/en/">ruby</a>) would have been yet another one that I had to deal with. In theory I wouldn&#x27;t have to deal with yet another language, but somehow I always find something in a framework that I would like &quot;improved&quot;.</p><p>Having persuaded myself that a static site generator would have been the best solution for my markdown text files (call them articles, pages or blog posts), I had to find something that would fit me. Fit me means, transforming my static text but also allow me to change layouts on demand. This on demand requirement is quite tricky as nobody wants to write plain css anymore nor to write javascript without jshint or tests. So this on demand means something that can blend in to the current css/js tool chain which is <a href="http://gruntjs.com/">grunt</a> or <a href="http://gulpjs.com/">gulp</a>. And this is where <a href="http://assemble.io/">assemble.io</a> comes in to the game.</p><p>In fact the whole site is a simple <a href="https://github.com/valotas/valotas.com">git repository</a> that I can clone, edit and push anytime, anywhere. I have local preview and the deploy is a <code>grunt deploy</code> of my current preview away.</p><p>Surprisingly (or not) the site became much faster (plain html with css and only google analytics as javascript) and it is responsive something that blogger lacks for the moment.</p><p>That is all, enjoy my new web home :)</p></div></div>]]></content:encoded>
    </item>
    <item>
      <title>Why do we need getters and setters ?</title>
      <link>https://valotas.com/getters-and-setters/</link>
      <guid isPermaLink="true">https://valotas.com/getters-and-setters/</guid>
      <pubDate>Sat, 14 Dec 2013 12:00:00 GMT</pubDate>
      <description>Recently I had a look at the Dart programming language and that reminded me of the getters and setters mechanism that someone has with C#. So let's have a…</description>
      <content:encoded><![CDATA[<div data-testid="marked" class="prose"><div><p>Recently I <a href="http://valotas.com/dart-language/">had a look at the Dart programming language</a> and that reminded me of the getters and setters mechanism that someone has with <a href="http://en.wikipedia.org/wiki/C_Sharp_(programming_language)">C#</a>. So let&#x27;s have a look at them.</p><h2>Where we use them</h2><p>Well, the idea in OO languages is very simple. You have a class and you have a property, a field or whatever piece of data that you want to access:</p><div class="code-block"><pre class="language-javascript"><code class="language-javascript"><span class="token keyword">class</span> <span class="token class-name">Person</span> <span class="token punctuation">{</span>
    String name <span class="token operator">=</span> <span class="token keyword">null</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span></code></pre></div><p>You start using this property in other classes:</p><div class="code-block"><pre class="language-javascript"><code class="language-javascript"><span class="token keyword">var</span> george <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Person</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
george<span class="token punctuation">.</span>name <span class="token operator">=</span> <span class="token string">"George"</span><span class="token punctuation">;</span>
assert george<span class="token punctuation">.</span>name <span class="token operator">===</span> <span class="token string">"George"</span><span class="token punctuation">;</span> <span class="token comment">//true</span></code></pre></div><p>Now you need to change your class a little bit. The name property is not enough anymore but you need to define a <code>firstname</code> and <code>lastname</code>. In order to provide backwards compatibility you do not want to just remove the name property. That is straight forward, just return something like <code>firstname username</code> when someone is trying to access the <code>name</code> field. For simplicity we also do not allow any direct updates of the <code>name</code> field. &quot;Speaking&quot; in pseudo code, it would be cool to have the above:</p><div class="code-block"><pre class="language-javascript"><code class="language-javascript"><span class="token keyword">var</span> george <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Person</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
george<span class="token punctuation">.</span>firstname <span class="token operator">=</span> <span class="token string">"George"</span><span class="token punctuation">;</span>
george<span class="token punctuation">.</span>lastname <span class="token operator">=</span> <span class="token string">"Valotasios"</span><span class="token punctuation">;</span>
assert george<span class="token punctuation">.</span>name <span class="token operator">===</span> <span class="token string">"George Valotasios"</span> <span class="token comment">//true</span></code></pre></div><p>Well, something like that is a no-go for java, but there are languages (Scala, C# and Dart to name a few) that allow you to do that. I do not really care about the syntax of the feature but let&#x27;s take dart&#x27;s syntax as an example and provide a solution to our problem:</p><div class="code-block"><pre class="language-javascript"><code class="language-javascript"><span class="token keyword">class</span> <span class="token class-name">Person</span> <span class="token punctuation">{</span>
    String firstname
    String lastname

    <span class="token function">Person</span><span class="token punctuation">(</span><span class="token keyword">this</span><span class="token punctuation">.</span>firstname<span class="token punctuation">,</span> <span class="token keyword">this</span><span class="token punctuation">.</span>lastname<span class="token punctuation">)</span><span class="token punctuation">;</span>

    String <span class="token keyword">get</span> <span class="token parameter">name</span> <span class="token operator">=></span> <span class="token string">"$firstname $lastname"</span>
<span class="token punctuation">}</span>

<span class="token keyword">var</span> george <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Person</span><span class="token punctuation">(</span><span class="token string">"George"</span><span class="token punctuation">,</span> <span class="token string">"Valotasios"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
assert george<span class="token punctuation">.</span>name <span class="token operator">===</span> <span class="token string">"George Valotasios"</span></code></pre></div><h2>Just another method declaration</h2><p>So, what is happening now? Well the vm knows that the class Person does not have the field named <code>name</code> but there is a special method that can be called whenever a someone tries to access the <code>Person</code>&#x27;s <code>name</code> field.</p><p>This is actually what we are forced to do with Java where no such feature exists. The normal way of dealing with data objects in Java is to have only private fields and provide methods named after the field with a <code>get</code> or <code>set</code> prefix. So in java the same class would look like:</p><div class="code-block"><pre class="language-java"><code class="language-java"><span class="token keyword">class</span> <span class="token class-name">Person</span> <span class="token punctuation">{</span>
    <span class="token keyword">private</span> <span class="token class-name">String</span> firstname<span class="token punctuation">;</span>
    <span class="token keyword">private</span> <span class="token class-name">String</span> lastname<span class="token punctuation">;</span>

    <span class="token keyword">public</span> <span class="token class-name">Person</span><span class="token punctuation">(</span><span class="token class-name">String</span> firstname<span class="token punctuation">,</span> <span class="token class-name">String</span> lastname<span class="token punctuation">)</span> <span class="token punctuation">{</span>
        <span class="token keyword">this</span><span class="token punctuation">.</span>firstname <span class="token operator">=</span> firstname<span class="token punctuation">;</span>
        <span class="token keyword">this</span><span class="token punctuation">.</span>lastname <span class="token operator">=</span> lastname<span class="token punctuation">;</span>
    <span class="token punctuation">}</span>

    <span class="token keyword">public</span> <span class="token function">getName</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
        <span class="token keyword">return</span> firstname <span class="token operator">+</span> <span class="token string">" "</span> <span class="token operator">+</span> lastname<span class="token punctuation">;</span>
    <span class="token punctuation">}</span>
<span class="token punctuation">}</span></code></pre></div><p>and making sure that you followed the rule of having private fields, you only end up having to always write some more characters for accessing fields: <code>person.getName()</code> instead of <code>persons.name</code>.</p><p>All in all, till now getters and setters looks like &quot;special&quot; methods. They either have a special name or a special syntax. That speciality allows you to make some assumptions about what is going to happen. But should it be that way?</p><h2>Getters and setters should not be regular methods</h2><p>Getters and setters in general should describe a property of a class. That said they should just update or return that property value. So in theory no computation should happen in them, they should be fast and they should be side-effect free. For simplicity, lets change a little bit the definition of them and apply only two rules:</p><ul><li>they should be fast</li><li>they should have any side-effect other than updating the underlying property (in the case of a setter)</li></ul><p>These two rules are a simplification of the <a href="http://en.wikipedia.org/wiki/Principle_of_least_astonishment">principle of least surprise</a> and tells you for example that you should not do there any IO stuff or spawn new threads or even update any fields other that the one that the name of the setter defines. Still these two rules has been violated even by developers who&#x27;s expertise in a language is not questionable.</p><p>As I can not question their expertise, I can only assume that it easy to just abuse this feature by mistake. But if that is the case, there should at least be some precautions. Static analysis tools have been around for a while, so for sure they can help us there.</p><p>It would be also cooler if the compiler of a language would be able to do the analysis for you as part of the compilation. In that case it makes sense to help the compiler and yourself with a special definition of the feature:</p><ul><li>The compiler will know that it should be stricter with the content of such a method definition</li><li>You will know when and how to use getters and setters</li><li>Prevent newbies from misusing them</li></ul><p>At the end, I do not see the need for a syntactic sugar for a method definitions, if that syntactic sugar only forces assumptions about the underlying execution.</p><h2>Do you really need a getter or a setter?</h2><p>Having said that and assuming that our code provide good implementations of getters and setters, there is still the question of their need.</p><p>A simple mistake that I used to do for example was to just let my IDE create them for me. I ended up having for every class stuff that never needed. In other words, before you use the stuff of your IDE, just make yourself a question: &quot;does a field represent an internal state of your class?&quot;. If so, why do you need to provide a getter or a setter for this?. Even if you have a clear yes for a getter (it could be), question again yourself about the setter. Do you always need to update a property of a class? If not why to provide a setter for it?</p><p>Not all of our object should be <a href="http://en.wikipedia.org/wiki/Data_access_object"><code>DAO</code></a>s and with that exception I hardly have to provide any setters for other object. Apparently even the use of getters is kind of limited outside the scope of a <code>DAO</code>.</p></div></div>]]></content:encoded>
    </item>
    <item>
      <title>Some thoughts on Dart language</title>
      <link>https://valotas.com/dart-language/</link>
      <guid isPermaLink="true">https://valotas.com/dart-language/</guid>
      <pubDate>Sun, 01 Dec 2013 12:00:00 GMT</pubDate>
      <description>So google choose to announce the release of the production ready dart lang at this year's devoxx. That was though mostly a rebrand of the 0.8 version that…</description>
      <content:encoded><![CDATA[<div data-testid="marked" class="prose"><div><p>So google choose to announce the release of the production ready dart lang at this year&#x27;s devoxx. That was though mostly a rebrand of the 0.8 version that was available some weeks earlier but that is marketing.</p><h2>A little bit of background</h2><p>For some reason I  felt like I should try the language earlier so I found a simple project to try to implement it with it. Apparently as dart is at version 1.0, I felt like I should also rebrand my latest branch of <a href="https://github.com/valotas/mustache4dart">mustache4dart</a> to v1.0, but given that I&#x27;ve used it for about a year now, I though that it is the right time to write some things about the language.</p><h2>First impression</h2><p>Unlike most of the new programming languages, this one comes with an IDE (based on Eclipse) and it makes it much more simple to get start with. That was a really good first impression.</p><p>Apart from that, given my java background, I can say that I felt really familiar with the language it self. The syntax has been kept really close to java and C# and it looks like that was on purpose. They really wanted to make it easy for these programmers to be a dart programmers and I can say that they managed to do that. From the other point of view though, I do not know why, at the year 2013, we should be using semicolons on the end of each line at our code.</p><p>Regarding the differences with Java someone could take a look at <a href="https://www.dartlang.org/articles/idiomatic-dart/">this article</a>. I think it describes most of the key features of the language and someone can compare with his own favorite language.</p><h3>Getters and setters</h3><p>A thing that was new to me was the getters and setters of the language, something that you can find with C# but not with Java. To be honest I can not see the need of them as they look like methods and they act like methods, but they should not be used like ones (ex: do not try to perform an IO operation with a getter or setter). In java world the same rule applies with the exception that you must always provide a getter/setter method for each of your fields you would like to be accessible and there is no special syntax for a getter/setter but a naming convention. This thing exists in C# though.</p><p>I personally do not see the need to have yet another syntax for them, but I would like to have them without writing them (thank you <a href="http://projectlombok.org/">project lombok</a>). I know that I&#x27;m biased here but I&#x27;m just used to the java way of dealing with fields and the simple rule: never try to access them directly. C# and Dart gives you the ability to do so, as you can later on change the behaviour of what looks only as a field access.</p><h3>Named parameters</h3><p>A thing that I liked with the language is the ability to have named parameters. This is really cool and something that would make for example the builder pattern in java to go away. I do not now if such a thing exists with C# but given the fact that its progress as a language is much faster than java&#x27;s I wouldn&#x27;t expect not to have something like that.</p><h3>Constructors</h3><p>Another interesting thing is constructors. First they are much more concise which I liked (event though the syntax may look awkword at the beginning). Second each class can have more that one named constructor. I tend to think of them as java&#x27;s <a href="http://stackoverflow.com/questions/13803032/java-constructor-and-static-method">static factory methods</a> but with access to the object itself (there is a <code>this</code> available). So, if we would like to change the name of java&#x27;s pattern, that would be factory methods.</p><p>On top of that, there is the so called <a href="https://www.dartlang.org/articles/idiomatic-dart/#factory-constructors">factory constructor</a> which is an unnamed <a href="http://stackoverflow.com/questions/13803032/java-constructor-and-static-method">static factory method</a>. In any case the introductions of these features are targeting the elimiation of <a href="http://stackoverflow.com/questions/13803032/java-constructor-and-static-method">java&#x27;s object construction patterns</a>. While general this is a good thing (language without patterns), I&#x27;ve already seen the creation of yet another pattern which is the use of a factory constructor only in cooparation with another &quot;internal&quot; named constructor.</p><p>For sure the whole construction thing was a little bit strange at the beginning and I think both java and javascript developers will have to spend sometime until they&#x27;ll learn to use them right.</p><h3>Functions</h3><p>One of the good parts of dart are functions. Yes, the language supports functions as first lever citizens. In fact every object can be used as a function by implementing a call method. That is a good way to introduce the idea of function to a purely object oriented thinking guys. Of course there are also normal named and anonymous functions (lambdas or closures anyone?).</p><p>After all lambdas are finally available to Java and it was for some time in C#. On top of that, Javascript was born with closures and is more functional as a language rather than object oriented. So there is no question, any language trying to replace them or just look familiar with them should support them.</p><h3>Types</h3><p>Another thing that the dart guys tried to advertise is that it is an optionally typed language. So you can start scripting and as soon as you grow you can start using types. This is ofcourse not true. Comming from java, I was always thinking of typed solutions. While developing with dart, I found myself only to drop back to untyped api when I did not want to introduce yet another method for something not so important.</p><p>So I think that the optionally typed part was because it targets also javascript developers. As soon as javascript does not have types it would be hard to enforce them in a new language.</p><h3>Asynchronous programming</h3><p>Another interesting thing with the language is its support for asynchronous programming. Yes, you can do that with any language but good luck with java&#x27;s Future object. When it commes to the ability of writing asynchronous code, javascript way much better than java. What dart did was to take a programming model well known to the javascript world nowadays and standarize it with the use of it&#x27;s <code>Future</code> implementation. Think of it as <a href="http://api.jquery.com/category/deferred-object/">jQuery&#x27;s Deferred</a> object or <a href="https://github.com/kriskowal/q">Q library</a> or as java&#x27;s new <code>CompletableFuture</code> (yes java is catching up there).</p><p>Although I&#x27;m slowly moving to a promise/future based way of thinking for async tasks and I&#x27;m still getting used to it, the api felt like fresh air to me.</p><h2>Some other&#x27;s thoughts</h2><p>Well, I am not a language expert and as it is a new language and it is from google, it is a little bit hard to find any serious arguments against the it. Though, there are some written at the begining of it&#x27;s lifecycle:</p><ul><li><a href="http://blogs.perl.org/users/rafael_garcia-suarez/2011/10/why-dart-is-not-the-language-of-the-future.html">Why dart is not the language of the future</a></li><li><a href="http://www.quirksmode.org/blog/archives/2011/10/dart_or_why_jav.html">Dart; or Why JavaScript has already won</a></li></ul><h2>Final thoughts</h2><p>Just like anything new, it is a little bit hard to say if it will be successful or not. For sure google wants to push it and the whole strategy behind the language is to target as many developers as possible so that they can then push for the adaption of the VM to more browsers.</p><h3>One language to rule them all</h3><p>Dart is targeting the web and that for javascript. There are some blog posts about <a href="http://www.grobmeier.de/10-reasons-why-dart-is-cooler-than-javascript-03012012.html">why it is cooler than javascript syntacticaly</a> and a lot of comments stating that dart is what javascript should have been. Not surprising to me these comments are not coming from the javascript word.</p><p>The best break down of the language till now can be found at <a href="http://www.2ality.com/2011/10/dart-launch.html">this article</a> and I would like to copy what the author wrote:</p><blockquote><p>If you like Java and can&#x27;t get yourself to like JavaScript, you program Dart.</p><p>If you like Ruby and can&#x27;t get yourself to like JavaScript, you program CoffeeScript.</p><p>If you like JavaScript, you program JavaScript.</p></blockquote><p>We like it or not javascript will be with us for a while. All the cool new programming languages targeting the web are getting compiled down to javascript and this can not be changed just by the introduction of a new one.</p><p>One thing though that I did not mention at all is that dart can be also run on the server side which helps a lot for the elimination of duplicated code. We tend nowadays to move most of our &quot;application&quot; code to the browser having stupid (or should I say stateless?) backend, but still, it really hurts me when I have to write input validation code on both the server and the client side.</p><p>For the moment the only solution is, guess what, javascript with <a href="http://nodejs.org/">nodejs</a>. Some could also mention <a href="http://clojure.org/">clojure</a> with <a href="https://github.com/clojure/clojurescript">clojurescript</a>, but do not forget that it still compiles down to javascript. So, I should put Dart to the candidates of the &quot;One language to rule them all&quot; but can not be anything else at the moment but a candidate.</p><h3>The future of Dart</h3><p>Google of course has the resources and the market share (google chrome) to push for such a change. In fact during devoxx it has been said that at some point next year the dart virtual machine will ship with the official version of google chrome. Having said that, do not forget that microsoft tried some years ago to do that too with IE (more than 80% of the market share) and VBScript and just failed.</p><p>On top of that, considering languages that have been developed targeting javascript as a runtime (they compile down to javascript) such as <a href="http://www.typescriptlang.org/">typescript</a>, <a href="http://coffeescript.org/">coffeescript</a> or <a href="https://github.com/clojure/clojurescript">clojurescript</a>, it looks to me that dart falls in to the same category (as it compiles down to javascript) with the only advantage that it will run faster on chrome in the future.</p><p>Given though the fact that it comes with it&#x27;s own vm, it looks more likely to me to see dart being a language for android or <a href="http://www.chromium.org/chromium-os">chrome os</a> or <a href="http://developer.chrome.com/apps/about_apps.html">chome apps</a> and then pushing for being the language for the web, rather than replacing javascript on the web.</p></div></div>]]></content:encoded>
    </item>
    <item>
      <title>An overview of Devoxx 2013</title>
      <link>https://valotas.com/an-overview-of-devoxx-2013/</link>
      <guid isPermaLink="true">https://valotas.com/an-overview-of-devoxx-2013/</guid>
      <pubDate>Thu, 21 Nov 2013 12:00:00 GMT</pubDate>
      <description>Never the less, we'll soon be able to use this new idiomatic feature of java. Apart from that I saw Mark Reinhold's need to state that java is not dead…</description>
      <content:encoded><![CDATA[<div data-testid="marked" class="prose"><div><p>So, devoxx 2013 is over. My first java community (or not) conference is over. The thing is that devoxx is not about java. It is more a technology/programming conference which I personally find even better as you have a better overview of what is going on and what the future will be.</p><h2>Java vs Google</h2><p>Having said that, we must always have in mind that it has its roots in the java world, but I&#x27;m pretty sure that it can make it without it. Just like a lot of parts of google have been built with java, it is not that google cannot live without it. Oh, did I say google, yes, that is maybe because if you take half of the talks out of the conference you end up with... <a href="http://www.angularjs.org/">AngularJS</a> and <a href="http://dartlang.org/">dart</a>. And that is by considering android talks java related. So let&#x27;s dive into what I got from this conference.</p><h3>Java 8 is here</h3><p>I mean, it has not been shipped, but finally the language gets lambda support. That was the most significant thing I took from Mark Reinhold and Brian Goetz. As the last one said, we know that the community has been expecting that for a long time but it was a hard thing to implement something in a way to maintain backwards compatibility.</p><p>Never the less, we&#x27;ll soon be able to use this new idiomatic feature of java. Apart from that I saw Mark Reinhold&#x27;s need to state that java is not dead. It was his closing statement, but it was kinda funny to try to convince 3500 mostly java developers that already paid to attend a java conference that java is not dead. Of course we can take this statement as Oracle&#x27;s submission to the java language and this is quite exciting.</p><p>From the other point of view, he could just be feeling the pressure of the competition (Kotlin, Ceylon, Dart, Clojure, Javascript, Scala, Groovy gave their presence to the conference)</p><h3>IoT</h3><p>In fact one other thing that came to my attention was the <a href="http://en.wikipedia.org/wiki/Internet_of_Things">IoT</a> (Internet of things). I never really thought seriously about it, but it looks like an emerging market (for developers and not only). Java wants to be part of this market and therefore there were some talks regarding this. For sure a thing to keep an eye on.</p><h2>Not only Java</h2><p>As I said before, devoxx is not only java and the proof of that is that two big sponsors of the conference, RedHad and Google, have chosen Devoxx to announce the stable (v1.0) release of their new language. So Redhat announced <a href="http://ceylon-lang.org/">Ceylon</a> and Google announced <a href="http://dartlang.org/">Dart</a>. Guess what, both of them are compiling to this strange bytecode called javascript 😁.</p><p>That is another interesting thing. We do not like javascript but, we write code compiling down to javascript in order to be able to run it everywhere! Any way, I did not follow the ceylon stuff, but I&#x27;ve been following dart for <a href="https://github.com/valotas/mustache4dart">about a year</a> now.</p><h3>Dart</h3><p>So, a language that looks like a hybrid of java and javascript, has its own virtual machine but also compiles down to javascript (or should I say optimized javascript). It&#x27;s supposed to be a language for structured web apps that does not fragment the web browsers more. Yes this is google&#x27;s description.</p><p>Of course I do not know how yet another language for the web will not fragment web browsers. For sure Google will try to push it as much as possible. I cannot think that it has been announced by coincidence at the second day&#x27;s keynote with the title &quot;Shaping the future of web development&quot;. On top of that, I heard Lars Bak saying that soon Chrome browser will get shipped with the dart virtual machine in order to run dart applications natively.</p><h3>AngularJS</h3><p>For sure Dart was the thing for the second day of the conference, but all the previous days google was busy giving talks about the cool javascript framework called <a href="http://www.angularjs.org/">AngularJS</a>. I did not follow most of the talks there as I&#x27;m aware of the framework and used it, but just to give you an Idea of how good it is, google is in the process of porting it to Dart too.</p><p>Given though the fact that the framework is popular enough already, I would not expect 25 talks (that is the number the Java Posse guys counted) being given by almost the same guys.</p><p>Never the less, it is my framework of choice for some time now.</p><h3>Google glasses</h3><p>Last day has been dominated again by google and the google glasses presentation. For some reason I&#x27;m not interested in this so I just picked a more java related thing to attend.</p><h3>Chrome Apps / HTML5 Apps</h3><p>That was the most interesting for me. I did not know that chrome provides you with the tools to create a native app using html5. You can find more info at <a href="http://developer.chrome.com/apps/about_apps.html">here</a>.</p><p>It looks like google wants everything to be done in the browser and that is why dart on chrome makes sense for me. On the long run, as soon as the user gets comfortable with the browser they&#x27;ll just port the browser to <a href="http://www.chromium.org/chromium-os">something else</a>. Of course that means that everything will then be so easily installed to your machine, you&#x27;ll just go to the chrome app store and install. From the other point of view, google will be in charge of all your apps so I would rather go with <a href="https://github.com/rogerwang/node-webkit">something in between</a>. Node-Webkit looks like it&#x27;s trying to do the same thing. Of course you do not have the ease of click and install but you can still have your html5 app running &quot;natively&quot; on your OS of choice.</p><h2>Buzz words</h2><p>A new buzzword to add to my vocabulary is <em>Reactive</em> programming. There were some talks about it. I attended one but Joshua Suereth spent about 20 minutes trying to explain how the java api of the play framework would have been with the new lambda support of java. For sure the worst talk of the conference so far.</p><h2>Room for improvements</h2><p>This is not for criticizing the event, but rather remarks to get better. Some of the talks were more like an advertisement. There is a remedy for that though, filter out the talks where there is no engineer talking.</p><p>The food was bad but again you do not go there for the food. Still, if you want to have fun, just search for <a href="https://twitter.com/search?q=%23devoxx%20salad&amp;src=typd">#devoxx salad</a> at twitter.</p><p>And a remark to Microsoft which surprisingly was one of the main sponsors. Next time come with something cool for developers. <a href="http://www.typescriptlang.org/">Typescript</a> for example, is much more appealing to a software engineer than how Azure works.</p></div></div>]]></content:encoded>
    </item>
    <item>
      <title>Apache Tomcat advanced startup configurations</title>
      <link>https://valotas.com/apache-tomcat-advanced-startup/</link>
      <guid isPermaLink="true">https://valotas.com/apache-tomcat-advanced-startup/</guid>
      <pubDate>Tue, 08 Jan 2013 12:00:00 GMT</pubDate>
      <description>I am always searching for the last tomcat configuration every time I need to deploy a new one, so, here is what I use.</description>
      <content:encoded><![CDATA[<div data-testid="marked" class="prose"><div><p>I am always searching for the last tomcat configuration every time I need to
deploy a new one, so, here is what I use.</p><h2>Common tomcat configuration</h2><p>Tomcat comes with some configuration tools. A command line one and a Window
based one (tomcat6.exe and tomcat6w.exe respectively). Lets use the GUI. One
thing to remember is that the executable should have the same basename with
your service name. So we rename the <code>tomcat6w.exe</code> file to <code>tomcat6020w.exe</code>,
and use it.</p><p>One other thing to mention is that it&#x27;s better not to rename the tomcat6.exe
file as it will be used in order for the service to start up.</p><h3>Java Options</h3><p>What are the most common java options in my opinion:</p><div class="code-block"><pre class="language-plain"><code class="language-plain">-Dcatalina.home=TOMCAT_HOME
-Dcatalina.base=TOMCAT_HOME
-Djava.endorsed.dirs=TOMCAT_HOME\common\endorsed
-Djava.io.tmpdir=TOMCAT_HOME\temp
-Dfile.encoding=UTF-8
-Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager
-Djava.util.logging.config.file=TOMCAT_HOME\conf\logging.properties
-Dcatalina.logbase=C:\SOME\PATH\FOR\LOGS
-XX:+UseConcMarkSweepGC
-XX:+CMSClassUnloadingEnabled
-XX:+CMSPermGenSweepingEnabled
-XX:MaxPermSize=128m</code></pre></div><p>I should add an explanation for each of the properties but it is not the time
yet</p></div></div>]]></content:encoded>
    </item>
    <item>
      <title>Quicker JerseyTest</title>
      <link>https://valotas.com/quicker-jerseytest/</link>
      <guid isPermaLink="true">https://valotas.com/quicker-jerseytest/</guid>
      <pubDate>Mon, 09 Apr 2012 12:00:00 GMT</pubDate>
      <description>That is a quick one. These days I was playing around with Jersey in order to create a rest web service. The thing is that I would like to test what I…</description>
      <content:encoded><![CDATA[<div data-testid="marked" class="prose"><div><p>That is a quick one. These days I was playing around with <a href="http://jersey.java.net/">Jersey</a> in order to create a rest web service. The thing is that I would like to test what I create. The good thing is that Jersey provides a testing framework. But...</p><h2>Jersey test setup</h2><p>As the project I was working on was a mavenized one, all I had to do was to add the dependency:</p><div class="code-block"><pre class="language-xml"><code class="language-xml"><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>dependency</span><span class="token punctuation">></span></span>
  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>groupId</span><span class="token punctuation">></span></span>com.sun.jersey.jersey-test-framework<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>groupId</span><span class="token punctuation">></span></span>
  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>artifactId</span><span class="token punctuation">></span></span>jersey-test-framework-grizzly2<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>artifactId</span><span class="token punctuation">></span></span>
  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>version</span><span class="token punctuation">></span></span>${jersey.version}<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>version</span><span class="token punctuation">></span></span>
  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>scope</span><span class="token punctuation">></span></span>test<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>scope</span><span class="token punctuation">></span></span>
<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>dependency</span><span class="token punctuation">></span></span></code></pre></div><p>As a quick reminder, you can not only use the grizzly web container with the jersey framework, but as I needed some a way to test the actual http api, I went that way initializing everything I would have initialize at a web container with an in memory database.</p><p>So after that you can extend the <code>com.sun.jersey.test.framework.JerseyTest</code> class and use it with jUnit.</p><h2>The problem</h2><p>The problem is that the JesreyTest initializes the webcontainer before each test and shut it down after that. That means that the procedure became real slow and I could not run parallel tests as the testing framework would try to initialize the web container twice causing an exception regarding the address that is already in use.</p><h2>The solution</h2><p>After reading the JerseyTest source code I ended up at the setUp method:</p><div class="code-block"><pre class="language-java"><code class="language-java"><span class="token annotation punctuation">@Before</span>
<span class="token keyword">public</span> <span class="token keyword">void</span> <span class="token function">setUp</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token keyword">throws</span> <span class="token class-name">Exception</span> <span class="token punctuation">{</span>
  tc<span class="token punctuation">.</span><span class="token function">start</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span></code></pre></div><p>but as tc was the <code>com.sun.jersey.test.framework.spi.container.TestContainer</code> class that is getting initialized at the contstractor of the JerseyTest, there was not anything that I could do there!.</p><p>As I used the JerseyTest(AppDescriptor ad) you can see here:</p><div class="code-block"><pre class="language-java"><code class="language-java"><span class="token keyword">public</span> <span class="token class-name">JerseyTest</span><span class="token punctuation">(</span><span class="token class-name">AppDescriptor</span> ad<span class="token punctuation">)</span> <span class="token keyword">throws</span> <span class="token class-name">TestContainerException</span> <span class="token punctuation">{</span>
  <span class="token keyword">this</span><span class="token punctuation">.</span>tc <span class="token operator">=</span> <span class="token function">getContainer</span><span class="token punctuation">(</span>ad<span class="token punctuation">,</span> <span class="token function">getTestContainerFactory</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
  <span class="token keyword">this</span><span class="token punctuation">.</span>client <span class="token operator">=</span> <span class="token function">getClient</span><span class="token punctuation">(</span>tc<span class="token punctuation">,</span> ad<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span></code></pre></div><p>I could change two things. Either the <code>getContainer</code> method or the <code>getTestContainerFactory</code>. From these two, only the second one was protected and could let me do something like that.</p><h3>One TestContainer per AppDescriptor</h3><p>So what I needed was a custom TestContainerFactory that would cache the resulted TestContainer per AppDescriptor. Something like:</p><div class="code-block"><div class="code-title"><a href="https://gist.github.com/valotas/2344641#file-oneperappdescriptortestcontainerfactory-java" target="_blank">OnePerAppDescriptorTestContainerFactory.java</a></div><pre class="language-java"><code class="language-java"><span class="token keyword">class</span> <span class="token class-name">OnePerAppDescriptorTestContainerFactory</span> <span class="token keyword">implements</span> <span class="token class-name">TestContainerFactory</span> <span class="token punctuation">{</span>
  <span class="token keyword">private</span> <span class="token keyword">static</span> <span class="token keyword">final</span> <span class="token class-name">ConcurrentMap</span><span class="token generics"><span class="token punctuation">&lt;</span><span class="token class-name">AppDescriptor</span><span class="token punctuation">,</span> <span class="token class-name">TestContainer</span><span class="token punctuation">></span></span> cache <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">ConcurrentHashMap</span><span class="token generics"><span class="token punctuation">&lt;</span><span class="token class-name">AppDescriptor</span><span class="token punctuation">,</span> <span class="token class-name">TestContainer</span><span class="token punctuation">></span></span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>

  <span class="token keyword">private</span> <span class="token keyword">final</span> <span class="token class-name">TestContainerFactory</span> tcf<span class="token punctuation">;</span>

  <span class="token keyword">public</span> <span class="token class-name">OnePerAppDescriptorTestContainerFactory</span><span class="token punctuation">(</span><span class="token class-name">TestContainerFactory</span> tcf<span class="token punctuation">)</span> <span class="token punctuation">{</span>
    <span class="token keyword">this</span><span class="token punctuation">.</span>tcf <span class="token operator">=</span> tcf<span class="token punctuation">;</span>
  <span class="token punctuation">}</span>

  <span class="token annotation punctuation">@Override</span>
  <span class="token keyword">public</span> <span class="token generics"><span class="token punctuation">&lt;</span><span class="token class-name">T</span> <span class="token keyword">extends</span> <span class="token class-name">AppDescriptor</span><span class="token punctuation">></span></span> <span class="token class-name">Class</span><span class="token generics"><span class="token punctuation">&lt;</span><span class="token class-name">T</span><span class="token punctuation">></span></span> <span class="token function">supports</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
    <span class="token keyword">return</span> tcf<span class="token punctuation">.</span><span class="token function">supports</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
  <span class="token punctuation">}</span>

  <span class="token annotation punctuation">@Override</span>
  <span class="token keyword">public</span> <span class="token class-name">TestContainer</span> <span class="token function">create</span><span class="token punctuation">(</span><span class="token class-name">URI</span> baseUri<span class="token punctuation">,</span> <span class="token class-name">AppDescriptor</span> ad<span class="token punctuation">)</span> <span class="token punctuation">{</span>
    <span class="token keyword">if</span> <span class="token punctuation">(</span>cache<span class="token punctuation">.</span><span class="token function">get</span><span class="token punctuation">(</span>ad<span class="token punctuation">)</span> <span class="token operator">==</span> <span class="token keyword">null</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
      cache<span class="token punctuation">.</span><span class="token function">putIfAbsent</span><span class="token punctuation">(</span>ad<span class="token punctuation">,</span> tcf<span class="token punctuation">.</span><span class="token function">create</span><span class="token punctuation">(</span>baseUri<span class="token punctuation">,</span> ad<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token punctuation">}</span>
    <span class="token keyword">return</span> cache<span class="token punctuation">.</span><span class="token function">get</span><span class="token punctuation">(</span>ad<span class="token punctuation">)</span><span class="token punctuation">;</span>
  <span class="token punctuation">}</span>
<span class="token punctuation">}</span></code></pre></div><p>Now I can wrap any other TestContainerFactory and only use it if I do not have any other TestContainer ready for a given AppDescriptor. The last problem would be a shutdown hook. As I&#x27;m using TestNG the <code>@BeforeSuite</code> with <code>@AfterSuite</code> annotations worked just fine:</p><div class="code-block"><div class="code-title"><a href="https://gist.github.com/valotas/2344641#file-betterjerseytest-java" target="_blank">BetterJerseyTest.java</a></div><pre class="language-java"><code class="language-java"><span class="token keyword">public</span> <span class="token keyword">class</span> <span class="token class-name">BetterJerseyTest</span> <span class="token keyword">extends</span> <span class="token class-name">JerseyTest</span> <span class="token punctuation">{</span>

  <span class="token comment">//Fire up jersey with Guice</span>
  <span class="token keyword">private</span> <span class="token keyword">static</span> <span class="token keyword">final</span> <span class="token class-name">AppDescriptor</span> <span class="token constant">APP_DESCRIPTOR</span> <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">WebAppDescriptor<span class="token punctuation">.</span>Builder</span><span class="token punctuation">(</span><span class="token string">"com.some.package.name"</span><span class="token punctuation">)</span>
    <span class="token punctuation">.</span><span class="token function">filterClass</span><span class="token punctuation">(</span><span class="token class-name">GuiceFilter</span><span class="token punctuation">.</span><span class="token keyword">class</span><span class="token punctuation">)</span>
    <span class="token punctuation">.</span><span class="token function">contextPath</span><span class="token punctuation">(</span><span class="token string">"jersey-ctx-path"</span><span class="token punctuation">)</span>
    <span class="token punctuation">.</span><span class="token function">servletPath</span><span class="token punctuation">(</span><span class="token string">"/"</span><span class="token punctuation">)</span>
    <span class="token punctuation">.</span><span class="token function">clientConfig</span><span class="token punctuation">(</span><span class="token keyword">new</span> <span class="token class-name">DefaultClientConfig</span><span class="token punctuation">(</span><span class="token class-name">JacksonJaxbJsonProvider</span><span class="token punctuation">.</span><span class="token keyword">class</span><span class="token punctuation">)</span><span class="token punctuation">)</span>
    <span class="token punctuation">.</span><span class="token function">build</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>

  <span class="token keyword">public</span> <span class="token class-name">JerseyTestNG</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
    <span class="token keyword">super</span><span class="token punctuation">(</span><span class="token constant">APP_DESCRIPTOR</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
  <span class="token punctuation">}</span>

  <span class="token annotation punctuation">@Override</span>
  <span class="token keyword">protected</span> <span class="token class-name">TestContainerFactory</span> <span class="token function">getTestContainerFactory</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token keyword">throws</span> <span class="token class-name">TestContainerException</span> <span class="token punctuation">{</span>
    <span class="token keyword">return</span> <span class="token keyword">new</span> <span class="token class-name">OnePerAppDescriptorTestContainerFactory</span><span class="token punctuation">(</span><span class="token keyword">super</span><span class="token punctuation">.</span><span class="token function">getTestContainerFactory</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
  <span class="token punctuation">}</span>

  <span class="token annotation punctuation">@BeforeSuite</span>
  <span class="token keyword">public</span> <span class="token keyword">void</span> <span class="token function">initTestContainer</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token keyword">throws</span> <span class="token class-name">Exception</span> <span class="token punctuation">{</span>
    <span class="token function">setUp</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
  <span class="token punctuation">}</span>

  <span class="token annotation punctuation">@AfterSuite</span>
  <span class="token keyword">public</span> <span class="token keyword">void</span> <span class="token function">tearDownTestContainer</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token keyword">throws</span> <span class="token class-name">Exception</span> <span class="token punctuation">{</span>
    <span class="token function">tearDown</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
  <span class="token punctuation">}</span>
<span class="token punctuation">}</span></code></pre></div><p>The jUnit users may have a look <a href="http://stackoverflow.com/questions/82949/before-and-after-suite-execution-hook-in-junit-4-x">here</a> to check how they can implement a shutdown hook or just don&#x27;t at all :-).</p></div></div>]]></content:encoded>
    </item>
    <item>
      <title>Get the output of a jsp or servlet response as String</title>
      <link>https://valotas.com/get-output-of-jsp-or-servlet-response/</link>
      <guid isPermaLink="true">https://valotas.com/get-output-of-jsp-or-servlet-response/</guid>
      <pubDate>Sun, 25 Sep 2011 12:00:00 GMT</pubDate>
      <description>Thanks God, the HttpUrlConnection solution stopped working after changing the network topology of the webapp. So instead of trying to tweak this solution…</description>
      <content:encoded><![CDATA[<div data-testid="marked" class="prose"><div><p>Well, at the first glance the answer to this problem would be to just make an http request to the jsp file and get the output!</p><h2>The problem</h2><p>In fact, many libraries can help you do that and you also have java&#x27;s <a href="http://download.oracle.com/javase/1.4.2/docs/api/java/net/HttpURLConnection.html">HttpUrlConnection</a>. This solution will work in most cases. At least it worked for me but I was never really happy with it. The jsp is within my webapp, why should I make an http connection to my webapp to get the computed output of the jsp? Not to mention that I had to pass all of my parameters again as my jsp could not use the attributes within my current request scope.</p><p>Thanks God, the HttpUrlConnection solution stopped working after changing the network topology of the webapp. So instead of trying to tweak this solution I just thought of the better one as at that point I had the knowledge I needed!</p><h2>The goal</h2><p>So, the goal is to have the web container generate the output and instead of writing to the servlet output, write it to &quot;something else&quot; I had access to. Cool, how to do that? After a little reading you can find out that the container writes the output of the jsp using the writer of <code>HttpServletResponse.getWriter()</code> just like you do when you want to directly write to the output of you response. That happens because after all the jsp&#x27;s are translated into servlets, get compiled and used as plain servlets.</p><h2>The solution</h2><p>Applying some OO patterns, the problem seems strait forward. First of all we need a custom HttpServletResponse where we would provide our custom writer when someone uses the getWriter() method. As for the writer, we need one that we can the access in order to get it&#x27;s content. Again java provides us with this tool and it&#x27;s called <a href="http://download.oracle.com/javase/1.4.2/docs/api/java/io/CharArrayWriter.html">CharArrayWriter</a>. Finally we can use the <a href="http://download.oracle.com/javaee/1.3/api/javax/servlet/http/HttpServletResponseWrapper.html">HttpServletRequestWrapper</a> to decorate our response!</p><div class="code-block"><div class="code-title"><a href="https://gist.github.com/valotas/1240545#file-chararraywriterresponse-java" target="_blank">CharArrayWriterResponse.java</a></div><pre class="language-java"><code class="language-java"><span class="token keyword">import</span> <span class="token import"><span class="token namespace">java<span class="token punctuation">.</span>io<span class="token punctuation">.</span></span><span class="token class-name">CharArrayWriter</span></span><span class="token punctuation">;</span>
<span class="token keyword">import</span> <span class="token import"><span class="token namespace">java<span class="token punctuation">.</span>io<span class="token punctuation">.</span></span><span class="token class-name">IOException</span></span><span class="token punctuation">;</span>
<span class="token keyword">import</span> <span class="token import"><span class="token namespace">java<span class="token punctuation">.</span>io<span class="token punctuation">.</span></span><span class="token class-name">PrintWriter</span></span><span class="token punctuation">;</span>

<span class="token keyword">import</span> <span class="token import"><span class="token namespace">javax<span class="token punctuation">.</span>servlet<span class="token punctuation">.</span>http<span class="token punctuation">.</span></span><span class="token class-name">HttpServletResponse</span></span><span class="token punctuation">;</span>
<span class="token keyword">import</span> <span class="token import"><span class="token namespace">javax<span class="token punctuation">.</span>servlet<span class="token punctuation">.</span>http<span class="token punctuation">.</span></span><span class="token class-name">HttpServletResponseWrapper</span></span><span class="token punctuation">;</span>

<span class="token keyword">public</span> <span class="token keyword">class</span> <span class="token class-name">CharArrayWriterResponse</span> <span class="token keyword">extends</span> <span class="token class-name">HttpServletResponseWrapper</span> <span class="token punctuation">{</span>
	
  <span class="token keyword">private</span> <span class="token keyword">final</span> <span class="token class-name">CharArrayWriter</span> charArray <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">CharArrayWriter</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>

  <span class="token keyword">public</span> <span class="token class-name">CharArrayWriterResponse</span><span class="token punctuation">(</span><span class="token class-name">HttpServletResponse</span> response<span class="token punctuation">)</span> <span class="token punctuation">{</span>
    <span class="token keyword">super</span><span class="token punctuation">(</span>response<span class="token punctuation">)</span><span class="token punctuation">;</span>
  <span class="token punctuation">}</span>

  <span class="token annotation punctuation">@Override</span>
  <span class="token keyword">public</span> <span class="token class-name">PrintWriter</span> <span class="token function">getWriter</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token keyword">throws</span> <span class="token class-name">IOException</span> <span class="token punctuation">{</span>
    <span class="token keyword">return</span> <span class="token keyword">new</span> <span class="token class-name">PrintWriter</span><span class="token punctuation">(</span>charArray<span class="token punctuation">)</span><span class="token punctuation">;</span>
  <span class="token punctuation">}</span>

  <span class="token keyword">public</span> <span class="token class-name">String</span> <span class="token function">getOutput</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
    <span class="token keyword">return</span> charArray<span class="token punctuation">.</span><span class="token function">toString</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
  <span class="token punctuation">}</span>
<span class="token punctuation">}</span></code></pre></div><h2>The wiring</h2><p>Ok done! Now how do I use it? Well, let&#x27;s say that you want to get the output of a jsp file in order to use it for the body of an html email (that was my case). Then you should wrap the actual <code>HttpServletResponse</code> with your&#x27;s and let the servlet container use that one. There is a servlet that does exactly that:</p><div class="code-block"><div class="code-title"><a href="https://gist.github.com/valotas/1240545#file-servletusingcustomresponse-java" target="_blank">ServletUsingCustomResponse.java</a></div><pre class="language-java"><code class="language-java"><span class="token keyword">import</span> <span class="token import"><span class="token namespace">java<span class="token punctuation">.</span>io<span class="token punctuation">.</span></span><span class="token class-name">IOException</span></span><span class="token punctuation">;</span>

<span class="token keyword">import</span> <span class="token import"><span class="token namespace">javax<span class="token punctuation">.</span>servlet<span class="token punctuation">.</span></span><span class="token class-name">ServletException</span></span><span class="token punctuation">;</span>
<span class="token keyword">import</span> <span class="token import"><span class="token namespace">javax<span class="token punctuation">.</span>servlet<span class="token punctuation">.</span>http<span class="token punctuation">.</span></span><span class="token class-name">HttpServlet</span></span><span class="token punctuation">;</span>
<span class="token keyword">import</span> <span class="token import"><span class="token namespace">javax<span class="token punctuation">.</span>servlet<span class="token punctuation">.</span>http<span class="token punctuation">.</span></span><span class="token class-name">HttpServletRequest</span></span><span class="token punctuation">;</span>
<span class="token keyword">import</span> <span class="token import"><span class="token namespace">javax<span class="token punctuation">.</span>servlet<span class="token punctuation">.</span>http<span class="token punctuation">.</span></span><span class="token class-name">HttpServletResponse</span></span><span class="token punctuation">;</span>

<span class="token annotation punctuation">@SuppressWarnings</span><span class="token punctuation">(</span><span class="token string">"serial"</span><span class="token punctuation">)</span>
<span class="token keyword">public</span> <span class="token keyword">class</span> <span class="token class-name">ServletUsingCustomResponse</span> <span class="token keyword">extends</span> <span class="token class-name">HttpServlet</span> <span class="token punctuation">{</span>

  <span class="token annotation punctuation">@Override</span>
  <span class="token keyword">protected</span> <span class="token keyword">void</span> <span class="token function">service</span><span class="token punctuation">(</span><span class="token class-name">HttpServletRequest</span> req<span class="token punctuation">,</span> <span class="token class-name">HttpServletResponse</span> resp<span class="token punctuation">)</span> <span class="token keyword">throws</span> <span class="token class-name">ServletException</span><span class="token punctuation">,</span> <span class="token class-name">IOException</span> <span class="token punctuation">{</span>
    <span class="token class-name">String</span> template <span class="token operator">=</span> req<span class="token punctuation">.</span><span class="token function">getParameter</span><span class="token punctuation">(</span><span class="token string">"tmpl"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>

    <span class="token class-name">CharArrayWriterResponse</span> customResponse  <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">CharArrayWriterResponse</span><span class="token punctuation">(</span>resp<span class="token punctuation">)</span><span class="token punctuation">;</span>
    req<span class="token punctuation">.</span><span class="token function">getRequestDispatcher</span><span class="token punctuation">(</span>template<span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">forward</span><span class="token punctuation">(</span>req<span class="token punctuation">,</span> customResponse<span class="token punctuation">)</span><span class="token punctuation">;</span>

    <span class="token class-name">System</span><span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span><span class="token class-name">String</span><span class="token punctuation">.</span><span class="token function">format</span><span class="token punctuation">(</span><span class="token string">"The output of %s is %s"</span><span class="token punctuation">,</span> template<span class="token punctuation">,</span> customResponse<span class="token punctuation">.</span><span class="token function">getOutput</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
  <span class="token punctuation">}</span>
<span class="token punctuation">}</span></code></pre></div></div></div>]]></content:encoded>
    </item>
    <item>
      <title>Java Decorator pattern example</title>
      <link>https://valotas.com/java-decorator-pattern-example/</link>
      <guid isPermaLink="true">https://valotas.com/java-decorator-pattern-example/</guid>
      <pubDate>Sun, 11 Sep 2011 12:00:00 GMT</pubDate>
      <description>Ok what the hell is the decorator pattern? Why do I need it?</description>
      <content:encoded><![CDATA[<div data-testid="marked" class="prose"><div><p>Ok what the hell is the decorator pattern? Why do I need it?</p><h2>Theory</h2><p>I can not say that I am good explaining theory. I just read it and try to apply it where possible! After all practice and theory, theoretically are exact the same! So If you are intrested in theory, I thing that <a href="http://en.wikipedia.org/wiki/Decorator_pattern">this article at Wikipedia</a> can explain pretty well what it is all about. But if you are like me I do not know if you will remember what exactly is and where to use it if you haven&#x27;t used it at least once!</p><h2>A real example using the Decorator pattern</h2><p>The funny thing is that I&#x27;ve been using this pattern a lot (even if I did not realize it from the first moment) and I&#x27;m pretty sure that many of you have. Where? Within every web application that uses the servlet directly. The scenario is that I want to make sure that when I use the <code>getRemoteAddr()</code> of a request I should always first check if there is an <code>X-Forwarded-For</code> header within the request and if so use that ip address. The solution is a custom <code>HttpServletRequest</code>. The servlet api gives us the tool in order not to have to write a lot of boilerplate code which is called <code>HttpServletRequestWrapper</code>. The class should look like the one below.</p><div class="code-block"><div class="code-title"><a href="https://gist.github.com/valotas/1209461#file-xffawarerequest-java" target="_blank">XFFAwareRequest.java</a></div><pre class="language-java"><code class="language-java"><span class="token keyword">public</span> <span class="token keyword">class</span> <span class="token class-name">XFFAwareReq</span> <span class="token keyword">extends</span> <span class="token class-name">HttpServletRequestWrapper</span> <span class="token punctuation">{</span>
  
  <span class="token keyword">public</span> <span class="token class-name">XFFAwareReq</span><span class="token punctuation">(</span><span class="token class-name">HttpServletRequest</span> request<span class="token punctuation">)</span> <span class="token punctuation">{</span>
    <span class="token keyword">super</span><span class="token punctuation">(</span>request<span class="token punctuation">)</span><span class="token punctuation">;</span>
  <span class="token punctuation">}</span>

  <span class="token annotation punctuation">@Override</span>
  <span class="token keyword">public</span> <span class="token class-name">String</span> <span class="token function">getRemoteAddr</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
    <span class="token class-name">String</span> xff <span class="token operator">=</span> <span class="token function">getXForwardedFor</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token keyword">return</span> xff <span class="token operator">!=</span> <span class="token keyword">null</span> <span class="token operator">?</span> xff <span class="token operator">:</span> <span class="token keyword">super</span><span class="token punctuation">.</span><span class="token function">getRemoteAddr</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
  <span class="token punctuation">}</span>

  <span class="token keyword">public</span> <span class="token class-name">String</span> <span class="token function">getXForwardedFor</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
    <span class="token class-name">String</span> xff <span class="token operator">=</span> <span class="token function">getHeader</span><span class="token punctuation">(</span><span class="token string">"X-Forwarded-For"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token keyword">if</span> <span class="token punctuation">(</span>xff <span class="token operator">==</span> <span class="token keyword">null</span> <span class="token operator">||</span> <span class="token string">""</span><span class="token punctuation">.</span><span class="token function">equals</span><span class="token punctuation">(</span>xff<span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token keyword">return</span> <span class="token keyword">null</span><span class="token punctuation">;</span>
    <span class="token keyword">return</span> <span class="token function">getIpFromXFF</span><span class="token punctuation">(</span>xff<span class="token punctuation">)</span><span class="token punctuation">;</span>
  <span class="token punctuation">}</span>

  <span class="token keyword">protected</span> <span class="token keyword">static</span> <span class="token keyword">final</span> <span class="token class-name">String</span> <span class="token function">getIpFromXFF</span><span class="token punctuation">(</span><span class="token class-name">String</span> xff<span class="token punctuation">)</span> <span class="token punctuation">{</span>
   <span class="token comment">//extract and return the ip from the X-Forwarded-For header</span>
  <span class="token punctuation">}</span>
<span class="token punctuation">}</span></code></pre></div><p>If you are also intrested in how to actually use it,that is with a Servlet filter:</p><div class="code-block"><div class="code-title"><a href="https://gist.github.com/valotas/1209461#file-httpservletrequestdecoratorfilter-java" target="_blank">HttpServletRequestDecoratorFilter.java</a></div><pre class="language-java"><code class="language-java"><span class="token keyword">public</span> <span class="token keyword">class</span> <span class="token class-name">HttpServletRequestDecoratorFilter</span> <span class="token keyword">implements</span> <span class="token class-name">Filter</span> <span class="token punctuation">{</span>
  <span class="token annotation punctuation">@Override</span>
  <span class="token keyword">public</span> <span class="token keyword">void</span> <span class="token function">init</span><span class="token punctuation">(</span><span class="token class-name">FilterConfig</span> filterConfig<span class="token punctuation">)</span> <span class="token keyword">throws</span> <span class="token class-name">ServletException</span> <span class="token punctuation">{</span>
    <span class="token comment">//do nothing</span>
  <span class="token punctuation">}</span>

  <span class="token annotation punctuation">@Override</span>
  <span class="token keyword">public</span> <span class="token keyword">void</span> <span class="token function">doFilter</span><span class="token punctuation">(</span><span class="token class-name">ServletRequest</span> request<span class="token punctuation">,</span> <span class="token class-name">ServletResponse</span> response<span class="token punctuation">,</span> <span class="token class-name">FilterChain</span> chain<span class="token punctuation">)</span> <span class="token keyword">throws</span> <span class="token class-name">IOException</span><span class="token punctuation">,</span> <span class="token class-name">ServletException</span> <span class="token punctuation">{</span>
    
    request <span class="token operator">=</span> <span class="token function">decorate</span><span class="token punctuation">(</span>request<span class="token punctuation">)</span><span class="token punctuation">;</span>
    chain<span class="token punctuation">.</span><span class="token function">doFilter</span><span class="token punctuation">(</span>request<span class="token punctuation">,</span> response<span class="token punctuation">)</span><span class="token punctuation">;</span>
  <span class="token punctuation">}</span>

  <span class="token keyword">private</span> <span class="token class-name">ServletRequest</span> <span class="token function">decorate</span><span class="token punctuation">(</span><span class="token class-name">ServletRequest</span> request<span class="token punctuation">)</span> <span class="token punctuation">{</span>
    <span class="token keyword">try</span> <span class="token punctuation">{</span>
      <span class="token class-name">HttpServletRequest</span> req <span class="token operator">=</span> <span class="token punctuation">(</span><span class="token class-name">HttpServletRequest</span><span class="token punctuation">)</span> request<span class="token punctuation">;</span>
      <span class="token keyword">return</span> <span class="token keyword">new</span> <span class="token class-name">XFFAwareReq</span><span class="token punctuation">(</span>req<span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token punctuation">}</span>
    <span class="token keyword">catch</span> <span class="token punctuation">(</span><span class="token class-name">ClassCastException</span> e<span class="token punctuation">)</span> <span class="token punctuation">{</span>
      <span class="token comment">// As we are not able to cast the request to an Http one, we just return the same object</span>
      <span class="token keyword">return</span> request<span class="token punctuation">;</span>
    <span class="token punctuation">}</span>
  <span class="token punctuation">}</span>

  <span class="token annotation punctuation">@Override</span>
  <span class="token keyword">public</span> <span class="token keyword">void</span> <span class="token function">destroy</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
    <span class="token comment">// Do nothing</span>
  <span class="token punctuation">}</span>
<span class="token punctuation">}</span></code></pre></div><p>Cool, but where is the power of decoration? We just wrapped a class providing some more logic to it. Well, the other day you have the request to prevent your site from <a href="http://en.wikipedia.org/wiki/Cross-site_scripting">xss attacks</a>. A way to do that is to filter the request parameters and strip or escape bad characters or group of characters. Of cource we can just add some functionality to our existing class (XFFAwareRequest) and also rename it to reflect the new functionality added. This solution thought breaks the principle of <a href="http://en.wikipedia.org/wiki/Separation_of_concerns">separation of concerns</a>. What we do then? Easy, create another decorator to provide the new functionality (and only that) overriding the getParameter method and replacing or removing the bad stuff.</p><div class="code-block"><div class="code-title"><a href="https://gist.github.com/valotas/1209461#file-xssawarereq-java" target="_blank">XSSAwareReq.java</a></div><pre class="language-java"><code class="language-java"><span class="token keyword">public</span> <span class="token keyword">class</span> <span class="token class-name">XSSAwareReq</span> <span class="token keyword">extends</span> <span class="token class-name">HttpServletRequestWrapper</span> <span class="token punctuation">{</span>

  <span class="token keyword">protected</span> <span class="token class-name">XSSAwareReq</span><span class="token punctuation">(</span><span class="token class-name">HttpServletRequest</span> req<span class="token punctuation">)</span> <span class="token punctuation">{</span>
    <span class="token keyword">super</span><span class="token punctuation">(</span>req<span class="token punctuation">)</span><span class="token punctuation">;</span>
  <span class="token punctuation">}</span>

  <span class="token annotation punctuation">@Override</span>
  <span class="token keyword">public</span> <span class="token class-name">String</span> <span class="token function">getParameter</span><span class="token punctuation">(</span><span class="token class-name">String</span> name<span class="token punctuation">)</span> <span class="token punctuation">{</span>
    <span class="token keyword">return</span> <span class="token keyword">super</span><span class="token punctuation">.</span><span class="token function">getParameter</span><span class="token punctuation">(</span>name<span class="token punctuation">)</span>
      <span class="token punctuation">.</span><span class="token function">replaceAll</span><span class="token punctuation">(</span><span class="token string">"&lt;"</span><span class="token punctuation">,</span> <span class="token string">"&amp;lt;"</span><span class="token punctuation">)</span>
      <span class="token punctuation">.</span><span class="token function">replaceAll</span><span class="token punctuation">(</span><span class="token string">">"</span><span class="token punctuation">,</span> <span class="token string">"&amp;gt;"</span><span class="token punctuation">)</span>
      <span class="token punctuation">.</span><span class="token function">replaceAll</span><span class="token punctuation">(</span><span class="token string">"\\("</span><span class="token punctuation">,</span> <span class="token string">"&amp;#40;"</span><span class="token punctuation">)</span>
      <span class="token punctuation">.</span><span class="token function">replaceAll</span><span class="token punctuation">(</span><span class="token string">"\\)"</span><span class="token punctuation">,</span> <span class="token string">"&amp;#41;"</span><span class="token punctuation">)</span>
      <span class="token punctuation">.</span><span class="token function">replaceAll</span><span class="token punctuation">(</span><span class="token string">"'"</span><span class="token punctuation">,</span> <span class="token string">"&amp;#39;"</span><span class="token punctuation">)</span>
      <span class="token punctuation">.</span><span class="token function">replaceAll</span><span class="token punctuation">(</span><span class="token string">"eval\\((.*)\\)"</span><span class="token punctuation">,</span> <span class="token string">""</span><span class="token punctuation">)</span>
      <span class="token punctuation">.</span><span class="token function">replaceAll</span><span class="token punctuation">(</span><span class="token string">"[\\\"\\\'][\\s]*javascript:(.*)[\\\"\\\']"</span><span class="token punctuation">,</span> <span class="token string">"\"\""</span><span class="token punctuation">)</span>
      <span class="token punctuation">.</span><span class="token function">replaceAll</span><span class="token punctuation">(</span><span class="token string">"script"</span><span class="token punctuation">,</span> <span class="token string">""</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
  <span class="token punctuation">}</span>
<span class="token punctuation">}</span></code></pre></div><p>Then all you have to do is to decorate a little bit more the first HttpServletRequest which is as easy as adding the line <code>req = new XSSAwaareReq(req)</code> before the <code>return new XFFAwareReq(req);</code> one letting the XFFAwareRequest untouchable and not breaking for example existing tests! Now you know that you&#x27;ve used the decorator pattern with in your web apps!</p></div></div>]]></content:encoded>
    </item>
    <item>
      <title>Scrap websites with nodejs!</title>
      <link>https://valotas.com/scrap-websites-with-nodejs/</link>
      <guid isPermaLink="true">https://valotas.com/scrap-websites-with-nodejs/</guid>
      <pubDate>Sat, 27 Aug 2011 12:00:00 GMT</pubDate>
      <description>I really wanted to experiment a little bit with nodejs.</description>
      <content:encoded><![CDATA[<div data-testid="marked" class="prose"><div><p>I really wanted to experiment a little bit with nodejs.</p><h2>Target</h2><p>So some days ago a friend of mine told me that he used a cool <a href="http://scrapy.org/">python library</a> in order to scrap from a site the information he wanted to! So that sounded to me like a very good exercise!</p><h2>Solution</h2><p>The idea is to use jQuery powerful selectors to extract whatever I wanted to from an html page. If I can do that, I can also extract the url of the next page and the put the mechanism to work again for the that page! The code I finally had to write was about 50 lines!</p><div class="code-block"><div class="code-title"><a href="https://gist.github.com/valotas/1175447#file-scrapy-js" target="_blank">scrapy.js</a></div><pre class="language-javascript"><code class="language-javascript"><span class="token keyword">var</span> jsdom <span class="token operator">=</span> <span class="token function">require</span><span class="token punctuation">(</span> <span class="token string">'jsdom'</span> <span class="token punctuation">)</span><span class="token punctuation">,</span>
	<span class="token comment">//fs = require( 'fs' )</span>
	<span class="token comment">//underscore = fs.readFileSync( './underscore.js' ).toString(),</span>
	<span class="token function-variable function">scrapy</span> <span class="token operator">=</span> <span class="token keyword">function</span><span class="token punctuation">(</span> <span class="token parameter">conf<span class="token punctuation">,</span> counter</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span>
		<span class="token keyword">var</span> url <span class="token operator">=</span> conf<span class="token punctuation">.</span>url <span class="token operator">||</span> <span class="token keyword">null</span><span class="token punctuation">,</span>
			getNextUrl <span class="token operator">=</span> conf<span class="token punctuation">.</span>getNextUrl <span class="token operator">||</span> <span class="token keyword">null</span><span class="token punctuation">,</span>
			filterPage <span class="token operator">=</span> conf<span class="token punctuation">.</span>filterPage <span class="token operator">||</span> <span class="token keyword">null</span><span class="token punctuation">,</span>
			finalDone <span class="token operator">=</span> conf<span class="token punctuation">.</span>done <span class="token operator">||</span> <span class="token keyword">null</span><span class="token punctuation">,</span>
			counter <span class="token operator">=</span> counter <span class="token operator">||</span> <span class="token number">1</span><span class="token punctuation">,</span>
			<span class="token function-variable function">done</span> <span class="token operator">=</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
				counter<span class="token operator">--</span><span class="token punctuation">;</span>
				<span class="token keyword">if</span> <span class="token punctuation">(</span> counter <span class="token operator">===</span> <span class="token number">0</span> <span class="token operator">&amp;&amp;</span> finalDone <span class="token operator">!==</span> <span class="token keyword">null</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
					<span class="token function">finalDone</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
				<span class="token punctuation">}</span>
			<span class="token punctuation">}</span><span class="token punctuation">;</span>

		jsdom<span class="token punctuation">.</span><span class="token function">env</span><span class="token punctuation">(</span><span class="token punctuation">{</span>
			<span class="token literal-property property">html</span><span class="token operator">:</span> url<span class="token punctuation">,</span>
			<span class="token literal-property property">scripts</span><span class="token operator">:</span> <span class="token punctuation">[</span> <span class="token string">'http://code.jquery.com/jquery-1.5.min.js'</span> <span class="token punctuation">]</span><span class="token punctuation">,</span>
			<span class="token function-variable function">done</span><span class="token operator">:</span> <span class="token keyword">function</span><span class="token punctuation">(</span> <span class="token parameter">errors<span class="token punctuation">,</span> window</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span>
				<span class="token keyword">if</span> <span class="token punctuation">(</span> errors <span class="token punctuation">)</span> <span class="token punctuation">{</span>
					console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span> errors <span class="token punctuation">)</span><span class="token punctuation">;</span>
				<span class="token punctuation">}</span>
				<span class="token keyword">var</span> $ <span class="token operator">=</span> window<span class="token punctuation">.</span>$<span class="token punctuation">,</span>
					nexturl<span class="token punctuation">;</span>

				<span class="token comment">// First of all try to scrap the next url available</span>
				<span class="token keyword">if</span> <span class="token punctuation">(</span> getNextUrl <span class="token punctuation">)</span> <span class="token punctuation">{</span>
					nexturl <span class="token operator">=</span> <span class="token function">getNextUrl</span><span class="token punctuation">(</span> $ <span class="token punctuation">)</span><span class="token punctuation">;</span>
					<span class="token keyword">if</span> <span class="token punctuation">(</span> nexturl <span class="token punctuation">)</span> <span class="token punctuation">{</span>
						<span class="token function">scrapy</span><span class="token punctuation">(</span> <span class="token punctuation">{</span> 
							<span class="token literal-property property">url</span><span class="token operator">:</span> nexturl<span class="token punctuation">,</span> <span class="token comment">//getNextUrl( $ ), </span>
							<span class="token literal-property property">getNextUrl</span><span class="token operator">:</span> getNextUrl<span class="token punctuation">,</span>
							<span class="token literal-property property">filterPage</span><span class="token operator">:</span> filterPage<span class="token punctuation">,</span>
							<span class="token literal-property property">done</span><span class="token operator">:</span> done <span class="token punctuation">}</span><span class="token punctuation">,</span> counter<span class="token operator">++</span>	 <span class="token punctuation">)</span><span class="token punctuation">;</span>
					<span class="token punctuation">}</span>
				<span class="token punctuation">}</span>

				<span class="token keyword">if</span> <span class="token punctuation">(</span> filterPage <span class="token punctuation">)</span> <span class="token punctuation">{</span>
					<span class="token function">filterPage</span><span class="token punctuation">(</span> $ <span class="token punctuation">)</span><span class="token punctuation">;</span>
				<span class="token punctuation">}</span>
				<span class="token keyword">else</span> <span class="token punctuation">{</span>
					console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span> <span class="token string">'No filterPage available'</span> <span class="token punctuation">)</span><span class="token punctuation">;</span>
				<span class="token punctuation">}</span>
				
				<span class="token function">done</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
			<span class="token punctuation">}</span>
		<span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
		<span class="token comment">//console.log( 'Done with scrap of ' + url);</span>
	<span class="token punctuation">}</span><span class="token punctuation">;</span>

exports<span class="token punctuation">.</span>scrapy <span class="token operator">=</span> scrapy<span class="token punctuation">;</span></code></pre></div><p>The conf argument that scrapy function expects should have a url (the page we want to filter), a <code>filterPage</code> function that filters the page and a findNext function that filters the page to find the next url that should be scraped. If you want to you can also provide a done function which will get called only when all the scraps will finish! Here is an example:</p><div class="code-block"><div class="code-title"><a href="https://gist.github.com/valotas/1175447#file-run-js" target="_blank">run.js</a></div><pre class="language-javascript"><code class="language-javascript"><span class="token keyword">var</span> scrapy <span class="token operator">=</span> <span class="token function">require</span><span class="token punctuation">(</span><span class="token string">'./scrapy.js'</span><span class="token punctuation">)</span><span class="token punctuation">.</span>scrapy<span class="token punctuation">,</span>

	<span class="token function-variable function">getAdFromTD</span> <span class="token operator">=</span> <span class="token keyword">function</span><span class="token punctuation">(</span> <span class="token parameter">$td</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span>
		<span class="token keyword">var</span> ad <span class="token operator">=</span> <span class="token punctuation">{</span>
				<span class="token literal-property property">title</span><span class="token operator">:</span> $td<span class="token punctuation">.</span><span class="token function">find</span><span class="token punctuation">(</span><span class="token string">'a'</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">html</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">replace</span><span class="token punctuation">(</span><span class="token regex"><span class="token regex-delimiter">/</span><span class="token regex-source language-regex">\s*$</span><span class="token regex-delimiter">/</span><span class="token regex-flags">g</span></span><span class="token punctuation">,</span> <span class="token string">''</span><span class="token punctuation">)</span>
			<span class="token punctuation">}</span><span class="token punctuation">,</span>
			type<span class="token punctuation">;</span>

		$td <span class="token operator">=</span> $td<span class="token punctuation">.</span><span class="token function">next</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
		ad<span class="token punctuation">.</span>address <span class="token operator">=</span> $td<span class="token punctuation">.</span><span class="token function">find</span><span class="token punctuation">(</span><span class="token string">'a'</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">html</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">replace</span><span class="token punctuation">(</span> <span class="token regex"><span class="token regex-delimiter">/</span><span class="token regex-source language-regex">&lt;br></span><span class="token regex-delimiter">/</span><span class="token regex-flags">g</span></span><span class="token punctuation">,</span> <span class="token string">','</span> <span class="token punctuation">)</span><span class="token punctuation">;</span>

		$td <span class="token operator">=</span> $td<span class="token punctuation">.</span><span class="token function">next</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
		type <span class="token operator">=</span> $td<span class="token punctuation">.</span><span class="token function">find</span><span class="token punctuation">(</span><span class="token string">'a'</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">html</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">split</span><span class="token punctuation">(</span> <span class="token string">'&lt;br>'</span> <span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">//.replace(/&lt;br>/g, ',').replace(/\n|\s{2,}/g, ''),</span>
		ad<span class="token punctuation">.</span>rooms <span class="token operator">=</span> type<span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span><span class="token punctuation">.</span><span class="token function">replace</span><span class="token punctuation">(</span> <span class="token regex"><span class="token regex-delimiter">/</span><span class="token regex-source language-regex">\sRooms[\n|\s]+</span><span class="token regex-delimiter">/</span><span class="token regex-flags">g</span></span><span class="token punctuation">,</span>  <span class="token string">''</span> <span class="token punctuation">)</span><span class="token punctuation">;</span>
		ad<span class="token punctuation">.</span>floor <span class="token operator">=</span> type<span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">.</span><span class="token function">replace</span><span class="token punctuation">(</span> <span class="token regex"><span class="token regex-delimiter">/</span><span class="token regex-source language-regex">.\s Floor</span><span class="token regex-delimiter">/</span><span class="token regex-flags">g</span></span><span class="token punctuation">,</span> <span class="token string">''</span> <span class="token punctuation">)</span><span class="token punctuation">;</span>
		ad<span class="token punctuation">.</span>space <span class="token operator">=</span> type<span class="token punctuation">[</span><span class="token number">2</span><span class="token punctuation">]</span><span class="token punctuation">.</span><span class="token function">replace</span><span class="token punctuation">(</span> <span class="token regex"><span class="token regex-delimiter">/</span><span class="token regex-source language-regex">[\n|\s]+$</span><span class="token regex-delimiter">/</span><span class="token regex-flags">g</span></span><span class="token punctuation">,</span> <span class="token string">''</span> <span class="token punctuation">)</span><span class="token punctuation">;</span>

		$td <span class="token operator">=</span> $td<span class="token punctuation">.</span><span class="token function">next</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
		type <span class="token operator">=</span> $td<span class="token punctuation">.</span><span class="token function">find</span><span class="token punctuation">(</span><span class="token string">'a'</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">html</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">split</span><span class="token punctuation">(</span><span class="token string">'&lt;br>'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">//.replace(/&lt;br>/g, ',').replace(/\n|\s{2,}/g, '');</span>
		ad<span class="token punctuation">.</span>type <span class="token operator">=</span> type<span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span><span class="token punctuation">.</span><span class="token function">replace</span><span class="token punctuation">(</span> <span class="token regex"><span class="token regex-delimiter">/</span><span class="token regex-source language-regex">[\n|\s]+$</span><span class="token regex-delimiter">/</span><span class="token regex-flags">g</span></span><span class="token punctuation">,</span> <span class="token string">''</span> <span class="token punctuation">)</span><span class="token punctuation">;</span>
		ad<span class="token punctuation">.</span>build <span class="token operator">=</span> type<span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">.</span><span class="token function">replace</span><span class="token punctuation">(</span> <span class="token regex"><span class="token regex-delimiter">/</span><span class="token regex-source language-regex">[\n|\s]+$</span><span class="token regex-delimiter">/</span><span class="token regex-flags">g</span></span><span class="token punctuation">,</span> <span class="token string">''</span> <span class="token punctuation">)</span><span class="token punctuation">;</span>
		ad<span class="token punctuation">.</span>price <span class="token operator">=</span> type<span class="token punctuation">[</span><span class="token number">2</span><span class="token punctuation">]</span><span class="token punctuation">;</span>

		<span class="token keyword">return</span> ad<span class="token punctuation">;</span>
	<span class="token punctuation">}</span><span class="token punctuation">,</span>
	ads <span class="token operator">=</span> <span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token punctuation">;</span> 

<span class="token function">scrapy</span><span class="token punctuation">(</span> <span class="token punctuation">{</span>
		<span class="token literal-property property">url</span><span class="token operator">:</span> <span class="token string">"http://www.homegate.ch/rent/apartment-and-house/region-zuerich/matching-list?a=default&amp;tab=list&amp;l=default&amp;cid=1585974&amp;ao=&amp;am=Z%C3%BCrich&amp;ep=1&amp;ac=1.5&amp;ad=2.0&amp;incsubs=default&amp;tid=1&amp;fromItem=ctn-zh&amp;ag=1000&amp;ah=2000&amp;be="</span><span class="token punctuation">,</span>
		<span class="token function-variable function">getNextUrl</span><span class="token operator">:</span> <span class="token keyword">function</span><span class="token punctuation">(</span> <span class="token parameter">$</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span>
				<span class="token keyword">return</span> <span class="token function">$</span><span class="token punctuation">(</span><span class="token string">'a.forward.iconLink'</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">attr</span><span class="token punctuation">(</span> <span class="token string">'href'</span> <span class="token punctuation">)</span><span class="token punctuation">;</span>
			<span class="token punctuation">}</span><span class="token punctuation">,</span>
		<span class="token function-variable function">filterPage</span><span class="token operator">:</span> <span class="token keyword">function</span><span class="token punctuation">(</span> <span class="token parameter">$</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span>
				<span class="token function">$</span><span class="token punctuation">(</span><span class="token string">'#objectList tr'</span><span class="token punctuation">)</span>
					<span class="token punctuation">.</span><span class="token function">each</span><span class="token punctuation">(</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
						<span class="token keyword">var</span> $td <span class="token operator">=</span> <span class="token function">$</span><span class="token punctuation">(</span> <span class="token keyword">this</span> <span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">find</span><span class="token punctuation">(</span> <span class="token string">'.tdTitle'</span> <span class="token punctuation">)</span><span class="token punctuation">,</span>
							ad<span class="token punctuation">;</span>
				
						<span class="token keyword">if</span> <span class="token punctuation">(</span> $td<span class="token punctuation">.</span><span class="token function">size</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">==</span> <span class="token number">1</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
							ad <span class="token operator">=</span> <span class="token function">getAdFromTD</span><span class="token punctuation">(</span> $td <span class="token punctuation">)</span><span class="token punctuation">;</span> 
							ads<span class="token punctuation">.</span><span class="token function">push</span><span class="token punctuation">(</span> ad <span class="token punctuation">)</span><span class="token punctuation">;</span>
							console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span> ad <span class="token punctuation">)</span><span class="token punctuation">;</span>
						<span class="token punctuation">}</span>
					<span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
				console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span> <span class="token string">'Found '</span> <span class="token operator">+</span> ads<span class="token punctuation">.</span>length<span class="token punctuation">)</span><span class="token punctuation">;</span>
			<span class="token punctuation">}</span><span class="token punctuation">,</span>
		<span class="token function-variable function">done</span><span class="token operator">:</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
				console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span> <span class="token string">'Done! found '</span> <span class="token operator">+</span> ads<span class="token punctuation">.</span>length <span class="token operator">+</span> <span class="token string">' ads in total!'</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
			<span class="token punctuation">}</span> 
		<span class="token punctuation">}</span> <span class="token punctuation">)</span><span class="token punctuation">;</span></code></pre></div></div></div>]]></content:encoded>
    </item>
    <item>
      <title>Grizzly 2 with guice 3</title>
      <link>https://valotas.com/grizzly-2-with-guice-3/</link>
      <guid isPermaLink="true">https://valotas.com/grizzly-2-with-guice-3/</guid>
      <pubDate>Mon, 30 May 2011 12:00:00 GMT</pubDate>
      <description>Playing with grizzly and guice. Considering that you already have a ServletModule and and a GuiceServletContextListener defined the above code should do…</description>
      <content:encoded><![CDATA[<div data-testid="marked" class="prose"><div><p>Playing with grizzly and guice. Considering that you already have a <code>ServletModule</code> and and a <code>GuiceServletContextListener</code> defined the above code should do the job.</p><h2>The code</h2><p>First a handler</p><div class="code-block"><div class="code-title"><a href="https://gist.github.com/valotas/999051#file-guicehandler-java" target="_blank">GuiceHandler.java</a></div><pre class="language-java"><code class="language-java"><span class="token keyword">import</span> <span class="token import"><span class="token namespace">javax<span class="token punctuation">.</span>servlet<span class="token punctuation">.</span></span><span class="token class-name">ServletContextEvent</span></span><span class="token punctuation">;</span>

<span class="token keyword">import</span> <span class="token import"><span class="token namespace">org<span class="token punctuation">.</span>glassfish<span class="token punctuation">.</span>grizzly<span class="token punctuation">.</span>servlet<span class="token punctuation">.</span></span><span class="token class-name">ServletHandler</span></span><span class="token punctuation">;</span>

<span class="token keyword">import</span> <span class="token import"><span class="token namespace">com<span class="token punctuation">.</span>google<span class="token punctuation">.</span>inject<span class="token punctuation">.</span>servlet<span class="token punctuation">.</span></span><span class="token class-name">GuiceFilter</span></span><span class="token punctuation">;</span>
<span class="token keyword">import</span> <span class="token import"><span class="token namespace">com<span class="token punctuation">.</span>google<span class="token punctuation">.</span>inject<span class="token punctuation">.</span>servlet<span class="token punctuation">.</span></span><span class="token class-name">GuiceServletContextListener</span></span><span class="token punctuation">;</span>

<span class="token keyword">public</span> <span class="token keyword">class</span> <span class="token class-name">GuiceHandler</span> <span class="token keyword">extends</span> <span class="token class-name">ServletHandler</span> <span class="token punctuation">{</span>
  <span class="token keyword">private</span> <span class="token keyword">static</span> <span class="token keyword">final</span> <span class="token class-name">Logger</span> logger <span class="token operator">=</span> <span class="token class-name">Logger</span><span class="token punctuation">.</span><span class="token function">getLogger</span><span class="token punctuation">(</span><span class="token class-name">GuiceHandler</span><span class="token punctuation">.</span><span class="token keyword">class</span><span class="token punctuation">.</span><span class="token function">getName</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
  <span class="token keyword">private</span> <span class="token keyword">final</span> <span class="token class-name">GuiceServletContextListener</span> guiceServletContextListener<span class="token punctuation">;</span>

  <span class="token keyword">public</span> <span class="token class-name">GuiceHandler</span><span class="token punctuation">(</span><span class="token class-name">GuiceServletContextListener</span> guiceServletContextListener<span class="token punctuation">)</span> <span class="token punctuation">{</span>
    <span class="token keyword">this</span><span class="token punctuation">.</span>guiceServletContextListener <span class="token operator">=</span> guiceServletContextListener<span class="token punctuation">;</span>
    <span class="token function">addFilter</span><span class="token punctuation">(</span><span class="token keyword">new</span> <span class="token class-name">GuiceFilter</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token string">"guiceFilter"</span><span class="token punctuation">,</span> <span class="token keyword">null</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
  <span class="token punctuation">}</span>

  <span class="token annotation punctuation">@Override</span>
  <span class="token keyword">public</span> <span class="token keyword">void</span> <span class="token function">start</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
    <span class="token keyword">if</span> <span class="token punctuation">(</span>logger<span class="token punctuation">.</span><span class="token function">isLoggable</span><span class="token punctuation">(</span><span class="token class-name">Level</span><span class="token punctuation">.</span><span class="token constant">INFO</span><span class="token punctuation">)</span><span class="token punctuation">)</span> logger<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span><span class="token class-name">Level</span><span class="token punctuation">.</span><span class="token constant">INFO</span><span class="token punctuation">,</span> <span class="token class-name">String</span><span class="token punctuation">.</span><span class="token function">format</span><span class="token punctuation">(</span><span class="token string">"Starting %s"</span><span class="token punctuation">,</span> <span class="token class-name">GuiceHandler</span><span class="token punctuation">.</span><span class="token keyword">class</span><span class="token punctuation">.</span><span class="token function">getSimpleName</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    guiceServletContextListener<span class="token punctuation">.</span><span class="token function">contextInitialized</span><span class="token punctuation">(</span><span class="token keyword">new</span> <span class="token class-name">ServletContextEvent</span><span class="token punctuation">(</span><span class="token function">getServletCtx</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token keyword">super</span><span class="token punctuation">.</span><span class="token function">start</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
  <span class="token punctuation">}</span>

  <span class="token annotation punctuation">@Override</span>
  <span class="token keyword">public</span> <span class="token keyword">void</span> <span class="token function">destroy</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
    <span class="token keyword">super</span><span class="token punctuation">.</span><span class="token function">destroy</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    guiceServletContextListener<span class="token punctuation">.</span><span class="token function">contextDestroyed</span><span class="token punctuation">(</span><span class="token keyword">new</span> <span class="token class-name">ServletContextEvent</span><span class="token punctuation">(</span><span class="token function">getServletCtx</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token keyword">if</span> <span class="token punctuation">(</span>logger<span class="token punctuation">.</span><span class="token function">isLoggable</span><span class="token punctuation">(</span><span class="token class-name">Level</span><span class="token punctuation">.</span><span class="token constant">INFO</span><span class="token punctuation">)</span><span class="token punctuation">)</span> logger<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span><span class="token class-name">Level</span><span class="token punctuation">.</span><span class="token constant">INFO</span><span class="token punctuation">,</span> <span class="token class-name">String</span><span class="token punctuation">.</span><span class="token function">format</span><span class="token punctuation">(</span><span class="token string">"Destroyed %s"</span><span class="token punctuation">,</span> <span class="token class-name">GuiceHandler</span><span class="token punctuation">.</span><span class="token keyword">class</span><span class="token punctuation">.</span><span class="token function">getSimpleName</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
  <span class="token punctuation">}</span>
<span class="token punctuation">}</span></code></pre></div><p>and the webserver:</p><div class="code-block"><div class="code-title"><a href="https://gist.github.com/valotas/999051#file-webserver-java" target="_blank">WebServer.java</a></div><pre class="language-java"><code class="language-java"><span class="token keyword">import</span> <span class="token import"><span class="token namespace">java<span class="token punctuation">.</span>io<span class="token punctuation">.</span></span><span class="token class-name">IOException</span></span><span class="token punctuation">;</span>

<span class="token keyword">import</span> <span class="token import"><span class="token namespace">org<span class="token punctuation">.</span>glassfish<span class="token punctuation">.</span>grizzly<span class="token punctuation">.</span>http<span class="token punctuation">.</span>server<span class="token punctuation">.</span></span><span class="token class-name">HttpServer</span></span><span class="token punctuation">;</span>
<span class="token keyword">import</span> <span class="token import"><span class="token namespace">org<span class="token punctuation">.</span>glassfish<span class="token punctuation">.</span>grizzly<span class="token punctuation">.</span>servlet<span class="token punctuation">.</span></span><span class="token class-name">ServletHandler</span></span><span class="token punctuation">;</span>

<span class="token keyword">public</span> <span class="token keyword">class</span> <span class="token class-name">WebServer</span> <span class="token punctuation">{</span>

  <span class="token keyword">public</span> <span class="token keyword">static</span> <span class="token keyword">void</span> <span class="token function">main</span><span class="token punctuation">(</span><span class="token class-name">String</span><span class="token punctuation">[</span><span class="token punctuation">]</span> args<span class="token punctuation">)</span> <span class="token punctuation">{</span>
    <span class="token class-name">HttpServer</span> server <span class="token operator">=</span> <span class="token class-name">HttpServer</span><span class="token punctuation">.</span><span class="token function">createSimpleServer</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>

    <span class="token class-name">ServletHandler</span> handler <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">GuiceHandler</span><span class="token punctuation">(</span><span class="token keyword">new</span> <span class="token class-name">Live24WebApp</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    server<span class="token punctuation">.</span><span class="token function">getServerConfiguration</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">addHttpHandler</span><span class="token punctuation">(</span>handler<span class="token punctuation">,</span> <span class="token string">"/*"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>

    <span class="token keyword">try</span> <span class="token punctuation">{</span>
      server<span class="token punctuation">.</span><span class="token function">start</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
      <span class="token class-name">System</span><span class="token punctuation">.</span>in<span class="token punctuation">.</span><span class="token function">read</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
      server<span class="token punctuation">.</span><span class="token function">stop</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token punctuation">}</span>
    <span class="token keyword">catch</span> <span class="token punctuation">(</span><span class="token class-name">IOException</span> e<span class="token punctuation">)</span> <span class="token punctuation">{</span>
      e<span class="token punctuation">.</span><span class="token function">printStackTrace</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token punctuation">}</span>
  <span class="token punctuation">}</span>
<span class="token punctuation">}</span></code></pre></div><p>Still have to test it as I only had a simple servlet working!</p></div></div>]]></content:encoded>
    </item>
    <item>
      <title>Tomcat init.d script</title>
      <link>https://valotas.com/tomcat-initd-script/</link>
      <guid isPermaLink="true">https://valotas.com/tomcat-initd-script/</guid>
      <pubDate>Sat, 14 May 2011 12:00:00 GMT</pubDate>
      <description>For some reason allmost all the init.d scripts for starting and stoping tomcat just calls tomcat's startup.sh and shutdown.sh scripts. I am ok with that…</description>
      <content:encoded><![CDATA[<div data-testid="marked" class="prose"><div><p>For some reason allmost all the <code>init.d</code> scripts for starting and stoping tomcat just calls tomcat&#x27;s <code>startup.sh</code> and <code>shutdown.sh</code> scripts. I am ok with that as far as they work. The startup script works just fine but when I want to restart or stop a tomcat instance, in most cases I have to just kill the process.</p><h2>A solution</h2><p>So what I need is a way to try stop tomcat with it&#x27;s shutdown script, wait a little bit to see if tomcat shutdown and if not just kill the process. The script below does exactly that.</p><div class="code-block"><div class="code-title"><a href="https://gist.github.com/valotas/1000094#file-tomcat-sh" target="_blank">tomcat.sh</a></div><pre class="language-plain"><code class="language-plain">#!/bin/bash
#
# tomcat7     This shell script takes care of starting and stopping Tomcat
#
# chkconfig: - 80 20
#
### BEGIN INIT INFO
# Provides: tomcat7
# Required-Start: $network $syslog
# Required-Stop: $network $syslog
# Default-Start:
# Default-Stop:
# Description: Release implementation for Servlet 2.5 and JSP 2.1
# Short-Description: start and stop tomcat
### END INIT INFO

## Source function library.
#. /etc/rc.d/init.d/functions
export JAVA_HOME=/usr/java/default
export JAVA_OPTS="-Dfile.encoding=UTF-8 \
  -Dcatalina.logbase=/var/log/tomcat7 \
  -Dnet.sf.ehcache.skipUpdateCheck=true \
  -XX:+DoEscapeAnalysis \
  -XX:+UseConcMarkSweepGC \
  -XX:+CMSClassUnloadingEnabled \
  -XX:+UseParNewGC \
  -XX:MaxPermSize=128m \
  -Xms512m -Xmx512m"
export PATH=$JAVA_HOME/bin:$PATH
TOMCAT_HOME=/usr/share/tomcat7
SHUTDOWN_WAIT=20

tomcat_pid() {
  echo `ps aux | grep org.apache.catalina.startup.Bootstrap | grep -v grep | awk '{ print $2 }'`
}

start() {
  pid=$(tomcat_pid)
  if [ -n "$pid" ] 
  then
    echo "Tomcat is already running (pid: $pid)"
  else
    # Start tomcat
    echo "Starting tomcat"
    ulimit -n 100000
    umask 007
    /bin/su -p -s /bin/sh tomcat $TOMCAT_HOME/bin/startup.sh
  fi


  return 0
}

stop() {
  pid=$(tomcat_pid)
  if [ -n "$pid" ]
  then
    echo "Stoping Tomcat"
    /bin/su -p -s /bin/sh tomcat $TOMCAT_HOME/bin/shutdown.sh

    let kwait=$SHUTDOWN_WAIT
    count=0;
    until [ `ps -p $pid | grep -c $pid` = '0' ] || [ $count -gt $kwait ]
    do
      echo -n -e "\nwaiting for processes to exit";
      sleep 1
      let count=$count+1;
    done

    if [ $count -gt $kwait ]; then
      echo -n -e "\nkilling processes which didn't stop after $SHUTDOWN_WAIT seconds"
      kill -9 $pid
    fi
  else
    echo "Tomcat is not running"
  fi
 
  return 0
}

case $1 in
start)
  start
;; 
stop)   
  stop
;; 
restart)
  stop
  start
;;
status)
  pid=$(tomcat_pid)
  if [ -n "$pid" ]
  then
    echo "Tomcat is running with pid: $pid"
  else
    echo "Tomcat is not running"
  fi
;; 
esac    
exit 0</code></pre></div><p>It would be much better to have a pid file at start time and use that one and not try to figure out the pid from ps. Maybe next version.</p></div></div>]]></content:encoded>
    </item>
    <item>
      <title>Resteasy Form annotations for Jersey</title>
      <link>https://valotas.com/resteasy-form-annotation-for-jersey/</link>
      <guid isPermaLink="true">https://valotas.com/resteasy-form-annotation-for-jersey/</guid>
      <pubDate>Sun, 16 Jan 2011 12:00:00 GMT</pubDate>
      <description>Lately I was developing a jax-rs application. What I really like with jaxrs is the way you can handle any kind of parameter values of a request using…</description>
      <content:encoded><![CDATA[<div data-testid="marked" class="prose"><div><p>Lately I was developing a jax-rs application. What I really like with jaxrs is the way you can handle any kind of parameter values of a request using annotations. So when I need a query parameter I just annotate a field or an argument of a Resource class with <code>@QueryParam(&quot;paramName&quot;)</code> and the parameter value will get injected for me.</p><h2>The problem</h2><p>The problem arise when you want to handle a lot of parameters. This is the scenario of an html form posted by a user. In that case you can end up injecting a lot of <code>@FormParam</code> witch isn&#x27;t the most maintainable code you can write (As <a href="http://www.amazon.com/Clean-Code-Handbook-Software-Craftsmanship/dp/0132350882/ref=sr_1_1?ie=UTF8&amp;qid=1295183417&amp;sr=8-1">Uncle Bob</a> says, avoid methods with arguments). There is of course a solutions which is called the Builder pattern or the Facroty pattern.</p><p><a href="http://www.jboss.org/resteasy">Resteasy</a> jaxrs offers you such an implementation out of the box. Just create a class that will work as a simple data transfer object, annotate their getters or fields with @*Param annotations and use it at a Resource class annotated with the <a href="http://docs.jboss.org/resteasy/docs/1.2.GA/userguide/html/_Form.html"><code>@Form</code> annotation</a>.</p><p>Unfortunately <a href="http://jersey.java.net/">Jersey</a> did not provide something like that out of the box. At least some google research did not give me anything valuable. That lead me to try to find a solution. That means that I wanted a way to inject a custom class in a jaxrs resource. The class should get generated by a factory provided by me</p><p>The real solution to the problem is: <a href="http://blog.valotas.com/2011/01/resteasy-form-annotation-for-jersey.html#jersey_solution"><code>InjectParam</code></a> but I didn&#x27;t find it before trying to do what I describe below.</p><h2>A Jersey solution</h2><p>After a small research found that a custom jersey @Provider will do the job just fine. So, we start with the our data transfer object class. We consider that we want to create an object holding the information:</p><div class="code-block"><pre class="language-java"><code class="language-java"><span class="token keyword">public</span> <span class="token keyword">class</span> <span class="token class-name">ContactFormParams</span> <span class="token punctuation">{</span>
  <span class="token keyword">private</span> <span class="token class-name">String</span> name<span class="token punctuation">;</span>
  <span class="token keyword">private</span> <span class="token class-name">String</span> email<span class="token punctuation">;</span>
  <span class="token keyword">private</span> <span class="token class-name">String</span> comments<span class="token punctuation">;</span>

  <span class="token comment">// Getters and setters...</span>
<span class="token punctuation">}</span></code></pre></div><p>Jersey provides a way of injecting custom classes to a resource class. In order to do that we should provide Jersey with that information. The way to do it is the <a href="http://jersey.java.net/nonav/apidocs/latest/jersey/com/sun/jersey/spi/inject/Injectable.html">Injectable interface</a>.</p><div class="code-block"><pre class="language-java"><code class="language-java"><span class="token keyword">import</span> <span class="token import"><span class="token namespace">com<span class="token punctuation">.</span>sun<span class="token punctuation">.</span>jersey<span class="token punctuation">.</span>api<span class="token punctuation">.</span>core<span class="token punctuation">.</span></span><span class="token class-name">HttpContext</span></span><span class="token punctuation">;</span>
<span class="token keyword">import</span> <span class="token import"><span class="token namespace">javax<span class="token punctuation">.</span>ws<span class="token punctuation">.</span>rs<span class="token punctuation">.</span>core<span class="token punctuation">.</span></span><span class="token class-name">Context</span></span><span class="token punctuation">;</span>

<span class="token keyword">public</span> <span class="token keyword">class</span> <span class="token class-name">ContactFormParamsProvider</span> <span class="token keyword">implements</span> <span class="token class-name">Injectable</span><span class="token generics"><span class="token punctuation">&lt;</span><span class="token class-name">ContactFormParams</span><span class="token punctuation">></span></span> <span class="token punctuation">{</span>
  <span class="token annotation punctuation">@Context</span> <span class="token class-name">HttpContext</span> ctx
  <span class="token keyword">public</span> <span class="token class-name">ContactFormParams</span> <span class="token function">getValue</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
      <span class="token comment">// Create and return a ContactFormParams based on parameters</span>
      <span class="token comment">// we can get from the ctx which Jersey will inject for us</span>
  <span class="token punctuation">}</span>
<span class="token punctuation">}</span></code></pre></div><p>In order to make our life a little bit easier we are going to use <code>com.sun.jersey.server.impl.inject.AbstractHttpContextInjectable</code> witch is not part of the Jersey API but the Jersey implementation itself:</p><div class="code-block"><pre class="language-java"><code class="language-java"><span class="token keyword">import</span> <span class="token import"><span class="token namespace">com<span class="token punctuation">.</span>sun<span class="token punctuation">.</span>jersey<span class="token punctuation">.</span>api<span class="token punctuation">.</span>core<span class="token punctuation">.</span></span><span class="token class-name">HttpContext</span></span><span class="token punctuation">;</span>

<span class="token keyword">public</span> <span class="token keyword">class</span> <span class="token class-name">ContactFormParamsProvider</span> 
  <span class="token keyword">extends</span> <span class="token class-name">AbstractHttpContextInjectable</span><span class="token generics"><span class="token punctuation">&lt;</span><span class="token class-name">ContactFormParams</span><span class="token punctuation">></span></span> <span class="token punctuation">{</span>
  <span class="token annotation punctuation">@Ovveride</span>
  <span class="token keyword">public</span> <span class="token class-name">ContactFormParams</span> <span class="token function">getValue</span><span class="token punctuation">(</span><span class="token class-name">HttpContext</span> ctx<span class="token punctuation">)</span> <span class="token punctuation">{</span>
    <span class="token comment">// Create and return a ContactFormParams based on parameters</span>
    <span class="token comment">// we can get from the ctx which Jersey will inject for us</span>
  <span class="token punctuation">}</span>
<span class="token punctuation">}</span></code></pre></div><p>Ok, we now have a factory that creates ContactFormParams for as and can get injected by Jersey. But in order be able to actually inject that class we must also provide an <a href="http://jersey.java.net/nonav/apidocs/latest/jersey/com/sun/jersey/spi/inject/InjectableProvider.html">InjectableProvider</a>. That tells jersey what kind of a factory should use in order to eject a value. We are going to use the same class for this:</p><div class="code-block"><pre class="language-java"><code class="language-java"><span class="token keyword">import</span> <span class="token import"><span class="token namespace">com<span class="token punctuation">.</span>sun<span class="token punctuation">.</span>jersey<span class="token punctuation">.</span>api<span class="token punctuation">.</span>core<span class="token punctuation">.</span></span><span class="token class-name">HttpContext</span></span><span class="token punctuation">;</span>

<span class="token annotation punctuation">@Provider</span> <span class="token comment">// Tell jersey that this class is a provider</span>
<span class="token keyword">public</span> <span class="token keyword">class</span> <span class="token class-name">ContactFormParamsProvider</span> 
  <span class="token keyword">extends</span> <span class="token class-name">AbstractHttpContextInjectable</span><span class="token generics"><span class="token punctuation">&lt;</span><span class="token class-name">ContactFormParams</span><span class="token punctuation">></span></span> 
  <span class="token keyword">implements</span> <span class="token class-name">InjectableProvider</span><span class="token generics"><span class="token punctuation">&lt;</span><span class="token class-name">Context</span><span class="token punctuation">,</span> <span class="token class-name">Type</span><span class="token punctuation">></span></span> <span class="token punctuation">{</span>

  <span class="token annotation punctuation">@Ovveride</span>
  <span class="token keyword">public</span> <span class="token class-name">ContactFormParams</span> <span class="token function">getValue</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
    <span class="token comment">// Create and return a ContactFormParams based on parameters</span>
    <span class="token comment">// we can get from the ctx which Jersey will inject for us</span>
  <span class="token punctuation">}</span>

  <span class="token comment">// InjectableProvider implementation:</span>
  <span class="token keyword">public</span> <span class="token class-name">ComponentScope</span> <span class="token function">getScope</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
    <span class="token keyword">return</span> <span class="token class-name">ComponentScope<span class="token punctuation">.</span>Singleton</span><span class="token punctuation">;</span>
  <span class="token punctuation">}</span>

  <span class="token keyword">public</span> <span class="token class-name">Injectable</span> <span class="token function">getInjectable</span><span class="token punctuation">(</span><span class="token class-name">ComponentContext</span> ic<span class="token punctuation">,</span> <span class="token class-name">Context</span> ctx<span class="token punctuation">,</span> <span class="token class-name">Type</span> c<span class="token punctuation">)</span> <span class="token punctuation">{</span>
    <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token class-name">ContactFormParams</span><span class="token punctuation">.</span><span class="token keyword">class</span><span class="token punctuation">.</span><span class="token function">equals</span><span class="token punctuation">(</span>c<span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token keyword">return</span> <span class="token keyword">this</span><span class="token punctuation">;</span>

    <span class="token comment">// In any other case:</span>
    <span class="token keyword">return</span> <span class="token keyword">null</span><span class="token punctuation">;</span>
  <span class="token punctuation">}</span>
<span class="token punctuation">}</span></code></pre></div><p>Finally add this class to the Singleton set of your Application subclass and you can use the <code>@Context</code> annotation wherever you want with a ContactFormParams class and it will get created an injected for you:</p><div class="code-block"><pre class="language-java"><code class="language-java"><span class="token annotation punctuation">@Path</span><span class="token punctuation">(</span><span class="token string">"/contact"</span><span class="token punctuation">)</span> <span class="token comment">// Tell jersey that this class is a provider</span>
<span class="token keyword">public</span> <span class="token keyword">class</span> <span class="token class-name">SimpleContactFormController</span> <span class="token punctuation">{</span> 
  <span class="token annotation punctuation">@Post</span>
  <span class="token keyword">public</span> <span class="token class-name">String</span> <span class="token function">getValue</span><span class="token punctuation">(</span><span class="token annotation punctuation">@Context</span> <span class="token class-name">ContactFormParam</span> formParameters<span class="token punctuation">)</span> <span class="token punctuation">{</span>
    <span class="token comment">// Use formParameters</span>
    <span class="token keyword">return</span> <span class="token string">"Some answer!"</span>
  <span class="token punctuation">}</span>
<span class="token punctuation">}</span></code></pre></div><h2>DRY</h2><p>Done! After that boilerplate code I have what resteasy gives me out of the box! I have to make it more abstract! A custom annotation (maybe <code>@Form</code>) that gives the same functionality with resteasy&#x27;s <code>@Form</code>. After a research and mailing list reading came up with <code>InjectParam</code> annotation which seems to be for Jerset exactly what <code>@Form</code> annotation is for resteasy:</p><div class="code-block"><pre class="language-java"><code class="language-java"><span class="token keyword">public</span> <span class="token keyword">class</span> <span class="token class-name">ContactFormParams</span> <span class="token punctuation">{</span>
  <span class="token annotation punctuation">@FormParam</span><span class="token punctuation">(</span><span class="token string">"name"</span><span class="token punctuation">)</span>
  <span class="token keyword">private</span> <span class="token class-name">String</span> name<span class="token punctuation">;</span>
  <span class="token annotation punctuation">@FormParam</span><span class="token punctuation">(</span><span class="token string">"email"</span><span class="token punctuation">)</span>
  <span class="token keyword">private</span> <span class="token class-name">String</span> email<span class="token punctuation">;</span>
  <span class="token annotation punctuation">@FormParam</span><span class="token punctuation">(</span><span class="token string">"comments"</span><span class="token punctuation">)</span>
  <span class="token keyword">private</span> <span class="token class-name">String</span> comments<span class="token punctuation">;</span>

  <span class="token comment">// Getters and setters...</span>
<span class="token punctuation">}</span>

<span class="token comment">//The resource class:</span>
<span class="token annotation punctuation">@Path</span><span class="token punctuation">(</span><span class="token string">"/contact"</span><span class="token punctuation">)</span> <span class="token comment">// Tell jersey that this class is a provider</span>
<span class="token keyword">public</span> <span class="token keyword">class</span> <span class="token class-name">SimpleContactFormController</span> <span class="token punctuation">{</span> 
  <span class="token annotation punctuation">@Post</span>
  <span class="token keyword">public</span> <span class="token class-name">String</span> <span class="token function">getValue</span><span class="token punctuation">(</span><span class="token annotation punctuation">@InjectParam</span> <span class="token class-name">ContactFormParam</span> formParameters<span class="token punctuation">)</span> <span class="token punctuation">{</span>
    <span class="token comment">// Use formParameters</span>
    <span class="token keyword">return</span> <span class="token string">"Some answer!"</span>
  <span class="token punctuation">}</span>
<span class="token punctuation">}</span></code></pre></div><h2>Conclusion</h2><p>Is it just me or Jersey really lacks documentation?</p><h2>References</h2><ul><li><a href="http://blogs.sun.com/sandoz/entry/ejb_injection">http://blogs.sun.com/sandoz/entry/ejb_injection</a></li><li><a href="http://codahale.com/what-makes-jersey-interesting-injection-providers/">http://codahale.com/what-makes-jersey-interesting-injection-providers/</a></li></ul></div></div>]]></content:encoded>
    </item>
    <item>
      <title>Hibernate, mssql and limit</title>
      <link>https://valotas.com/hibernate-mssql-and-limit/</link>
      <guid isPermaLink="true">https://valotas.com/hibernate-mssql-and-limit/</guid>
      <pubDate>Thu, 08 Jul 2010 12:00:00 GMT</pubDate>
      <description>This is a strange combination. Not the hibernate with mssql (and any kind of sql) but the mssql server and limit clause. Yes Sql Server never supported…</description>
      <content:encoded><![CDATA[<div data-testid="marked" class="prose"><div><p>This is a strange combination. Not the hibernate with mssql (and any kind of
sql) but the mssql server and limit clause. Yes Sql Server never supported the
limit clause (and will probably never will). Of course there is workarounds
for this until the 2005 version came out witch provide as the <code>ROW_NUMBER()</code>
function. This can give solution to our problem witch again isn&#x27;t as elegant
as the limit clause used by MySql for example.</p><h2>Hibernate dialect</h2><p>Unfortunately hibernate does not make use of this function in order to get
paginated data (as we can see <a href="http://opensource.atlassian.com/projects/hibernate/browse/HHH-2655">here</a>).
Instead uses top to get the first x data and then a scrollable result to only
fetch what the user needs. After downloading the classes and experimenting with
them I ended up with the class bellow witch is a mix of the ones someone can
find at the provided link.</p><div class="code-block"><pre class="language-java"><code class="language-java"><span class="token keyword">import</span> <span class="token import"><span class="token namespace">java<span class="token punctuation">.</span>sql<span class="token punctuation">.</span></span><span class="token class-name">Types</span></span><span class="token punctuation">;</span>

<span class="token keyword">import</span> <span class="token import"><span class="token namespace">org<span class="token punctuation">.</span>hibernate<span class="token punctuation">.</span>dialect<span class="token punctuation">.</span></span><span class="token class-name">SQLServerDialect</span></span><span class="token punctuation">;</span>

<span class="token comment">/**
 * Modified version based on the work found at {@link http://opensource.atlassian.com/projects/hibernate/browse/HHH-2655}
 *
 */</span>
<span class="token keyword">public</span> <span class="token keyword">class</span> <span class="token class-name">SqlServer2008Dialect</span> <span class="token keyword">extends</span> <span class="token class-name">SQLServerDialect</span> <span class="token punctuation">{</span>

  <span class="token keyword">public</span> <span class="token class-name">SqlServer2008Dialect</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
    <span class="token keyword">super</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token function">registerColumnType</span><span class="token punctuation">(</span><span class="token class-name">Types</span><span class="token punctuation">.</span><span class="token constant">VARCHAR</span><span class="token punctuation">,</span> <span class="token number">1073741823</span><span class="token punctuation">,</span> <span class="token string">"NVARCHAR(MAX)"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token function">registerColumnType</span><span class="token punctuation">(</span><span class="token class-name">Types</span><span class="token punctuation">.</span><span class="token constant">VARCHAR</span><span class="token punctuation">,</span> <span class="token number">2147483647</span><span class="token punctuation">,</span> <span class="token string">"VARCHAR(MAX)"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token function">registerColumnType</span><span class="token punctuation">(</span><span class="token class-name">Types</span><span class="token punctuation">.</span><span class="token constant">VARBINARY</span><span class="token punctuation">,</span> <span class="token number">2147483647</span><span class="token punctuation">,</span> <span class="token string">"VARBINARY(MAX)"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
  <span class="token punctuation">}</span>


  <span class="token comment">/**
   * Add a LIMIT clause to the given SQL SELECT
   *
   * The LIMIT SQL will look like:
   *
   * WITH query AS (SELECT ROW_NUMBER() OVER (ORDER BY orderby) as __hibernate_row_nr__, original_query_without_orderby)
   * SELECT * FROM query WHERE __hibernate_row_nr__ BEETWIN offset AND offset + last
   * --ORDER BY __hibernate_row_nr__: Don't think that wee need this last order by clause
   *


   * @param querySqlString
   *            The SQL statement to base the limit query off of.
   * @param offset
   *            Offset of the first row to be returned by the query (zero-based)
   * @param limit
   *            Maximum number of rows to be returned by the query
   * @return A new SQL statement with the LIMIT clause applied.
   */</span>
  <span class="token annotation punctuation">@Override</span>
  <span class="token keyword">public</span> <span class="token class-name">String</span> <span class="token function">getLimitString</span><span class="token punctuation">(</span><span class="token class-name">String</span> querySqlString<span class="token punctuation">,</span> <span class="token keyword">int</span> offset<span class="token punctuation">,</span> <span class="token keyword">int</span> limit<span class="token punctuation">)</span> <span class="token punctuation">{</span>
    <span class="token keyword">if</span> <span class="token punctuation">(</span>offset <span class="token operator">==</span> <span class="token number">0</span><span class="token punctuation">)</span> <span class="token keyword">return</span> <span class="token keyword">super</span><span class="token punctuation">.</span><span class="token function">getLimitString</span><span class="token punctuation">(</span>querySqlString<span class="token punctuation">,</span> offset<span class="token punctuation">,</span> limit<span class="token punctuation">)</span><span class="token punctuation">;</span>

    <span class="token class-name">StringBuilder</span> sb <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">StringBuilder</span><span class="token punctuation">(</span>querySqlString<span class="token punctuation">.</span><span class="token function">trim</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>

    <span class="token class-name">String</span> querySqlLowered <span class="token operator">=</span> querySqlString<span class="token punctuation">.</span><span class="token function">trim</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">toLowerCase</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token keyword">int</span> orderByIndex <span class="token operator">=</span> querySqlLowered<span class="token punctuation">.</span><span class="token function">toLowerCase</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">indexOf</span><span class="token punctuation">(</span><span class="token string">"order by"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token class-name">String</span> orderby <span class="token operator">=</span> orderByIndex <span class="token operator">></span> <span class="token number">0</span> <span class="token operator">?</span> querySqlString<span class="token punctuation">.</span><span class="token function">substring</span><span class="token punctuation">(</span>orderByIndex<span class="token punctuation">)</span> <span class="token operator">:</span> <span class="token string">"ORDER BY CURRENT_TIMESTAMP"</span><span class="token punctuation">;</span>

    <span class="token comment">// Delete the order by clause at the end of the query</span>
    <span class="token keyword">if</span> <span class="token punctuation">(</span>orderByIndex <span class="token operator">></span> <span class="token number">0</span><span class="token punctuation">)</span> sb<span class="token punctuation">.</span><span class="token function">delete</span><span class="token punctuation">(</span>orderByIndex<span class="token punctuation">,</span> orderByIndex <span class="token operator">+</span> orderby<span class="token punctuation">.</span><span class="token function">length</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>

    <span class="token comment">// Find the end of the select statement</span>
    <span class="token keyword">int</span> selectIndex <span class="token operator">=</span> querySqlLowered<span class="token punctuation">.</span><span class="token function">trim</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">startsWith</span><span class="token punctuation">(</span><span class="token string">"select distinct"</span><span class="token punctuation">)</span> <span class="token operator">?</span> <span class="token number">15</span> <span class="token operator">:</span> <span class="token number">6</span><span class="token punctuation">;</span>

    <span class="token comment">// Isert after the select statement the row_number() function:</span>
    sb<span class="token punctuation">.</span><span class="token function">insert</span><span class="token punctuation">(</span>selectIndex<span class="token punctuation">,</span> <span class="token string">" ROW_NUMBER() OVER ("</span> <span class="token operator">+</span> orderby <span class="token operator">+</span> <span class="token string">") as __hibernate_row_nr__,"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>

    <span class="token comment">//Wrap the query within a with statement:</span>
    sb<span class="token punctuation">.</span><span class="token function">insert</span><span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">,</span> <span class="token string">"WITH query AS ("</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">append</span><span class="token punctuation">(</span><span class="token string">") SELECT * FROM query "</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    sb<span class="token punctuation">.</span><span class="token function">append</span><span class="token punctuation">(</span><span class="token string">"WHERE __hibernate_row_nr__ "</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token keyword">if</span> <span class="token punctuation">(</span>offset <span class="token operator">></span> <span class="token number">0</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
      sb<span class="token punctuation">.</span><span class="token function">append</span><span class="token punctuation">(</span><span class="token string">"BETWEEN "</span><span class="token punctuation">)</span>
        <span class="token punctuation">.</span><span class="token function">append</span><span class="token punctuation">(</span>offset<span class="token punctuation">)</span>
        <span class="token punctuation">.</span><span class="token function">append</span><span class="token punctuation">(</span><span class="token string">" AND "</span><span class="token punctuation">)</span>
        <span class="token punctuation">.</span><span class="token function">append</span><span class="token punctuation">(</span>limit<span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token punctuation">}</span>
    <span class="token keyword">else</span> <span class="token punctuation">{</span>
      sb<span class="token punctuation">.</span><span class="token function">append</span><span class="token punctuation">(</span><span class="token string">" &lt;= "</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">append</span><span class="token punctuation">(</span>limit<span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token punctuation">}</span>

    <span class="token comment">//I don't think that we really need this last order by clause</span>
    <span class="token comment">//sb.append(" ORDER BY __hibernate_row_nr__");</span>

    <span class="token keyword">return</span> sb<span class="token punctuation">.</span><span class="token function">toString</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
  <span class="token punctuation">}</span>

  <span class="token annotation punctuation">@Override</span>
  <span class="token keyword">public</span> <span class="token keyword">boolean</span> <span class="token function">supportsLimit</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
    <span class="token keyword">return</span> <span class="token boolean">true</span><span class="token punctuation">;</span>
  <span class="token punctuation">}</span>

  <span class="token annotation punctuation">@Override</span>
  <span class="token keyword">public</span> <span class="token keyword">boolean</span> <span class="token function">supportsLimitOffset</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
    <span class="token keyword">return</span> <span class="token boolean">true</span><span class="token punctuation">;</span>
  <span class="token punctuation">}</span>

  <span class="token annotation punctuation">@Override</span>
  <span class="token keyword">public</span> <span class="token keyword">boolean</span> <span class="token function">bindLimitParametersFirst</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
    <span class="token keyword">return</span> <span class="token boolean">false</span><span class="token punctuation">;</span>
  <span class="token punctuation">}</span>

  <span class="token annotation punctuation">@Override</span>
  <span class="token keyword">public</span> <span class="token keyword">boolean</span> <span class="token function">useMaxForLimit</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
    <span class="token keyword">return</span> <span class="token boolean">true</span><span class="token punctuation">;</span>
  <span class="token punctuation">}</span>
<span class="token punctuation">}</span></code></pre></div><p>I&#x27;ve also updated the <a href="http://opensource.atlassian.com/projects/hibernate/browse/HHH-2655">jira issue</a>.
The class has not been heavily tested yet but it seems to work.</p><p>Another thing I didn&#x27;t come up with is how to have the offset and limit
parameters bindable at the query we&#x27;ve created. I hope to find some time
working on that unless you have the solution and would like to drop me a line.</p></div></div>]]></content:encoded>
    </item>
    <item>
      <title>Java database connections management</title>
      <link>https://valotas.com/java-database-connections-managemet/</link>
      <guid isPermaLink="true">https://valotas.com/java-database-connections-managemet/</guid>
      <pubDate>Wed, 30 Jun 2010 12:00:00 GMT</pubDate>
      <description>A month ago, I had to do some work on a legacy application. As there is no definition of the &quot;legacy application&quot; expression I refer to an old one where…</description>
      <content:encoded><![CDATA[<div data-testid="marked" class="prose"><div><p>A month ago, I had to do some work on a legacy application. As there is no definition of the &quot;legacy application&quot; expression I refer to an old one where no actual framework has been used for its creation. So there is no any ORM technology here. In that case you have to deal with plain old JDBC.</p><h2>The Model 2 Pattern</h2><p>The most common way to handle database connectivity to a legacy application is the Model 2 pattern where you have a servlet doing all the connectivity with the database, creating the model, binding it to the request scope and forwarding the request to the view technology. As we are talking about a legacy application this is jsp.</p><h3>More than good practice</h3><p>If you have a web application with traffic you will definitely know that you have to close the connections you use. That means that the connection will get returned to the connection pool you are using or just get closed. In case you do not close them your webapp will get to the state that will have all possible connections. That means that any request that needs a database interactivity won&#x27;t be able to get server (until some how the connections will get closed).</p><p>In order do that and make sure that always the connection will get closed all the database logic should be enclosed within a try-catch-finally block and close the connection, possible statements and result sets object at the finally block.</p><p>Of course when you try to close a connection you should also be aware that the close operation itself can throw a SQLException. The solution is to enclose every operation that tries to close a resource to a try-catch block again. The code will end up to something like the below snipset</p><div class="code-block"><pre class="language-java"><code class="language-java"><span class="token class-name">Connection</span> conn <span class="token operator">=</span> <span class="token keyword">null</span><span class="token punctuation">;</span>
<span class="token class-name">PreparedStatement</span> st <span class="token operator">=</span> <span class="token keyword">null</span><span class="token punctuation">;</span>
<span class="token class-name">ResultSet</span> <span class="token operator">=</span> <span class="token keyword">null</span><span class="token punctuation">;</span>

<span class="token keyword">try</span> <span class="token punctuation">{</span>
  <span class="token comment">//Assuming that we have a datasource object available</span>
  conn <span class="token operator">=</span> datasource<span class="token punctuation">.</span><span class="token function">getConnection</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
  st <span class="token operator">=</span> conn<span class="token punctuation">.</span><span class="token function">prepareStatement</span><span class="token punctuation">(</span>'fancy sql here'<span class="token punctuation">)</span><span class="token punctuation">;</span>
  rs <span class="token operator">=</span> st<span class="token punctuation">.</span><span class="token function">executeQuery</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token keyword">catch</span><span class="token punctuation">(</span><span class="token class-name">SQLException</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
  <span class="token comment">// do whatever you want with the SQLException</span>
<span class="token punctuation">}</span>
<span class="token keyword">finally</span> <span class="token punctuation">{</span>
  <span class="token keyword">try</span> <span class="token punctuation">{</span>
    <span class="token keyword">if</span> <span class="token punctuation">(</span>rs <span class="token operator">!=</span> <span class="token keyword">null</span><span class="token punctuation">)</span> rs<span class="token punctuation">.</span><span class="token function">close</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
  <span class="token punctuation">}</span>
  <span class="token keyword">catch</span> <span class="token punctuation">(</span><span class="token class-name">SQLException</span> e<span class="token punctuation">)</span> <span class="token punctuation">{</span>
    <span class="token comment">//Do nothing</span>
  <span class="token punctuation">}</span>
  <span class="token keyword">try</span> <span class="token punctuation">{</span>
    <span class="token keyword">if</span> <span class="token punctuation">(</span>st <span class="token operator">!=</span> <span class="token keyword">null</span><span class="token punctuation">)</span> st<span class="token punctuation">.</span><span class="token function">close</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
  <span class="token punctuation">}</span>
  <span class="token keyword">catch</span> <span class="token punctuation">(</span><span class="token class-name">SQLException</span> e<span class="token punctuation">)</span> <span class="token punctuation">{</span>
    <span class="token comment">//Do nothing</span>
  <span class="token punctuation">}</span>
  <span class="token keyword">try</span> <span class="token punctuation">{</span>
    <span class="token keyword">if</span> <span class="token punctuation">(</span>conn <span class="token operator">!=</span> <span class="token keyword">null</span><span class="token punctuation">)</span> conn<span class="token punctuation">.</span><span class="token function">close</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
  <span class="token punctuation">}</span>
  <span class="token keyword">catch</span> <span class="token punctuation">(</span><span class="token class-name">SQLException</span> e<span class="token punctuation">)</span> <span class="token punctuation">{</span>
    <span class="token comment">//Do nothing</span>
  <span class="token punctuation">}</span>
<span class="token punctuation">}</span></code></pre></div><h3>DRY</h3><p>Having three same code of blocks in every class that has connection interactivity causes a lot of boilerplate code. So lets try to avoid that creating a Utility class:</p><div class="code-block"><pre class="language-java"><code class="language-java"><span class="token keyword">public</span> <span class="token keyword">class</span> <span class="token class-name">ConnUtil</span> <span class="token punctuation">{</span>
  <span class="token keyword">public</span> <span class="token keyword">static</span> <span class="token keyword">final</span> <span class="token function">closeIgnoringExceptions</span><span class="token punctuation">(</span><span class="token class-name">ResultSet</span> rs<span class="token punctuation">)</span> <span class="token punctuation">{</span>
    <span class="token keyword">try</span> <span class="token punctuation">{</span>
      <span class="token keyword">if</span> <span class="token punctuation">(</span>rs <span class="token operator">!=</span> <span class="token keyword">null</span><span class="token punctuation">)</span> rs<span class="token punctuation">.</span><span class="token function">close</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token punctuation">}</span>
    <span class="token keyword">catch</span> <span class="token punctuation">(</span><span class="token class-name">SQLException</span> e<span class="token punctuation">)</span> <span class="token punctuation">{</span>
      <span class="token comment">//do nothing</span>
    <span class="token punctuation">}</span>
  <span class="token punctuation">}</span>

  <span class="token keyword">public</span> <span class="token keyword">static</span> <span class="token keyword">final</span> <span class="token function">closeIgnoringExceptions</span><span class="token punctuation">(</span><span class="token class-name">Statement</span> st<span class="token punctuation">)</span> <span class="token punctuation">{</span>
    <span class="token keyword">try</span> <span class="token punctuation">{</span>
      <span class="token keyword">if</span> <span class="token punctuation">(</span>st <span class="token operator">!=</span> <span class="token keyword">null</span><span class="token punctuation">)</span> st<span class="token punctuation">.</span><span class="token function">close</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token punctuation">}</span>
    <span class="token keyword">catch</span> <span class="token punctuation">(</span><span class="token class-name">SQLException</span> e<span class="token punctuation">)</span> <span class="token punctuation">{</span>
      <span class="token comment">//do nothing</span>
    <span class="token punctuation">}</span>
  <span class="token punctuation">}</span>

<span class="token keyword">public</span> <span class="token keyword">static</span> <span class="token keyword">final</span> <span class="token function">closeIgnoringExceptions</span><span class="token punctuation">(</span><span class="token class-name">Connection</span> conn<span class="token punctuation">)</span> <span class="token punctuation">{</span>
    <span class="token keyword">try</span> <span class="token punctuation">{</span>
      <span class="token keyword">if</span> <span class="token punctuation">(</span>conn <span class="token operator">!=</span> <span class="token keyword">null</span><span class="token punctuation">)</span> conn<span class="token punctuation">.</span><span class="token function">close</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token punctuation">}</span>
    <span class="token keyword">catch</span> <span class="token punctuation">(</span><span class="token class-name">SQLException</span> e<span class="token punctuation">)</span> <span class="token punctuation">{</span>
      <span class="token comment">//do nothing</span>
    <span class="token punctuation">}</span>
  <span class="token punctuation">}</span>
<span class="token punctuation">}</span></code></pre></div><p>Using this utility class the final block of the previous snippet becomes:</p><div class="code-block"><pre class="language-java"><code class="language-java"><span class="token keyword">finally</span> <span class="token punctuation">{</span>
  <span class="token function">closeIgnoringException</span><span class="token punctuation">(</span>rs<span class="token punctuation">)</span><span class="token punctuation">;</span>
  <span class="token function">closeIgnoringException</span><span class="token punctuation">(</span>st<span class="token punctuation">)</span><span class="token punctuation">;</span>
  <span class="token function">closeIgnoringException</span><span class="token punctuation">(</span>st<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// The problem!</span>
<span class="token punctuation">}</span></code></pre></div><p>So I fixed the bug, but I wasn&#x27;t completely happy as I was thinking that autocomplete should be used without having to worry for cases like that. On solution is to change the names of the methods to something like <code>closeResultSetIgnoringExceptions(ResultSet rs)</code>, <code>closeStatementIgnoringExceptions(Statement st)</code> and <code>closeConnectionIgnoringExceptions(Connection conn)</code> and make uncle Bob happy. Looking for a much more elegant way, I come up with an additional utility method:</p><div class="code-block"><pre class="language-java"><code class="language-java"><span class="token keyword">public</span> <span class="token keyword">static</span> <span class="token keyword">final</span> <span class="token function">closeIgnoringExceptions</span><span class="token punctuation">(</span><span class="token class-name">Connection</span> conn<span class="token punctuation">,</span> <span class="token class-name">Statement</span> st<span class="token punctuation">,</span> <span class="token class-name">ResultSet</span> rs<span class="token punctuation">)</span> <span class="token punctuation">{</span>
  <span class="token function">closeResultSetIgnoringExceptions</span><span class="token punctuation">(</span>rs<span class="token punctuation">)</span><span class="token punctuation">;</span>
  <span class="token function">closeStatementIgnoringExceptions</span><span class="token punctuation">(</span>st<span class="token punctuation">)</span><span class="token punctuation">;</span>
  <span class="token function">closeConnectionIgnoringExceptions</span><span class="token punctuation">(</span>conn<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span></code></pre></div><p>Making that finally block one liner: <code>closeIgnoringExceptions(conn, st, rs)</code> and letting the IDE do its job warning you if you don&#x27;t use the right arguments and helping you with the autocomplete!</p><p>Of course you will not always be able to use this method as sometimes you may need to use some of the objects and close only the ResultSet or the Statement ones. I personally try to avoid it.</p></div></div>]]></content:encoded>
    </item>
    <item>
      <title>Mail Session on tomcat and jetty via jndi</title>
      <link>https://valotas.com/mail-session-on-tomcat-and-jetty-via/</link>
      <guid isPermaLink="true">https://valotas.com/mail-session-on-tomcat-and-jetty-via/</guid>
      <pubDate>Sat, 01 May 2010 12:00:00 GMT</pubDate>
      <description>It's been a while since I last bloged but here I am again with something that took me a little bit in order to figure out how exactly should someone…</description>
      <content:encoded><![CDATA[<div data-testid="marked" class="prose"><div><p>It&#x27;s been a while since I last bloged but here I am again with something that took me a little bit in order to figure out how exactly should someone define a mail Session at the config files of jetty and tomcat. So the problem here is to define a mail session with name <code>mail/Session</code> using the host <code>my.mail.server.com</code> as mail server with username <code>mailserver_username</code> and password <code>mypassword</code>.</p><h2>Show me the code!</h2><p>Actually in both cases I found documentation on how to define the mail session but didn&#x27;t find out how to define the authentication part of it. Let&#x27;s jump to the solution</p><h3>Jetty</h3><p>Jetty has the <code>jetty-env.xml</code> file you can use to define resources of the web application. So with in the Configure xml element we add the following</p><div class="code-block"><pre class="language-xml"><code class="language-xml"><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>New</span> <span class="token attr-name">id</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>mailSessionId<span class="token punctuation">"</span></span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>org.eclipse.jetty.plus.jndi.Resource<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>
  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>Arg</span><span class="token punctuation">></span></span>mail/Session<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>Arg</span><span class="token punctuation">></span></span>
    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>Arg</span><span class="token punctuation">></span></span>
      <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>New</span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>org.eclipse.jetty.jndi.factories.MailSessionReference<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>
        <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>Set</span> <span class="token attr-name">name</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>user<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>mailserver_username<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>Set</span><span class="token punctuation">></span></span>
        <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>Set</span> <span class="token attr-name">name</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>password<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>mypassword<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>Set</span><span class="token punctuation">></span></span>
        <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>Set</span> <span class="token attr-name">name</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>properties<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>
          <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>New</span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>java.util.Properties<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>
            <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>Put</span> <span class="token attr-name">name</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>mail.host<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>my.mail.server.com<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>Put</span><span class="token punctuation">></span></span>
            <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>Put</span> <span class="token attr-name">name</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>mail.debug<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>true<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>Put</span><span class="token punctuation">></span></span>
            <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>Put</span> <span class="token attr-name">name</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>mail.smtp.auth<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>true<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>Put</span><span class="token punctuation">></span></span>
          <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>New</span><span class="token punctuation">></span></span>
        <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>Set</span><span class="token punctuation">></span></span>
      <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>New</span><span class="token punctuation">></span></span>
    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>Arg</span><span class="token punctuation">></span></span>
<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>New</span><span class="token punctuation">></span></span></code></pre></div><h3>Tomcat</h3><p>Just like jetty, tomcat has its own file to put configuration about possible references. That is <code>context.xml</code> where we should put the following with in the Context xml element:</p><div class="code-block"><pre class="language-xml"><code class="language-xml"><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>Resource</span> <span class="token attr-name">name</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>mail/Session<span class="token punctuation">"</span></span> <span class="token attr-name">auth</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>Container<span class="token punctuation">"</span></span>
  <span class="token attr-name">type</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>javax.mail.Session<span class="token punctuation">"</span></span>
  <span class="token attr-name">mail.smtp.host</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>my.mail.server.com<span class="token punctuation">"</span></span>
  <span class="token attr-name">mail.debug</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>false<span class="token punctuation">"</span></span>
  <span class="token attr-name">mail.smtp.auth</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>true<span class="token punctuation">"</span></span>
  <span class="token attr-name">mail.user</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>mailserver_username<span class="token punctuation">"</span></span>
  <span class="token attr-name">password</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>mypassword<span class="token punctuation">"</span></span> <span class="token punctuation">/></span></span></code></pre></div><h2>Note</h2><p>In both cases I had to dig more than the usual as I din&#x27;t find anywhere an as is solution. Things became a little bit clear when start reading the javadoc of its container. For jetty things was a little bit better as you only need the javadoc and then you can figure out the configuration (very nice xml based way to deal with classes but not as short as a configuration should be).</p><p>For tomcat the configuration is much more smaller but in order to see how to define the host and the username to use I had to have a look at tomcat source code. I mean why there isn&#x27;t any full example at the java doc on the attributes a user can use in order for the <a href="http://tomcat.apache.org/tomcat-6.0-doc/api/org/apache/naming/factory/MailSessionFactory.html">org.apache.naming.factory.MailSessionFactory</a> to create a <code>javax.mail.Session</code> using an <code>javax.mail.Authenticator</code> with given username and password.</p><h2>Getting the session</h2><p>With in the web application we get the session looking for the given name form an <code>InitialContext</code>. The following snipet will do the trick</p><div class="code-block"><pre class="language-java"><code class="language-java"><span class="token class-name">Context</span> initial <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">InitialContext</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token class-name">Session</span> session <span class="token operator">=</span> <span class="token punctuation">(</span><span class="token class-name">Session</span><span class="token punctuation">)</span> initial<span class="token punctuation">.</span><span class="token function">lookup</span><span class="token punctuation">(</span><span class="token string">"java:/comp/env/mail/Session"</span><span class="token punctuation">)</span><span class="token punctuation">;</span></code></pre></div></div></div>]]></content:encoded>
    </item>
    <item>
      <title>Eclipse on Linux, make it look good</title>
      <link>https://valotas.com/eclipse-on-linux-make-it-look-good/</link>
      <guid isPermaLink="true">https://valotas.com/eclipse-on-linux-make-it-look-good/</guid>
      <pubDate>Wed, 24 Feb 2010 12:00:00 GMT</pubDate>
      <description>I really do not know why such an issue hasn't been fixed. I do not care who is responsible for the uglyness of Eclipse on Linux but unfortunately this is…</description>
      <content:encoded><![CDATA[<div data-testid="marked" class="prose"><div><p>I really do not know why such an issue hasn&#x27;t been fixed. I do not care who is responsible for the uglyness of Eclipse on Linux but unfortunately this is a fact. After some search I found a solution.</p><h2>Let me know!</h2><p>That is to change the <code>.gtk2rc</code> (or something like that) file on your home directory to something like...</p><div class="code-block"><pre class="language-plain"><code class="language-plain">style "gtkcompact" {
 font_name="Sans 8"
 GtkButton::default_border={0,0,0,0}
 GtkButton::default_outside_border={0,0,0,0}
 GtkButtonBox::child_min_width=0
 GtkButtonBox::child_min_heigth=0
 GtkButtonBox::child_internal_pad_x=0
 GtkButtonBox::child_internal_pad_y=0
 GtkMenu::vertical-padding=1
 GtkMenuBar::internal_padding=0
 GtkMenuItem::horizontal_padding=4
 GtkToolbar::internal-padding=0
 GtkToolbar::space-size=0
 GtkOptionMenu::indicator_size=0
 GtkOptionMenu::indicator_spacing=0
 GtkPaned::handle_size=4
 GtkRange::trough_border=0
 GtkRange::stepper_spacing=0
 GtkScale::value_spacing=0
 GtkScrolledWindow::scrollbar_spacing=0
 GtkExpander::expander_size=10
 GtkExpander::expander_spacing=0
 GtkTreeView::vertical-separator=0
 GtkTreeView::horizontal-separator=0
 GtkTreeView::expander-size=10
 GtkTreeView::fixed-height-mode=TRUE
 GtkWidget::focus_padding=0
}
class "GtkWidget" style "gtkcompact"
style "gtkcompactextra" {
 xthickness=0
 ythickness=0
}
class "GtkButton" style "gtkcompactextra"
class "GtkToolbar" style "gtkcompactextra"
class "GtkPaned" style "gtkcompactextra"</code></pre></div><p>And yes! You will have a much pretier Eclipse and a real ungly gnome desktop! So lets rename the file to something like <code>gtkrc4eclipse</code>. Now instead of using the eclipse executable it self we will create a small bash script to execute it:</p><div class="code-block"><pre class="language-plain"><code class="language-plain">#!/bin/sh
export MY_ECLIPSE_GTKRC=/path/to/gtkrc4eclipse
export GTK_RC_FILES=$GTK_RC_FILES:$MY_ECLIPSE_GTKRC
export GTK2_RC_FILES=$GTK2_RC_FILES:$MY_ECLIPSE_GTKRC
export JAVA_HOME
/path/to/current/eclipse &amp;</code></pre></div><h2>References</h2><ul><li><a href="http://blog.xam.dk/?p=70">Making Eclipse look good on Linux</a></li><li><a href="http://lj4newbies.blogspot.com/2008/02/make-your-eclipse-look-better-on-ubuntu.html">Make your eclipse look better on ubuntu</a></li></ul></div></div>]]></content:encoded>
    </item>
    <item>
      <title>Grails, the first parts, a long introduction</title>
      <link>https://valotas.com/grails-first-parts-long-introduction/</link>
      <guid isPermaLink="true">https://valotas.com/grails-first-parts-long-introduction/</guid>
      <pubDate>Sun, 13 Dec 2009 12:00:00 GMT</pubDate>
      <description>Inspired by the title of Douglas Crockford book, &quot;Javascript, the good parts&quot; and having to write an introduction on grails as a course for some…</description>
      <content:encoded><![CDATA[<div data-testid="marked" class="prose"><div><p>Inspired by the title of Douglas Crockford book, &quot;Javascript, the good parts&quot; and having to write an introduction on grails as a course for some colleagues, I thought it would be good to just blog about grails and the first steps some one should take.</p><h2>Installation</h2><p>Well the installation is not as easy as one double click but I can live with that and anyone that will have to deal with web application deployment should. That is because you will probably find harder things to deal with! The place to start is <a href="http://grails.org/Download">grails download page</a> and the <a href="http://grails.org/Installation">official installation instructions</a>.</p><p>I assume that these steps are easy to follow. If not you should really reconsider your thoughts about the framework and web development. Not that you wouldn&#x27;t be able to create a simple project but because you probably wouldn&#x27;t understand a thing of what you were doing.</p><h2>First grails project</h2><p>We start with a</p><div class="code-block"><pre class="language-plain"><code class="language-plain">$ grails create-app firstgrailsproject
$ cd firstgrailsproject
$ grails run-app</code></pre></div><p>Yes! this is it! You&#x27;ve got your first web application ready!!! You don&#x27;t believe me? Just try to visit <a href="http://localhost:8080/firstgrailsproject">http://localhost:8080/firstgrailsproject</a> and see it yourself.</p><h3>The good parts</h3><p>Ok! This is not what you had in mind but, it is a really big step. You have a servlet container with a lot of libraries and many other nice things ready waiting for you! That means that the framework not only provides you with a good development environment but also with a build system to use. Let&#x27;s use it!</p><p>Before we start lets have some theory as a background. One thing you should care about is MVC. MVC is a pattern and is THE pattern when developing a web application and especially in java. We may not deal with java here directly but we do live in a java environment. What is MVC? MVC stands for Model View Control and lets have an example explaining it.</p><p>Lets say that a client needs something from the server. An xml, an html or whatever he may want. The server should be responsible for giving him what we want. This is where the developer (that should be you) have to do his job. Should check what the client needs and serve it. So you need a mechanism that will analyze what a client want retrieve the data and serve them in a form that the client asked for. This mechanism is called Controller.</p><p>We also mentioned the data. That is probably something we store in our database. Generally the data are never in a format that the client want so you give them in the format he wants. So the data is your Model and the format the View. We may have many views. For example an xml representation of the data or an html representation of the same data.</p><p>Grails is built with this pattern in mind. Ok this is another good thing! I also mention data here. Yes grails takes care of this too! It provides you with a ready to use database within the development environment. Another thing that you should not bother about until you&#x27;ll reach the production phase.</p><h3>The controller</h3><p>As I said before, grails is build around MVC. So lets try to create a new Controller. By conversion all controllers have a name that ends with Controller and are placed inside grails-app/controllers directory. Let&#x27;s create an echo controller.</p><div class="code-block"><pre class="language-plain"><code class="language-plain">$ grails create-controller com.valotas.firstgrailsproject.Echo</code></pre></div><p>Don&#x27;t forget that you are playing within a java environment and so, even if packages can be skipped, nobody will suggest such a thing. So lets have a look at our controller. Just open the generated groovy class/file with your favorite editor. That would be <code>grails-app/controllers/com/valotas/firstgrailsproject/EchoController.groovy</code>. As the name of the controller suggests, we would like to just return us a page writing the parameter phrase of our request. Lets edit our controller to do this exactly:</p><div class="code-block"><pre class="language-plain"><code class="language-plain">package com.valotas.firstgrailsproject

class EchoController {

  def index = { }

  def echophrase = {
    //if the request parameters has one named phrase use it's value
    //if not use the 'No phrase has been given' value for the phrase variable
    def phrase = params.phrase ? params.phrase : 'No phrase has been given'

    //return the model witch in our case is just a phrase
    return [message:phrase]
  }
}</code></pre></div><p>This should do exactly what we want to. But before we continue we should also see how are we going to represent this data to the user</p><h3>The View</h3><p>So we must take care of the layout/representation or whatever you would like to call it, of the data we have. In this case we will use an html page. As you can see we returned a model within the echophrase action (that&#x27;s how we call it from now on) in the EchoController. This is just a map who&#x27;s key is the string message and the value of it is the value of the phrase variable</p><p>Now lets create a simple page that will display this message. All we have to do is create a new gsp file under <code>grails-app/views/echo</code> folder named <code>echophrase.gsp</code>. The above will be just fine:</p><div class="code-block"><pre class="language-html"><code class="language-html"><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>html</span><span class="token punctuation">></span></span>
  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>head</span><span class="token punctuation">></span></span>
    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>title</span><span class="token punctuation">></span></span>EchoController - echophrase<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>title</span><span class="token punctuation">></span></span>
    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>meta</span> <span class="token attr-name">name</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>layout<span class="token punctuation">"</span></span> <span class="token attr-name">content</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>main<span class="token punctuation">"</span></span> <span class="token punctuation">/></span></span>
  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>head</span><span class="token punctuation">></span></span>
  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>body</span><span class="token punctuation">></span></span>
    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>p</span><span class="token punctuation">></span></span>${message}<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>p</span><span class="token punctuation">></span></span>
  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>body</span><span class="token punctuation">></span></span>
<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>html</span><span class="token punctuation">></span></span></code></pre></div><p>Now we can check if that works pointing our browser here: <a href="http://localhost:8080/firstgrailsproject/echo/echophrase?phrase=1,2,3">http://localhost:8080/firstgrailsproject/echo/echophrase?phrase=1,2,3</a> and here: <a href="http://localhost:8080/firstgrailsproject/echo/echophrase">http://localhost:8080/firstgrailsproject/echo/echophrase</a></p><h3>Controller - View glue</h3><p>Well, how did that happen? Again grails wires many things together in order to have this kind of magic without doing anything. The whole concept is that every action can return a model witch is just a map. When this happens grails looks for a gsp page having the same name with our action inside the folder witch have the same name with our controller, except the Controller part. All the views must be placed inside the views folder. That is why we&#x27;ve placed the echophrase.gsp inside the echo folder in the views.</p><p>This is what we should if we have to return html pages. As we&#x27;ve said before a model may have more than one representation. So we could just return the model as xml or as json. Of course our main concern is html pages, so in this case we will stick to the gsps. Note the returning an xml or a json is hard to do! It is easier as you don&#x27;t even have to write a gsp template!</p><h2>The Model: take our webapp to the next level: database</h2><p>As we have seen in our example the model part is just a phrase a user passed to our controller as a parameter to it&#x27;s request. This isn&#x27;t the case of course in real web applications as in most cases we also have to do some interaction with the database. In order to do that we will also save the Echo phrase in the database and show the user a small history of the previous Echos.</p><p>To do that we must somehow tell grails what we would like to save to the database. We define this using the so called domain classes. For our example we would like our echos to have a date they have been submitted and the actual phrase the user has submitted. Domain classes are simple groovy classes inside the <code>grails-app/domain</code> folder of our application. Let&#x27;s create one manually (by creating an appropriate file) or let grails do it for us: <code>$ grails create-domain-class com.valotas.firstgrailsproject.Echo</code>. Now just edit the newly created file:</p><div class="code-block"><pre class="language-groovy"><code class="language-groovy"><span class="token keyword">package</span> com<span class="token punctuation">.</span>valotas<span class="token punctuation">.</span>firstgrailsproject

<span class="token keyword">class</span> <span class="token class-name">Echo</span> <span class="token punctuation">{</span>
  String phrase
  Date dateCreated

  <span class="token keyword">static</span> constraints <span class="token operator">=</span> <span class="token punctuation">{</span>
    <span class="token function">phrase</span><span class="token punctuation">(</span>size<span class="token punctuation">:</span><span class="token number">1</span><span class="token operator">..</span><span class="token number">100</span><span class="token punctuation">,</span> blank<span class="token punctuation">:</span><span class="token boolean">false</span><span class="token punctuation">)</span>
  <span class="token punctuation">}</span>
<span class="token punctuation">}</span></code></pre></div><p>We defined what we would like our model to have. Note here that we would also like our phrases to have a size not bigger than 100 characters. We also defined that within the constraints.</p><p>Now let&#x27;s add an action to also save the echos, and except from the last posted one display the previous ones ordered by the dateCreated descended.</p><div class="code-block"><pre class="language-groovy"><code class="language-groovy"><span class="token keyword">def</span> echoandlist <span class="token operator">=</span> <span class="token punctuation">{</span>
  <span class="token comment">//Get the list of the previous posted echos:</span>
  <span class="token keyword">def</span> echolist <span class="token operator">=</span> Echo<span class="token punctuation">.</span><span class="token function">findAll</span><span class="token punctuation">(</span><span class="token punctuation">[</span>sort<span class="token punctuation">:</span><span class="token string">'dateCreated'</span><span class="token punctuation">,</span> order<span class="token punctuation">:</span><span class="token string">'desc'</span><span class="token punctuation">]</span><span class="token punctuation">)</span>

  <span class="token keyword">def</span> msg <span class="token operator">=</span> <span class="token string">'Your echo has been saved'</span> <span class="token comment">//The default message</span>

  <span class="token comment">//Create a new echo and try to save it to the db</span>
  <span class="token keyword">def</span> echo <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Echo</span><span class="token punctuation">(</span>phrase<span class="token punctuation">:</span>params<span class="token punctuation">.</span>phrase<span class="token punctuation">)</span>
  <span class="token keyword">if</span> <span class="token punctuation">(</span>echo<span class="token punctuation">.</span><span class="token function">hasErrors</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">||</span> <span class="token operator">!</span>echo<span class="token punctuation">.</span><span class="token function">save</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span> msg <span class="token operator">=</span> <span class="token string">'Could not save your echo'</span>

  <span class="token punctuation">[</span>message<span class="token punctuation">:</span>msg<span class="token punctuation">,</span> lastecho<span class="token punctuation">:</span>echo<span class="token punctuation">,</span> echolist<span class="token punctuation">:</span>echolist<span class="token punctuation">]</span>
<span class="token punctuation">}</span></code></pre></div><p>One thing to to mention here is the hasErrors, save and findAll methods. These methods like many others are not defined to our class, but has been created thanks to groovy&#x27;s AST. In other worlds grails provide us with a lot of utility methods. Three of these are the ones used here and I think that are self explained.</p><p>The last thing to do is to create our new view for this action. That will be something like the above</p><div class="code-block"><pre class="language-html"><code class="language-html"><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>html</span><span class="token punctuation">></span></span>
  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>head</span><span class="token punctuation">></span></span>
    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>title</span><span class="token punctuation">></span></span>EchoController - echoandlist<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>title</span><span class="token punctuation">></span></span>
    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>meta</span> <span class="token attr-name">name</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>layout<span class="token punctuation">"</span></span> <span class="token attr-name">content</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>main<span class="token punctuation">"</span></span> <span class="token punctuation">/></span></span>
  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>head</span><span class="token punctuation">></span></span>
  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>body</span><span class="token punctuation">></span></span>
    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>div</span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>${lastecho.phrase ? 'message' : 'errors'}<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>
      ${message}
      <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>ul</span><span class="token punctuation">></span></span>
        <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span><span class="token namespace">g:</span>eachError</span> <span class="token attr-name">bean</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>${lastecho}<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>
        <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>li</span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span><span class="token namespace">g:</span>message</span> <span class="token attr-name">error</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>${it}<span class="token punctuation">"</span></span><span class="token punctuation">/></span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>li</span><span class="token punctuation">></span></span>
        <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span><span class="token namespace">g:</span>eachError</span><span class="token punctuation">></span></span>
      <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>ul</span><span class="token punctuation">></span></span>
    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>div</span><span class="token punctuation">></span></span>

    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span><span class="token namespace">g:</span>if</span> <span class="token attr-name">test</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>${lastecho.phrase}<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>
    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>h2</span><span class="token punctuation">></span></span>${lastecho.phrase}<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>h2</span><span class="token punctuation">></span></span>
    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span><span class="token namespace">g:</span>if</span><span class="token punctuation">></span></span>

    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>h3</span><span class="token punctuation">></span></span>Previous echos:<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>h3</span><span class="token punctuation">></span></span>
    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>ul</span><span class="token punctuation">></span></span>
      <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span><span class="token namespace">g:</span>each</span> <span class="token attr-name">var</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>echo<span class="token punctuation">"</span></span> <span class="token attr-name">in</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>${echolist}<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>
      <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>li</span><span class="token punctuation">></span></span>${echo.phrase}<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>li</span><span class="token punctuation">></span></span>
      <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span><span class="token namespace">g:</span>each</span><span class="token punctuation">></span></span>
    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>ul</span><span class="token punctuation">></span></span>
  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>body</span><span class="token punctuation">></span></span>
<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>html</span><span class="token punctuation">></span></span></code></pre></div><p>Again, lets check if that works pointing our browser to the following links: <a href="http://localhost:8080/firstgrailsproject/echo/echoandlist?phrase=1,2,3">http://localhost:8080/firstgrailsproject/echo/echoandlist?phrase=1,2,3</a>, <a href="http://localhost:8080/firstgrailsproject/echo/echoandlist?phrase=foo">http://localhost:8080/firstgrailsproject/echo/echoandlist?phrase=foo</a>, and: <a href="http://localhost:8080/firstgrailsproject/echo/echoandlist">http://localhost:8080/firstgrailsproject/echo/echoandlist</a></p><p>Yes it was that simple. We now save our echo to an inmemory database witch we then query to take all the Echos we previously saved and show them the user.</p><h2>Productivity</h2><p>As you can understand, grails not only provide us with utility methods within the domain class to validate it, but it also binds these errors to the domain class, and provide us with a custom tag to check the errors of a domain class within the view. Generally you can find a lot of utility methods and tags to use.</p><p>Except for those which make our life easier, grails provide us with a more exotic feature which pushed productivity to a next level. It is called scaffolding and it is the ability of grails to provide you with a simple yet very useful html based user interface. What exactly is this? If you are familiar with Domain Driven Development then this feature is your gateway!</p><h3>Domain Driven Development</h3><p>Generally when you create a new web application, the first thing to do is to write down all the dynamic features of the site. All the things that will get changed by the end users and not by the developer. All these features describes the domain of your web application. So a good domain description can get a good web application. And here when we say good, we mean a site that will be usable by the end user.</p><p>In our case we wanted to keep a track of the posted Echo phrases. In case of a Bookstore webapp, the first thing that you want is to get a track of the books available at the bookstore. Of course a book has a title but it also has an Author witch could also have written more books. So in this example you should also have an Author domain class witch could have many Books (so Book should be another domain class) each of them could have many other authors.</p><h3>Scaffolding</h3><p>As you can see, things are getting complicated. But not with scaffolding. Scaffolding help you get prototypes up and running by defining just the domain classes. Most of the tutorials of grails describes scaffolding. It something that shouldn&#x27;t covered one more time but it is something the user should start playing only after knowing the basics witch I tried to describe here.</p><p>I&#x27;ve seen people who just get stack on how are they going to change something like the label of an input field of a scaffolded view. That&#x27;s why I would suggest not to get experiment with scaffolding until you&#x27;ve understand the basic flow used to handle user&#x27;s requests. So once you&#x27;ve done something the echo example you can start playing with scaffolding.</p><p>The idea behind scaffolding is that having domain described by your domain classes you will have to do some basic operations with them. These operations are Create Read Update Delete operations which are also known as CRUD operations. Things like that with todays tools are in most cases extremely easy to implement. But you still have to implement them and you have to do it for all your domain classes. A good programmer will consider having a helper class for this case but when you come to html form that things are getting more difficult. So why not we just have some kind of templates for such things that could easily get overwritten.</p><p>In that case all we need is the implementation of simple actions and its views. These actions are <code>list</code>, <code>show</code>, <code>delete</code>, <code>edit</code>, <code>update</code>, <code>create</code>, save and their views: <code>create.gsp</code>, <code>edit.gsp</code>, <code>list.gsp</code>, <code>show.gsp</code>. The views are not equal with the actions as some actions actually redirect the user to someother action. That is what scaffolding do. Generate boilerplate code that otherwise you should write. In my opinion this generated code is not written the best possible way and that is why I would suggest to use it only when prototyping a project.</p></div></div>]]></content:encoded>
    </item>
    <item>
      <title>Grails fileupload without touching the scaffolding actions (kinda)</title>
      <link>https://valotas.com/grails-fileupload-without-touching/</link>
      <guid isPermaLink="true">https://valotas.com/grails-fileupload-without-touching/</guid>
      <pubDate>Fri, 20 Nov 2009 12:00:00 GMT</pubDate>
      <description>Well, when I'm prototyping and generally developing with grails I do not want to use generate-all and just edit the generated controllers and gsps. I try…</description>
      <content:encoded><![CDATA[<div data-testid="marked" class="prose"><div><p>Well, when I&#x27;m prototyping and generally developing with grails I do not want to use generate-all and just edit the generated controllers and gsps. I try to find my way overwriting maybe some actions but not edit them and some or more changes to the scaffold templates.</p><h2>Setup</h2><p>So after adding the basic domain classes I always end up doing a <code>grails install-templates</code> in order to start playing with the templates. In most cases this works just fine except from one case. File uploading is a little bit tricky. Most times (actually all the times) I wan&#x27;t the uploaded files to be stored somewhere (not in the database) and just keep a record of the path of the file to the database. Consider something like the domain class below:</p><div class="code-block"><pre class="language-groovy"><code class="language-groovy"><span class="token keyword">class</span> <span class="token class-name">UploadedFile</span> <span class="token punctuation">{</span>
  String filepath
<span class="token punctuation">}</span></code></pre></div><p>The point here is to just use this class for the prototyping and then handle more &quot;exotic&quot; stuff like fileupload. Lets say that the time to handle this exotic stuff has came...</p><h2>beforeInterceptor to the rescue</h2><p>Grails has the ability to intercept calls to actions. All we want to do is before an action (save, and update in this case) just do the fileupload and replace the posted parameter with the path in order to be used by the action.</p><div class="code-block"><pre class="language-groovy"><code class="language-groovy"><span class="token keyword">class</span> <span class="token class-name">UploadedFileController</span> <span class="token punctuation">{</span>
  <span class="token keyword">def</span> scaffold <span class="token operator">=</span> <span class="token boolean">true</span>
  <span class="token keyword">def</span> beforeInterceptor <span class="token operator">=</span> <span class="token punctuation">[</span>action<span class="token punctuation">:</span><span class="token keyword">this</span><span class="token operator">.&amp;</span>fileupload<span class="token punctuation">,</span> only<span class="token punctuation">:</span> <span class="token punctuation">[</span><span class="token string">'save'</span><span class="token punctuation">,</span> <span class="token string">'update'</span><span class="token punctuation">]</span><span class="token punctuation">]</span>
 
  <span class="token keyword">def</span> <span class="token function">fileupload</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
    <span class="token keyword">def</span> filepath <span class="token comment">//the path of the uploaded file</span>
    <span class="token comment">// handle normal file upload as per grails docs</span>
    params<span class="token punctuation">.</span>filepath <span class="token operator">=</span> filepath
  <span class="token punctuation">}</span>
<span class="token punctuation">}</span></code></pre></div><p>This is it! Isn&#x27;t it? Well, it isn&#x27;t! For some reason data Binding does not work witch means that we have to also edit the Controller template in order exclude the filepath and put it manually. So a the save action we replace the <code>def ${propertyName} = new ${className}(params)</code> with:</p><div class="code-block"><pre class="language-groovy"><code class="language-groovy"><span class="token keyword">def</span> <span class="token punctuation">$</span><span class="token punctuation">{</span>propertyName<span class="token punctuation">}</span> <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token punctuation">$</span><span class="token punctuation">{</span>className<span class="token punctuation">}</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
<span class="token function">bindData</span><span class="token punctuation">(</span><span class="token punctuation">$</span><span class="token punctuation">{</span>propertyName<span class="token punctuation">}</span><span class="token punctuation">,</span> params<span class="token punctuation">,</span> <span class="token punctuation">[</span>exclude<span class="token punctuation">:</span> <span class="token string">'filepath'</span><span class="token punctuation">]</span><span class="token punctuation">)</span>
<span class="token keyword">if</span> <span class="token punctuation">(</span>params<span class="token punctuation">.</span>filepath<span class="token punctuation">)</span> <span class="token punctuation">$</span><span class="token punctuation">{</span>propertyName<span class="token punctuation">}</span><span class="token punctuation">.</span>filepath <span class="token operator">=</span> params<span class="token punctuation">.</span>filepath</code></pre></div><p>And in the update action replace <code>${propertyName}.properties = params</code> with</p><div class="code-block"><pre class="language-groovy"><code class="language-groovy"><span class="token function">bindData</span><span class="token punctuation">(</span><span class="token punctuation">$</span><span class="token punctuation">{</span>propertyName<span class="token punctuation">}</span><span class="token punctuation">,</span> params<span class="token punctuation">,</span> <span class="token punctuation">[</span>exclude<span class="token punctuation">:</span> <span class="token string">'filepath'</span><span class="token punctuation">]</span><span class="token punctuation">)</span>
<span class="token keyword">if</span> <span class="token punctuation">(</span>params<span class="token punctuation">.</span>filepath<span class="token punctuation">)</span> <span class="token punctuation">$</span><span class="token punctuation">{</span>propertyName<span class="token punctuation">}</span><span class="token punctuation">.</span>filepath <span class="token operator">=</span> params<span class="token punctuation">.</span>filepath</code></pre></div><p>And if you don&#x27;t care about deleting the files when a UploadFile domain gets deleted you are done.</p></div></div>]]></content:encoded>
    </item>
    <item>
      <title>GroovyServlet on the OSGI</title>
      <link>https://valotas.com/groovyservlet-on-osgi/</link>
      <guid isPermaLink="true">https://valotas.com/groovyservlet-on-osgi/</guid>
      <pubDate>Sun, 15 Nov 2009 12:00:00 GMT</pubDate>
      <description>After having static resources get served right with Jetty within an OSGI environment you may want to be able to use groovy and more specific some groovlets</description>
      <content:encoded><![CDATA[<div data-testid="marked" class="prose"><div><p>After having <a href="https://valotas.com/jetty-defaultservlet-on-osgi/">static resources get served right with Jetty within an OSGI environment</a>
you may want to be able to use groovy and more specific some groovlets</p><p>More or less the problem is the one that has been described at a <a href="https://valotas.com/jetty-defaultservlet-on-osgi/">previous post</a>.
Once again all we have to do is give some more &quot;space&quot; to the
<code>groovy.servlet.GroovyServlet</code> to look for our groovlets</p><h2>The code</h2><div class="code-block"><pre class="language-java"><code class="language-java"><span class="token keyword">package</span> <span class="token namespace">com<span class="token punctuation">.</span>valotas<span class="token punctuation">.</span>osgi<span class="token punctuation">.</span>jetty<span class="token punctuation">.</span>servlet</span><span class="token punctuation">;</span>


<span class="token keyword">import</span> <span class="token import"><span class="token namespace">java<span class="token punctuation">.</span>net<span class="token punctuation">.</span></span><span class="token class-name">URLConnection</span></span><span class="token punctuation">;</span>
<span class="token keyword">import</span> <span class="token import"><span class="token namespace">java<span class="token punctuation">.</span>util<span class="token punctuation">.</span>logging<span class="token punctuation">.</span></span><span class="token class-name">Level</span></span><span class="token punctuation">;</span>
<span class="token keyword">import</span> <span class="token import"><span class="token namespace">java<span class="token punctuation">.</span>util<span class="token punctuation">.</span>logging<span class="token punctuation">.</span></span><span class="token class-name">Logger</span></span><span class="token punctuation">;</span>

<span class="token keyword">import</span> <span class="token import"><span class="token namespace">groovy<span class="token punctuation">.</span>servlet<span class="token punctuation">.</span></span><span class="token class-name">GroovyServlet</span></span><span class="token punctuation">;</span>
<span class="token keyword">import</span> <span class="token import"><span class="token namespace">groovy<span class="token punctuation">.</span>util<span class="token punctuation">.</span></span><span class="token class-name">ResourceException</span></span><span class="token punctuation">;</span>


<span class="token keyword">public</span> <span class="token keyword">class</span> <span class="token class-name">OsgiGroovyServlet</span> <span class="token keyword">extends</span> <span class="token class-name">GroovyServlet</span> <span class="token punctuation">{</span>
  <span class="token keyword">private</span> <span class="token keyword">static</span> <span class="token keyword">final</span> <span class="token keyword">long</span> serialVersionUID <span class="token operator">=</span> <span class="token number">4017944232557220667L</span><span class="token punctuation">;</span>
  <span class="token keyword">private</span> <span class="token keyword">static</span> <span class="token keyword">final</span> <span class="token class-name">Logger</span> logger <span class="token operator">=</span> <span class="token class-name">Logger</span><span class="token punctuation">.</span><span class="token function">getLogger</span><span class="token punctuation">(</span><span class="token class-name">OsgiGroovyServlet</span><span class="token punctuation">.</span><span class="token keyword">class</span><span class="token punctuation">.</span><span class="token function">getName</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
  <span class="token keyword">private</span> <span class="token keyword">static</span> <span class="token keyword">final</span> <span class="token class-name">String</span> resourcesPrefix <span class="token operator">=</span> <span class="token string">"/webapp"</span><span class="token punctuation">;</span>


  <span class="token annotation punctuation">@Override</span>
  <span class="token keyword">public</span> <span class="token class-name">URLConnection</span> <span class="token function">getResourceConnection</span><span class="token punctuation">(</span><span class="token class-name">String</span> path<span class="token punctuation">)</span> <span class="token keyword">throws</span> <span class="token class-name">ResourceException</span> <span class="token punctuation">{</span>
    <span class="token keyword">if</span> <span class="token punctuation">(</span>logger<span class="token punctuation">.</span><span class="token function">isLoggable</span><span class="token punctuation">(</span><span class="token class-name">Level</span><span class="token punctuation">.</span><span class="token constant">FINER</span><span class="token punctuation">)</span><span class="token punctuation">)</span> logger<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span><span class="token class-name">Level</span><span class="token punctuation">.</span><span class="token constant">FINER</span><span class="token punctuation">,</span> <span class="token class-name">String</span><span class="token punctuation">.</span><span class="token function">format</span><span class="token punctuation">(</span><span class="token string">"Trying to serve resource %s"</span><span class="token punctuation">,</span> path<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token keyword">try</span> <span class="token punctuation">{</span>
      <span class="token keyword">return</span> <span class="token keyword">super</span><span class="token punctuation">.</span><span class="token function">getResourceConnection</span><span class="token punctuation">(</span>path<span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token punctuation">}</span>
    <span class="token keyword">catch</span> <span class="token punctuation">(</span><span class="token class-name">ResourceException</span> e<span class="token punctuation">)</span> <span class="token punctuation">{</span>
      <span class="token keyword">return</span> <span class="token function">getResourceConnectionFromOSGI</span><span class="token punctuation">(</span>path<span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token punctuation">}</span>
  <span class="token punctuation">}</span>


  <span class="token keyword">private</span> <span class="token class-name">URLConnection</span> <span class="token function">getResourceConnectionFromOSGI</span><span class="token punctuation">(</span><span class="token class-name">String</span> path<span class="token punctuation">)</span> <span class="token keyword">throws</span> <span class="token class-name">ResourceException</span> <span class="token punctuation">{</span>
    <span class="token class-name">String</span> actualpath <span class="token operator">=</span> path<span class="token punctuation">;</span>
    <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token operator">!</span>actualpath<span class="token punctuation">.</span><span class="token function">startsWith</span><span class="token punctuation">(</span>resourcesPrefix<span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
      actualpath <span class="token operator">=</span> resourcesPrefix <span class="token operator">+</span> path<span class="token punctuation">;</span>
    <span class="token punctuation">}</span>

    <span class="token keyword">if</span> <span class="token punctuation">(</span>logger<span class="token punctuation">.</span><span class="token function">isLoggable</span><span class="token punctuation">(</span><span class="token class-name">Level</span><span class="token punctuation">.</span><span class="token constant">FINER</span><span class="token punctuation">)</span><span class="token punctuation">)</span> logger<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span><span class="token class-name">Level</span><span class="token punctuation">.</span><span class="token constant">FINER</span><span class="token punctuation">,</span> <span class="token class-name">String</span><span class="token punctuation">.</span><span class="token function">format</span><span class="token punctuation">(</span><span class="token string">"Trying to serve resourse %s (%s) from our osgi container"</span><span class="token punctuation">,</span> actualpath<span class="token punctuation">,</span> path<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>

    <span class="token keyword">try</span> <span class="token punctuation">{</span>
      <span class="token keyword">return</span> <span class="token keyword">this</span><span class="token punctuation">.</span><span class="token function">getClass</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">getResource</span><span class="token punctuation">(</span>actualpath<span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">openConnection</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token punctuation">}</span>
    <span class="token keyword">catch</span> <span class="token punctuation">(</span><span class="token class-name">Exception</span> e<span class="token punctuation">)</span> <span class="token punctuation">{</span>
      <span class="token keyword">throw</span> <span class="token keyword">new</span> <span class="token class-name">ResourceException</span><span class="token punctuation">(</span><span class="token class-name">String</span><span class="token punctuation">.</span><span class="token function">format</span><span class="token punctuation">(</span><span class="token string">"Script %s couldn't be found"</span><span class="token punctuation">,</span> path<span class="token punctuation">)</span><span class="token punctuation">,</span> e<span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token punctuation">}</span>
  <span class="token punctuation">}</span>
<span class="token punctuation">}</span></code></pre></div><p>So all we do is to extend the GroovyServlet and override it&#x27;s
<code>getResourceConnection</code> in such a way that it will do a final try to find the
groovlet from within the osgi bundle. That is what we implement with the
<code>getResourceConnectionFromOsgi</code> method.</p><p>Caution: We assume that we pack all our resources and so our groovlets with in
the webapp directory witch we provide with the resourcesPrefix variable. Of
course we could change the servlet to get it&#x27;s value with a servlet init
parameter.</p></div></div>]]></content:encoded>
    </item>
    <item>
      <title>Dealing with Richmedia ad content</title>
      <link>https://valotas.com/dealing-with-richmedia-ad-content-put/</link>
      <guid isPermaLink="true">https://valotas.com/dealing-with-richmedia-ad-content-put/</guid>
      <pubDate>Sun, 08 Nov 2009 12:00:00 GMT</pubDate>
      <description>Long story short: Always put your javascript at the bottom of the html. But why?</description>
      <content:encoded><![CDATA[<div data-testid="marked" class="prose"><div><p>Long story short: <em>Always put your javascript at the bottom of the html</em>. But why?</p><h2>What is the deal here?</h2><p>When you have to deal with richmedia ad content many thing could slow you down. The basic problem here is that the richmedia ad content needs javascript in order to implement their &quot;rich&quot; part! The bad thing here is that in order to have a better page rendering performance you have to put the javascript stuff at the bottom of you html page. Why? Well <a href="http://developer.yahoo.com/performance/rules.html#js_bottom">this</a> should give you something to start with and google searching will get you into it!</p><h2>Putting richmedia scripts at the bottom</h2><p>Now if we all agree that we must do that lets try to find some solutions. The most easy way to accomplish this is with css. Of course rewriting the html so that all the banners could be at the bottom is not as easy as it sounds but it will not cause any problems to the richmedia delivery.</p><p>Unfortunately css side (html rewriting) solution is not always that easy and most times needs some javascript help especially when we have ad slots that doesn&#x27;t have an absolute position. For example a slot at the end of some text dynamically inserted by your back end.</p><h2>Use javascript to cure javascript problems</h2><p>Instead of trying to use javascript to cure the positioning of some banners we could just use it to reposition all of them. So this is another solution to our problem.</p><p>The idea of this solution is to have placeholders where we would like the ad slots to appear. These placeholders will then help us compute the position of the actual slot (lets call them bannerholder) that will be put at the bottom of the html, possibly in a hidden block.</p><h3>jQuery to the rescue</h3><p>I&#x27;m personally a big fan of jQuery and so I wrote a small plugin to do just that</p><div class="code-block"><pre class="language-javascript"><code class="language-javascript"><span class="token comment">/**
 * We have banner placeholders and the actual banners loaded at the end of
 * the page. The banner placeholders have an id of type placeholder__[banner_id]
 * and the banners are placed in a div with id banner__[banner_id] which we will
 * call bannerholder
 */</span>
$<span class="token punctuation">.</span>fn<span class="token punctuation">.</span><span class="token function-variable function">attachBanners</span> <span class="token operator">=</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token parameter">o</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
  o <span class="token operator">=</span> $<span class="token punctuation">.</span><span class="token function">extend</span><span class="token punctuation">(</span><span class="token punctuation">{</span>
    <span class="token literal-property property">attachRetry</span><span class="token operator">:</span> <span class="token number">200</span><span class="token punctuation">,</span> <span class="token comment">//Retry to attach the bannerholder to placeholder in 200millis</span>
    <span class="token literal-property property">syncInterval</span><span class="token operator">:</span> <span class="token number">400</span> <span class="token comment">//Sync the positions of the bannerholder and placeholder every 400millis</span>
  <span class="token punctuation">}</span><span class="token punctuation">,</span> o <span class="token operator">?</span> o <span class="token operator">:</span> <span class="token punctuation">{</span><span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span>

  <span class="token keyword">return</span> <span class="token keyword">this</span><span class="token punctuation">.</span><span class="token function">each</span><span class="token punctuation">(</span><span class="token keyword">function</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
    <span class="token keyword">var</span> $placeholder <span class="token operator">=</span> <span class="token function">$</span><span class="token punctuation">(</span><span class="token keyword">this</span><span class="token punctuation">)</span><span class="token punctuation">,</span>
      id <span class="token operator">=</span> <span class="token keyword">this</span><span class="token punctuation">.</span>id<span class="token punctuation">.</span><span class="token function">replace</span><span class="token punctuation">(</span><span class="token string">'placeholder__'</span><span class="token punctuation">,</span> <span class="token string">''</span><span class="token punctuation">)</span><span class="token punctuation">,</span>
      $bannerholder <span class="token operator">=</span> <span class="token function">$</span><span class="token punctuation">(</span><span class="token string">'#banner__'</span> <span class="token operator">+</span> id<span class="token punctuation">)</span><span class="token punctuation">,</span>
      retry <span class="token operator">=</span> <span class="token boolean">false</span><span class="token punctuation">,</span> <span class="token comment">//If something goes wrong just retry after the attachRetry period of time</span>
      bannerholderWidth<span class="token punctuation">,</span>
      bannerholderHeight<span class="token punctuation">;</span>

    <span class="token keyword">if</span> <span class="token punctuation">(</span>$bannerholder<span class="token punctuation">.</span>length <span class="token operator">></span> <span class="token number">0</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
      <span class="token comment">/*
       * We compute the width and height of the bannerholder. They are both equal to zero we
       * will not do anything and retry as the DOM of the bannerholder might not be ready yet
       */</span>
      bannerholderWidth <span class="token operator">=</span> $bannerholder<span class="token punctuation">.</span><span class="token function">width</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
      bannerholderHeight <span class="token operator">=</span> $bannerholder<span class="token punctuation">.</span><span class="token function">height</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
      <span class="token keyword">if</span> <span class="token punctuation">(</span>bannerholderWidth <span class="token operator">!==</span> <span class="token number">0</span> <span class="token operator">&amp;&amp;</span> bannerholderHeight <span class="token operator">!==</span> <span class="token number">0</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
        $placeholder
          <span class="token punctuation">.</span><span class="token function">attr</span><span class="token punctuation">(</span><span class="token string">'class'</span><span class="token punctuation">,</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token comment">//Add to the placeholder the classes of the bannerholder</span>
            <span class="token keyword">return</span> <span class="token keyword">this</span><span class="token punctuation">.</span>className <span class="token operator">+</span> <span class="token string">' '</span> <span class="token operator">+</span> $bannerholder<span class="token punctuation">.</span><span class="token function">attr</span><span class="token punctuation">(</span><span class="token string">'class'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> 
          <span class="token punctuation">}</span><span class="token punctuation">)</span>
          <span class="token punctuation">.</span><span class="token function">width</span><span class="token punctuation">(</span>bannerholderWidth<span class="token punctuation">)</span>
          <span class="token punctuation">.</span><span class="token function">height</span><span class="token punctuation">(</span>bannerholderHeight<span class="token punctuation">)</span><span class="token punctuation">;</span>
        $bannerholder
          <span class="token punctuation">.</span><span class="token function">css</span><span class="token punctuation">(</span><span class="token string">'position'</span><span class="token punctuation">,</span> <span class="token string">'absolute'</span><span class="token punctuation">)</span>
          <span class="token punctuation">.</span><span class="token function">css</span><span class="token punctuation">(</span>$placeholder<span class="token punctuation">.</span><span class="token function">offset</span><span class="token punctuation">(</span><span class="token string">'px'</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    
        <span class="token comment">//We now make sure that the banner and the placeholder are always in sync</span>
        <span class="token function">setInterval</span><span class="token punctuation">(</span><span class="token keyword">function</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
          $bannerholder<span class="token punctuation">.</span><span class="token function">css</span><span class="token punctuation">(</span>$placeholder<span class="token punctuation">.</span><span class="token function">offset</span><span class="token punctuation">(</span><span class="token string">'px'</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
        <span class="token punctuation">}</span><span class="token punctuation">,</span> o<span class="token punctuation">.</span>syncInterval<span class="token punctuation">)</span><span class="token punctuation">;</span>
      <span class="token punctuation">}</span>
      <span class="token keyword">else</span> <span class="token punctuation">{</span>
        retry <span class="token operator">=</span> <span class="token boolean">true</span><span class="token punctuation">;</span>
      <span class="token punctuation">}</span>
    <span class="token punctuation">}</span>
    <span class="token keyword">else</span> <span class="token punctuation">{</span>
      <span class="token comment">//In this case we assume that the DOM is not ready yet and we have to retry</span>
      retry <span class="token operator">=</span> <span class="token boolean">true</span><span class="token punctuation">;</span>
    <span class="token punctuation">}</span>

    <span class="token keyword">if</span> <span class="token punctuation">(</span>retry<span class="token punctuation">)</span> <span class="token punctuation">{</span>
      <span class="token function">setTimeout</span><span class="token punctuation">(</span><span class="token keyword">function</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
        $placeholder<span class="token punctuation">.</span><span class="token function">attachBanners</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
      <span class="token punctuation">}</span><span class="token punctuation">,</span> o<span class="token punctuation">.</span>attachRetry<span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token punctuation">}</span>
  <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span><span class="token punctuation">;</span>

<span class="token comment">/**
 * Just a plugin to compute the offset of an element
 */</span>
$<span class="token punctuation">.</span>fn<span class="token punctuation">.</span><span class="token function-variable function">offset</span> <span class="token operator">=</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token parameter">o</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
  <span class="token keyword">var</span> what <span class="token operator">=</span> <span class="token keyword">this</span><span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span><span class="token punctuation">,</span>
    offset_left <span class="token operator">=</span> what<span class="token punctuation">.</span>offsetLeft<span class="token punctuation">,</span>
    offset_top <span class="token operator">=</span> what<span class="token punctuation">.</span>offsetTop<span class="token punctuation">,</span>
    parentEl <span class="token operator">=</span> what<span class="token punctuation">.</span>offsetParent<span class="token punctuation">;</span>
 
  <span class="token keyword">while</span> <span class="token punctuation">(</span>parentEl <span class="token operator">!==</span> <span class="token keyword">null</span><span class="token punctuation">)</span><span class="token punctuation">{</span>
    offset_left <span class="token operator">+=</span> parentEl<span class="token punctuation">.</span>offsetLeft<span class="token punctuation">;</span>
    offset_top <span class="token operator">+=</span> parentEl<span class="token punctuation">.</span>offsetTop<span class="token punctuation">;</span>
    parentEl <span class="token operator">=</span> parentEl<span class="token punctuation">.</span>offsetParent<span class="token punctuation">;</span>
  <span class="token punctuation">}</span>
 
  <span class="token keyword">if</span> <span class="token punctuation">(</span>o <span class="token operator">&amp;&amp;</span> o <span class="token operator">==</span> <span class="token string">'px'</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
    offset_left <span class="token operator">+=</span> <span class="token string">'px'</span><span class="token punctuation">;</span>
    offset_top <span class="token operator">+=</span> <span class="token string">'px'</span><span class="token punctuation">;</span>
  <span class="token punctuation">}</span>
  <span class="token keyword">return</span> <span class="token punctuation">{</span><span class="token literal-property property">left</span><span class="token operator">:</span> offset_left<span class="token punctuation">,</span> <span class="token literal-property property">top</span><span class="token operator">:</span> offset_top<span class="token punctuation">}</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span><span class="token punctuation">;</span></code></pre></div><p>Now assuming that you have a slot with id myslot, all you have to do is add a div with id <code>placeholder__myslot</code> where you would like your slot to be displayed and a div with id <code>banner__myslot</code> with your rich media markup inside. Then a <code>$(#placeholder__myslot).attachBanners()</code> will do the positioning for you no matter where you&#x27;ve got your <code>div#banner__myslot</code> placed!</p><p>Update: Reviewing the code (as it must have been over a year since I first wrote it), I can say that the offset function is a little bit useless as jQuery provide us with a function which does this this exactly! No need to rewrite stuff!</p></div></div>]]></content:encoded>
    </item>
    <item>
      <title>Groovy SQL to the resque</title>
      <link>https://valotas.com/groovy-sql-to-rescue/</link>
      <guid isPermaLink="true">https://valotas.com/groovy-sql-to-rescue/</guid>
      <pubDate>Sat, 24 Oct 2009 12:00:00 GMT</pubDate>
      <description>The case is an sql table with about 30 columns that I have to query and export some (or all) data. In this case plain csv format should be just fine!</description>
      <content:encoded><![CDATA[<div data-testid="marked" class="prose"><div><p>The case is an sql table with about 30 columns that I have to query and export
some (or all) data. In this case plain csv format should be just fine!</p><h2>Lazyness</h2><p>The problem here is that I really don&#x27;t want to query the database and start
exporting the fields manually from the result set. In this case the possibility
of a plain typo mistake is really high and really hard to find (ok! Im lazy!)</p><h2>The solution</h2><p>A solution to this problem (not lazyness) is to get the table metadata and use
them to get all the fields of the selected rows. Ofcourse you have to build
that or use something ready. Here comes the groovy language...</p><div class="code-block"><pre class="language-groovy"><code class="language-groovy">Sql sql <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Sql</span><span class="token punctuation">(</span>ConnectionUtil<span class="token punctuation">.</span><span class="token function">getDataSource</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">def</span> keyset <span class="token operator">=</span> null<span class="token punctuation">;</span> <span class="token comment">//A place to keep the column names</span>
sql<span class="token punctuation">.</span><span class="token function">eachRow</span><span class="token punctuation">(</span><span class="token interpolation-string"><span class="token string">"select * from theTableName"</span></span><span class="token punctuation">)</span> <span class="token punctuation">{</span> row <span class="token operator">-></span>
  <span class="token comment">//If the keyset is null create one and add the column names</span>
  <span class="token keyword">if</span> <span class="token punctuation">(</span>keyset <span class="token operator">==</span> null<span class="token punctuation">)</span> <span class="token punctuation">{</span>
    <span class="token comment">//We want all the column names exept the one named 'id</span>
    keyset <span class="token operator">=</span> row<span class="token punctuation">.</span><span class="token function">toRowResult</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">keySet</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span>findAll <span class="token punctuation">{</span> it <span class="token operator">!=</span> <span class="token string">'id'</span> <span class="token punctuation">}</span>

    <span class="token comment">//create a nice header for our output</span>
    keyset<span class="token punctuation">.</span><span class="token function">each</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> print <span class="token interpolation-string"><span class="token string">"</span><span class="token interpolation"><span class="token interpolation-punctuation punctuation">${</span><span class="token expression">it</span><span class="token interpolation-punctuation punctuation">}</span></span><span class="token string">,"</span></span> <span class="token punctuation">}</span>
    print <span class="token string">'\n'</span>
  <span class="token punctuation">}</span>

  keyset<span class="token punctuation">.</span><span class="token function">each</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> k <span class="token operator">-></span>
    print <span class="token interpolation-string"><span class="token string">"""row."</span><span class="token interpolation"><span class="token interpolation-punctuation punctuation">$</span><span class="token expression">k</span></span><span class="token string">","""</span></span>
  <span class="token punctuation">}</span>
  print <span class="token string">'\n'</span>
<span class="token punctuation">}</span></code></pre></div><p>This is it! All we&#x27;ve done is to use the groovy&#x27;s build in
<code>groovy.sql.GroovyRowResult</code> (that is <code>row.toRowResult()</code>) to get all the
metadata we&#x27;ll need. Knowing the column names we again use groovy&#x27;s
<code>row.columnName</code> to get the value of the columnName of the row</p><p>Now combine that with a groovlet and you will really save time! (did I find
some kind of solution for laziness?)</p></div></div>]]></content:encoded>
    </item>
    <item>
      <title>Jetty DefaultServlet on the osgi</title>
      <link>https://valotas.com/jetty-defaultservlet-on-osgi/</link>
      <guid isPermaLink="true">https://valotas.com/jetty-defaultservlet-on-osgi/</guid>
      <pubDate>Sun, 11 Oct 2009 12:00:00 GMT</pubDate>
      <description>Basically when you work on the osgi and want to use a resource, things are not that easy. What I wanted to do is use Jetty embedded on an Osgi container…</description>
      <content:encoded><![CDATA[<div data-testid="marked" class="prose"><div><p>Basically when you work on the osgi and want to use a resource, things are not that easy. What I wanted to do is use Jetty embedded on an Osgi container and use it with a simple servlet and a resource.</p><h2>Embed jetty</h2><p>A good resource on how to embed the Jetty container can be found at <a href="http://www.gridshore.nl/2008/02/15/embedding-jetty-in-osgi-osgi-felix-sample-step-3/">this blog post</a>. After embedding jetty the most common thing to do in order to test it is to write a simple servlet and let jetty use it. More on how to embed jetty on the osgi on a future post.</p><h2>DefaultServlet</h2><p>Assuming that you have the container embedded and work right with a simple servlet you would propably like to also serve some actual html pages or images witch is what we used to call static resources. These resources can be served by the container thanks to a specific jetty&#x27;s servlet. That is <code>org.mortbay.jetty.servlet.DefaultServlet</code>.</p><p>So if you just try to serve some static content from embedded jetty you will probably wont be able to accomplish that. The reason is that the resources will be within your bundle jar. So in order to overcome this you must tell jetty where to look for the resources</p><p>This can be accomplish exending jetty&#x27;s DefaultServlet:</p><div class="code-block"><pre class="language-java"><code class="language-java"><span class="token keyword">package</span> <span class="token namespace">com<span class="token punctuation">.</span>valotas<span class="token punctuation">.</span>osgi<span class="token punctuation">.</span>jetty<span class="token punctuation">.</span></span><span class="token class-name">OsgiDefaultServlet</span><span class="token punctuation">;</span>


<span class="token keyword">import</span> <span class="token import"><span class="token namespace">java<span class="token punctuation">.</span>io<span class="token punctuation">.</span></span><span class="token class-name">IOException</span></span><span class="token punctuation">;</span>
<span class="token keyword">import</span> <span class="token import"><span class="token namespace">java<span class="token punctuation">.</span>net<span class="token punctuation">.</span></span><span class="token class-name">URL</span></span><span class="token punctuation">;</span>

<span class="token keyword">import</span> <span class="token import"><span class="token namespace">org<span class="token punctuation">.</span>mortbay<span class="token punctuation">.</span>jetty<span class="token punctuation">.</span>servlet<span class="token punctuation">.</span></span><span class="token class-name">DefaultServlet</span></span><span class="token punctuation">;</span>
<span class="token keyword">import</span> <span class="token import"><span class="token namespace">org<span class="token punctuation">.</span>mortbay<span class="token punctuation">.</span>resource<span class="token punctuation">.</span></span><span class="token class-name">Resource</span></span><span class="token punctuation">;</span>

<span class="token comment">/**
 * This is the default servlet that handles the the resources
 * that are inside an osgi bundle under the /webapp directory
 * 
 * It extends DefaultServlet and should be used instead of it with 
 * embedded jetty inside an osgi environment
 * 
 *
 */</span>
<span class="token keyword">public</span> <span class="token keyword">class</span> <span class="token class-name">OsgiDefaultServlet</span> <span class="token keyword">extends</span> <span class="token class-name">DefaultServlet</span> <span class="token punctuation">{</span>
  <span class="token keyword">private</span> <span class="token keyword">static</span> <span class="token keyword">final</span> <span class="token keyword">long</span> serialVersionUID <span class="token operator">=</span> <span class="token operator">-</span><span class="token number">1951721992652851719L</span><span class="token punctuation">;</span>
  <span class="token keyword">private</span> <span class="token keyword">static</span> <span class="token keyword">final</span> <span class="token class-name">String</span> resourcesPrefix <span class="token operator">=</span> <span class="token string">"/webapp"</span><span class="token punctuation">;</span>

  <span class="token annotation punctuation">@Override</span>
  <span class="token keyword">public</span> <span class="token class-name">Resource</span> <span class="token function">getResource</span><span class="token punctuation">(</span><span class="token class-name">String</span> resourceString<span class="token punctuation">)</span> <span class="token punctuation">{</span>
    <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token operator">!</span>resourceString<span class="token punctuation">.</span><span class="token function">startsWith</span><span class="token punctuation">(</span>resourcesPrefix<span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
      resourceString <span class="token operator">=</span> resourcesPrefix <span class="token operator">+</span> resourceString<span class="token punctuation">;</span>
    <span class="token punctuation">}</span>

    <span class="token class-name">URL</span> url <span class="token operator">=</span> <span class="token keyword">this</span><span class="token punctuation">.</span><span class="token function">getClass</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">getResource</span><span class="token punctuation">(</span>resourceString<span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token class-name">Resource</span> resource <span class="token operator">=</span> <span class="token function">tryCreateResource</span><span class="token punctuation">(</span>url<span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token keyword">return</span> resource<span class="token punctuation">;</span>
  <span class="token punctuation">}</span>

  <span class="token keyword">private</span> <span class="token class-name">Resource</span> <span class="token function">tryCreateResource</span><span class="token punctuation">(</span><span class="token class-name">URL</span> url<span class="token punctuation">)</span> <span class="token punctuation">{</span>
    <span class="token class-name">Resource</span> resource <span class="token operator">=</span> <span class="token keyword">null</span><span class="token punctuation">;</span>
    <span class="token keyword">try</span> <span class="token punctuation">{</span>
      resource <span class="token operator">=</span> <span class="token class-name">Resource</span><span class="token punctuation">.</span><span class="token function">newResource</span><span class="token punctuation">(</span>url<span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token punctuation">}</span>
    <span class="token keyword">catch</span> <span class="token punctuation">(</span><span class="token class-name">IOException</span> e<span class="token punctuation">)</span> <span class="token punctuation">{</span>
      <span class="token comment">//do nothing!</span>
    <span class="token punctuation">}</span>

    <span class="token keyword">return</span> resource<span class="token punctuation">;</span>
  <span class="token punctuation">}</span>
<span class="token punctuation">}</span></code></pre></div><p>The above will work if you will package your static resources within webapp package (or folder!). Of course you can change that!</p><p>Now what we just did is to override the <code>getResource</code> resource method of the <code>DefaultServlet</code> class in order to force jetty look for them within the webapp package.</p><h2>References</h2><ul><li><a href="http://www.gridshore.nl/2008/02/15/embedding-jetty-in-osgi-osgi-felix-sample-step-3/">Embedding Jetty in OSGi</a></li></ul></div></div>]]></content:encoded>
    </item>
    <item>
      <title>Server side OSGI with Equinox</title>
      <link>https://valotas.com/equinox-service-server-side-osgi/</link>
      <guid isPermaLink="true">https://valotas.com/equinox-service-server-side-osgi/</guid>
      <pubDate>Sat, 26 Sep 2009 12:00:00 GMT</pubDate>
      <description>Well this is not about OSGi itself but using it at the server side. So assuming that you have some osgi bundle you want to run them on a server. There is…</description>
      <content:encoded><![CDATA[<div data-testid="marked" class="prose"><div><p>Well this is not about OSGi itself but using it at the server side. So assuming that you have some osgi bundle you want to run them on a server. There is many osgi frameworks that you can use but here we are about to use Equinox.</p><h2>Stand alone Equinox</h2><p>We don&#x27;t have to say that if you are running eclipse you are running equinox. But how should you run it stand alone? Well all you need is the main jar file witch would look like <code>org.eclipse.osgi_[version].jar</code> and can be found under the plugins folder of your Eclipse installation. If you find it just run it:</p><div class="code-block"><pre class="language-plain"><code class="language-plain">java -jar org.eclipse.osgi_[version].jar -console</code></pre></div><p><em>Update</em>: If you can&#x27;t find it or you thing that you may be outdated just grab the latest one from <a href="http://download.eclipse.org/equinox/">Equinox homepage</a></p><p>More information on that can be found searching for stand alone equinox or headless equinox. A quick start is also available here at the <a href="http://www.eclipse.org/equinox/documents/quickstart.php">project&#x27;s homepage</a></p><h2>Equinox as a service</h2><p>Well I&#x27;m ok with my bundles! How can I put them on the server side? We need an environment to put them and the most appropriate one would be a windows service or a linux daemon!</p><p>I couldn&#x27;t find any solutions ready to go. So I had to create one! <a href="http://wrapper.tanukisoftware.org/doc/english/download.jsp">Java Service Wrapper</a> to the rescue.</p><p>There is some integration methods that can be used with the service wrapper. I choosed the easiest one and I&#x27;ll describe it here step by step:</p><p><em>Step 1</em>: Download and unzip the service wrapper</p><p><em>Step 2</em>: Place in the lib folder the equinox jar</p><p><em>Step 3</em>: Edit the wrapper configuration file. This is the most importatant part. Above are the common settings that can be used</p><div class="code-block"><pre class="language-plain"><code class="language-plain">wrapper.java.mainclass=org.tanukisoftware.wrapper.WrapperSimpleApp

wrapper.java.classpath.1=../lib/wrappertest.jar
wrapper.java.classpath.2=../lib/wrapper.jar
wrapper.java.classpath.3=../lib/org.eclipse.osgi_3.5.0.v20090520.jar

wrapper.java.additional.1=-Declipse.ignoreApp=true
wrapper.java.additional.2=-Dosgi.noShutdown=true
wrapper.java.additional.3=-Dosgi.requiredJavaVersion=1.5
wrapper.java.additional.4=-Dosgi.compatibility.bootdelegation=true
wrapper.java.additional.5=-Djava.util.logging.config.file=../conf/logging.properties
wrapper.java.additional.6=-Dfile.encoding=UTF-8

wrapper.app.parameter.1=org.eclipse.core.runtime.adaptor.EclipseStarter
wrapper.app.parameter.2=-console
wrapper.app.parameter.3=OSGI_CONSOLE_PORT

wrapper.console.title=Eclipse Server
wrapper.name=equinoxservice
wrapper.displayname=Equinox Server
wrapper.description=Equinox Server</code></pre></div><p>So what we&#x27;ve done? The java main class is the wrapper&#x27;s helper class that will actually call our main class. That&#x27;s why we also added to the classpath our equinox jar.</p><p>Now we also need to call the equinox jar with some java properties. This is done with the <code>wrapper.java.additional</code> properties. The four first ones should be used in order for our osgi runtime to work properly</p><p>Now after that we must provide the wrapper class with our main class and possible parameters. This is done with the wrapper.app.parameter properties, but what to put there? Looking at our equinox manifest file we get the main class: <code>org.eclipse.core.runtime.adaptor.EclipseStarter</code> we we also added the <code>-console port_num</code> parameters in order to be able to telnet to port_num and install or uninstall bundles</p><p>Now all the other properties has to do with with the service name. You can of course give what ever values you want!</p><p><em>Step 4</em>: At last just install the service calling the install script that can be found in the bin folder of the wrapper.</p><h2>Referencies</h2><ul><li><a href="http://wrapper.tanukisoftware.org/doc/english/integrate-simple-win.html">http://wrapper.tanukisoftware.org/doc/english/integrate-simple-win.html</a></li><li><a href="http://www.eclipsezone.com/eclipse/forums/t112152.html">http://www.eclipsezone.com/eclipse/forums/t112152.html</a></li><li><a href="http://mauszeig.wordpress.com/2007/06/10/equinox-as-a-service/">http://mauszeig.wordpress.com/2007/06/10/equinox-as-a-service/</a></li></ul></div></div>]]></content:encoded>
    </item>
    <item>
      <title>Multiple tomcat 6 services on windows</title>
      <link>https://valotas.com/installing-multiple-tomcat-6-services/</link>
      <guid isPermaLink="true">https://valotas.com/installing-multiple-tomcat-6-services/</guid>
      <pubDate>Mon, 07 Sep 2009 12:00:00 GMT</pubDate>
      <description>Not that there isn't any documentation out there, but just for helping myself, I need a place where to put all the steps needed for an installation of…</description>
      <content:encoded><![CDATA[<div data-testid="marked" class="prose"><div><p>Not that there isn&#x27;t any documentation out there, but just for helping myself, I need a place where to put all the steps needed for an installation of multiple instances of tomcats on a windows machine. Lets start...</p><h2>Downloading</h2><p><a href="http://tomcat.apache.org">tomcat.apache.org</a> should be the place to start. At the time of this writing the latest tomcat available is 6.0.20. You can find the download page <a href="http://http//tomcat.apache.org/download-60.cgi/">here</a>. One thing to remember: <em>don&#x27;t download the windows installer</em>. If you want to install many instances of tomcat you should download the zipped version.</p><h2>Unzip and go</h2><p>Well if you unzip the downloaded file somewhere (lets say <code>TOMCAT_HOME</code>) you have a tomcat ready to start serving your webapps but not as a windows service. In order to do that you must use the <code>service.bat</code> script provided in <code>TOMCAT_HOME\bin</code> directory. When you run it you will have the tomcat installed as a service with name Tomcat6 but don&#x27;t do that yet.</p><h2>Custom service name</h2><p>Now what we want is to have tomcat installed as service with a custom name, lets say tomcat6020. What you do is</p><div class="code-block"><pre class="language-plain"><code class="language-plain">cd TOMCAT_HOME\bin\
service.bat install tomcat6020</code></pre></div><p>And you are done! You have tomcat installed as a service with name tomcat6020. <em>All you have to do now is repeat these steps for each tomcat instance you want to run on your machine</em>. The above steps can be done separately, once for all the tomcat instances</p><h2>Configuring the service</h2><p>We may have our service ready but this doesn&#x27;t mean that it is secured nor that it can work properly. It is a good practice to create a special user account on the machine that will run the service with appropriate permissions.</p><h3>Create a user</h3><p>For adding a user just go to <code>Administrative Tools &gt; Computer Management &gt; Local Users and Groups</code>. It is good for the newly created user not to be a member of any Groups (yes not even the Users one).</p><h3>Give user access to tomcat and java</h3><p>You then must add full access for the user you just creates to tomcat&#x27;s directory. This is done by right clicking on the directory, going to the Security tab and adding the new user with full access to the directory</p><p>You then must give the user access the java executables. This is done the same way you gave him access to the tomcat dirs except that you can give him only read and execute access to the <code>JAVA_HOME</code> dir.</p><h3>Let the user log on as service</h3><p>You then must adjust the newly created account settings, in order to do that go to <code>Administrative Tools &gt; Local Security Policy &gt; Local Policies &gt; User Right Assignments</code> and add the user to the following rules:</p><ul><li>Deny Logon Locally</li><li>Deny Access to This Computer from the Network</li><li>Deny Logon As a Batch Job</li><li>Deny Logon Through Terminal Services</li><li>Log on as a Service</li></ul><p>Actually the most important rule is the last one. You can&#x27;t skip this one as the service will not be able to start otherwise</p><p>All the other rules is a step further securing our machine and of course will not cost anything using them!</p><h3>Update: Installing on a win 64bit machine</h3><p>In order for the tomcat service to start, apache provides a java service wrapper witch is actually the <code>tomcat6.exe</code> executable. This file will not work under a 64bit windows machine. You have to replace it with one compiled to work with 64bit windows. You can get a precompiled one for the current version of tomcat, at tomcat&#x27;s svn: <a href="http://svn.apache.org/repos/asf/tomcat/tc6.0.x/tags/TOMCAT_6_0_20/res/procrun/amd64/tomcat6.exe">http://svn.apache.org/repos/asf/tomcat/tc6.0.x/tags/TOMCAT_6_0_20/res/procrun/amd64/tomcat6.exe</a></p><h2>Referencies</h2><ul><li><a href="http://tomcat.apache.org/tomcat-6.0-doc/setup.html">http://tomcat.apache.org/tomcat-6.0-doc/setup.html</a></li><li><a href="http://tomcat.apache.org/tomcat-6.0-doc/windows-service-howto.html">http://tomcat.apache.org/tomcat-6.0-doc/windows-service-howto.html</a></li></ul></div></div>]]></content:encoded>
    </item>
    <item>
      <title>Cleaner javascript code - namespacing</title>
      <link>https://valotas.com/cleaner-javascript-code-namespacing/</link>
      <guid isPermaLink="true">https://valotas.com/cleaner-javascript-code-namespacing/</guid>
      <pubDate>Wed, 26 Aug 2009 12:00:00 GMT</pubDate>
      <description>Having read the Clean Code book by Robert C. Martin I always try to follow most of the rules he gives. In my opinion the best rule I've seen and helped me…</description>
      <content:encoded><![CDATA[<div data-testid="marked" class="prose"><div><p>Having read the <em>Clean Code</em> book by Robert C. Martin I always try to follow most of the rules he gives. In my opinion the best rule I&#x27;ve seen and helped me a lot in order to make more readable code is to try to make classes as small as possible.</p><h2>Javascript</h2><p>Well this is possible with languages that support classes or any other type of file based code dependency (is there an actual term for this?). But what happens with languages like... javascript. Not that you can&#x27;t split your code in separate js files, but the most known performance rule for is to have as less js files as possible. This is where frameworks like jawr comes, but this is not the topic of this blog post.</p><p>What I&#x27;m trying to have is as much readable code as possible at one big javascript file. Having written a lot of (bad) javascript code, I really understand the needing of the clean code. So lately what I tend to do one thing:</p><h2>Namespacing</h2><p>Yes client side javascript as we know it at the moment, does not have native support for it but how many times have you seen <code>YAHOO.util.Event</code> or <code>jQuery.fn.pngFix</code>? The good part here is that you understand from the first time you see the code what is all about and if you don&#x27;t you will be able to search for help at the right place.</p><p>When you write your own code most of the times you don&#x27;t have to search for help but you must be able to understand what you are writing. The test for a really clean code is to be able to understand your code as fast as possible after some period of time, let&#x27;s say one month without looking at it.</p><p>So you can have namespacing...</p><div class="code-block"><pre class="language-javascript"><code class="language-javascript"><span class="token keyword">var</span> mySite <span class="token operator">=</span> <span class="token punctuation">{</span>
  <span class="token literal-property property">validation</span><span class="token operator">:</span> <span class="token punctuation">{</span>
    <span class="token function-variable function">validationofsomething</span><span class="token operator">:</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
      <span class="token comment">//do some validation</span>
    <span class="token punctuation">}</span>
  <span class="token punctuation">}</span><span class="token punctuation">,</span>
  <span class="token literal-property property">ajax</span><span class="token operator">:</span> <span class="token punctuation">{</span>
    <span class="token function-variable function">requestsomething</span><span class="token operator">:</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
      <span class="token comment">//do the request</span>
    <span class="token punctuation">}</span>
  <span class="token punctuation">}</span>
<span class="token punctuation">}</span><span class="token punctuation">;</span></code></pre></div><p>Not only you can have namespacing but can also add stuff later:</p><div class="code-block"><pre class="language-javascript"><code class="language-javascript">mySite<span class="token punctuation">.</span>validation<span class="token punctuation">.</span><span class="token function-variable function">bettervalidation</span><span class="token operator">:</span> <span class="token keyword">function</span> <span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
  <span class="token comment">//do some better validation</span>
<span class="token punctuation">}</span><span class="token punctuation">;</span></code></pre></div><p>or</p><div class="code-block"><pre class="language-javascript"><code class="language-javascript">mySite<span class="token punctuation">.</span>moduleX <span class="token operator">=</span> <span class="token punctuation">{</span><span class="token punctuation">}</span><span class="token punctuation">;</span>
mySite<span class="token punctuation">.</span>moduleX<span class="token punctuation">.</span><span class="token function-variable function">doSomething</span> <span class="token operator">=</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
  <span class="token comment">//do something!</span>
<span class="token punctuation">}</span><span class="token punctuation">;</span></code></pre></div><p>Now when on your code see something like <code>mySite.moduleX.doSomething()</code> where will you start looking for more information? Hope not on the <code>mySite.moduleX</code> &quot;namespace&quot;!</p></div></div>]]></content:encoded>
    </item>
  </channel>
</rss>
