<?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 Conference 2012: Learning the latest in web development and business</title><link>http://feeds.liip.ch/~r/liip_blog/~3/9W1zugHqwvs/one-conference-2012-learning-the-latest-in-web-development-and-business.html</link><guid isPermaLink="false">http://blog.liip.ch/archive/id/5939/</guid><content:encoded xmlns="http://www.w3.org/1999/xhtml"><![CDATA[<p>On Wednesday five Liipers spoke at the <a href="http://www.one-schweiz.ch/"
    >ONE Schweiz</a> Conference in the Messe Zürich.</p>
<p>Kicking off the "Development and Design" track as the first talk in the morning, <a href="https://twitter.com/anderageru"
    >Gerhard Andrey</a>, <a href="https://twitter.com/chregu"
    >Christian Stocker</a> and <a href="https://twitter.com/dbu"
    >David Buchmann</a> presented the most important web technologies and topics to watch for.</p>
<p>The ten topics for web developers to consider:</p>
<p><b>1. Serverside Javascript</b> like node.js bring one common language to the frontend and the backend. With that most of the code is recycled. As a bonus feature Javascript servers work event driven which boosts performance of interaction rich frontends.</p>
<p><b>2. html5</b> has been around for some time and many APIs are available for expanding the browser. Yet, developers still meet some "troubles" in certain areas (e.g. Local Storage). But you can work around many of those spots with the help oflibraries like jQuery or YUI.</p>
<p><b>3. Maps</b> OpenStreetMap in combination with OpenLayers Leaflet is a very powerful alternative to Google Maps. Liip has released advanced applications like http://plaene.uzh.ch with custom graphics.</p>
<p><b>4. Semantic Web</b>: With RDFa, Apache Stanbol and more capable content editors the building blocks are here, and the reference data is out there for more semantic web applications. Liip demonstrated with the Symfony Content Editor the technology successfully.</p>
<p><b>5. NoSQL / Big Data</b>: As an alternative to relational data bases NoSQL promises better scalability in decentralized cloud situations. NoSQL solutions like MongoDB or CouchDB should definitely be a tool in every web developers toolbox.</p>
<p><b>6. Content Repositories / PHPCR</b>: PHP meets corporate Java based content repositories (JCR). Through PHPCR your web application is ready to connect to hierarchic file systems with big amounts of data. Liip pushes the development of PHPCR and advocates it's usage in more and more CMSs.</p>
<p><b>7. NIWEA</b>: The Browser wins again when it comes to the mobile web, because it has won before on the desktop. The stack of web technologies paired with frameworks for mobile development like PhoneGap and Sencha Touch can do for many more devices like smartphones and tablets what apps can do only developed specifically for one platform.</p>
<p><b>8. Distribution</b>: Companies that want to go free from the dominant players in the app distribution market will increasingly choose the mobile web as an alternative. That is true for media publishers and also for game developers.</p>
<p><b>9. Mobile Payment</b>: Not many of the existing models were a big success so far. We are hoping for debit solutions that eliminate the hassle with credit cards for the end user .</p>
<p><b>10. Open Government Data</b>: When data owned by the public is made available to the public, new ways of participation for citizens and new data journalism is possible. The potential of such applications has been demonstrated in the Make.Opendata hackdays.</p>
<p>This wide field of expertise presented by Liip may have sparked many an idea in the developers in the audience. The slides of this talk can be viewed here:</p>
<p><iframe src="http://portal.sliderocket.com:80/app/fullplayer.aspx?id=EC321363-E61B-36D2-561A-8297B3254AB0"
     width="400"
     height="326"
     scrolling="no"
     frameborder="1"
     style="border:1px solid #333333;border-bottom-style:none"
    /></p>
<p>Later in the program <a href="http://twitter.com/timob"
    >Timo Bezjak</a> talked about models for agile contracts. He argued that Agile processes be better suited for fixed-price contracts than more rigid approaches — if the team is free to negotiate and develop the features and architecture of the product. Unless it is hindered by a strict contract based on a detailed requirements document, an Agile team will consequently maximise their customer's return on investment.</p>
<p>At the end of the day <a href="http://twitter.com/zurcherart"
    >Steve Holyer</a> spoke on how "How to Fail at Agile". An Agile (or Lean) team needs to develop and test hypothesas in order to learn and become more effective. As Donald G.  Reinertsen says, "Failure is actually a good thing in learning systems…this is one of the ways most information is generated." To learn from failure an Agile team must reflect regularly. Steve, a few hints on structuring Agile Retrospectives to support the advice of political commentator Molly Ivins who coined the homespun Texan saying, "The first rule of holes, when you're in one stop digging." Steve's conclusion? If you want to make your Agile project fail don't hold retrospectives, or--even better--hold retrospectives, but don't act on the learning or the outcome. But, if you want to fail well at Agile build and nurture a reflective culture. <a href="http://www.slideshare.net/zurcherart/how-to-fail-at-agile"
    >Find the slides here</a></p>
<p>In between the Liiper's talks, I ventured out to listen into the other tracks. One common theme I noticed was multichannel strategies in eCommerce and in Social Media and Content Marketing. The consumer today expects consistent service no matter what device he or she uses. It has even been called Noline Commerce in <a href="http://blog.carpathia.ch/2012/05/10/trends-im-e-commerce-2012-der-konferenz/"
    >Thomas Lang's E-Commerce Trends 2012</a>. The opportunities for mobile applications lies exactly here, as do the challenges for brands to constantly tell their stories, which <a href="http://blog.buerobaron.ch/"
    >Rolando Baron</a> pointed out in his talk.</p>
