<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:blogChannel="http://backend.userland.com/blogChannelModule" xmlns:creativeCommons="http://backend.userland.com/creativeCommonsRssModule" xmlns:xhtml="http://www.w3.org/1999/xhtml" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:blog="http://bitflux.org/doctypes/blog" xmlns:php="http://php.net/xsl" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:georss="http://www.georss.org/georss" xmlns:media="http://search.yahoo.com/mrss/" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0"><channel><title>Liip Blog</title><link>http://blog.liip.ch/</link><description>This is the Blog of Liip AG, Zurich/Fribourg/Lausanne/Berne</description><generator>Flux CMS - http://www.flux-cms.org</generator><georss:point>47.3798 8.5275</georss:point><geo:lat>47.3798</geo:lat><geo:long>8.5275</geo:long><atom:link xmlns:atom="http://www.w3.org/2005/Atom" rel="http://api.friendfeed.com/2008/03#sup" type="application/json" href="http://friendfeed.com/api/public-sup.json#flx-3108300a57" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.liip.ch/liip_blog" /><feedburner:info uri="liip_blog" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><item><title>One day with NodeJS</title><link>http://feeds.liip.ch/~r/liip_blog/~3/9Mdkz25BWEU/one-day-with-nodejs.html</link><guid isPermaLink="false">http://blog.liip.ch/archive/id/6379/</guid><content:encoded xmlns="http://www.w3.org/1999/xhtml"><![CDATA[<p>I spent last Friday in the mood of the innovation with a few other liipers. So we had all day long to explore a new technology, something we had never tried before. The main purpose of this hackday was to implement a simple REST API based on NodeJS providing a list of images taken randomly from the world wide web.</p><br/><br/>
        <a href="http://blog.liip.ch/archive/2013/05/14/one-day-with-nodejs.html#post_content_extended">
            Read whole post</a><img src="http://feeds.feedburner.com/~r/liip_blog/~4/9Mdkz25BWEU" height="1" width="1"/>]]></content:encoded><dc:subject>JavaScript</dc:subject><dc:subject>node</dc:subject><dc:subject>mongodb</dc:subject><dc:subject>REST</dc:subject><dc:subject>javascript</dc:subject><dc:creator>Germain Hugon</dc:creator><dc:date>2013-05-14T11:34:27Z</dc:date><feedburner:origLink>http://blog.liip.ch/archive/2013/05/14/one-day-with-nodejs.html</feedburner:origLink></item><item><title>PHPUCEU</title><link>http://feeds.liip.ch/~r/liip_blog/~3/v-BIkkrnyd0/phpuceu.html</link><guid isPermaLink="false">http://blog.liip.ch/archive/id/6374/</guid><content:encoded xmlns="http://www.w3.org/1999/xhtml"><![CDATA[<p>So this weekend I visited my hometown Berlin for the <a href="http://www.phpuceu.org"
    >PHPUCEU</a>. Actually this was in very close proximity to where I grew up, which was nice as I was staying at my parents place. Usually staying there requires a one hour ride to the hipster areas of Berlin to attend a conference. In this case it was just a 2 stop U-Bahn ride. That being said, this wasn't a "normal" conference. This was an <a href="http://en.wikipedia.org/wiki/Unconference"
    >unconference</a>. As such attendees proposed talks they could give, but also talks that they would want to hear. Every morning every attendee would then have two votes for talks. The top voted talks would then be distributed across the 4 slots in the 3 available tracks. As such several of the sessions ended up being quite ad hoc with multiple people chipping in with what they new about the topic. What is also special about this event is that the sessions are just as long as the breaks to facilitate idea exchange about the session topics, but also about other topics. Overall I found this to be an absolutely thrilling experience.</p>

<h2>Day one</h2>

<h3>PHPCR</h3>

<p>I proposed a talk on PHPCR which was selected for the first session. I essentially gave the talk I had given multiple times before. But its still exciting to share the content repository vision for PHP. Looks like there might even be PHPCR support in the future for <a href="http://dev.jimdo.com/2013/05/06/phpuceu/"
    >Jimdo</a> and <a href="http://www.mage-hackathon.de/projectIdea/index/"
    >Magento</a>?</p>

<h3>Clean puppet</h3>

<p>I attended this session by Soenke, Jakon und Hans-Christian mainly because I am still quite a noob when it comes to Puppet and Chef. I must admit, the possibilities excite me but I still prefer others to do the development for me. Somehow I just don't like the DSL of Puppet nor the Rubyness of Chef. This session didn't change this but did highlight some important aspects, specifically that you would keep the concept of environments as for up the chain as possible.</p>

<h3>Behavior Driven Development</h3>

<p>Kore and Gaylord gave this session. Gaylord was representing the more business level perspective while Kore the more technical one. The exciting part about BDD is that BDD can really bring those two sides closer together. However the most important take away for me from this session is that <a href="http://behat.org"
    >Behat</a> can now generate stubs for Context definitions, which will drastically reduce the effort for expanding the DSL for non developers. Gaylord mentioned that he thinks that using BDD seriously increases development time. Yet the benefits of additional testing and always uptodate documentation outweigh these costs. We have played with BDD at Liip several times, but its time we get more serious about it.</p>

<h3>Evening programm</h3>

<p>I missed the 4th session of the day because I was chatting with people outside. After the last session ended we got together and each session was briefly summarized. We headed to a local beer garden which unfortunately was a bit overwhelmed with us and so the service was quite non existant. However we still stayed several hours. Talking about technology and organization challenges.</p>

<h2>Day Two</h2>

<h3>Agile documentation</h3>

<p>This was the <a href="https://speakerdeck.com/s0enke/agile-documentation"
    >first session</a> of the day for me. Soenke was making some important points about how documentation does not only provide benefit but also cost. And this cost is best managed by single sourcing documentation (ie. not duplicating documentation) and by making documentation executable (via BDD).</p>

<h3>Hood.ie</h3>

