<?xml version="1.0" encoding="utf-8"?>

<feed xmlns="http://www.w3.org/2005/Atom">

  <title><![CDATA[labs @ Qandidate.com]]></title>
  <link href="https://labs.qandidate.com/atom.xml" rel="self"/>
  <link href="https://labs.qandidate.com/"/>
  <updated>2025-11-14T18:17:34+00:00</updated>
  <id>https://labs.qandidate.com/</id>
  <author>
    <name>Qandidate.com</name>
      </author>

    <entry>
        <author>
      <name>Fritsjan</name>
      <uri>/authors/fritsjanb/</uri>
    </author>
        <title type="html">Asynchronous Event Processing with Broadway using RabbitMQ</title>
          <link href="https://labs.qandidate.com/blog/2015/10/07/asynchronous-event-processing-with-broadway-using-rabbitmq//"/>
        <updated>2015-10-07T16:00:00+00:00</updated>
    <id>https://labs.qandidate.com/blog/2015/10/07/asynchronous-event-processing-with-broadway-using-rabbitmq/</id>
    <content type="html"><![CDATA[<p><a href="https://github.com/qandidate-labs/broadway">Broadway</a> allows the processing of events by passing them to an <a href="https://github.com/qandidate-labs/broadway/blob/6d8859820a17cba423d3d8a02ed5e228d10cbedc/src/Broadway/EventHandling/SimpleEventBus.php">event bus</a>. You
can have a <a href="https://github.com/qandidate-labs/broadway/blob/6d8859820a17cba423d3d8a02ed5e228d10cbedc/src/Broadway/ReadModel/Projector.php">Projector</a> subscribe to this event bus in order to update your
read models, or you can have a <a href="https://github.com/qandidate-labs/broadway/blob/6d8859820a17cba423d3d8a02ed5e228d10cbedc/src/Broadway/Processor/Processor.php">Processor</a> subscribe to the event bus in order to
for example send an email. In Broadway this all happens synchronously:
dispatching of the command, persisting the new events and processing the events
(the projectors and processors) all happen on a single request, on a single
thread. In this blog post we will explain to you how you can improve your user
experience by running the processors asynchronously using <a href="https://www.rabbitmq.com/">RabbitMQ</a> (or any
other message queue).</p>


<p><a rel="bookmark" href="https://labs.qandidate.com/blog/2015/10/07/asynchronous-event-processing-with-broadway-using-rabbitmq/">&infin; labs @ Qandidate.com Permalink</a></p>
]]></content>
  </entry>
    <entry>
        <author>
      <name>Willem-Jan</name>
      <uri>/authors/wjzijderveld/</uri>
    </author>
        <title type="html">Replaying event streams with Broadway</title>
          <link href="https://labs.qandidate.com/blog/2015/07/08/replaying-event-streams-with-broadway//"/>
        <updated>2015-07-08T16:00:00+00:00</updated>
    <id>https://labs.qandidate.com/blog/2015/07/08/replaying-event-streams-with-broadway/</id>
    <content type="html"><![CDATA[<p>With event sourcing you have access to some powerful mechanisms. One of which is the ability to revisit the events that happened in the past.
By revisiting the events, you can discover new patterns in your data and the usage of your system!</p>

<p>For example: in <a href="http://qandidate.com">Qandidate.com</a> we have companies that register for an account, but not everybody that registered
actually starts using the system. We have a report about <em>active</em> companies, where the definition of <em>active</em> is determined by combining
multiple events. But at some point we might change the definition of <em>active</em>. With replaying we have the possibility to revisit those events
and create new reports based on the new defintion of <em>active</em>.</p>

<p>It also allows for error correction. Whenever you find a bug in one of your read models, you can simply fix the bug and recreate your read models by replaying the events.</p>

<p>In this post we will go through the process of replaying events.</p>


<p><a rel="bookmark" href="https://labs.qandidate.com/blog/2015/07/08/replaying-event-streams-with-broadway/">&infin; labs @ Qandidate.com Permalink</a></p>
]]></content>
  </entry>
    <entry>
        <author>
      <name>Willem-Jan</name>
      <uri>/authors/wjzijderveld/</uri>
    </author>
        <title type="html">How filepicker saved us a lot of trouble</title>
          <link href="https://labs.qandidate.com/blog/2015/04/08/how-filepicker-saved-us-a-lot-of-trouble//"/>
        <updated>2015-04-08T16:00:00+00:00</updated>
    <id>https://labs.qandidate.com/blog/2015/04/08/how-filepicker-saved-us-a-lot-of-trouble/</id>
    <content type="html"><![CDATA[<p>Adding upload possibilities to an application is often not a pleasant experience. How often did you forget to configure the upload size?
Or forgot to whitelist the mimetypes? And that is just the basic implementation. What if you need to support mobile browsers, how is one going to upload
a document from his iPhone?</p>

<p>At <a href="http://qandidate.com">Qandidate.com</a> we had to implement file uploads as well. Besides the regular upload it should also support selecting files from cloud services
like Google Drive and Dropbox. Instead of trying to implement all integrations ourselfs we decided to look for services that could handle this for us.
We found <a href="https://www.filepicker.com">filepicker</a>, a service that supports 22 sources out of the box.
Besides selecting files from your computer you can also select files from Dropbox, Google Drive, Facebook, SkyDrive or even from FTP.</p>


<p><a rel="bookmark" href="https://labs.qandidate.com/blog/2015/04/08/how-filepicker-saved-us-a-lot-of-trouble/">&infin; labs @ Qandidate.com Permalink</a></p>
]]></content>
  </entry>
    <entry>
        <author>
      <name>Willem-Jan</name>
      <uri>/authors/wjzijderveld/</uri>
    </author>
        <title type="html">Projecting your event stream</title>
          <link href="https://labs.qandidate.com/blog/2015/01/22/projecting-your-event-stream//"/>
        <updated>2015-01-22T16:00:00+00:00</updated>
    <id>https://labs.qandidate.com/blog/2015/01/22/projecting-your-event-stream/</id>
    <content type="html"><![CDATA[<p>When you are using a CQRS and Event Sourcing architecture you are separating your writes from your reads.
You can fire commands that change state but return nothing and you have queries that return a result but don't change state.</p>

<p>So when you need to query some data, you can replay your eventstream and listen to specific events you are interested in.
Although this can work for quite a lot of cases, most of the time this is not very efficient and it doesn't scale very well.</p>

<p>One solution to solve that, is to use projections to create a view that you can query against. Those projections are created with a projector.
A projector listens to events and creates a read model from it. With this method it is really easy to create multiple read models at the same time.
Because of the nature of your event stream, collecting facts that happened in the past, you can also easily create new read models for events that happened a long time ago.</p>


<p><a rel="bookmark" href="https://labs.qandidate.com/blog/2015/01/22/projecting-your-event-stream/">&infin; labs @ Qandidate.com Permalink</a></p>
]]></content>
  </entry>
    <entry>
        <author>
      <name>Willem-Jan</name>
      <uri>/authors/wjzijderveld/</uri>
    </author>
        <author>
      <name>Fritsjan</name>
      <uri>/authors/fritsjanb/</uri>
    </author>
        <title type="html">A Broadway demo application</title>
          <link href="https://labs.qandidate.com/blog/2014/12/30/a-broadway-demo-application//"/>
        <updated>2014-12-30T16:00:00+00:00</updated>
    <id>https://labs.qandidate.com/blog/2014/12/30/a-broadway-demo-application/</id>
    <content type="html"><![CDATA[<p>After <a href="http://labs.qandidate.com/blog/2014/08/26/broadway-our-cqrs-es-framework-open-sourced/">the release of Broadway</a> we got a lot of requests for a demo application. People were curious
how we use Broadway and how everything ties together.</p>

<p>So <a href="http://labs.qandidate.com/authors/fritsjanb/">Fritsjan</a> started with the demo application a while back and we just published it <a href="https://github.com/qandidate-labs/broadway-demo">on Github</a>.
In this blog post we want to take a closer look at the demo application.</p>


<p><a rel="bookmark" href="https://labs.qandidate.com/blog/2014/12/30/a-broadway-demo-application/">&infin; labs @ Qandidate.com Permalink</a></p>
]]></content>
  </entry>
    <entry>
        <author>
      <name>Remy</name>
      <uri>/authors/remy/</uri>
    </author>
        <title type="html">So...we received funding! Now what are we going to invest in?</title>
          <link href="https://labs.qandidate.com/blog/2014/11/27/so-we-received-funding//"/>
        <updated>2014-11-27T16:00:00+00:00</updated>
    <id>https://labs.qandidate.com/blog/2014/11/27/so-we-received-funding/</id>
    <content type="html"><![CDATA[<p><em>If you are an experienced developer and keen on growing you should definitely
read this bit.</em></p>

<p>On Tuesday 4 November we announced our <a href="http://qandidate.com/blogpost/vonq-qandidate-com-secure-a-series-a-investment-led-by-randstad-innovation-fund/">Series A investment</a> by Randstad
Innovation Fund and Qmulus. A really exciting moment for the whole team. This is
the starting point we all were waiting for and it feels like having trained all
these years for the Champions League and now finally stepping on the grass to
perform. We are growing, in fact we were already growing fast, but with this
investment we can ramp up our activities and execute our growth plans at an even
faster pace. Please also check out this article on <a href="http://techcrunch.com/2014/11/06/randstad-innovation-fund/">Techcrunch</a> about why
Randstad Innovation Fund invests in companies like Qandidate.com.</p>


<p><a rel="bookmark" href="https://labs.qandidate.com/blog/2014/11/27/so-we-received-funding/">&infin; labs @ Qandidate.com Permalink</a></p>
]]></content>
  </entry>
    <entry>
        <author>
      <name>Willem-Jan</name>
      <uri>/authors/wjzijderveld/</uri>
    </author>
        <title type="html">Broadway just got a new release</title>
          <link href="https://labs.qandidate.com/blog/2014/11/25/broadway-just-got-a-new-release//"/>
        <updated>2014-11-25T16:00:00+00:00</updated>
    <id>https://labs.qandidate.com/blog/2014/11/25/broadway-just-got-a-new-release/</id>
    <content type="html"><![CDATA[<p>Today we tagged version <a href="https://github.com/qandidate-labs/broadway/releases/tag/0.3.0">0.3.0</a> for <a href="http://labs.qandidate.com/blog/2014/08/26/broadway-our-cqrs-es-framework-open-sourced/">Broadway</a>. In this version we have merged some nice pull requests from
various contributors, thanks to everybody that submitted issues and/or pull requests!</p>

<p>One of the pull requests we received is from <a href="https://twitter.com/beausimensen">simensen</a>. He added factories for our aggregates.</p>


<p><a rel="bookmark" href="https://labs.qandidate.com/blog/2014/11/25/broadway-just-got-a-new-release/">&infin; labs @ Qandidate.com Permalink</a></p>
]]></content>
  </entry>
    <entry>
        <author>
      <name>Fritsjan</name>
      <uri>/authors/fritsjanb/</uri>
    </author>
        <title type="html">Adding a unique request id using middleware</title>
          <link href="https://labs.qandidate.com/blog/2014/10/28/adding-a-unique-request-id-using-middleware//"/>
        <updated>2014-10-28T16:00:00+00:00</updated>
    <id>https://labs.qandidate.com/blog/2014/10/28/adding-a-unique-request-id-using-middleware/</id>
    <content type="html"><![CDATA[<p>In our event-sourced applications built using <a href="https://github.com/qandidate-labs/broadway">Broadway</a> we have a full log of all events that happened in our application. We also log all commands using <a href="https://github.com/Seldaek/monolog">monolog</a>.
We did however miss some traceability between the commands and the actual events: we logged both the commands and the events but could not determine
which commands led to which events.</p>

<p>In order to achieve this we decided to add a request id to each of our requests.
We can now add the request id to the command log and add the request id to the metadata of our <a href="https://github.com/qandidate-labs/broadway/blob/2006586b59167141c0d34574de1e7de66ee66194/src/Broadway/Domain/DomainMessage.php#L27">DomainMessages</a> using the <a href="https://github.com/qandidate-labs/broadway/blob/2006586b59167141c0d34574de1e7de66ee66194/src/Broadway/EventSourcing/MetadataEnrichment/MetadataEnricherInterface.php">MetadataEnricherInterface</a></p>

<p>There are some webservers that provide a solution for this problem.
One of these is <a href="https://github.com/newobj/nginx-x-rid-header">an nginx module</a>, and there is also <a href="http://httpd.apache.org/docs/2.2/mod/mod_unique_id.html">an apache module</a>.
However, we wanted our solution to be webserver-independent.
The result: we decided to tackle our problem the way we know best; in PHP.</p>

<p>We created a middleware for <a href="http://symfony.com">Symfony</a> that adds a request id header to the request's headers.
Check out <a href="https://github.com/qandidate-labs/stack-request-id">the source code</a>. You can add it to your application by changing a few lines of code in your app.php file.
Just have a look at these 'before' and 'after' codeblocks:</p>


<p><a rel="bookmark" href="https://labs.qandidate.com/blog/2014/10/28/adding-a-unique-request-id-using-middleware/">&infin; labs @ Qandidate.com Permalink</a></p>
]]></content>
  </entry>
    <entry>
        <author>
      <name>Willem-Jan</name>
      <uri>/authors/wjzijderveld/</uri>
    </author>
        <title type="html">Using the Accept Header to version your API</title>
          <link href="https://labs.qandidate.com/blog/2014/10/16/using-the-accept-header-to-version-your-api//"/>
        <updated>2014-10-16T16:00:00+00:00</updated>
    <id>https://labs.qandidate.com/blog/2014/10/16/using-the-accept-header-to-version-your-api/</id>
    <content type="html"><![CDATA[<p>I investigated different ways to version a REST API. Most of the sources I found, pretty much all said the same thing. To version <em>any</em> resource on the internet, you should <strong>not</strong> change the URL. The web isn't versioned, and changing the URL would tell a client there is more than 1 resource. But actually there aren't multiple resources, it's just a different representation of the same resource. Of course there are cases where you should change the URL; for example if you are changing the API in such a way that its functionality alters. In this particular case you could consider changing the URL as you could reason that it is not the same resource anymore.</p>

<p>But another thing, and probably even more important, you should always try to make sure your changes are backwards compatible. That would mean there is a lot of thinking involved before the actual API is built, but it can also save you from a big, very big headache.</p>


<p><a rel="bookmark" href="https://labs.qandidate.com/blog/2014/10/16/using-the-accept-header-to-version-your-api/">&infin; labs @ Qandidate.com Permalink</a></p>
]]></content>
  </entry>
    <entry>
        <author>
      <name>Emil</name>
      <uri>/authors/e1379/</uri>
    </author>
        <title type="html">Using HAProxy to offload SSL</title>
          <link href="https://labs.qandidate.com/blog/2014/09/18/using-haproxy-to-offload-ssl//"/>
        <updated>2014-09-18T16:01:00+00:00</updated>
    <id>https://labs.qandidate.com/blog/2014/09/18/using-haproxy-to-offload-ssl/</id>
    <content type="html"><![CDATA[<p>At <a href="http://qandidate.com">Qandidate.com</a> we started to use <a href="https://www.docker.com">Docker</a> containers to run our apps and REST APIs. Some of them are publicly exposed and should communicate over a secure connection. Of course we can config <a href="http://nginx.org">nginx</a> in our containers to accept secure connections, but I want to show you how easy it is to use <a href="http://www.haproxy.org">HAProxy</a> to do the SSL <a href="http://en.wiktionary.org/wiki/offload">offloading</a>.</p>

<p>
<p><a rel="bookmark" href="https://labs.qandidate.com/blog/2014/09/18/using-haproxy-to-offload-ssl/">&infin; labs @ Qandidate.com Permalink</a></p>
]]></content>
  </entry>
    <entry>
        <author>
      <name>Fritsjan</name>
      <uri>/authors/fritsjanb/</uri>
    </author>
        <title type="html">There is a microservice for that</title>
          <link href="https://labs.qandidate.com/blog/2014/09/17/there-is-a-microservice-for-that//"/>
        <updated>2014-09-17T15:59:00+00:00</updated>
    <id>https://labs.qandidate.com/blog/2014/09/17/there-is-a-microservice-for-that/</id>
    <content type="html"><![CDATA[<p>At Qandidate.com we recently shifted our development process towards building
<a href="http://martinfowler.com/articles/microservices.html">microservices</a>. We’re constantly looking to improve our way of writing software.
For example, moving from <a href="http://en.wikipedia.org/wiki/Create,_read,_update_and_delete">CRUD</a> applications to <a href="http://martinfowler.com/eaaDev/EventSourcing.html">event-sourced</a> applications and
using <a href="http://labs.qandidate.com/blog/2014/09/11/kanban-continuously-improving-our-process/">Kanban to manage our process</a>. Microservices seem to be the next step.</p>

<p>So far we encountered a number of advantages of working with microservices, and
we would like to share our findings with you. Note that we don't run many
microservices in our production environment yet. Who knows how we will be
developing software in six months!</p>


<p><a rel="bookmark" href="https://labs.qandidate.com/blog/2014/09/17/there-is-a-microservice-for-that/">&infin; labs @ Qandidate.com Permalink</a></p>
]]></content>
  </entry>
    <entry>
        <author>
      <name>Emil</name>
      <uri>/authors/e1379/</uri>
    </author>
        <title type="html">Kanban: Continuously improving our process!</title>
          <link href="https://labs.qandidate.com/blog/2014/09/11/kanban-continuously-improving-our-process//"/>
        <updated>2014-09-11T15:58:00+00:00</updated>
    <id>https://labs.qandidate.com/blog/2014/09/11/kanban-continuously-improving-our-process/</id>
    <content type="html"><![CDATA[<p>In my previous <a href="http://labs.qandidate.com/blog/2014/08/21/development-process-at-qandidate-com/">post</a> I explained how our development process works at a high
level. Now I will try to go into detail and explain how we develop day-to-day.</p>


<p><a rel="bookmark" href="https://labs.qandidate.com/blog/2014/09/11/kanban-continuously-improving-our-process/">&infin; labs @ Qandidate.com Permalink</a></p>
]]></content>
  </entry>
    <entry>
        <author>
      <name>Sander</name>
      <uri>/authors/othillo/</uri>
    </author>
        <title type="html">Having fun with geometry data in MariaDB and ElasticSearch</title>
          <link href="https://labs.qandidate.com/blog/2014/09/09/having-fun-with-geometry-data-in-mariadb-and-elasticsearch//"/>
        <updated>2014-09-09T16:00:00+00:00</updated>
    <id>https://labs.qandidate.com/blog/2014/09/09/having-fun-with-geometry-data-in-mariadb-and-elasticsearch/</id>
    <content type="html"><![CDATA[<p>At Qandidate.com we get an insane amount of job applications each day. Because
we're an awesome company to work for? Well I hope so, but that's not the reason
why. It's because we make a free <a href="http://en.wikipedia.org/wiki/Applicant_tracking_system">ATS</a> or Applicant Tracking System. Companies
worldwide manage their vacancies and candidates with our software. We <a href="http://en.wikipedia.org/wiki/Geocoding">geocode</a>
all the location data and use <a href="https://mariadb.org/">MariaDB</a> and <a href="http://www.elasticsearch.org/">ElasticSearch</a> to store and
analyze them.</p>

<p>In this blog post I will explain how to store geocodes in <a href="https://mariadb.org/">MariaDB</a> and
<a href="http://www.elasticsearch.org/">ElasticSearch</a> and how to calculate the distances between them.</p>


<p><a rel="bookmark" href="https://labs.qandidate.com/blog/2014/09/09/having-fun-with-geometry-data-in-mariadb-and-elasticsearch/">&infin; labs @ Qandidate.com Permalink</a></p>
]]></content>
  </entry>
    <entry>
        <author>
      <name>Willem-Jan</name>
      <uri>/authors/wjzijderveld/</uri>
    </author>
        <title type="html">Feature Toggles in Symfony</title>
          <link href="https://labs.qandidate.com/blog/2014/09/04/feature-toggles-in-symfony2//"/>
        <updated>2014-09-04T16:00:00+00:00</updated>
    <id>https://labs.qandidate.com/blog/2014/09/04/feature-toggles-in-symfony2/</id>
    <content type="html"><![CDATA[<p>When we launched <a href="https://github.com/qandidate-labs/qandidate-toggle">our feature toggle library</a> to the public <a href="http://labs.qandidate.com/blog/2014/08/18/a-new-feature-toggling-library-for-php/">a few weeks ago</a>, we had multiple people asking for a Symfony Bundle.
So guess what? We created one just for you! This bundle doesn't just help you
with feature toggling in your controllers, it is shipped with a Twig Extension
for your toggling pleasure. Read on to see how to get started!</p>


<p><a rel="bookmark" href="https://labs.qandidate.com/blog/2014/09/04/feature-toggles-in-symfony2/">&infin; labs @ Qandidate.com Permalink</a></p>
]]></content>
  </entry>
    <entry>
        <author>
      <name>Sander</name>
      <uri>/authors/othillo/</uri>
    </author>
        <title type="html">Minifying an existing AngularJS project</title>
          <link href="https://labs.qandidate.com/blog/2014/09/02/minifying-an-existing-angularjs-project//"/>
        <updated>2014-09-02T16:00:00+00:00</updated>
    <id>https://labs.qandidate.com/blog/2014/09/02/minifying-an-existing-angularjs-project/</id>
    <content type="html"><![CDATA[<p>Being a PHP Developer who only recently started using <a href="https://angularjs.org/">AngularJS</a> I knew almost
nothing about the incredible progress front-end development had made since I
last created a website.</p>

<p>When we deployed our first AngularJS application over at <a href="http://qandidate.com/">Qandidate.com</a> a
single page view would generate a whopping 56 HTTP requests of which 32 were
our own AngularJS files like controllers and services and 12 were 3rd party
dependencies.</p>

<p>Since browsers only allow for up to about <a href="http://sgdev-blog.blogspot.sg/2014/01/maximum-concurrent-connection-to-same.html">8 parallel connections</a> a lot of
requests will have to wait for other requests to finish resulting in a poor
end-user experience.</p>

<p>In this blog post I will show how you can safely minify and concatenate your
AngularJS code.</p>


<p><a rel="bookmark" href="https://labs.qandidate.com/blog/2014/09/02/minifying-an-existing-angularjs-project/">&infin; labs @ Qandidate.com Permalink</a></p>
]]></content>
  </entry>
    <entry>
        <author>
      <name>Willem-Jan</name>
      <uri>/authors/wjzijderveld/</uri>
    </author>
        <title type="html">Learning Scala with the team</title>
          <link href="https://labs.qandidate.com/blog/2014/08/28/learning-scala-with-the-team//"/>
        <updated>2014-08-28T15:58:00+00:00</updated>
    <id>https://labs.qandidate.com/blog/2014/08/28/learning-scala-with-the-team/</id>
    <content type="html"><![CDATA[<p>Last April we decided as a <a href="http://labs.qandidate.com/about/">team</a> to follow the Coursera course "<a href="https://www.coursera.org/course/progfun">Principles of Functional Programming in Scala</a>". We want to keep growing as a team so we wanted to follow the course with the whole team. By following the course together we could learn from each other while building the team spirit.</p>


<p><a rel="bookmark" href="https://labs.qandidate.com/blog/2014/08/28/learning-scala-with-the-team/">&infin; labs @ Qandidate.com Permalink</a></p>
]]></content>
  </entry>
    <entry>
        <author>
      <name>Alexander</name>
      <uri>/authors/asm89/</uri>
    </author>
        <author>
      <name>Emil</name>
      <uri>/authors/e1379/</uri>
    </author>
        <author>
      <name>Fritsjan</name>
      <uri>/authors/fritsjanb/</uri>
    </author>
        <author>
      <name>Sander</name>
      <uri>/authors/othillo/</uri>
    </author>
        <author>
      <name>Willem-Jan</name>
      <uri>/authors/wjzijderveld/</uri>
    </author>
        <title type="html">Bringing CQRS and Event Sourcing to PHP. Open sourcing Broadway!</title>
          <link href="https://labs.qandidate.com/blog/2014/08/26/broadway-our-cqrs-es-framework-open-sourced//"/>
        <updated>2014-08-26T16:00:00+00:00</updated>
    <id>https://labs.qandidate.com/blog/2014/08/26/broadway-our-cqrs-es-framework-open-sourced/</id>
    <content type="html"><![CDATA[<p>Last week we open sourced our <a href="https://github.com/qandidate-labs/qandidate-toggle">toggle library</a>, <a href="https://github.com/qandidate-labs/qandidate-toggle-api">API</a> and <a href="https://github.com/qandidate-labs/qandidate-toggle-ui">GUI</a>, see our
announcements <a href="/blog/2014/08/18/a-new-feature-toggling-library-for-php/">here</a> and <a href="/blog/2014/08/19/open-sourcing-our-feature-toggle-api-and-ui/">here</a>. Today we open
source <a href="https://github.com/qandidate-labs/broadway">Broadway</a>! Broadway is a project providing infrastructure and testing
helpers for creating CQRS and event sourced applications. Broadway tries hard
to not get in your way. The project contains several loosely coupled components
that can be used together to provide a full CQRS\ES experience.</p>


<p><a rel="bookmark" href="https://labs.qandidate.com/blog/2014/08/26/broadway-our-cqrs-es-framework-open-sourced/">&infin; labs @ Qandidate.com Permalink</a></p>
]]></content>
  </entry>
    <entry>
        <author>
      <name>Sander</name>
      <uri>/authors/othillo/</uri>
    </author>
        <title type="html">Using ZFS to snapshot your database</title>
          <link href="https://labs.qandidate.com/blog/2014/08/25/using-zfs-to-snapshot-your-database//"/>
        <updated>2014-08-25T16:00:00+00:00</updated>
    <id>https://labs.qandidate.com/blog/2014/08/25/using-zfs-to-snapshot-your-database/</id>
    <content type="html"><![CDATA[<p>What if I told you you can backup your database in under a second?
Awesome right? Well it's not entirely true, but you can create a snapshot of
your database in under a second and decide later on how to backup this snapshot.
In this post I will show you how to get the <a href="http://en.wikipedia.org/wiki/ZFS">ZFS</a> filesystem running on Ubuntu
and how to backup and restore a <a href="https://mariadb.org/">MariaDB</a> database from a snapshot.</p>


<p><a rel="bookmark" href="https://labs.qandidate.com/blog/2014/08/25/using-zfs-to-snapshot-your-database/">&infin; labs @ Qandidate.com Permalink</a></p>
]]></content>
  </entry>
    <entry>
        <author>
      <name>Emil</name>
      <uri>/authors/e1379/</uri>
    </author>
        <title type="html">How we manage our development process at Qandidate.com</title>
          <link href="https://labs.qandidate.com/blog/2014/08/21/development-process-at-qandidate-com//"/>
        <updated>2014-08-21T15:52:00+00:00</updated>
    <id>https://labs.qandidate.com/blog/2014/08/21/development-process-at-qandidate-com/</id>
    <content type="html"><![CDATA[<p>At Qandidate.com we tried a lot of different project management tools and techniques. After two years of experimenting I want to share our current process, seen from my role as product owner (PO). One reason for sharing this, is to help you improve your process, but the most important reason is to start a discussion with you based on your experience, to improve our process even more.
Our main rule at Qandidate.com is to embrace change. Always be open for changes that may or may not improve your process. If a change improves the process it’s a win. If you didn’t try it you will never know!</p>


<p><a rel="bookmark" href="https://labs.qandidate.com/blog/2014/08/21/development-process-at-qandidate-com/">&infin; labs @ Qandidate.com Permalink</a></p>
]]></content>
  </entry>
    <entry>
        <author>
      <name>Willem-Jan</name>
      <uri>/authors/wjzijderveld/</uri>
    </author>
        <author>
      <name>Alexander</name>
      <uri>/authors/asm89/</uri>
    </author>
        <author>
      <name>Sander</name>
      <uri>/authors/othillo/</uri>
    </author>
        <title type="html">Open sourcing our feature toggle API and UI</title>
          <link href="https://labs.qandidate.com/blog/2014/08/19/open-sourcing-our-feature-toggle-api-and-ui//"/>
        <updated>2014-08-19T16:15:00+00:00</updated>
    <id>https://labs.qandidate.com/blog/2014/08/19/open-sourcing-our-feature-toggle-api-and-ui/</id>
    <content type="html"><![CDATA[<p>In <a href="http://labs.qandidate.com/blog/2014/08/18/a-new-feature-toggling-library-for-php/">our previous post</a> we released our <a href="https://github.com/qandidate-labs/qandidate-toggle">toggle library</a> and showed how to use it in your PHP project, but our goal was to toggle features without the need for a deploy. To accomplish this we created <a href="https://github.com/qandidate-labs/qandidate-toggle-api">an API</a> with <a href="https://github.com/qandidate-labs/qandidate-toggle-ui">an AngularJS frontend</a>. In this blogpost we’ll show you how the API works and how we use it in combination with the AngularJS frontend.</p>


<p><a rel="bookmark" href="https://labs.qandidate.com/blog/2014/08/19/open-sourcing-our-feature-toggle-api-and-ui/">&infin; labs @ Qandidate.com Permalink</a></p>
]]></content>
  </entry>
    <entry>
        <author>
      <name>Willem-Jan</name>
      <uri>/authors/wjzijderveld/</uri>
    </author>
        <author>
      <name>Alexander</name>
      <uri>/authors/asm89/</uri>
    </author>
        <title type="html">A new feature toggling library for PHP</title>
          <link href="https://labs.qandidate.com/blog/2014/08/18/a-new-feature-toggling-library-for-php//"/>
        <updated>2014-08-18T16:15:00+00:00</updated>
    <id>https://labs.qandidate.com/blog/2014/08/18/a-new-feature-toggling-library-for-php/</id>
    <content type="html"><![CDATA[<p>Adding features to an existing application can seem straightforward, but what if
the system you need the feature in is already running in production and the feature
needs small bug fixes from time to time? Or what if developing a feature takes longer than a standard release
cycle, so it can’t be rolled out yet?</p>


<p><a rel="bookmark" href="https://labs.qandidate.com/blog/2014/08/18/a-new-feature-toggling-library-for-php/">&infin; labs @ Qandidate.com Permalink</a></p>
]]></content>
  </entry>
    <entry>
        <author>
      <name>Fritsjan</name>
      <uri>/authors/fritsjanb/</uri>
    </author>
        <title type="html">Asynchronous Phystrix explained</title>
          <link href="https://labs.qandidate.com/blog/2014/08/14/asynchronous-phystrix-explained//"/>
        <updated>2014-08-14T17:00:00+00:00</updated>
    <id>https://labs.qandidate.com/blog/2014/08/14/asynchronous-phystrix-explained/</id>
    <content type="html"><![CDATA[<p>We started this blog series with <a href="http://labs.qandidate.com/blog/2014/07/14/fault-tolerant-programming-in-php/">the basics of a circuit breaker</a>. Our second post showed a <a href="http://labs.qandidate.com/blog/2014/08/11/asynchronous-fault-tolerant-programming-in-php/">running demo</a> of an API consisting of two private microservices using <a href="https://github.com/odesk/phystrix">oDesk’s Phystrix</a>. The demo consisted of asynchronous calls using <a href="https://github.com/reactphp/">ReactPHP</a>.</p>

<p>The demo itself shows a working circuit breaker, but I didn’t explain how
Phystrix actually works. This blog will go through the <a href="https://github.com/qandidate-labs/phystrix-async-demo">demo code</a> and
show the changes we had to make to get Phystrix running asynchronously, while
also looking more in-depth as to how Phystrix actually works. Awesome!</p>


<p><a rel="bookmark" href="https://labs.qandidate.com/blog/2014/08/14/asynchronous-phystrix-explained/">&infin; labs @ Qandidate.com Permalink</a></p>
]]></content>
  </entry>
    <entry>
        <author>
      <name>Sander</name>
      <uri>/authors/othillo/</uri>
    </author>
        <title type="html">Handling AngularJS POST requests in Symfony</title>
          <link href="https://labs.qandidate.com/blog/2014/08/13/handling-angularjs-post-requests-in-symfony//"/>
        <updated>2014-08-13T16:00:00+00:00</updated>
    <id>https://labs.qandidate.com/blog/2014/08/13/handling-angularjs-post-requests-in-symfony/</id>
    <content type="html"><![CDATA[<p>At Qandidate.com we started using <a href="https://angularjs.org/">AngularJS</a> last year and I have to say it
was love at first sight! Two-way databinding, testability, dependency
injection, server communication...awesome!</p>

<p>Did I say server communication? We use <a href="http://symfony.com/">Symfony 2</a> (which is awesome too) for
our back end API’s. Unfortunately AngularJS and Symfony do not speak the same
language out-of-the-box.</p>

<p>In this post I will show you how we automatically decode JSON requests so we
can use it with Symfony's <a href="http://api.symfony.com/2.3/Symfony/Component/HttpFoundation/Request.html">Request</a> object using our
<a href="https://github.com/qandidate-labs/symfony-json-request-transformer">symfony-json-request-transformer</a> library (or class actually).</p>


<p><a rel="bookmark" href="https://labs.qandidate.com/blog/2014/08/13/handling-angularjs-post-requests-in-symfony/">&infin; labs @ Qandidate.com Permalink</a></p>
]]></content>
  </entry>
    <entry>
        <author>
      <name>Fritsjan</name>
      <uri>/authors/fritsjanb/</uri>
    </author>
        <author>
      <name>Alexander</name>
      <uri>/authors/asm89/</uri>
    </author>
        <title type="html">Asynchronous fault tolerant programming with PHP</title>
          <link href="https://labs.qandidate.com/blog/2014/08/11/asynchronous-fault-tolerant-programming-in-php//"/>
        <updated>2014-08-11T00:00:00+00:00</updated>
    <id>https://labs.qandidate.com/blog/2014/08/11/asynchronous-fault-tolerant-programming-in-php/</id>
    <content type="html"><![CDATA[<p>In the previous post on <a href="http://labs.qandidate.com/blog/2014/07/14/fault-tolerant-programming-in-php/">fault tolerant programming in PHP</a> we have
shown the basics of fault tolerant programming using the circuit breaker
pattern. Now we will show you a running demo of the application where the
circuit breaker library <a href="https://github.com/odesk/phystrix">Phystrix</a> is combined with asynchronous programming. The
advantage of this approach is that it allows the querying of multiple backend
services asynchronously. A timeout can be set for each of the calls and the
circuit breaker will deal with failing services.</p>


<p><a rel="bookmark" href="https://labs.qandidate.com/blog/2014/08/11/asynchronous-fault-tolerant-programming-in-php/">&infin; labs @ Qandidate.com Permalink</a></p>
]]></content>
  </entry>
    <entry>
        <author>
      <name>Alexander</name>
      <uri>/authors/asm89/</uri>
    </author>
        <author>
      <name>Fritsjan</name>
      <uri>/authors/fritsjanb/</uri>
    </author>
        <title type="html">Fault tolerant programming in PHP</title>
          <link href="https://labs.qandidate.com/blog/2014/07/14/fault-tolerant-programming-in-php//"/>
        <updated>2014-07-14T00:00:00+00:00</updated>
    <id>https://labs.qandidate.com/blog/2014/07/14/fault-tolerant-programming-in-php/</id>
    <content type="html"><![CDATA[<p>In your application, every time you call an "external" service you are vulnerable to the failure in that service. That either might be a third party API being down, your database being unresponsive or unexpected errors from the 3rd party library you are using. With many developers and companies being interested in composing applications out of <a href="http://martinfowler.com/articles/microservices.html">microservices</a> at the moment, guarding for failures because of broken dependencies gets even more important.</p>

<p><a href="/img/fault-tolerant-programming-with-php/a-public-facing-api-with-dependencies-on-two-external-services.png"><img src="/img/fault-tolerant-programming-with-php/a-public-facing-api-with-dependencies-on-two-external-services.png" alt="A public facing API with dependencies on two internal services" /></a></p>


<p><a rel="bookmark" href="https://labs.qandidate.com/blog/2014/07/14/fault-tolerant-programming-in-php/">&infin; labs @ Qandidate.com Permalink</a></p>
]]></content>
  </entry>
    <entry>
        <author>
      <name>Sander</name>
      <uri>/authors/othillo/</uri>
    </author>
        <title type="html">Using Satis for fast and reliable software deployment</title>
          <link href="https://labs.qandidate.com/blog/2013/12/05/using-satis-for-fast-and-reliable-software-deployment//"/>
        <updated>2013-12-05T00:00:00+00:00</updated>
    <id>https://labs.qandidate.com/blog/2013/12/05/using-satis-for-fast-and-reliable-software-deployment/</id>
    <content type="html"><![CDATA[<p>If you're familiar with <a href="http://getcomposer.org/">Composer</a> you know it can be slow
and sometimes unreliable when one or more packages are not available.</p>

<p><a href="/img/composer_fail.png"><img src="/img/composer_fail.png" alt="composer failure example" /></a></p>


<p><a rel="bookmark" href="https://labs.qandidate.com/blog/2013/12/05/using-satis-for-fast-and-reliable-software-deployment/">&infin; labs @ Qandidate.com Permalink</a></p>
]]></content>
  </entry>
    <entry>
        <author>
      <name>Sander</name>
      <uri>/authors/othillo/</uri>
    </author>
        <title type="html">Setting up XHProf/XHGui profiling with Ansible</title>
          <link href="https://labs.qandidate.com/blog/2013/11/28/setting_up_xhprof_xhgui_profiling_with_ansible//"/>
        <updated>2013-11-28T00:00:00+00:00</updated>
    <id>https://labs.qandidate.com/blog/2013/11/28/setting_up_xhprof_xhgui_profiling_with_ansible/</id>
    <content type="html"><![CDATA[<p>Once in a while I think about profiling my web applications to see if I can get them to run faster.
There are cool tools out there like <a href="https://github.com/facebook/xhprof">XHProf</a> and <a href="https://github.com/preinheimer/xhprof">XHGUI</a> to help you do exactly that.
And then I remember it took me quite some time to get it all set up...
But now that I've started using <a href="http://www.ansibleworks.com/">Ansible</a> I decided to document the set up process and share it with you.
Today I will walk you through my Ansible role for setting up everything you need for profiling your first PHP script.</p>


<p><a rel="bookmark" href="https://labs.qandidate.com/blog/2013/11/28/setting_up_xhprof_xhgui_profiling_with_ansible/">&infin; labs @ Qandidate.com Permalink</a></p>
]]></content>
  </entry>
    <entry>
        <author>
      <name>Sander</name>
      <uri>/authors/othillo/</uri>
    </author>
        <title type="html">Installing a LAMP server with Ansible playbooks and roles</title>
          <link href="https://labs.qandidate.com/blog/2013/11/21/installing-a-lamp-server-with-ansible-playbooks-and-roles//"/>
        <updated>2013-11-21T00:00:00+00:00</updated>
    <id>https://labs.qandidate.com/blog/2013/11/21/installing-a-lamp-server-with-ansible-playbooks-and-roles/</id>
    <content type="html"><![CDATA[<p>In my <a href="http://labs.qandidate.com/blog/2013/11/15/first-steps-with-ansible/">previous post</a> I introduced you to <a href="http://www.ansibleworks.com/">Ansible</a>. I showed you how to install Ansible, how to create a server inventory and how to execute some basic commands. Afterwards we installed a very basic web server with PHP and Apache and we ended up with a working Hello World script.</p>

<p>In this post I will show you how to organize your server configuration using playbooks and roles. As an example we will install <a href="https://mariadb.org">MariaDB</a> 10.0 beta.</p>


<p><a rel="bookmark" href="https://labs.qandidate.com/blog/2013/11/21/installing-a-lamp-server-with-ansible-playbooks-and-roles/">&infin; labs @ Qandidate.com Permalink</a></p>
]]></content>
  </entry>
    <entry>
        <author>
      <name>Sander</name>
      <uri>/authors/othillo/</uri>
    </author>
        <title type="html">First steps with Ansible</title>
          <link href="https://labs.qandidate.com/blog/2013/11/15/first-steps-with-ansible//"/>
        <updated>2013-11-15T00:00:00+00:00</updated>
    <id>https://labs.qandidate.com/blog/2013/11/15/first-steps-with-ansible/</id>
    <content type="html"><![CDATA[<p>I remember having to install a new web server next to an existing one.
The only requirement my boss had was it had to be "the same" as the existing one. There were two problems:</p>

<ul>
<li>no one had ever documented which packages were needed to run our software</li>
<li>the existing server hadn't been upgraded in ages.</li>
</ul>

<p>I had to use trial and error to get the new server up and running and still I wasn't confident everything was properly installed.
What I needed at that time was a way to manage my server configuration.</p>

<p>In this blog post I will tell you about my experience with server provisioning, why I chose Ansible and I will show you how to install a web server.</p>


<p><a rel="bookmark" href="https://labs.qandidate.com/blog/2013/11/15/first-steps-with-ansible/">&infin; labs @ Qandidate.com Permalink</a></p>
]]></content>
  </entry>
    <entry>
        <author>
      <name>Alexander</name>
      <uri>/authors/asm89/</uri>
    </author>
        <author>
      <name>Emil</name>
      <uri>/authors/e1379/</uri>
    </author>
        <title type="html">Debugging PHP applications with HHVM</title>
          <link href="https://labs.qandidate.com/blog/2013/10/29/debugging-php-applications-with-hhvm//"/>
        <updated>2013-10-29T00:00:00+00:00</updated>
    <id>https://labs.qandidate.com/blog/2013/10/29/debugging-php-applications-with-hhvm/</id>
    <content type="html"><![CDATA[<p>In the previous parts of this series we <a href="/blog/2013/10/15/getting-started-with-hhvm/">got you started with HHVM</a> and showed
how we could get the <a href="/blog/2013/10/21/running-symfony-standard-on-hhvm/">symfony standard edition running on HHVM</a>. This time we
will dive deeper into HHVM by using it to debug our application.</p>

<p>For most people the easiest way of debugging a PHP application is to place
<code>var_dump()</code> and <code>die()</code> statements all over the code. Another option is
installing xdebug, which has gotten a lot easier nowadays due to IDE
integrations.</p>

<p>In this blog post we'll show you how to debug your PHP application using HHVM.
We describe how you can step through your program, set and manage your
breakpoints, how to inspect variables and take a peek at helpful features like
conditional breakpoints.</p>


<p><a rel="bookmark" href="https://labs.qandidate.com/blog/2013/10/29/debugging-php-applications-with-hhvm/">&infin; labs @ Qandidate.com Permalink</a></p>
]]></content>
  </entry>
    <entry>
        <author>
      <name>Alexander</name>
      <uri>/authors/asm89/</uri>
    </author>
        <author>
      <name>Emil</name>
      <uri>/authors/e1379/</uri>
    </author>
        <title type="html">Running symfony standard edition on HHVM</title>
          <link href="https://labs.qandidate.com/blog/2013/10/21/running-symfony-standard-on-hhvm//"/>
        <updated>2013-10-21T00:00:00+00:00</updated>
    <id>https://labs.qandidate.com/blog/2013/10/21/running-symfony-standard-on-hhvm/</id>
    <content type="html"><![CDATA[<p>In part one of this series we talked about "<a href="/blog/2013/10/15/getting-started-with-hhvm/">Getting started with HHVM</a>" by getting a compiled version of HHVM running in a vagrant box. In this part we'll configure the HHVM webserver to run the <a href="https://github.com/symfony/symfony-standard">symfony standard</a> edition.</p>

<p><a href="/img/running-symfony-standard-on-hhvm.png"><img src="/img/running-symfony-standard-on-hhvm.png" alt="Running symfony standard edition on HHVM" /></a></p>


<p><a rel="bookmark" href="https://labs.qandidate.com/blog/2013/10/21/running-symfony-standard-on-hhvm/">&infin; labs @ Qandidate.com Permalink</a></p>
]]></content>
  </entry>
    <entry>
        <author>
      <name>Emil</name>
      <uri>/authors/e1379/</uri>
    </author>
        <title type="html">Getting started with HHVM</title>
          <link href="https://labs.qandidate.com/blog/2013/10/15/getting-started-with-hhvm//"/>
        <updated>2013-10-15T00:00:00+00:00</updated>
    <id>https://labs.qandidate.com/blog/2013/10/15/getting-started-with-hhvm/</id>
    <content type="html"><![CDATA[<p>Facebook deploys one of the biggest PHP codebases in the world. They’re not only pushing the boundaries of what you can do with PHP, but also PHP itself. A few years ago they open-sourced their hiphop compiler and nowadays <a href="https://www.facebook.com">facebook.com</a> runs on their latest generation of the <a href="http://www.hhvm.com">HipHop Virtual Machine</a> (hhvm).</p>

<p><a href="https://www.facebook.com/hphp">What Facebook says about HipHop</a>:</p>

<blockquote>
  <p>HipHop is Facebook's complete toolchain for the PHP language: interpreter, JIT compiler and
  debugger.</p>
</blockquote>

<p>Facebook.com was motivated to create HipHop to save recources on their servers. They claim to be 40% faster than their previous version that was in fact a PHP to C++ compiler which was already faster than plain PHP <a href="http://en.wikipedia.org/wiki/HipHop_for_PHP">1</a>.</p>

<p><a href="/img/hhvm-chart.png"><img src="/img/hhvm-chart.png" alt="HHVM Performance with addition of IR" /></a></p>

<p><em>source: <a href="http://www.hhvm.com/blog/875/wow-hhvm-is-fast-too-bad-it-doesnt-run-my-code">Wow HHVM is fast…too bad it doesn’t run my code
</a></em></p>

<p>In this blog series we’ll get you started with hhvm. We’ll get the symfony standard edition running and show the ins and outs of debugging your code with hhvm (which is awesome!). Today, we’ll start of by setting up hhvm in your own vagrant box.</p>


<p><a rel="bookmark" href="https://labs.qandidate.com/blog/2013/10/15/getting-started-with-hhvm/">&infin; labs @ Qandidate.com Permalink</a></p>
]]></content>
  </entry>
    <entry>
        <author>
      <name>Alexander</name>
      <uri>/authors/asm89/</uri>
    </author>
        <author>
      <name>Emil</name>
      <uri>/authors/e1379/</uri>
    </author>
        <author>
      <name>Fritsjan</name>
      <uri>/authors/fritsjanb/</uri>
    </author>
        <author>
      <name>Sander</name>
      <uri>/authors/othillo/</uri>
    </author>
        <title type="html">Hello world!</title>
          <link href="https://labs.qandidate.com/blog/2013/10/14/hello-world//"/>
        <updated>2013-10-14T00:00:00+00:00</updated>
    <id>https://labs.qandidate.com/blog/2013/10/14/hello-world/</id>
    <content type="html"><![CDATA[<p>It's "official", our development team now has a blog. At Qandidate.com we spend one day a week on research and other fun stuff that's not related to our short term roadmap. We use this time to check out new techniques, build prototypes and educate ourselves on current 'cutting edge' technology.</p>

<p>In order to capture the things we learn during 20% time we've been blogging on an internal blog for some time now. A short while ago we decided we wanted to share what we've learned with the world and so this blog was born!</p>

<p>In the future we'll blog about all things PHP, our development process and all things development which aren't really PHP. Stay tuned!</p>

<p>In the meantime, enjoy one of our favorite cat gifs!</p>


<p><a rel="bookmark" href="https://labs.qandidate.com/blog/2013/10/14/hello-world/">&infin; labs @ Qandidate.com Permalink</a></p>
]]></content>
  </entry>
  </feed>