<p>The day ended for us with many exchanged ideas about trends in web development and business. It was an interesting conference with good speakers. For Zurich it's good to have an event like this.</p><img src="http://feeds.feedburner.com/~r/liip_blog/~4/9W1zugHqwvs" height="1" width="1"/>]]></content:encoded><dc:subject>Liip :: Blog</dc:subject><dc:subject>conference</dc:subject><dc:subject>zürich</dc:subject><dc:subject>one12</dc:subject><dc:creator>Stefan Bucher</dc:creator><dc:date>2012-05-11T15:40:12Z</dc:date><feedburner:origLink>http://blog.liip.ch/archive/2012/05/11/one-conference-2012-learning-the-latest-in-web-development-and-business.html</feedburner:origLink></item><item><title>PHP talking to Magnolia CMS</title><link>http://feeds.liip.ch/~r/liip_blog/~3/TBfo6yBKAQ8/php-talking-to-magnolia-cms.html</link><guid isPermaLink="false">http://blog.liip.ch/archive/id/5924/</guid><content:encoded xmlns="http://www.w3.org/1999/xhtml"><![CDATA[<p><img height="340"
     width="600"
     src="http://blog.liip.ch//files/images/magnolia-phpcr-article.png"
     alt=""
    /></p>
<p/>
<p>Since we started working on Jackalope, we always claimed it would also provide an integration point with other enterprise systems. Last week, we set out to proof this idea. Grégory Joseph of the Java based <em>Magnolia CMS</em> came to help us on the Magnolia side of things. Magnolia is using the JCR reference implementation Jackrabbit for storing its content. After an interesting exchange on their design decisions and our ideas, we started to hack.</p>
<p>Trying to import an XML export from Magnolia in the JCR standard format showed that the Jackalope importer is not yet perfect. In the end Greg  was faster in building a Magnolia module that exposes the Jackrabbit Davex binding that Jackalope uses to communicate with the server.</p>
<p>After that, things really started flowing. We managed to not only read data, but also write using the frontend editing feature of the CMF. Additionally, we managed to configure PHPCR-ODM to determine document classes based on the MetaData child every Magnolia page node has. And all of that using several parallel connections to the repositories, so that the normal pages and navigation can still be loaded from our standalone jackrabbit backend (you could just as well use another PHPCR implementation like jackalope-doctrine).</p>
<p>All in all a very successful hackday. We integrated the demos into the <a href="https://github.com/symfony-cmf/cmf-sandbox/tree/magnolia_integration"
    >cmf-sandbox</a> (branch magnolia_integration). See the MagnoliaController in src/Sandbox/MagnoliaBundle/Controller.</p>
<p/>
<h2>Screencapture showing the edit functionality</h2>
<p><iframe height="315"
     frameborder="0"
     width="560"
     src="http://www.youtube.com/embed/oAeNC6FmONg"
     allowfullscreen=""
    /></p>
<h2>Installing the Sandbox with Magnolia</h2>
<p>If you want to try things out for yourself, you need to:</p>
<ul style="list-style:inside circle"
    >
    <li style="list-style:circle inside"
    >Download <a href="http://www.magnolia-cms.com/"
    >Magnolia Community Edition</a></li>
    <li style="list-style:circle inside"
    >unpack it into a folder</li>
    <li style="list-style:circle inside"
    >Download the <a href="http://ci.magnolia-cms.com/job/forge_magnolia-module-jackrabbit-davex/info.magnolia.davex$magnolia-module-jackrabbit-davex/"
    >Magnolia Jackrabbit-Davex Module</a> and drop all .jar files from this archive into apache-tomcat-6.0.32/webapps/magnoliaAuthor/WEB-INF/lib/</li>
    <li style="list-style:circle inside"
    >edit apache-tomcat-6.0.32/conf/server.xml to change the port from the default 8080 to 8888, so it looks something like &lt;connector port="8888" protocol="HTTP/1.1"&gt;...</li>
    <li style="list-style:circle inside"
    >remove open file limitations. in bash, this will be <tt>ulimit -n 5000</tt></li>
    <li style="list-style:circle inside"
    >launch magnolia with something like this: apache-tomcat-6.0.32/bin/magnolia_control.sh start  tail -f apache-tomcat-6.0.32/logs/catalina.out</li>
    <li style="list-style:inside circle"
    >visit localhost:8888 and follow the Magnolia installation (login with superuser/superuser)</li>
</ul>
<p>If you followed the above steps, you should be able to access Magnolia data with Jackalope-Jackrabbit at http://localhost:8888/magnoliaAuthor/.davex/  (Note that there is no web browser access, as the servlet does not issue a basic auth challenge but just expect the credentials to be set from the beginning).</p>
<p/>
<p>Now try the urls /magnolia_edit, /magnolia/about/subsection-articles/article and /magnolia_odm and read the code to see what we do.</p>
<p/>
<p/>
<p/>
<p><img height="459"
     width="600"
     src="http://blog.liip.ch//files/images/magnolia-phpcr.png"
     alt=""
    /></p><img src="http://feeds.feedburner.com/~r/liip_blog/~4/TBfo6yBKAQ8" height="1" width="1"/>]]></content:encoded><dc:subject>PHP</dc:subject><dc:subject>Open Source :: Jackalope</dc:subject><dc:subject>phpcr</dc:subject><dc:subject>jackalope</dc:subject><dc:subject>cms</dc:subject><dc:subject>java</dc:subject><dc:subject>magnolia</dc:subject><dc:subject>hackday</dc:subject><dc:creator>David Buchmann</dc:creator><dc:date>2012-05-08T21:11:29Z</dc:date><feedburner:origLink>http://blog.liip.ch/archive/2012/05/08/php-talking-to-magnolia-cms.html</feedburner:origLink></item><item><title>Wsunit - the first release</title><link>http://feeds.liip.ch/~r/liip_blog/~3/s1ruAiT5qAc/wsunit-the-first-release.html</link><guid isPermaLink="false">http://blog.liip.ch/archive/id/5886/</guid><content:encoded xmlns="http://www.w3.org/1999/xhtml"><![CDATA[<p>It's always the same issue... you write unit tests for a web-service, giving you a feeling of confidence about the correctness of your code. Then the service provider changes the response without notifying you. Suddenly your implementation doesn't work anymore, but even your continuous integration server says it's "all green".</p>