<p>This session was slightly sabotaged by github. Kore and Hans-Christian wanted to explore <a href="http://hood.ie"
    >Hood.ie</a> life on stage but couldn't get the necessary code in time. So instead Kore spoke a bit about the core idea behind <a href="http://couchapp.org"
    >CouchApps</a>. I was also able to add some tidbits about what Hood.ie adds as I recently got a personal demo by <a href="https://twitter.com/gr2m"
    >Gregor</a>, one of the core developers. We then went through some of the code examples on the site. In general I believe that the coolest thing in CouchDB is the replication protocol, which is why I never understood why Couchbase decided to focus on elastic scaling instead. Thanks to async multi master replication with local storage one can build a whole new class of mobile applications. There is a very high chance that Hood.ie will become a big part of the Liip technology stack.</p>

<h3>Symfony2 Rest API</h3>

<p>I held this session by basically doing a walk through of a client application we are currently building as well as the Liip Symfony2 techtalk edition. Overall I was showing off how to integrate various Bundles: <a href="https://github.com/friendsOfSymfony/FOSRestBundle"
    >FOSRestBundle</a>, <a href="http://github.com/schmittjoh/JMSSerializerBundle"
    >JMSSerializerBundle</a>, <a href="https://github.com/nelmio/NelmioApiDocBundle"
    >NelmioApiDocBundle</a>, <a href="https://github.com/TheFootballSocialClub/FSCHateoasBundle"
    >FSCHateoasBundle</a> (requires this <a href="https://github.com/FriendsOfSymfony/FOSRestBundle/pull/327"
    >PR</a>) and <a href="https://github.com/hautelook/TemplatedUriBundle"
    >HautelookTemplatedUriBundle</a>. I also highlighted several limitations which let me to post <a href="http://pooteeweet.org/blog/2221"
    >this</a> on my blog as a follow up.</p>

<h3>NoSQL is not the answer</h3>

<p>I had given <a href="http://www.slideshare.net/lsmith77/no-sql-isnottheanswer"
    >this</a> as a lightning talk at GotoCon in Zurich and figured it would be a useful topic for this event as well. I even managed to get Kris to come out of the sun for this session! He added some more insights. The tl;dr; of this session is: Stop using the term NoSQL as well as that there is lots of room for innovation on top of relation theory which the vendors are finally addressing thanks to all the hype around MongoDB, CouchDB and friends.</p>

<h2>Take away</h2>

<p>The big take away is that unconferences are awesome and from what I hear our yearly Liip internal techday will heavily draw from this concept. The second take away is that Symfony2 is the dominante framework in continental Europe. Third BDD deserves more attention at Liip.</p>
<img src="http://feeds.feedburner.com/~r/liip_blog/~4/v-BIkkrnyd0" height="1" width="1"/>]]></content:encoded><dc:subject>PHP</dc:subject><dc:subject>Open Source</dc:subject><dc:subject>On the Road</dc:subject><dc:creator>Lukas Kahwe Smith</dc:creator><dc:date>2013-05-06T19:09:32Z</dc:date><feedburner:origLink>http://blog.liip.ch/archive/2013/05/06/phpuceu.html</feedburner:origLink></item><item><title>Jackalope-jackrabbit 1.0.0 Beta 1 released</title><link>http://feeds.liip.ch/~r/liip_blog/~3/Jd7rmPY4K_w/jackalope-jackrabbit-1-0-0-beta-1-released.html</link><guid isPermaLink="false">http://blog.liip.ch/archive/id/6365/</guid><content:encoded xmlns="http://www.w3.org/1999/xhtml"><![CDATA[<p>Yesterday i tagged version Beta 1 of jackalope-jackrabbit, our PHP Content Repository (PHPCR) implementation. <a href="http://phpcr.github.io"
    >PHPCR</a> is an API to manage tree-structured data, modelled after the Java Content Repository JCR specification. Time to summarize what jackalope can do today. For people already familiar with Jackalope, I summarize the recent changes at the bottom.</p>
<h2>State of Jackalope-Jackrabbit</h2>
<p>The <strong>basic node API</strong> is implemented and working fully. You can do direct access to paths and walk the tree hierarchy and read and write data. All data types including binary streams are supported.<br/>
We do support the workspace and session write operations including cross-workspace synchronization of nodes.</p>
<p><strong>Queries</strong> can be expressed in the JCR-SQL2 language as well as the query object model. Additionally, jackalope provides a fluent query builder on top of the query object model. Most features of query are supported, the exceptions being query parameters and storing a query as stored query.</p>
<p><strong>Exporting</strong> the repository to the standard "system" format and also the "document" format works, as does re-importing any repository dump (including those generated by Java JCR implementations).</p>
<p><strong>Node type definitions</strong> can be inspected and are used to restrict allowed data when used. Both the CND file format and the object model to define custom node types are supported.</p>
<p>The <strong>observation journal</strong> is a log of everything that happened in the repository since a specified timestamp. It can be filtered to just see events an application is interested in. Filtering is for example done by repository path and by type of event like adding, changing, moving or removing.</p>
<p><strong>Versioning</strong> is implemented and working. You can make nodes versionable, create new versions, inspect the version history to see old versions and restore old versions. Activities and version labels however are not yet implemented.</p>
<p><strong>Session scoped locks</strong> are implemented. They allow to block a node, and optionally its subtree, to synchronize operations.<br/>
We did not yet implement open scoped locks, but that should not be too hard to do.</p>
<p>Besides building PHP content management, Jackalope-Jackrabbit can also be used to connect PHP applications to the Java jackrabbit based systems <a href="http://www.magnolia-cms.com/"
    >Magnolia CMS</a> and <a href="http://www.adobe.com/ch_de/solutions/web-experience-management/web-content-management.html"
    >Adobe CQ</a> (currently called Adobe Experience Manager)</p>
<p>A couple of optional PHPCR features are <strong>not (yet) implemented</strong>:</p>
<ul>
    <li>Permissions and capabilities: Checks whether the current user is allowed to do an operation</li>
    <li>Same Name Siblings: multiple children of the same node each having the same name</li>
    <li>Shareable nodes: would allow a node to have more than one parent</li>
    <li>Access Control Lists (ACL), because Jackrabbit does not expose this feature over the remoting protocol jackalope uses</li>
    <li>Lifecycle mmanagement</li>
    <li>Retention and Hold</li>
    <li>Transactions, because Jackrabbit does not expose this feature.</li>