<p>So what happened?</p>
<p>Surely the fixture files you used are outdated, and since they won't get updated automatically your tests don't stand a chance to detect the change.</p>
<h3>Wsunit to the rescue</h3>
<p>Implemented as a PHPUnit test listener, once configured wsunit will request a new response every time you run your test suite. It saves the response to your test's fixture file to verify the correct behavior of your implementation. Therefore you probably want to run this test suite as a separate job on your continuous integration server so you don't disturb the developers when doing their job.<br/>
Furthermore, wsunit keeps every 'old' responses (aka fixture files) enabling you to find the differences between the current response and an old response.</p>
<h3>How does it work?</h3>
<p>After configuring the test listener in the PHPUnit configuration file, the central point of interest is the wsunit configuration file. Here you define which test (identified by it's name) will send a request to which location together with what query parameters.<br/>
If you now run the test suite the test listener detects that there is a request to be sent and fetches the requested data from the defined location. After a conversion to XML the response will be stored in a fixture file named after the executed test.<br/>
The test now just uses the fixture file to verify the correct implementation of your code.<br/>
Since the header and response body are converted into a XML structure it is fairly easy to check it's content by using PHPUnit's 'assertXml*' assertion methods.</p>
<h3>Further reading</h3>
<p>A complete description how to install and set up wsunit is written down in <a href="http://blog.bastian-feder.de/blog/031_wsunit.html"
    >Bastian's blog</a>.</p><img src="http://feeds.feedburner.com/~r/liip_blog/~4/s1ruAiT5qAc" height="1" width="1"/>]]></content:encoded><dc:subject>Liip</dc:subject><dc:subject>test driven development</dc:subject><dc:subject>unit test</dc:subject><dc:subject>integration test</dc:subject><dc:subject>test listener</dc:subject><dc:subject>continous integration</dc:subject><dc:subject>web services</dc:subject><dc:subject>software quality</dc:subject><dc:subject>configuration over implementation</dc:subject><dc:subject>best practices</dc:subject><dc:subject>testing</dc:subject><dc:subject>PHPUnit</dc:subject><dc:subject>extension</dc:subject><dc:creator>Bastian Feder</dc:creator><dc:date>2012-05-08T09:48:04Z</dc:date><feedburner:origLink>http://blog.liip.ch/archive/2012/05/08/wsunit-the-first-release.html</feedburner:origLink></item><item><title>Mahara ePortfolio what for?</title><link>http://feeds.liip.ch/~r/liip_blog/~3/pqrGd7P-oZk/mahara-what-for.html</link><guid isPermaLink="false">http://blog.liip.ch/archive/id/5876/</guid><content:encoded xmlns="http://www.w3.org/1999/xhtml"><![CDATA[<p>For various reasons, people don't really know what an ePortfolio is and/or what the Mahara ePortfolio system could be used for. I will try and explain:</p>
<h3>Mahara is...</h3>
<h3><span id="1336039787334S"
     style="display: none;"
    > </span></h3>
<p>... a web based tool to track, nurture and document your learning path.<br/>
... a container to store your artefacts (textfiles, audio files, movies, pictures) in one place.<br/>
... designed in a user centered way, giving you (and only you) full control over your content, with easy tools to share only what you want to share.<br/>
... ecouraging self reflection, self learning and learning in peer groups.<br/>
... designed to practice and encourage peer review with a system-wide feedback functionality.<br/>
... designed as a kind of reversed "walled garden", giving you easy control over the "gardens" you work in.<br/>
... made for social networking without distraction in a controlled environment.</p>
<h3>Mahara use cases</h3>
<p>The most obvious use case is in <u>education</u>. Mahara is made to accompany you throughout an educational career, from primary school, higher education to further education and vocational training. Mahara is made for <u>life long learning</u>.</p>
<p>Since you have your CV, diplomas, awards, journals, feedback and discussions all inside Mahara, a <u>job application</u> is easily assembled, choosing from the elements in your Mahara that fit the job you're applying for. This leads to the use case of Mahara as a <u>software for job agencies</u> , - to manage and "sell" their clients. </p>
<p>Easy to create forums, groups, institutions, feedback forms (wherever you want them) and the option to have several blog instances per user, let you create a <u>social networking site</u> out of the box.</p>
<p>Drag &amp; drop embedding and arranging of movies, photos and audio files make it fun to create, work with and share your content. In the primary school use case, Mahara can be used to <u>train media skills</u>, by having a class work with Mahara on small <u>research projects</u> like gathering, reporting and sharing nature observations or a day at the zoo, museum etc.</p>
<p>Speaking of nature, Mahara can be a platform for <u>breeders and growers</u> (...), to <u>document, discuss and show off</u> their "items", be that cattle or flowers.</p>
<p>Mahara is an ideal place to document and report on <u>work placements</u> (which is often a requirement in higher education), <u>voluntary work and political or environmental activism</u>. Any example where you want to have discussion as well as documenting activities illustrates this use case really. You can write a journal, embed video, photo galleries, run discussion forums, share with and invite people to join - all inside Mahara.</p>
<p>I'd be happy to read about further examples of how to use Mahara, please leave a comment.<br/>
<br/>
Find more information on the Mahara website <a href="http://mahara.org"
    >mahara.org</a>. A good place to start is <a href="http://manual.mahara.org/en/1.5_STABLE/"
    >manual.mahara.org</a></p><img src="http://feeds.feedburner.com/~r/liip_blog/~4/pqrGd7P-oZk" height="1" width="1"/>]]></content:encoded><dc:subject>Liip</dc:subject><dc:subject>Mahara</dc:subject><dc:subject>eLearning</dc:subject><dc:subject>ePortfolio</dc:subject><dc:creator>Kevin Mueller</dc:creator><dc:date>2012-05-03T10:13:36Z</dc:date><feedburner:origLink>http://blog.liip.ch/archive/2012/05/03/mahara-what-for.html</feedburner:origLink></item><item><title>"Conférence Romande sur l’Accessibilité du Web" wrap up</title><link>http://feeds.liip.ch/~r/liip_blog/~3/4Kw-gk8rOzo/conference-romande-sur-l-accessibilite-du-web-wrap-up.html</link><guid isPermaLink="false">http://blog.liip.ch/archive/id/5871/</guid><content:encoded xmlns="http://www.w3.org/1999/xhtml"><![CDATA[<p>Yesterday took place the first <a href="http://www.telono.com/fr/societe/conference-romande-accessibilite-web-2012"
    >Conférence Romande sur l’Accessibilité du Web"</a> organized by <a href="http://www.telono.com"
    >Telono</a> in Geneva and Liip was well represented by me, Brian King and Jonas Vonlanthen.</p>
<p>This was also a great opportuniy to have a closer look at some of the real-life accessibility problems and the solutions proposed.</p>
<p>The organizazion was perfect and everything went fine.</p>
<p>I was also surprised by the high number of participants and the interest they had in almost all of the topics proposed and discussed.</p>
<p>The schedule was very "dense" with 8 presentations to be followed from 9 to 18 with a lunch break, of course.</p>
<h2>Liip contribution</h2>
<p>I presented the talk "Optimisation de l’accessibilité and Responsive Design: étude de cas" where I showed the efforts we made during the development of Liip.ch relaunch to improve the accessibility and the semantic of the whole site.</p>
<p>Also had the opportunity to present the implementation of the responsive design that shaped up after the dedicated hackday in November and the recent mini-sprint.</p>
<p>People showed their interest and also asked questions. Definitely not a boring talk ;-)</p>
<h2>The other talks</h2>
<p>The first two presentations have been given by two visually impared people (Julien Conti and Christophe Oberson) showing how to overcome common accessibility issues in everyday web browsing.</p>
<p>The great thing was that they also suggested/proposed how to not do things that are a known source of problems.</p>
<p>Julien Conti also introduced the (soon to be released) <a href="http://www.youtube.com/watch?v=rIEO1bUFHsI"
    >"BrailleTouch"</a> iPhone app.</p>
<p>Yannick Guerdat (Artionet) presented the work done to make <a href="http://www.jura.ch"
    >jura.ch</a> fully accessible and certified.</p>
<p>Very valuable contributions came from the two Telono organizers, Carine Rivière and Laetitia Giannettini who talked, among other things, about the relationship between ergonomy and accessibility.</p>
<p>Markus Riesch of <a href="http://www.access-for-all.ch/"
    >Access for all foundation</a> let us know the state of accessibility in Swiss public institutions and the Swiss laws currently applying to the accessibility subject.</p>
<p>The most interesting contributions came from Jean-Pierre Villain (Qelios) and his co-relator Romain who went through the WCAG 2.0 directives and proposed some concrete ARIA solutions to make Javascript implementations accessible.</p>
<p>They also showed the great accessibility support on the iPhone.</p>
<h2>Conclusion</h2>
<p>Not that much to add, only looking forward to the 2013 edition for another great apportunity to learn and share.</p>
<p>Feel free to check <a href="http://ralf57.netsons.org/files/craw-2012.zip"
    >the slides of the presentation</a>.</p>
<p>And finally some pics.....</p>
<p><img width="600"
     height="450"
     src="http://blog.liip.ch//files/images/blog/conferences/craw2012/craw-2012-1.jpg"
     alt="Telono organizers introducing the program"
    /></p>
<p><img width="600"
     height="450"
     src="http://blog.liip.ch//files/images/blog/conferences/craw2012/craw-2012-2.jpg"
     alt="Attendees following the talks"
    /></p>
<p><img width="600"
     height="450"
     src="http://blog.liip.ch//files/images/blog/conferences/craw2012/craw-2012-3.jpg"
     alt="Jean-Pierre Villain about the ARIA in forms"
    /></p>
<p><img width="600"
     height="450"
     src="http://blog.liip.ch//files/images/blog/conferences/craw2012/craw-2012-4.jpg"
     alt="Romain explaining how to use Voice Over on iPhone"
    /></p>
<p><img width="600"
     height="451"
     src="http://blog.liip.ch//files/images/blog/conferences/craw2012/craw-2012-5.jpg"
     alt=""
    /></p><img src="http://feeds.feedburner.com/~r/liip_blog/~4/4Kw-gk8rOzo" height="1" width="1"/>]]></content:encoded><dc:subject>Liip</dc:subject><dc:subject>Liip :: Projects</dc:subject><dc:subject>UX</dc:subject><dc:subject>accessibility</dc:subject><dc:creator>Donato Rotunno</dc:creator><dc:date>2012-04-27T09:02:02Z</dc:date><feedburner:origLink>http://blog.liip.ch/archive/2012/04/27/conference-romande-sur-l-accessibilite-du-web-wrap-up.html</feedburner:origLink></item><item><title>Game development with JavaScript</title><link>http://feeds.liip.ch/~r/liip_blog/~3/WzrfHXB6yqI/game-development-with-javascript.html</link><guid isPermaLink="false">http://blog.liip.ch/archive/id/5857/</guid><content:encoded xmlns="http://www.w3.org/1999/xhtml"><![CDATA[<p>Recently, we had a hackday at Liip, where we dived into game development with JavaScript. Our goal was to see how hard it is to produce a simple cross platform game using just JavaScript and html5 elements. Since we didn't want to reinvent the wheel, we decided to use a JavaScript game framework.</p>
<p>To make it short: we were very impressed at the state of the different frameworks around. We were able to put together a simple game in a suprisingly short time. Check it out <a href="http://alainhorner.ch/experiments/jsgame/"
    >here</a>! (Thx to Chrigu for letting us use the graphics of his awesome iPhone game <a href="http://app.etite.ch/herbert/"
    >Herbert, the misanthropical fly</a>).</p>
<p><img alt=""
     src="http://blog.liip.ch//files/images/blog/jsgame.png"
    /></p>
<h2>Technical details</h2>
<p>We developed our game using <a href="http://impactjs.com/"
    >ImpactJS</a>, a high-level JavaScript game framework that did a lot of work for us. While we briefly looked at some alternatives like <a href="http://craftyjs.com/"
    >Crafty</a> and <a href="http://www.limejs.com/"
    >LimeJS,</a> we didn't want to spend our time comparing libraries but get our hands dirty. We went with ImpactJS simply because Chrigu had already looked into it a bit, and because of their awesome <a href="http://playbiolab.com"
    >demo game</a>. The downside of ImpactJS is the fact that it's proprietary, though it's well worth the price of 99$.</p>