</ul>
<p>It is not a design decision not to support those features. We would be happy about contributions to those features, though right now we focus on stabilizing and improving the features already supported.</p>
<h2>Changes</h2>
<h3>Bootstrapping</h3>
<p>The RepositoryFactoryInterface was defining static methods. This is not legal PHP but the interpreter accepted it. We changed them to class methods and require the factory to have a no-argument constructor. Instead of</p>
<p><code>     Jackalope\RepositoryFactoryJackrabbit::getRepository() </code></p>
<p>you now need to do</p>
<p><code>     $factory = new Jackalope\RepositoryFactoryJackrabbit;     $factory-&gt;getRepository(); </code></p>
<h3>Workflows</h3>
<p>Jackalope now supports the SessionInterface::cloneFrom method and NodeInterface::update methods. This allows to copy a node into a different namespace, modify it there and then synchronize the changes back. With this, you can build workflow concepts.</p>
<h3>Observation</h3>
<p>The observation journal now is now usable. We figured out how to only get the events you actually care about when using the skipTo method. You can now use jackalope-jackrabbit as a message queue.</p>
<h3>CLI commands</h3>
<p>You have now commands to move a node, to touch (= create) a node and properties and to list the node types present in your repository.<br/>
The CLI commands are reorganized to a logical naming schema. We grouped them by what they affect: phpcr:node:*, phpcr:workspace:* and phpcr:node-type:*. We now differentiate between workspace:purge that deletes the whole repository and node:remove that can only delete a subtree but never "/".</p>
<h3>Performance</h3>
<p>Besides some performance tweaks, we implemented the new PHPCR NodeInterface::getNodeNames method. This method allows to get the names of children of a node without actually needing to fetch them from the backend. Perfect for showing a list of nodes without the overhead.</p>
<h3>Node Type Definition</h3>
<p>We can now convert between the CND file format and node type objects and back. This means you can register node types in jackalope-jackrabbit by using the node type API.</p>
<h3>Stability tweaks</h3>
<p>The import and export got improved to work more reliable and some bugs are fixed. Jackalope-jackrabbit takes more effort now to avoid same name siblings from being created. If they should still happen to be created, deletion is fixed to be able to delete them. We fixed issues with the types of values returned by queries.</p>
<h3>Preliminary Adobe CQ support</h3>
<p>We already have Magnolia CMS support since last year. Adobe CQ is another CMS built on top of the commercial distribution of Jackrabbit called CRX. We tested compatibility with CRX and jackalope can now read and write data from that content repository.</p><img src="http://feeds.feedburner.com/~r/liip_blog/~4/Jd7rmPY4K_w" height="1" width="1"/>]]></content:encoded><dc:subject>PHP</dc:subject><dc:subject>Open Source</dc:subject><dc:subject>Open Source :: Jackalope</dc:subject><dc:subject>jackalope</dc:subject><dc:subject>phpcr</dc:subject><dc:creator>David Buchmann</dc:creator><dc:date>2013-05-05T08:33:42Z</dc:date><feedburner:origLink>http://blog.liip.ch/archive/2013/05/05/jackalope-jackrabbit-1-0-0-beta-1-released.html</feedburner:origLink></item><item><title>Some facts about Responsive Web Design</title><link>http://feeds.liip.ch/~r/liip_blog/~3/MwkeQScPGSY/some-facts-about-responsive-web-design.html</link><guid isPermaLink="false">http://blog.liip.ch/archive/id/6356/</guid><content:encoded xmlns="http://www.w3.org/1999/xhtml"><![CDATA[<p><img src="http://blog.liip.ch//files/images/blog/liip_rwd.png"
     width="615"
     height="308"
     alt=""
    /></p>
<p>Responsive Web Design is, simply said, a web design approach aimed at crafting sites to provide an optimal viewing experience. RWD makes a website easy to read and navigate with a minimum of resizing, panning, and scrolling, across different browsers and platforms (desktop to tablets to phone) based on fluid grids, flexible images and media queries.</p>
<h3>But why should you care about Responsive Web Design?</h3>
<p/>
<p>Previously, sites were chiefly designed for desktops. But the mobile web has became more popular. According to statistics the mobile internet is expected to overtake desktop internet usage this year. This makes it necessary to design websites that are flexible and can be viewed from almost any device.</p><br/><br/>
        <a href="http://blog.liip.ch/archive/2013/04/30/some-facts-about-responsive-web-design.html#post_content_extended">
            Read whole post</a><img src="http://feeds.feedburner.com/~r/liip_blog/~4/MwkeQScPGSY" height="1" width="1"/>]]></content:encoded><dc:subject>Liip :: Blog</dc:subject><dc:subject>responsive web design</dc:subject><dc:subject>rwd</dc:subject><dc:subject>webdesign</dc:subject><dc:creator>Marcel Hauri</dc:creator><dc:date>2013-04-30T19:30:00Z</dc:date><feedburner:origLink>http://blog.liip.ch/archive/2013/04/30/some-facts-about-responsive-web-design.html</feedburner:origLink></item><item><title>For the very first time: Hello UK!</title><link>http://feeds.liip.ch/~r/liip_blog/~3/-aKfzohuIak/for-the-very-first-time-hello-uk.html</link><guid isPermaLink="false">http://blog.liip.ch/archive/id/6328/</guid><content:encoded xmlns="http://www.w3.org/1999/xhtml"><![CDATA[<p>I have been on the conference tour for quite some time now and on top of that I travel about every 2nd weekend to some frisbee tournament around the globe. Yet I have never visited the UK. So far the most I have seen of the UK was transiting via direct bus from one London airport to another. So I was quite thrilled when my talk about the Symfony2 CMF was accepted for <a href="http://conference.phpne.org.uk"
    >PHPNE in Newcastle</a>. I was also quite keen to learn more about the PHP community over there. At any rate I flew in on Monday evening and made my way to the hotel in a light drizzle which perfectly matched my image of UK weather. But even in the dark one could make out the historical feel to the architecture in the city center. I cut the sightseeing short and crashed into bed. Next day I made my way to the conference venue which was set at a movie theatre. There were countless busy bee's from the organization team and in general this conference was organized top notch. Quite an impressive achievement given that this was the very first PHPNE. The theatre also provided top notch projectors and of course comfy seats.</p>

<h3>Rowan kicks off the show</h3>

<p>Rowan did an awesome intro keynote talking about <a href="http://conference.phpne.org.uk/schedule/#rowan"
    >how to make better developers</a>, touching both and practical aspects in terms of tech setup and continuing on to useful tips about self education and human interaction.</p>

<h3>API Design by Alex</h3>

<p>Next talk I listened to was about <a href="http://conference.phpne.org.uk/schedule/#alex"
    >API design</a> by Alex. It was a combination of general tips and lesson learned from introducing an open API at a university. I pondered raising my hand when the presenter flat out recommended to always go with JSON over XML for REST APIs. Personally JSON is my preferred format when the client is usually a browser as it integrates so naturally there. For server to server interaction I much prefer XML, since its simply a much better format when one needs to evolve data format as one can get away with many changes without requiring a new API version.</p>

<h3>Bastian on logging and metrics</h3>

<p>After this talk I attended was delivered by Bastian about <a href="http://conference.phpne.org.uk/schedule/#bastian"
    >logging and metrics</a>. This is a topic I find quite important but unfortunately I have found its hard to convince clients to invest into this as they tend to focus more and features end users can see. However to ensure a stable environment which is sort of the basis for ensuring that customers can enjoy your site, logging is key. Furthermore only with metrics it is possible to figure out what features customers actually use, where they might get stuck and what could be easily dropped. It was nice to see that the tools Bastian chose to introduce are exactly the tools I had on my radar already. He specifically mentioned graylog, logstash, statsd and graphite.</p>

<h3>Lunch time chat on knowledge exchange</h3>

<p>Over lunch I ended up chatting with Rowan about internal knowledge exchange. Rowan works for Invica. Just like Liip they have multiple offices and deliver projects using various frameworks and applications. Interestingly they seem to have several teams that span across offices. At Liip we of course also sometimes collaborate between teams in multiple offices, however project teams for the most part always come together in a single office.</p>

<h3>Fabrice showing the path to Symfony2</h3>

<p>After lunch the sessions commenced again. I had seen Fabrice's talk about <a href="http://conference.phpne.org.uk/schedule/#fabrice"
    >migrating legacy applications to Symfony2</a> before. However it has evolved quite a bit since then. I will definitely apply many of his tips next time I have the task to migrate a legacy application and look forward to Theodo release some of their solutions as open source.</p>

<h3>Intro to the CMF</h3>

<p>Right after Fabrice's talk I delivered <a href="http://conference.phpne.org.uk/schedule/#lukas"
    >my CMF presentation</a> to a noticeably smaller crowd. I hear the talk that was running in parallel about dealing with failures was very good. At any rate I must admit I have seen this pattern before at other conferences. I tend to have a fair number of people asking questions in my talk and afterwards even more. So I figure that the market for people willing to explore a new content management approach is simply a bit smaller than other topics, yet for those who do have issues with the current solutions its quite an important topic. At the start of my talk I asked what frameworks people are using and it validated a feeling I had gotten in the previous talks: There was no clear goto framework for conference attendees. The preferred frameworks were all over the map.</p>

<h3>Theij's on the cloud</h3>

<p>The <a href="http://conference.phpne.org.uk/schedule/#thijs"
    >closing keynote was held by Theijs</a> who did a very energetic delivery to drive home the point that really the cloud is nothing more than .. the internet! Additionally he provided several good hints about what things to consider when using SaaS.</p>

<h3>Bar chatting</h3>

<p>After the closing ceremony with lots of prizes we then moved on to dinner and finally everybody met back at a local bar where we had free drinks all night. However instead of simply getting drunk there were many lively discussions. I talked quite a lot with people about Symfony2 and the need for RAD development layers on top of the core. I also chatted a bit about e-commerce solutions in the PHP scene, specifically Magento, Oxid, FoxyCart as well as Vespolina and Sylius. At any rate, people were so busy talking that the free drinks money actually only ran out just before the bar was closing anyway.</p>

<h3>CMF workshop</h3>

<p>For me however the conference wasn't quite over then as thanks to a late afternoon return flight I had offered to provide a <a href="http://symfonycmf.eventbrite.com"
    >CMF introduction workshop</a> on the next day. Anthony had managed to secure funds to give us a room large enough that I could give 10 people a 4 hour run down of all the details about the CMF with much more depth than my talk at the conference. Some people had already played with the CMF while others had only heard about it in a blog post. I led the attendees decide how to best spend the time. In the end all attendees installed the Symfony2 CMF Standard Edition, I answered several specific questions that some of the people had that already played with the CMF but aside from that I just ended up going through the PHPCR and Routing/Menu <a href="http://cmf.symfony.com"
    >slides</a>, showing a bit more about the SonataAdminBundle and various other pieces. After the workshop I grabbed lunch together with Lars and Marc. Lars had been posting various questions about how to implement publishing workflows on the mailing list and is now diving into implementing some missing functionality into the Jackrabbit transport layer of Jackalope, which was <a href="https://github.com/jackalope/jackalope-jackrabbit/pull/38"
    >just merged</a>.</p>

<h3>Wrapping up</h3>

<p>Overall I must say it was a great conference and I was especially grateful that I could do the workshop. As we are approaching the first stable release its important to get as many people double checking our concepts as possible. Secretly I am also hoping that the attendees will take what they have learned and spread the word in their cities and organizations. Even with the internet frameworks and applications tend to be strongest in close geographical proximity to the core developers. So having an opportunity to make the Symfony2 CMF known outside of continental Europe will hopefully help grow the user base.</p>
<img src="http://feeds.feedburner.com/~r/liip_blog/~4/-aKfzohuIak" height="1" width="1"/>]]></content:encoded><dc:subject>PHP</dc:subject><dc:subject>Open Source</dc:subject><dc:subject>On the Road</dc:subject><dc:subject>Open Source :: Jackalope</dc:subject><dc:subject>Open Source :: Symfony</dc:subject><dc:subject>symfony cmf</dc:subject><dc:subject>conference</dc:subject><dc:creator>Lukas Kahwe Smith</dc:creator><dc:date>2013-03-27T18:24:45Z</dc:date><feedburner:origLink>http://blog.liip.ch/archive/2013/03/27/for-the-very-first-time-hello-uk.html</feedburner:origLink></item><item><title>My day at Liip</title><link>http://feeds.liip.ch/~r/liip_blog/~3/GpbCIzerg04/my-day-at-liip.html</link><guid isPermaLink="false">http://blog.liip.ch/archive/id/6324/</guid><content:encoded xmlns="http://www.w3.org/1999/xhtml"><![CDATA[<p class="p1"
    >As you might know Liip is hiring. If not checkout <a href="http://liip.ch/jobs"
    >http://liip.ch/jobs</a> and see if you find something for you there. ProTip™: Bring beer if you get invited.</p>