<p>In ImpactJS, one generally has three different types of objects: screens, levels and entities. Screens control the different game states. For example you could have a settings screen, a highscore screen and an actual playing screen. Because your game (unlike our demo) probably has different levels, there are simple JSON files that describe how a level looks and can be automatically loaded by ImpactJS. Background images, collision maps and entities are placed in there. Finally, entities are all interacive objects: The hero, enemies, coins, bombs and so on. Entities are distributed over the level, they are animated and interact with other entities.</p>
<p>In our case we put together a startscreen, the main screen with a level map behind it and an endscreen that appears when one accomplished the level. Within the game we have our hero entity, whose goal it is to navigate through the map without hitting enemies or walls. He also wants to pick up coins. Coins are entities as well and can be picked up by the hero increasing his health a little. When the hero hits a wall or an enemy, he loses health. Of course, these actions are accompanied by sounds. The hero, enemies and coins are animated, which is achieved by simply looping through different frames in a <a href="http://en.wikipedia.org/wiki/Sprite_(computer_graphics)"
    >sprite sheet</a>.</p>
<h2>Our Experiences</h2>
<p>- ImpactJS does a lot of work for you. It handles animations, collision detection, scene management, controls and scrolling of the screen</p>
<p>- ImpactJS is documented very well, and there seems to be an active discussion forum on their website</p>
<p>- The level editor bundled with ImpactJS ("Weltmeister") makes it very easy to set up level layouts fast. That said, the user interface isn't always intuitive (right-click to drag around the map, press space to insert something) and the level editor sometimes feels buggy</p>
<p>- We had quite some issues with the playback of sound, since there are still several tricks needed to have sound working in a wide range of browsers. We did not get the built in sound manager of ImpactJS running properly. We instead used <a href="http://www.schillmania.com/projects/soundmanager2/"
    >SoundManager2</a> but we still had to do a hack to get it to work on iOS devices. The problem is, that iOS won't start the download of media until there is a user-input event, so we just required the user to touch the screen, before the game can be started</p>
<p>- Porting to mobile phones or tablets can be achieved by simply wrapping the game in <a href="http://phonegap.com"
    >Phonegap</a>, but we weren't sure how to deal with different screen / viewport sizes and resolutions without making the game look distorted or blurry</p>
<p>- Performance was surprisingly good, even on mobile phones. That said, on an iPhone 3G, we only reached 30 FPS, which is the "lagging limit". So a game that has more elements would probably need performance optimisations in addition to ImpactJS</p>
<p>- We played around a bit with different ways to navigate, including using the accelerometer or touch gestures, but didn't get much support from ImpactJS in that regard</p>
<p>Overall we are very happy with the outcome and we are impressed, how fast a simple game could be put together. Have a look at the <a href="https://github.com/colinfrei/gamehackday"
    >source code</a> to see how straightforward it was. ImpactJS helps a lot in handling the interactive parts, allowing you to spend more time on the look and feel, which is one of the key factors for games. We're all looking forward to using ImpactJS on a customer project, but also to playing around with free alternatives and seeing if they measure up to the high bar that ImpactJS has set!</p>
<p><a href="https://twitter.com/#!/elHornair"
    >Alain</a>, <a href="https://twitter.com/#!/_chrigu"
    >Chrigu</a>, <a href="https://twitter.com/#!/colinfrei"
    >Colin</a></p><img src="http://feeds.feedburner.com/~r/liip_blog/~4/WzrfHXB6yqI" height="1" width="1"/>]]></content:encoded><dc:subject>JavaScript</dc:subject><dc:subject>Liip :: Labs</dc:subject><dc:subject>game</dc:subject><dc:subject>impactjs</dc:subject><dc:subject>niwea</dc:subject><dc:subject>phonegap</dc:subject><dc:creator>Alain Horner</dc:creator><dc:date>2012-04-15T21:27:11Z</dc:date><feedburner:origLink>http://blog.liip.ch/archive/2012/04/15/game-development-with-javascript.html</feedburner:origLink></item><item><title>Big leap forward for Opendata</title><link>http://feeds.liip.ch/~r/liip_blog/~3/zJemwG4fNYU/big-leap-forward-for-opendata.html</link><guid isPermaLink="false">http://blog.liip.ch/archive/id/5840/</guid><content:encoded xmlns="http://www.w3.org/1999/xhtml"><![CDATA[<p><a href="http://make.opendata.ch/"
    ><img alt="make.opendata.ch"
     style="float: right; margin: 0 0 1em 1em;"
     title="make.opendata.ch"
     src="http://blog.liip.ch//files/images/blog/makeopendata.png"
    /></a> This year, the second <a href="http://make.opendata.ch/"
    >make.opendata.ch-hackdays</a> took place in Geneva and Zurich. More than 120 developers, designers and ideators including a handful of Liipers met to work on “public transport”, which was set as the hackday’s main focus. A goal was to show to the SBB and the public what open data sources allow and how they can be used.</p>
<p>The Liipers present at the hackdays got involved in some of the projects:</p>
<h2>Zurich: The Swiss Public Transport API</h2>
<p><i>Team: Colin Frei, Danilo Bargen, Dominic Lüchinger, Fabian Vogler, Roland Schilter</i></p>
<p>Following our internal Transport API hackday in the beginning of the year, some others joined us to continue working on the Rest-API. The goal of the project was to provide a public transport Rest-API that allows every interested developer to create his own applications based on public transport schedules. Basically the API transforms the complex SBB XML response into a JSON format. Documentation and examples can be found at <a href="http://transport.opendata.ch/"
    >transport.opendata.ch</a>.</p>
<p>During the two days, the team including three Liipers reacted on user requests and implemented new features to the existing API. Besides little changes, we added a location-based station search as well as the output of the full stage details.</p>
<p>Today, the API is already in use by several projects, including a command line interface and a wheelchair map.</p>
<p>Feel free to <a href="https://github.com/OpendataCH/Transport"
    >use it, extend it, and share it</a>. Feedback is welcome as well.</p>
<h2>Zurich: Transport Flows visualization</h2>
<p><i>Team: Benjamin Wiederkehr, Dagmar Muth, Ilya Boyandin, Joel Bez, Patrick Stählin, Patrick Zahnd, Sylke Gruhnwald, Thomas Preusse</i></p>
<p>In the second project Patrick got involved in visualizing Transport Flows. Adapting the idea of the Villevivante project, the goal was to visualize the Swiss transport flows nicely and in an interactive way.</p>
<p>We collected the data based on the <a href="http://swisstrains.ch/"
    >swisstrains.ch</a> JSON output and processed it with Python scripts. With the given information, we created some interactive graphics using the JavaScript visualization framework d3. It turned out that it just perfectly matched our requirements and provided a wide range of features.</p>