<p class="p1"
    >It might be interesting for you, our potential employee, to know how a typical day at Liip is for me. So first a little bit about myself. I'm only half a Liiper the other half of me is studying at ZHAW. I'm lucky enough to work and study at the same time without making all to great sacrifices. I'm employed as a software developer but lately I'm doing all sorts of things since the teams now organize themselves at Liip.</p>
<p class="p1"
    >So let's dive into this more or less regular tuesday.</p>
<p class="p2"
    ><img src="http://blog.liip.ch//files/pascal/start.jpg"
     width="500"
     height="375"
     alt=""
    /></p>
<p class="p1"
    >I get up at 07:00 and move towards the bathroom bla bla not interesting. I jump on the train at 07.39 and are on my way to Zürich. Since the ride takes about 50 minutes, I start to work on my MacBook which is my private machine as well as my work horse. Time to find some tickets to work on. Oh the importer of that project needs to change. Let's do that.</p>
<p class="p1"
    ><img src="http://blog.liip.ch//files/pascal/train.jpg"
     width="500"
     height="408"
     alt=""
    /></p>
<p class="p1"
    >After I get out of the coding zone I'm already arriving in Zürich. It's time to get my bike from the Velostation and drive 2-3 minutes to the Liip ZH office.</p>
<p class="p1"
    ><img src="http://blog.liip.ch//files/pascal/screens.jpg"
     width="500"
     height="331"
     alt=""
     style="font-size: 0.9em; line-height: 1.2;"
    /></p>
<p class="p1"
    >I arrive at the office and connect my MacBook to my 2 beautiful 24" screens. Let's finish up the importer changes before the Daily starts.</p>
<p><img src="http://blog.liip.ch//files/pascal/daily.jpg"
     width="500"
     height="331"
     alt=""
     style="font-size: 0.9em; line-height: 1.2;"
    /></p>
<p class="p1"
    >09:00 it's Daily time. My team, called team Lego, stands in front of the scrum board and we discuss with each other what we are going to do today. The business developer in our team asks if anyone has time to help him with an upcoming offer. I tell him that I'd help.</p>
<p class="p1"
    >After that me and one half of my team have a sprint meeting where we show the customer what we did in the last 2 weeks. The client can add changes to existing features or change the coming sprint if he thinks it's necessary. We also use this time to get feedback from the client for unclear user stories.</p>
<p class="p1"
    ><img src="http://blog.liip.ch//files/pascal/food.jpg"
     width="500"
     height="375"
     alt=""
     style="font-size: 0.9em; line-height: 1.2;"
    /></p>
<p class="p1"
    >12:00 lunch time, we go to Giardino where most of the company get their lunch. It's almost our mensa but the food is better.</p>
<p class="p1"
    >Back in the office, time to form the changes from the meeting into jira tickets and put them on the scrumboard.</p>
<p class="p1"
    >Now it's time to see how I can help our business developer to prepare that offer he was talking about in the Daily. I have to read through a whole bunch of stories and estimate them, come up with the right technologies for the job and explain each of them in the offer. It's very different from coding but challenging nevertheless.</p>
<p class="p1"
    ><img src="http://blog.liip.ch//files/pascal/stzbr2.jpg"
     width="500"
     height="353"
     alt=""
    /></p>
<p class="p1"
    >17:00 like a swiss clock the coworkers call for STZBR. Off we are to giardino to have our well deserved after work beer. We talk about software issues but also about whatever comes to mind.</p>
<p class="p1"
    >After a beer or two, I take my bike to the train station and get onto the next train.</p>
<p class="p1"
    >As you see, the work at Liip is not just about coding. Yes I do code a lot, usually more than on this particular day, but working at Liip is also about the people, coordinating with them, solving problems together and most of all helping each other.</p>
<p class="p1"
    >If you think you could fit into this family, give it a try and apply for one of our<a href="http://liip.ch/jobs"
    > open positions</a>.</p><img src="http://feeds.feedburner.com/~r/liip_blog/~4/GpbCIzerg04" height="1" width="1"/>]]></content:encoded><dc:subject>Liip</dc:subject><dc:creator>Pascal Helfenstein</dc:creator><dc:date>2013-03-25T09:26:23Z</dc:date><feedburner:origLink>http://blog.liip.ch/archive/2013/03/25/my-day-at-liip.html</feedburner:origLink></item><item><title>So when is the Symfony CMF release?</title><link>http://feeds.liip.ch/~r/liip_blog/~3/LuGDLHBzYUo/so-when-is-the-symfony-cmf-release.html</link><guid isPermaLink="false">http://blog.liip.ch/archive/id/6319/</guid><content:encoded xmlns="http://www.w3.org/1999/xhtml"><![CDATA[<p><a href="http://blog.liip.ch//files/cmf-combined-admin.png"
     style="float:right"
    ><img width="320"
     height="327"
     src="http://blog.liip.ch//files/cmf-combined-admin_tn.png"
     alt=""
    /></a> In January, Lukas wrote a <a href="https://blog.liip.ch/archive/2013/01/09/symfony-cmf-what-is-left-todo.html"
    >collection of things left to do</a>. Later I wrote a <a href="https://github.com/symfony-cmf/symfony-cmf/wiki/Release-1.0"
    >tentative release schedule</a> that turned out to be too optimistic. I just updated that document with new dates. Sorry about this.</p>
<p>There are two actually quite cool reasons for the delays. One is that we had two projects at Liip where we had to integrate the CMF into existing projects. It was fun, but we found quite a lot of issues and missing features in Doctrine PHPCR-ODM that we fixed resp. implemented. (The Symfony2 Form component is incredibly powerful, but requires the persistance layer to work very exactly and we did not want any more workarounds and hacks to a achieve functionality.) The other reason is that many other people started using the CMF too. Some found issues that need to be fixed, others even managed to contribute fixes themselves - but which took time to review and comment on. Also, a lot of new features have been built or are currently being built.</p>
<p>One feature I am particularly happy with is that PHPCR-ODM can now cascade persist referrers. This is quite useful for example to embed route and menu editing into the edit form for static content, as shown in the screenshot. (This is already in the ContentBundle and should come into the sandbox with the next update.)</p>
<h3>Getting to a release</h3>
<p>As soon the above 2 client projects have stabilized, Lukas and I plan to focus on cleaning the base layers PHPCR and Jackalope to a point where we can tag release candidates, then bring Doctrine PHPCR-ODM to a state that can be called 1.0. We might have to postpone new features, but try to find all the interface changes and similar things to avoid BC breaks once 1.0 is stable.</p>
<p>Getting things out depends on contributions from the community too. While it is great to get new features, we now need to focus on cleaning up those we already have. On improving the documentation. On investigating bugs. The <a href="https://github.com/symfony-cmf/symfony-cmf/wiki/Release-1.0"
    >Release plan</a> links the important missing pieces, if you want to dig into something.</p>
<p>There is the idea for a hackday in May or June. Please  contact me or Lukas if you are interested. If we have enough interest,  it is much more likely that we actually organize something.</p>
<p>I will present PHPCR at the Symfony Live conference in Paris  beginning of April. I will also be at the hackday on Saturday if anybody  is interested in meeting me there. Additionally, Thomas and me planned a  (very focused) hackday on April 3rd to integrate <a href="https://github.com/sonata-project/SonataPageBundle"
    >SonataPagesBundle</a> with PHPCR on the 3rd. If you are interested in helping with that integration, please contact me or Thomas.</p>
<h3>Documentation hackday</h3>
<p>This week, we also did a hackday at Liip, with focus on documentating some of those new features people built. I tried to collect what we achieved that day:</p>
<ul>
    <li>Allow to edit <a href="https://github.com/symfony-cmf/ContentBundle/pull/27"
    >menu and routes embedded in content documents</a></li>
    <li><a href="https://github.com/symfony-cmf/BlockBundle/pull/32"
    >Slideshow block</a> and <a href="https://github.com/symfony-cmf/symfony-cmf-docs/pull/104"
    >documentation</a></li>
    <li><a href="https://github.com/symfony-cmf/symfony-cmf-docs/pull/101"
    >Documentation</a> for the <a href="https://github.com/doctrine/DoctrinePHPCRBundle/pull/41"
    >Reference collection form type</a></li>
    <li><a href="https://github.com/symfony-cmf/symfony-cmf-docs/pull/97"
    >Documentation</a> for the <a href="https://github.com/doctrine/DoctrinePHPCRBundle/pull/37"
    >Image form type</a>. And a <a href="https://github.com/doctrine/DoctrinePHPCRBundle/pull/42"
    >imagine cache invalidator service</a>. Wanted to make the form type more powerful, but  <a href="https://gist.github.com/dbu/5142035"
    >still looking for the right solution</a>.</li>
    <li>Improved Symfony documentation on <a href="https://github.com/symfony/symfony-docs/pull/2301"
    >doctrine events</a></li>
    <li>Doctrine exposes the method to get the <a href="https://github.com/doctrine/phpcr-odm/pull/264"
    >current locale</a> of a document regardless of whether the locale is mapped on the document.</li>
    <li>The <a href="https://github.com/doctrine/phpcr-odm/pull/265"
    >Image and File</a> documents of doctrine are cleaned up</li>
    <li>Started work on another problem when <a href="https://github.com/doctrine/phpcr-odm/pull/262"
    >replacing child documents</a> but <a href="https://github.com/symfony-cmf/symfony-cmf/wiki/PHPCR-ODM-replace-document"
    >still discussing the concept</a></li>
    <li>Jackalope-Jackrabbit will give <a href="https://github.com/jackalope/jackalope-jackrabbit/pull/36"
    >better exceptions on login problems</a></li>
</ul><img src="http://feeds.feedburner.com/~r/liip_blog/~4/LuGDLHBzYUo" height="1" width="1"/>]]></content:encoded><dc:subject>Open Source :: Jackalope</dc:subject><dc:subject>Open Source :: Symfony</dc:subject><dc:subject>PHP</dc:subject><dc:creator>David Buchmann</dc:creator><dc:date>2013-03-15T09:33:40Z</dc:date><feedburner:origLink>http://blog.liip.ch/archive/2013/03/15/so-when-is-the-symfony-cmf-release.html</feedburner:origLink></item><item><title>This Tuesday: Webtuesday at Liip Zurich</title><link>http://feeds.liip.ch/~r/liip_blog/~3/j75MIRXbtQc/this-tuesday-webtuesday-at-liip-zurich.html</link><guid isPermaLink="false">http://blog.liip.ch/archive/id/6316/</guid><content:encoded xmlns="http://www.w3.org/1999/xhtml"><![CDATA[<p>This tuesday (tomorrow), the traditional Webtuesday will be held at the Liip Zurich office. Pierre Spring will talk about responsive design done responsibly. Liip will sponsor drinks and snacks. It starts as usual at 19:30. We're happy to welcome you.</p>

<p>Some little more info at <a href="http://webtuesday.ch/meetings/20130312/"
    >the webtuesday web page</a></p>