<p>In the end we were able to visualize facts like sector-based train speeds and counts. We also visualized the transport hubs on a minute and hour basis.</p>
<p>An interesting statistic is the transport hub list, especially that Lucerne is the number three after Zurich and Berne. Also interesting is that the fastest railway line is still the “Bahn2000” between Berne and Zurich, which some of us use regularly.</p>
<p>The result can be found on <a href="http://flows.transport.opendata.ch/"
    >flows.transport.opendata.ch</a>.</p>
<h2>Geneva: SiesteApp</h2>
<p><i>Team: Andreas Kuendig, Benoît Pointet, Raphaël Halloran</i></p>
<p>The Geneva hackday crowd grew many interests which were more focused on the Geneva region, since a delegation of the territorial information systems department of Geneva (SITG) was present and provided great help and insights in the available geo-informations for the city. Topics like “bike mobility” or “multi-modality” got under heavy scrutiny, discussion and ideation.</p>
<p>Benoît got involved in a team who focused on a vague but non-the-less fascinating topic around individuality, emotions and comfort. He ended up working on a mobile app to help people find out where they could take a nap in Geneva; have a rest or just breath some fresh air in a quiet (or even dog-free) environment.</p>
<p>Follow the project at <a href="http://make.opendata.ch/doku.php?id=project:sieste"
    >http://make.opendata.ch/doku.php?id=project:sieste</a>.</p>
<h2>Conclusion</h2>
<p>Not only in the eyes of the Liip attendees the hackday was a success, but also in those of the participants and of the many institutional delegations visiting the hackday, like the SBB participants, who were impressed and willing to support the Swiss public transport API.</p>
<p><i>– Andreas Amsler, Benoît Pointet, Colin Frei, Fabian Vogler, Patrick Zahnd, Roland Schilter</i></p><img src="http://feeds.feedburner.com/~r/liip_blog/~4/zJemwG4fNYU" height="1" width="1"/>]]></content:encoded><dc:subject>Open Source</dc:subject><dc:subject>php</dc:subject><dc:subject>opendata</dc:subject><dc:subject>opendatach</dc:subject><dc:subject>transport</dc:subject><dc:subject>api</dc:subject><dc:subject>rest</dc:subject><dc:subject>json</dc:subject><dc:subject>sbb</dc:subject><dc:creator>Fabian Vogler</dc:creator><dc:date>2012-04-04T09:18:03Z</dc:date><feedburner:origLink>http://blog.liip.ch/archive/2012/04/04/big-leap-forward-for-opendata.html</feedburner:origLink></item><item><title>Monitoring Symfony Applications</title><link>http://feeds.liip.ch/~r/liip_blog/~3/KoTwHyFwmYs/monitoring-symfony-applications.html</link><guid isPermaLink="false">http://blog.liip.ch/archive/id/5837/</guid><content:encoded xmlns="http://www.w3.org/1999/xhtml"><![CDATA[<p>For one of our projects we wanted to be able to check the system health once we go live. Our idea was to have a system that let us see the status of the services like MySQL or Memcached from the point of view of the application itself. Since our project was developed in PHP using the Symfony framework we decided to create a new Symfony bundle where we could implement this functionality. The bundle is called LiipMonitorBundle and can be obtained <a href="https://github.com/liip/LiipMonitorBundle"
    >here</a>.</p>
<div/>
<p/>
<div>So one goal of our bundle was to do something more advanced than a simple "Ping" to a server –for that we can just use Nagios. We wanted that the bundle could do something like: "Let's write a session object to Redis, updating the user membership status, read it back and see that the data stored in the server is correct". So we can know more than just a simple "ping redis". Also when we get a report that the system is misbehaving we want to be able to run the health checks from the point of view of the app itself. For example we can ping Redis and see that is up and running but that doesn't mean our application is using it properly.</div>
<div/>
<p/>
<div>A second goal was that the health checks themselves should be easy to write and easy to run. Also they should be totally independent from the bundle itself. So the bundle should provide functionality for auto discovering health checks, for running them and for giving reports, but it should not provide any health checks. That means that the health checks should be implemented by the applications themselves.</div>
<div/>
<p/>
<div>In regard to how to run the checks we added two possibilities: via web using a REST API and by using the command line. Also since each health check has an id that identifies it, we can run the checks all together or individually. If the checks succeed you get an "OK" message for each of them. If they fail you get a "KO" plus the message from the Exception that made the test fail.</div>
<div/>
<p/>
<div>Now, what are health checks, how do you implement them? Health checks are simply a PHP class that implements the CheckInterface from the MonitorBundle. This interface has two methods: CheckInterface::check and CheckInterface::getName. The method getName just returns the Health Check name while the method check implements the actual logic for the health check. The bundle documentation explains these in detail.</div>
<div/>
<p/>
<div>Once we implement a health check we have to add it as a service to our Service Container and tag it as <strong>monitor.check</strong>. By doing just that our health check is ready and available to be picked up by the bundle's Health Check Runner.</div>
<div/>
<p/>
<div>Running health checks from the command line is quite easy, just execute the following command and you will see the results right away:</div>
<div/>
<p/>
<pre>
$ ./app/console monitor:health
Jackrabbit Health Check: OK
Redis Health Check: OK
Memcache Health Check: KO - No configuration set for session.save_path
PHP Extensions Health Check: OK
</pre>
<p/>
<div>As you can see there the bundle ran four Health Checks of which only the Memcache one failed.</div>
<div/>
<p/>
<div>Health Checks are not only for your applications, you could also ship them inside your bundles and let the bundle auto-discover them. This means that for example if you create your own bundle that say connects to a RabbitMQ, your bundle could provide the health checks required to see that your connection with RabbitMQ is working as expected.</div>
<div/>
<p/>
<div>As for the technology the bundle has a couple of peculiarities. Since the bundle provides also a REST API that allows us to run health checks and get the replies as JSON objects we built a web app for it that's implemented using Ember.js. Ember.js is an MVC javascript framework that deserves a post on it's own. You can learn more about it <a href="http://emberjs.com/"
    >here</a>. The views for the Ember.js app are rendered by Symfony with a template engine agnostic solution. By doing that the bundle doesn't require for you to use Twig or the PHP templating engine from Symfony. We had to provide that feature since we have apps that use Twig for frontend views and PHP for backen views.</div>