<img src="http://feeds.feedburner.com/~r/liip_blog/~4/j75MIRXbtQc" height="1" width="1"/>]]></content:encoded><dc:subject>Liip</dc:subject><dc:subject>webtuesday</dc:subject><dc:creator>Christian Stocker</dc:creator><dc:date>2013-03-11T16:11:02Z</dc:date><feedburner:origLink>http://blog.liip.ch/archive/2013/03/11/this-tuesday-webtuesday-at-liip-zurich.html</feedburner:origLink></item><item><title>Wieso wir Teilzeitarbeit fördern</title><link>http://feeds.liip.ch/~r/liip_blog/~3/AXbKcuSdaFc/wieso-wir-teilzeitarbeit-foerdern.html</link><guid isPermaLink="false">http://blog.liip.ch/archive/id/6313/</guid><content:encoded xmlns="http://www.w3.org/1999/xhtml"><![CDATA[<h2>Teilzeitarbeit muss kein Karriererisiko sein</h2>
<p>In  vielen Firmen zeigt sich das Bild des Mitarbeitenden, der nur als  Vollzeitbeschäftigter Karriereschritte machen kann. Teilzeit - gerade  auch wenn für Kinderbetreuung eingesetzt - wird vom Arbeitgeber oft als  zu kleines Engagement gewertet. Wir verstehen deshalb Angestellte in  solchen Firmen, welche die Frage nach Teilzeit nur sehr zögernd oder  vielleicht überhaupt nie stellen. Unsere Erfahrung zeigt, dass gelebte  Teilzeitarbeit über verschiedene Funktionen und Rollen dazu führt, dass  diese Furcht verschwindet. Wohl deshalb arbeiten bei uns weit über die  Hälfte aller Mitarbeitenden Teilzeit (60% - 90%). Für unsere männlich  dominierte Branche ist das bemerkenswert. Die Väter (und Mütter)  betreuen am freien Tag ihre Kinder. Jüngere Kollegen ohne Kinder machen  Ausbildungen oder gehen anderen Beschäftigungen nach.</p>
<p><a href="http://vimeo.com/58644239"
    ><img width="620"
     height="410"
     src="http://blog.liip.ch//files/images/blog/anna.jpg"
     alt=""
    /></a></p>
<h2 id="BlogPostTeilzeitarbeit-NichtdieMännersindschuld"
    >Nicht die Männer sind schuld</h2>
<p>Wir sind der festen Überzeugung, dass Männer Kinderbetreuungsarbeit leisten wollen. Denn sobald eine Organisation diese Flexibilität praktiziert und beispielsweise durch die Beförderung eines Mitarbeitenden mit Teilzeit in die Geschäftsleitung vorlebt, sind Männer sehr wohl bereit sich vermehrt für die Erziehung zu engagieren. Dadurch kann die Partnerin ihrerseits zu einem substanziellen  Beschäftigungsgrad arbeiten und damit wiederum ihre Chance auf Karriere  innerhalb ihrer (hoffentlich zeitgemässen) Organisation erhöhen. Somit  leisten wir mit Teilzeitarbeit einen Beitrag zur Vereinbarkeit von Beruf  und Familie. Zudem haben Väter, die an mindestens einem Tag ihren  Nachwuchs betreuen, wohl ein intensiveres Verhältnis zu ihren Kindern. Auch  bringen sie mehr Verständnis auf für die Situation der Partnerin. Auf  diese Weise kann Teilzeitarbeit von Familienvätern zu einem  ausgeglichenerem Familienleben beisteuern.</p>
<h2 id="BlogPostTeilzeitarbeit-DieMärTeilzeitarbeitlassesichnichtorganisieren"
    >Die Mär, Teilzeitarbeit lasse sich nicht organisieren</h2>
<p>Es  ist kaum abzustreiten, dass es praktisch ist, wenn Mitarbeitende jeden  Tag verfügbar sind. Auf der anderen Seite ist es auch nicht so  anspruchsvoll, sich etwas um die freien Tage herum zu organisieren; und  sicherlich nicht nur in unserer Branche. Bei uns konstituieren sich die  Teams (4-7 Personen) selber und gehen auch gegenseitig Kompromisse ein,  damit eine gute Verfügbarkeit mit gleichzeitig gutem Output generiert  werden kann. Teilzeitarbeit kann die Effizienz sogar steigern. Denn die  Mitarbeitenden kommen ausgeglichener zu Arbeit, haben weniger Fehlzeiten  und legen ihre privaten Termine auf den freien Tag. Wir als Arbeitgeber  fühlen uns mit dieser Situation wohl aber auch unsere Mitarbeiter - wie  die Bewertungsplattform kununu <a href="http://www.kununu.com/ch/all/ch/in/liip"
     class="external-link"
    >zeigt</a>.</p>
<p>Verfasst haben den Artikel <a class="external-link"
     href="http://www.liip.ch/de/who/team"
    >Nadja</a> und <a class="external-link"
     href="https://blog.liip.ch/archive/author/gerhard/index.html"
    >Gerhard</a>.</p><img src="http://feeds.feedburner.com/~r/liip_blog/~4/AXbKcuSdaFc" height="1" width="1"/>]]></content:encoded><dc:subject>Liip</dc:subject><dc:creator>Gerhard Andrey</dc:creator><dc:date>2013-03-07T12:10:53Z</dc:date><feedburner:origLink>http://blog.liip.ch/archive/2013/03/07/wieso-wir-teilzeitarbeit-foerdern.html</feedburner:origLink></item><item><title>Jackalope and Magnolia CMS: Recording online, questions and answers</title><link>http://feeds.liip.ch/~r/liip_blog/~3/JYhHZi4Lun8/jackalope-and-magnolia-cms-recording-online-questions-and-answers.html</link><guid isPermaLink="false">http://blog.liip.ch/archive/id/6305/</guid><content:encoded xmlns="http://www.w3.org/1999/xhtml"><![CDATA[<p>Last thursday, i did the webinar about PHPCR and Magnolia CMS. You can <a href="http://davidbu.ch/slides/20130228_jackalope-magnolia.html"
    >download the slides</a> or <a href="http://www.magnolia-cms.com/resource-directory/webinars/phpcr.html"
    >watch the recorded presentation</a> (you need to register to see it). Thanks to all the attendees, I hope you enjoyed it.<br/>
There where some questions that i want to answer here on the blog to have the answers available to everybody.</p>
<p><b>Question</b>: How reliable is Jackalope, can i trust my data to it?</p>
<p><b>Answer</b>: Jackalope is still on the young side, but running successfully in a couple of real life applications. We also built a PHPCR API test suite that checks on many features. The PHPCR test suite is by no means as complete as the JCR technology compatibilty kit (TCK) testing suite. With jackalope-jackrabbit, the data is stored into Jackrabbit however. Jackrabbit is really mature and validates the data coming in over DavEx. In the very worst case when Jackalope totally fails, you could still write Java code or use Java tools to interact with Jackrabbit directly. In my experience I never needed to resort to that.</p>
<p><b>Question</b>: You mentioned that same name siblings are not supported by Jackalope. Is there any particular reason for Jackalope for not supporting this? Is support coming, or is this a design choice?</p>
<p><b>Answer</b>: Same name siblings is one of the optional chapters of JCR. Jackrabbit supports them, so it would be doable to implement them in Jackalope as well. It can be rather tricky to do it, having unique child names made a lot of the code easier. But if somebody wants to take the effort to implement it, I would be happy to provide support and help understanding implementation details.<br/>
The main reason to have them, by the way, is that JCR / PHPCR can import arbitrary XML documents, and such documents tend to have same name siblings, just think of a Xhtml document for example.</p>
<p><b>Question</b>: What if I need a particular PHPCR feature not yet implemented in Jackalope?</p>
<p><b>Answer</b>: Jackalope is an open source project. Contributions are always welcome, and the community will help. Liip is also open to consulting work for such tasks. Note that there are a few chapters that will be impossible to implement with jackalope-jackrabbit until the jackrabbit side implements exposing them over DavEx. This is not impossible, but considerably more effort. The next major version of Jackrabbit, codename "Oak" will focus more on feature completeness over the remoting protocol.</p>
<p><b>Question</b>: Where are queries executed? Is there any way to measure the impact on the Magnolia repository? (I wouldn't want my main sites performance to degrade dramatically) Is there some sort of cache or index on the PHPCR side?</p>
<p><b>Answer</b>: Normal requests for nodes are cached by Jackalope for the PHP session. SQL2 or QOM queries however are not cached. The impact will not be higher than when implementing the functionality in Java in a custom module inside Magnolia CMS. The load should be slightly lower even, as the DavEx remoting is more low-level than the full JCR API. And the PHP application can life on its own separate server. Nontheless it makes of course sense to cache rendered pages or page-fragments on the PHP side. But that is an application level task.</p>
<p><b>Question</b>: DavEx provides to the Jackrabbit used in the Magnolia CMS. Is there a way to connect to different repositories?</p>
<p><b>Answer</b>: DavEx is an implementation specific protocol invented for jackrabbit to do remoting. Jackalope thus can talk to any Jackrabbit instance, and it has no problem opening several sessions with different servers. But connecting to any non-jackrabbit JCR implementation is not supported. JCR is an API, not a protocol. Note that there are ideas to generalize the jackrabbit-protocol into another standard called <a href="http://wiki.apache.org/jackrabbit/Jsop"
    >JSOP</a>.</p>
<p><b>Question</b>: Something is unclear to me: Are calls from Jackalope to the Jackrabbit repository bypassing Magnolia?</p>
<p><b>Answer</b>: Yes, exactly. The Magnolia CMS DavEx module just provides a servlet that receives the requests and pipes them through to the jackrabbit DavEx layer. This is needed because Magnolia CMS runs Jackrabbit in its own process and does not use the DavEx remoting.<br/>
The following diagram shows the interaction between Jackalope, Jackrabbit and Magnolia CMS. The PHP application is talking to the PHPCR interfaces, implemented by Jackalope. Jackalope uses the HTTP based DavEx protocol to talk to the Jackrabbit DavEx handler which is exposed by the servlet Magnolia plugin. Magnolia CMS is accessed through web requests and uses its in-process connection to Jackrabbit to read data. If Magnolia CMS needs to know about data changes done by the PHP application, it would have to use the <a href="http://www.day.com/specs/jcr/2.0/12_Observation.html"
    >observation feature of Jackrabbit</a> to listen for changes on the content.</p>
<p><img width="600"
     height="146"
     alt=""
     src="http://blog.liip.ch//files/magnolia-flow.png"
    /><br/>
When not using Magnolia CMS, you could also run jackrabbit standalone or use the .war archive in any servlet container like Tomcat.</p>
<p><b>Question</b>: Is there also support for the other "direction"? A case where Magnolia would use a PHPCR-backed repo/app instead of being the master?</p>
<p><b>Answer</b>: This is partially answered above - JCR and PHPCR are APIs for code, not a protocol. A PHPCR server implementation would need to expose its content over DavEx for jackrabbit to connect to it. Besides the effort to build that, the scenario does not make too much sense. PHP is typically used in request-response setup where all objects are lost after a request. Such a server would be extremly slow as it would spend most of the time bootstrapping. While there are solutions for building PHP application servers like <a href="http://reactphp.org/"
    >react</a>, i don't see a real benefit.<br/>
What can make sense is to configure Magnolia CMS to talk to a remote Jackrabbit rather than use the in-process Jackrabbit bindings. Then Magnolia CMS and the PHP client would both connect to the same repository outside of Magnolia CMS.</p>
<p><b>Question</b>: Will the Magnolia DavEx Module be available as a Maven dependency?</p>
<p><b>Answer</b>: It is available in the maven repository of Magnolia CMS. Here's the dependency snippet:</p>
<p><code> &lt;dependency&gt;<br/>
&lt;groupid&gt;info.magnolia.davex&lt;/groupid&gt;<br/>
&lt;artifactid&gt;magnolia-module-jackrabbit-davex&lt;/artifactid&gt;  <br/>
&lt;version&gt;0.2&lt;/version&gt; <br/>
&lt;/dependency&gt; </code></p>
<p/>
<p>You can use the http://nexus.magnolia-cms.com/content/groups/public/ repository, which contains all public artifacts from Magnolia, CE and Forge, releases and snapshots.</p>
<p>Or - for just the Magnolia Forge projects, either of these, depending on what you're after:</p>
<ul>
    <li>http://nexus.magnolia-cms.com/content/repositories/magnolia.forge.releases/</li>
    <li>http://nexus.magnolia-cms.com/content/repositories/magnolia.forge.snapshots/</li>
</ul><img src="http://feeds.feedburner.com/~r/liip_blog/~4/JYhHZi4Lun8" height="1" width="1"/>]]></content:encoded><dc:subject>Open Source :: Jackalope</dc:subject><dc:subject>jackalope</dc:subject><dc:subject>phpcr</dc:subject><dc:subject>magnolia</dc:subject><dc:creator>David Buchmann</dc:creator><dc:date>2013-03-04T17:25:14Z</dc:date><feedburner:origLink>http://blog.liip.ch/archive/2013/03/04/jackalope-and-magnolia-cms-recording-online-questions-and-answers.html</feedburner:origLink></item></channel></rss>