<div/>
<p/>
<div>All in all we've got an easy to use bundle that was quite well received by the Symfony community, counting 49 followers on Github and 2 forks. From one of those forks we already merged pull request. Apart from that it spawned a new bundle called <a href="https://github.com/liip/LiipMonitorExtraBundle"
    >LiipMonitorExtraBundle</a> that serves as a repository of reusable Health Checks for and by the community. Is time that you fork it and contribute your own health checks.</div>
<div/>
<p/>
<div>P. S.: As a side note a week after the bundle was released a new Java web framework came to life with exactly the same <a href="http://dropwizard.codahale.com/getting-started/#creating-a-health-check"
    >concept</a>. That framework was created by @coda an engineer that works at Yammer.</div><img src="http://feeds.feedburner.com/~r/liip_blog/~4/KoTwHyFwmYs" height="1" width="1"/>]]></content:encoded><dc:subject>PHP</dc:subject><dc:creator>Alvaro Videla</dc:creator><dc:date>2012-04-02T08:02:28Z</dc:date><feedburner:origLink>http://blog.liip.ch/archive/2012/04/02/monitoring-symfony-applications.html</feedburner:origLink></item><item><title>Touring North America</title><link>http://feeds.liip.ch/~r/liip_blog/~3/t25mSExlP-U/touring-north-america.html</link><guid isPermaLink="false">http://blog.liip.ch/archive/id/5829/</guid><content:encoded xmlns="http://www.w3.org/1999/xhtml"><![CDATA[<p>After pretty much exactly a month I have concluded my north american "tour" featuring speaking at <a href="http://confoo.ca"
    >Confoo</a> in Montreal, a <a href="http://www.meetup.com/South-Florida-PHP-Users-Group/events/51689792/"
    >PHP UG meeting</a> on Boca Raton and last, but definitely not least <a href="http://denver2012.drupal.org/"
    >DrupalCon</a> Denver. In between relaxing at my parents place in Florida. Lets me review the experience in chronological order.</p>
<p>I had previously attended Confoo in 2008 where it was still very much focused on PHP developers. These days Confoo aims to cover all web technologies all the while also including non-developers in some tracks. My <a href="https://joind.in/talk/view/5962"
    >first talk</a> was on <a href="http://phpcr.github.com/"
    >PHPCR</a>, while everyone back home was celebrating <a href="http://liipday.liip.ch/"
    >Liip Day</a>. This usually attracts a smaller crowd that have both experienced the pains of todays CMS and are ready to look beyond. I always ask the audience at the end of they think that PHPCR looks relevant to them and pretty much everyone raised their hand. The <a href="https://joind.in/talk/view/6012"
    >other talk</a> I gave was a presentation on Symfony2. I came with zero slides, but only my editor, the shell and a browser to show people the guts of Symfony2 in its raw beauty. I did this <a href="https://joind.in/talk/view/3879"
    >before</a> at PHP Conference in Mainz and I think I am improving in terms of finding the right pace and order of topics. However a single 60 min slot is just too short, so if I am going to submit this talk in the future I will need to ensure I have 120 min. In general interested in Symfony2 with all around at the conference. It seemed to be the dominant PHP framework discussed which surprised me, since I thought that Symfony2 was struggling in North America, but maybe it isn't or maybe its just struggling in the USA.</p>
<p>My next speaking engagement was at the South Florida PHP UG. Pablo from ServerGrove suggested that I leverage the fact that I will be in Florida to give a talk. I also held my PHPCR talk there to quite a diverse group. Most people were using home grown CMS solutions or heavily customized solutions based on other CMS. Once again I felt like in the end people really saw the value in having a mature and consistent storage API as well as the benefits of collaboration across CMS for implementing this.</p>
<p>My next stop was Denver for DrupalCon. I was quite excited to be going because I had invested quite a bit of my personal time as well as my Liip sponsored weekly "do what you want on OSS" day in supporting the <a href="http://groups.drupal.org/wscci"
    >WSCCI</a> initiative for Drupal8. In a way its strange, since I have never done a Drupal project in my life. Furthermore I am one of the lead people behind the <a href="http://cmf.symfony.com/"
    >Symfony CMF</a> initiative. However it is simply an exciting opportunity for the entire PHP world, heck given that <a href="http://w3techs.com/technologies/details/cm-drupal/all/all"
    >Drupal runs close to 2% of all websites in the world</a>, its should be exciting for quite a large portion of people on this planet! Furthermore I know that collaboration with Drupal will have benefits for Symfony2 as well as the CMF project as the will continue to push the common code pieces.</p>
<p>The first talk I did together with Fabien Potencier. He has submitted a <a href="http://denver2012.drupal.org/program/sessions/drupal-8-meets-symfony2"
    >talk on the Symfony2 components</a>, which Dries announced the day before at the keynote would become a key piece in Drupal8's core architecture. Since I was involved in the initial evaluation of Symfony2 for Drupal, Fabien figured it would make sense if I start things off with a little introduction about why this development could be beneficial for the Drupal community. Needless to say the attendance was jaw-dropping: This was easily the biggest presentation on Symfony2 .. ever .. at a DrupalCon no less! During the entire conference people walked up to me expressing their excitement and so I just want to pass along the countless "thank you for Symfony2" I heard to the Symfony2 community. Speaking of which, many people also asked me why the Symfony community cares so much about Drupal? To which I replied, we realize that this will mean we have a lot more users which will lead to more developers, leading to more code contributions. By the way, DrupalCon Denver has over 3000 attendees, I have been to plenty of PHP conference that had less attendees than were present at the hack day on the day following the conference. Of course we also realize that with <a href="http://www.garfieldtech.com/blog/refocusing-wscci"
    >Drupal8 using the HttpKernel</a>, it will be a breeze to integrate Drupal8 and Symfony2 applications. This is something many of us currently have to deal with already.</p>
<p>My <a href="http://denver2012.drupal.org/content/open-standards-and-document-oriented-storage"
    >other talk was a core conversation</a> together with Damien Tournoud about defining the next steps towards a documented oriented storage API for Drupal. I think this makes me the first DrupalCon core conversation speaker to never have installed Drupal. I started things off again with a 15 min intro to PHPCR. Then Damien discussed how to refactor the current Entity and Field API's to a unified API that should eventually be replaced with PHPCR. The goal is to get things far along with Drupal8 that it would be possible to provide a contrib module that would already switch things to PHPCR and at the latest with Drupal9 PHPCR would become the native storage API. We would of course have to push the<a href="https://github.com/jackalope/jackalope-doctrine-dbal"
    > Doctrine DBAL implementation of Jackalope</a> quite a bit to be able to handle larger use cases in order to make this a viable option for Drupal. As this was a core conversation we then had about 30 min of Q&amp;A where to my surprise no tomatoes were thrown. Instead all attendees seemed to be quite excited and so it seems like things are pretty much on track to get PHPCR into Drupal!</p>
<p/>
<p>I cannot express how huge this is as the only way I could imagine I could would be with a video of me doing a back flip, but I can't do back flips. With <a href="http://denver2012.drupal.org/keynote/dries-buytaert"
    >Dries emphasis on mobile and content authoring</a> which was also pushed in <a href="http://denver2012.drupal.org/keynote/luke-wroblewski"
    >Luke's mobile first keynote</a> I think that Drupal is well on track to become the first big CMS to adopt the <a href="http://bergie.iki.fi/blog/decoupling_content_management/"
    >Decoupled CMS</a> vision that Henri and I have been shouting from the roof tops for a while now. I also discussed CMIS briefly during the talk and then later on with a guy from Alfresco (darn forgot the name) and then again at the hack day with several Drupal core people. We might look into providing an implementation that can expose any PHPCR repository via the CMIS protocol, similar to what <a href="http://chemistry.apache.org/"
    >Apache Chemistry</a> does for JCR. For an introduction to CMIS see this <a href="http://ecmarchitect.com/archives/2009/11/23/1094"
    >blog post</a> by Jeff.</p>
<p>Needless to day I am thrilled with what is going on with Symfony2, Drupal and of course PHPCR. Really enjoyed each speaking opportunity and I want to especially thank Liip for funding my travel expenses to Denver as core conversation speakers need to pay for travel and hotel on their own.</p><img src="http://feeds.feedburner.com/~r/liip_blog/~4/t25mSExlP-U" height="1" width="1"/>]]></content:encoded><dc:subject>Open Source</dc:subject><dc:subject>Open Source :: Jackalope</dc:subject><dc:subject>Open Source :: Symfony</dc:subject><dc:subject>phpcr</dc:subject><dc:subject>drupal</dc:subject><dc:subject>symfony2</dc:subject><dc:creator>Lukas Kahwe Smith</dc:creator><dc:date>2012-03-30T12:38:03Z</dc:date><feedburner:origLink>http://blog.liip.ch/archive/2012/03/30/touring-north-america.html</feedburner:origLink></item><item><title>Jackalope observation and import repository dumps </title><link>http://feeds.liip.ch/~r/liip_blog/~3/ZiGjo9KteQM/jackalope-observation-and-import-repository-dumps.html</link><guid isPermaLink="false">http://blog.liip.ch/archive/id/5826/</guid><content:encoded xmlns="http://www.w3.org/1999/xhtml"><![CDATA[<p>Daniel Barsotti and me were reviewing the observation API of PHPCR and decided to just implement getting the observation journal. The journal contains all add, remove and update operations that happened on a PHPCR repository. You can also filter the journal by event type, path, node type and other criteria. This way, PHPCR can become almost a message queue (but just almost, there is no guaranteed delivery of messages).</p>
<pre>
use PHPCR\Observation\EventInterface; // Contains the constants for event types

// Get the observation manager
$workspace = $session-&gt;getWorkspace();
$observationManager = $workspace-&gt;getObservationManager();

// Get the unfiltered event journal and go through its content
$journal = $observationManager-&gt;getEventJournal();
$journal-&gt;skipTo(strtotime('-1 day'); // Skip all the events prior to yesterday
foreach ($journal as $event) {
    // Do something with $event (it's a Jackalope\Observation\Event instance)
    echo $event-&gt;getType() . ' - ' . $event-&gt;getPath()
}

// You can filter the event journal on several criteria.
// here we are only interested in events for node and properties added
$journal = $observationManager-&gt;getEventJournal(
    EventInterface::NODE_ADDED | EventInterface::PROPERTY_ADDED);

foreach ($journal as $event) {
    $event = $journal-&gt;current();
    // Do something with $event
    echo $event-&gt;getType() . ' - ' . $event-&gt;getPath()
}
</pre>
<p>The PHPCR / JCR standard also defines how to attach event listeners. The problem with this is that for any situation with concurrent repository access, the implementation needs to poll for events to trigger the listener. We assume that the JCR use case was a long running Java application that updates some local state based on polling events in a separate thread. For PHP, you neither have long running processes nor a thread system where you could do the polling. We decided that the journal will cover the most important use case: A cronjob that looks for specific events to act upon, instead of searching the whole repository each time and needing to determine if there is something changed that it needs to act upon.</p>
<p/>
<p>Additionally, we implemented Session::importXML to import XML data into the repository. You can import both the JCR system view documents that are an exact dump of the repository and general XML documents where element names will be translated to PHPCR nodes and attributes to PHPCR properties.</p><img src="http://feeds.feedburner.com/~r/liip_blog/~4/ZiGjo9KteQM" height="1" width="1"/>]]></content:encoded><dc:subject>Open Source :: Jackalope</dc:subject><dc:creator>David Buchmann</dc:creator><dc:date>2012-03-28T10:06:53Z</dc:date><feedburner:origLink>http://blog.liip.ch/archive/2012/03/28/jackalope-observation-and-import-repository-dumps.html</feedburner:origLink></item></channel></rss>

