<?xml version="1.0" encoding="utf-8"?>
<!-- generator="Kirby" -->
<rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom">

  <channel>
    <title>Mot-cl&#233;: opensource &#183; Blog &#183; Liip</title>
    <link>https://www.liip.ch/fr/blog/tags/opensource</link>
    <generator>Kirby</generator>
    <lastBuildDate>Mon, 23 Jul 2018 00:00:00 +0200</lastBuildDate>
    <atom:link href="https://www.liip.ch" rel="self" type="application/rss+xml" />

        <description>Articles du blog Liip avec le mot-cl&#233; &#8220;opensource&#8221;</description>
    
        <language>fr</language>
    
        <item>
      <title>LiipRokkaImagineBundle 1.0.0 Release</title>
      <link>https://www.liip.ch/fr/blog/liiprokkaimaginebundle-1-0-0-release</link>
      <guid>https://www.liip.ch/fr/blog/liiprokkaimaginebundle-1-0-0-release</guid>
      <pubDate>Mon, 23 Jul 2018 00:00:00 +0200</pubDate>
      <description><![CDATA[<p>Previously, such a switch could cost you lot's of efforts, but with <a href="https://github.com/liip/LiipRokkaImagineBundle">LiipRokkaImagineBundle</a> we reduced it to minimum. It allows you to configure <a href="https://github.com/liip/LiipImagineBundle">LiipImagineBundle</a> in the way, that it uses <a href="https://rokka.io/">rokka.io</a> service as a storage. You just have to create a rokka account and adjust a few settings in your application config.  Check the <a href="https://github.com/liip/LiipRokkaImagineBundle#installation">installation details</a> in our documentation and try out how easy it is.<br />
We've already tested this extension against different open source platforms. For example, the installation on <a href="https://sylius.com/">Sylius</a> takes only 3-5 minutes.</p>
<p>If you like LiipRokkaImagineBundle extension, the github star will be very much appreciated. Please also do not hesitate to create tickets or pull requests, if you notice any issues or would like to make an improvement to the new extension.</p>]]></description>
                  <enclosure url="http://liip.rokka.io/www_card_2/0fc5e6/liiprokkaimagine100.jpg" length="149036" type="image/jpeg" />
          </item>
        <item>
      <title>Magento 2 Config Search</title>
      <link>https://www.liip.ch/fr/blog/magento-2-config-search</link>
      <guid>https://www.liip.ch/fr/blog/magento-2-config-search</guid>
      <pubDate>Fri, 29 Sep 2017 00:00:00 +0200</pubDate>
      <description><![CDATA[<p>Do you remember, I recently wrote about implementation of a small but handy <a href="https://blog.liip.ch/archive/2015/05/21/8062.html">extension</a> for config search in Magento1? I have become so used to it, that I had to do the same for Magento 2. And since I heard many rumors about improved contribution process to M2, I also decided to make it as a contribution and get my hands “dirty”.</p>
<p>Since the architecture of the framework has drastically changed, I expected many troubles. But in fact, it was even a little bit easier than for M1. From the development point of view it was definitely more pleasant to work with the code, but I also wanted to test the complete path to the fully merged pull request.</p>
<h3>Step #0 (Local dev setup)</h3>
<p>For the local setup I decided to use Magento2  <a href="http://devdocs.magento.com/guides/v2.1/install-gde/docker/docker-over.html">docker devbox</a>, and since it was still in the beta state I ran the first command without any hope for smooth execution. But surprisingly I had no issues with the whole set up. By executing few commands in terminal and cup of coffee, Magento 2 was successfully installed and ready to use. Totally positive experience.</p>
<h3>Step #1 (Configuration)</h3>
<p>All I had to do is to declare my search model in di.xml, not too hard, right ?)</p>
<figure><img src="https://liip.rokka.io/www_inarticle/9035905badda7e6a90560726a044b8db3b4a572d/screenshot-1.jpg" alt="app/code/Magento/Backend/etc/adminhtml/di.xml"></figure>
<p>app/code/Magento/Backend/etc/adminhtml/di.xml</p>
<h3>Step #2 (Implementation)</h3>
<p>Implementation of search itself was trivial, we just have to look for matches for a given keyword in the ConfigStructure object using  <a href="http://php.net/manual/en/function.mb-stripos.php">mb_stripos(</a>).</p>
<figure><img src="https://liip.rokka.io/www_inarticle/0f5b0af4ee70e489e3b6e9c79ff1bdd84d489a84/screenshot-2.jpg" alt="app/code/Magento/Backend/Model/Search/Config.php"></figure>
<p>app/code/Magento/Backend/Model/Search/Config.php</p>
<h3>Step #3 (View)</h3>
<p>The same as for M1, the result of the search is a list of URLs to the matched configuration label. When the user clicks the selected URL, they are redirected to the config page and the searched field is highlighted.</p>
<p>That would be it regarding the implementation :)</p>
<h3>Step #4 (Afterparty)</h3>
<p>Too simple to believe? You are right. I thought that it is enough for submitting the <a href="https://github.com/magento/magento2/pull/10335">PR</a>. But I completely forgot about tests :) This one of main requirements for accepting pull request by Magento Team.</p>
<p>Since all implemented code was well isolated (had no strict dependencies), it was pretty easy to write tests. I have covered most of the code with unit tests, and for the main search method I wrote the integration test.</p>
<h3>Conclusion</h3>
<p>I would like to point out that during the whole cycle of the pull request, I had fast and high-quality support from the Magento team. They were giving useful recommendations and consulted me sometimes even during their vacations. This is what I call outstanding interaction with the community!</p>
<p>My special thanks to  <a href="https://github.com/vrann">Eugene Tulika</a> and  <a href="https://github.com/maghamed">Igor Miniailo</a>, and of course <a href="https://github.com/vil11">Dmitrii Vilchinskii</a> for the idea for creation this handy feature.</p>]]></description>
          </item>
        <item>
      <title>Hello, Rust! &#8212; An overview</title>
      <link>https://www.liip.ch/fr/blog/rust-an-overview</link>
      <guid>https://www.liip.ch/fr/blog/rust-an-overview</guid>
      <pubDate>Mon, 06 Feb 2017 00:00:00 +0100</pubDate>
      <description><![CDATA[<p><em>This is my report of my talk at the TupperRust meetup hold in Lyon (France, February 2017) You find my slides available to download. </em></p>
<p>The February 2nd 2017, I have presented a talk entitled <em>Hello, Rust! — An overview</em> about <a href="https://www.rust-lang.org/">the Rust language</a>. This language describes itself as safe, concurrent, and practical. The goal of this presentation was to give an overview of several features brought by the language, such as its strong safety guarantees, or speed and memory performances.</p>
<p><a href="https://speakerdeck.com/hywan/hello-rust-an-overview">The slides are available online</a></p>
<figure><a href="https://www.liip.ch/content/4-blog/20170206-rust-an-overview/Screen-Shot-2017-02-03-at-13.43.09.png"><img src="https://liip.rokka.io/www_inarticle/793297e6a4f1748c3165f9bdd66ac15a59fccc8a/screen-shot-2017-02-03-at-13-43-09-1024x767.jpg" alt=""></a></figure>
<p>First slide from the <em>Hello, Rust!</em> talk</p>
<p>This talk has been presented during the first <a href="https://twitter.com/TupperRust">TupperRust</a> meetup event in Lyon (France) <em>.</em> This is a serie of meetups focusing on Rust. The interaction was exceptional: The audience has been a great actor of this talk, and we even had a live-coding session on projects made by someones in the room. It was a great moment to talk about concrete problem, memory safety, performance etc.</p>
<p>It was also an opportunity to present a project that I have started here at Liip, called <a href="https://github.com/tagua-vm/tagua-vm">Tagua VM</a>, which is an experimental PHP Virtual Machine that guarantees safety and quality by removing large classes of vulnerabilities thanks to the Rust language and <a href="http://llvm.org/">the LLVM Compiler Infrastructure</a>.</p>
<p>If you have any question, feel free to ask anything!</p>]]></description>
                  <enclosure url="http://liip.rokka.io/www_card_2/dbcb7d3a446586c0385bb6546e5a911b50140023/screen-shot-2017-02-03-at-13-43-09.jpg" length="139318" type="image/png" />
          </item>
        <item>
      <title>Accessibility: make your website barrier-free with a11ym!</title>
      <link>https://www.liip.ch/fr/blog/accessibility-with-a11ym</link>
      <guid>https://www.liip.ch/fr/blog/accessibility-with-a11ym</guid>
      <pubDate>Tue, 06 Dec 2016 00:00:00 +0100</pubDate>
      <description><![CDATA[<p><em>Accessibility is not only about people with disabilities but also about making your website accessible to search engines robots. This blog post shares our experience with making the website of a famous luxury watchmaker more accessible, an important e-commerce application. We have built a custom tool, called <a href="https://github.com/liip/TheA11yMachine">The A11y Machine</a> to help us crawl and test each URL against accessibility and HTML conformances. Less than 100 hours were required to fix a thousand of strict errors.</em></p>
<h2>Issues with unaccessible application</h2>
<p>Accessibility is not just a matter of helping people with disabilities. Of course, it is very important that an application can be used by everyone. But, have you ever considered that robots are visitors with numerous disabilities? What kind of robots you may ask, well: Search engine robots for instance, like Google, Bing, DuckDuckGo, Baidu… They are totally blind, they don't have a mouse, they don't have a keyboard, they must understand your content only with the source code.</p>
<p>Whilst it is easy to consider a man or a woman with a pushchair having a bad time in public transport, someone color-blind, a widespread disability, could also have issues browsing the web.</p>
<h3>Several domains are concerned by the accessibility of an application:</h3>
<ul>
<li><strong>Content description</strong> , the use of appropriated HTML tags and attributes help to structure the content of a document (like <code>nav</code>, <code>main</code>, <code>article</code>, <code>aside</code>, <code>footer</code> etc.),</li>
<li><strong>Design of the content</strong> , the use of appropriated colors, contrasts, size of elements, layouts, animations etc.,</li>
<li><strong>SEO</strong> , a content that is understandable by a robot can be well referenced, and search engines can print more content, like associated links or menus (with “Jump to”, or “Related section” etc.),</li>
<li><strong>Development framework</strong> , using ARIA recommendations help to create rich applications with good, clear and relevant practices (<code>aria-hidden</code> to hide an element, <code>aria-describedby</code> to describe objects, all roles like <code>tab</code>, <code>tabpanel</code>, <code>progressbar</code>, <code>alert</code>, <code>dialog</code> etc. to create your own component),</li>
<li><strong>Legal</strong> , where more and more foundations or group of people attend to sue companies for not respecting common recommendations. Unfortunately, while this might be good to improve the status of accessibility for Web applications, it also turns into a juicy market…</li>
</ul>
<p>In other words, from an editor's point of view, making a product accessible is unavoidable, and even beneficial.</p>
<p>Do not think that the mobile market is somehow different. iOS and Android are gently becoming the first screen readers of the market, even for Web content.</p>
<p>However, testing the accessibility conformance is often a matter of money. It is costly because it takes time to check everything. Now, this is no longer the case.</p>
<h2>E-commerce solution of a luxury brand</h2>
<p>Our client, a famous watchmaker's application is an important e-commerce solution, with more than 16 domains, 10 languages, 1000+ products, and hundreds of thousands of visitors from around the globe.</p>
<p>A simple calculation quickly shows that it is very hard to check the application page by page (better say URL by URL). Content can differ according to language, the business constraints, available products, localized features etc.</p>
<p>For this reason, we were looking for a tool that does 3 things:</p>
<ol>
<li>Crawls an entire application based on a starting URL,</li>
<li>Tests each URL against pre-defined conformance levels/accessibility rules,</li>
<li>Can be installed locally for privacy concerns.</li>
</ol>
<p>Searching online, we found several awesome tools doing either point 1, or point 2, or point 3, but never all 3 at once. So we decided to develop our own tool, called <a href="https://github.com/liip/TheA11yMachine/">The A11y Machine</a> (<code>a11ym</code> for short). More below.</p>
<h2>Conformance levels</h2>
<p>Several accessibility recommandations exist, like:</p>
<ul>
<li><a href="http://www.w3.org/TR/WCAG20/">W3C Web Content Accessibility Guidelines</a> (WCAG) 2.0, including A, AA and AAA levels ( <a href="http://www.w3.org/TR/UNDERSTANDING-WCAG20/conformance.html#uc-levels-head">understanding levels</a> of conformance),</li>
<li>U.S. <a href="http://www.section508.gov/">Section 508</a> legislation.</li>
</ul>
<p>We might consider the following recommandation too:</p>
<ul>
<li><a href="https://www.w3.org/TR/html/">W3C HTML5 Recommendation</a>.</li>
</ul>
<p>Conforming to the HTML specification guarantees that the document is not broken, which is a good basis.</p>
<p>Our client's goal was to reach the WCAG 2.0 AA conformance level, with HTML recommendation. Some other specific SEO rules have been added, like: Only one <code>h1</code> per page, or no link with an empty target ( <a href="https://github.com/liip/TheA11yMachine#write-your-custom-rules">Learn how to write your own rules</a>).</p>
<h2>Results</h2>
<p>In less than 100 hours, we have been able to fix more than 1300 strict errors and 400 warnings. As a result, with a team of 3 motivated developers, it took around 4 days to fix everything (including developing The A11y Machine)!</p>
<p>Given a starting URL, The A11y Machine extracts each URL from this document. For each extracted URL, the same operation is repeated until the maximum of URL to compute is reached.</p>
<p>In parallel, several tests are ran on each URL. They are categorized in 2 groups: Accessibility (e.g. WCAG) and other (e.g. HTML). Test results are stored as standalone HTML reports. Why standalone? Because it makes it possible to simply attach the report to an email, so that everyone is able to read and interact with it, even offline.</p>
<p>A report contains only errors. They are classified in 3 classical categories: Error, warning and notice. A CSS selector is provided to better select and analyse the culprit element, in addition to a very complete description, and a link to the recommendation. For instance:</p>
<ul>
<li>Error: “This button element does not have a name available to an accessibility API. Valid names are: title attribute, element content”,</li>
<li>Code: <a href="http://www.w3.org/TR/WCAG20-TECHS/H91.html">H91</a>,</li>
<li>Rule name: <code>#BRAND.Principle4.Guideline4_1.4_1_2.H91.Button.Name</code>,</li>
<li>Selector: <code>#reel-collection_product-section-580456752a01b &gt; button:nth-child(1)</code>,</li>
<li>Code extract: <code>&lt;button class="reel__previous btn btn--bare btn--disabled" data-navigate="previous"&gt;</code>.</li>
</ul>
<figure><a href="https://www.liip.ch/content/4-blog/20161206-accessibility-with-a11ym/screenshot_error.png"><img src="https://liip.rokka.io/www_inarticle/8566da879f14b62b239ee9246ae06a902a037454/screenshot-error.jpg" alt="A typical error message"></a></figure>
<p>A typical error message</p>
<p>With all these information in hands, it is really easy for a developer to target the element and fix it. Accessibility recommendations are not always hard to apply. Indeed, they are mostly hard and long to detect. This tool really eases this step, thus reducing the costs of making an application accessible.</p>
<h2>Automated testing and reports</h2>
<p>Every Monday, <strong>a11ym</strong>  computes a new report. It crawls a set of pre-defined URLs that are important for our customer, and applies all the tests on these URLs.</p>
<p>A board displays the evolution over time. For obvious confidentiality reasons, we cannot display anything about our client. Consequently, the following screenshots are reports from our own website: <a href="https://www.liip.ch/">liip.ch</a>.</p>
<figure><a href="https://www.liip.ch/content/4-blog/20161206-accessibility-with-a11ym/dashboard.jpg"><img src="https://liip.rokka.io/www_inarticle/12f45ca1e769b83105bae35ac4363c18cdc79a83/dashboard.jpg" alt="Example of a typical a11ym dasboard."></a></figure>
<p>Example of a typical a11ym dasboard.</p>
<p>We regularly check this board to see if we have introduced a regression or not. When developing, we can also run The A11y Machine on our local server and check if everything conforms. It takes less than 10 minutes to check hundreds of URLs.</p>
<p>The following screenshot is the index of all reports per URLs.</p>
<figure><a href="https://www.liip.ch/content/4-blog/20161206-accessibility-with-a11ym/index.png"><img src="https://liip.rokka.io/www_inarticle/f4bcee02c7b15dd17fe17a2b5bde97e67c65d310/index.jpg" alt="A typical index of all reports generated by a11ym."></a></figure>
<p>A typical index of all reports generated by a11ym.</p>
<p>The following screenshot is a detailed report for one specific URL.</p>
<figure><a href="https://www.liip.ch/content/4-blog/20161206-accessibility-with-a11ym/report.png"><img src="https://liip.rokka.io/www_inarticle/5a54899df271c2f8c270776b6a84c3800ad6f36d/report.jpg" alt="A typical report generated by a11ym"></a></figure>
<p>A typical report generated by a11ym</p>
<h2>Build upon awesome tools</h2>
<p>The A11y Machine is mostly an orchestration of several tools:</p>
<ul>
<li><a href="https://github.com/cgiffard/node-simplecrawler/"><code>node-simplecrawler</code></a> to crawl the Web application, but a custom exploration algorithm has been developed to detect various errors with the lowest similarities (all products may have the same portion of errors because the HTML structure is rather the same, so we need diversity to target more relevant errors). This exploration algorithm also supports parallelism,</li>
<li><a href="http://phantomjs.org/">PhantomJS</a> to open a headless browser and executes <a href="https://github.com/squizlabs/HTML_CodeSniffer"><code>HTML_CodeSniffer</code></a> in order to check the accessibility conformance. This step is semi-automated with the help of <a href="https://github.com/nature/pa11y"><code>pa11y</code></a>,</li>
<li><a href="http://validator.github.io/validator/">The Nu HTML Checker</a> for the HTML conformance.</li>
</ul>
<p><a href="https://github.com/liip/TheA11yMachine#how-does-it-work">Learn more about how these tools are used and orchestrated</a>.</p>
<h2>We ❤️ Open Source</h2>
<p><a href="https://github.com/liip/TheA11yMachine#authors-and-license">The A11y Machine is open source, under a BSD-3 license</a>. It is developed on Github, under the <a href="https://github.com/liip/TheA11yMachine"><code>liip/TheA11yMachine</code></a> repository.</p>
<p>If you need anything or would like to contribute, you will be very welcome. Let's break the barriers together and make the Web more accessible!</p>]]></description>
                  <enclosure url="http://liip.rokka.io/www_card_2/f4ff61d52897d9421bc66263c2b32d8f60cba5b5/admin-ajax-2.jpg" length="76790" type="image/png" />
          </item>
        <item>
      <title>An opensource Drupal theme for the Swiss Confederation</title>
      <link>https://www.liip.ch/fr/blog/an-opensource-drupal-theme-for-the-swiss-confederation</link>
      <guid>https://www.liip.ch/fr/blog/an-opensource-drupal-theme-for-the-swiss-confederation</guid>
      <pubDate>Mon, 11 Jul 2016 00:00:00 +0200</pubDate>
      <description><![CDATA[<p>After having contributed to the official styleguide of the Swiss Federal Government and having implemented it on a couple of websites, we decided to go further and bring these styleguide into a theme for Drupal, a well-known, pluripotent and robust CMS we implement regularly at Liip.</p>
<figure><a href="https://www.liip.ch/content/4-blog/20160711-an-opensource-drupal-theme-for-the-swiss-confederation/bundrupal-screenshot.jpg"><img src="https://liip.rokka.io/www_inarticle/2a5a3fa775ffc0cb53c373b2316bbc25b93a8022/bundrupal-screenshot.jpg" alt="Screenshot of Drupal theme for the Swiss Confederation"></a></figure>
<p><a href="https://github.com/liip/bund-drupal-starterkit">The current result</a> is a starterkit providing the essential bricks to start <em>in a snap</em> a website project for the federal government running with Drupal 8, based on the version 3 of the <a href="http://swiss.github.io/styleguide">official styleguide</a>.</p>
<p>Navigation modules, multilingual environnement per default (German, French, Italian, Rumantch and English), responsive layout following the Web Content Accessibility Guidelines, we threw the fundamental stones for bootstraping a web platform for the Confederation.</p>
<h2><em>con~foederatio</em> : to build a league, together.</h2>
<p>In other words, joining forces, to support a common cause. From the very start of the project we decided to opensource the code, as a participatory initiative.</p>
<p><a href="https://www.liip.ch/en/news/archive/2016/07/08/liip-releases-open-source-starter-kit-for-swiss-government-websites.html">Learn more about this intent</a>.</p>
<p>Any developer working on a new website for the swiss government can now quickly start developing with this Drupal starterkit, then modify, contribute and improve it collegially. Pulling requests and opening issues on GitHub is the recommended way to help us extend further the project.</p>
<h2>What's inside the box</h2>
<p>The Bund-Starterkit provides theme and elements based on the official styleguide (version 3.0.0) of the Swiss Federal Administration.</p>
<p>This starterkit also contains a base to quickly implement a website running on Drupal 8 for the Swiss Federal Administration. Currently, it provides the following Drupal and frontend elements:</p>
<ul>
<li>Multilingual main navigation blocks</li>
<li>Multilingual service navigation blocks</li>
<li>Multilingual footer service navigation blocks</li>
<li>Logo block</li>
<li>Language switcher block with German, French, Italian, Rumantsch enabled</li>
<li>All the assets (CSS, SASS. JS files) provided by the official styleguide</li>
<li>A ready-to-use SASS workflow</li>
</ul>
<h2>Installation process, an overview</h2>
<p>Please check the <a href="https://github.com/liip/bund-drupal-starterkit/blob/master/README.md">Readme</a> file to quickly start your project. But let's have a look at the details of the installation process. First of all, <a href="https://getcomposer.org/">Composer</a> (a PHP dependencies manager) is binding together for us the following repositories:</p>
<ul>
<li>a Drupal 8 installer</li>
<li>a theme:  <a href="https://github.com/liip/bund_drupal_starterkit_theme">bund_drupal_starterkit_theme</a></li>
<li>an installation profile:  <a href="https://github.com/liip/bund_drupal_starterkit_profile">bund_drupal_starterkit_profile</a></li>
<li>
<p>a module for importing menu content:</p>
<p><a href="https://github.com/liip/bund_drupal_starterkit_dummycontent">bund_drupal_starterkit_dummycontent</a></p>
</li>
</ul>
<p>After downloading the sources with Composer and setting your vhost and hosts files, you have two options. Continuing with a few drush commands to run the Drupal installation process, or following the installation wizard in the browser. If you choose this last option, don't forget to select the «Bund profile» option when the wizard ask you to choose a profile:</p>
<figure><a href="https://www.liip.ch/content/4-blog/20160711-an-opensource-drupal-theme-for-the-swiss-confederation/screencapture-bund-starterkit-choose-profile.png"><img src="https://liip.rokka.io/www_inarticle/a82c768e66c86a8dc7c69bc2a0902da9ef4b63dd/screencapture-bund-starterkit-choose-profile.jpg" alt="Chose a profile for the Drupal theme for the Swiss Confederation"></a></figure>
<p>Continue with the last steps of the wizard and that's it. you should be able to see an empty Drupal 8 website, painted with the swiss administration's corporate sauce.</p>
<h3>Inserting menus content</h3>
<p>With the help of a .CSV file and some drush commands, you can quickly import your menu structure. Once done, create and assign your content the the freshly created menu items through the Drupal administration interface.</p>
<h3>Theming</h3>
<p>Don't forget to create a personal <a href="https://www.drupal.org/theme-guide/8/creating-a-sub-theme">Drupal sub-theme</a> from the bund_drupal_starterkit_theme, as a Drupal best practice.  Don't edit the existing theme directly or you could loose your changes after a future update.</p>
<h3>Frontend</h3>
<p>This starterkit use the official styleguide (version 3.0.0) as a submodule. All existing CSS/JS files and assets are imported and available per default, but not necessary integrated as a drupal module at the moment. We highly encourage you to check the <a href="http://swiss.github.io/styleguide/en/index.html">official styleguide</a> before adding any new CSS style or JS files to your project. Based on the existing styles, it should be possible to create a lot of Drupal templates without modifying or extending any CSS. And as already said, we invite you to share any Drupal template matching the styleguide you would develop for your project.</p>
<h3><strong>Further reading</strong></h3>
<ul>
<li><a href="http://swiss.github.io/styleguide">Official styleguide</a></li>
<li><a href="https://www.liip.ch/en/news/archive/2016/07/08/liip-releases-open-source-starter-kit-for-swiss-government-websites.html">Official announcement</a> by Jenny Bächtold</li>
<li><a href="https://github.com/liip/bund-drupal-starterkit">The Drupal starterkit repository</a></li>
<li>An article  <a href="https://www.liip.ch/en/what/projects/style-guide-swiss-confederation">about the realization of the Style Guide of the Swiss Confederation</a></li>
<li><a href="https://blog.liip.ch/archive/2016/05/11/swiss-confederation-the-styleguide-version-3.html">A blogpost by Ludovic Turmel</a></li>
</ul>]]></description>
          </item>
        <item>
      <title>Liip releases open-source starter kit for Swiss government websites</title>
      <link>https://www.liip.ch/fr/blog/liip-releases-open-source-starter-kit-for-swiss-government-websites</link>
      <guid>https://www.liip.ch/fr/blog/liip-releases-open-source-starter-kit-for-swiss-government-websites</guid>
      <pubDate>Fri, 08 Jul 2016 00:00:00 +0200</pubDate>
      <description><![CDATA[<p><a href="https://www.liip.ch/en/drupal">Drupal</a>is one of the mostly widely used open-source content management systems. With the release of Version 8, Drupal has shored up its status as a comprehensive web framework and, with over 10,000 modules, is now more flexible than ever.</p>
<p>The <a href="https://github.com/liip/bund-drupal-starterkit">Drupal 8 starter kit</a> from Liip affords the federal administration a considerably high degree of flexibility in how it develops its digital presence and online services. This powerful and freely available tool set will dramatically cut the time the federal authorities and their respective partner agencies have to spend on developing a new website, thereby letting them invest resources in those areas will real added-value potential. Liip is a firm believer in open source software and actively encourages its uptake across the public sector. With the opening of its brand-new office in Bern, Liip is one step closer to realising this ambitious goal.</p>
<p>Liip hopes that the release of the starter kit will lead the Swiss Drupal community and other agencies to get on board too. The kit is on <a href="https://github.com/liip/bund-drupal-starterkit">Github</a>and can be used by all federal offices and agencies free of charge.</p>
<h2>Background information</h2>
<h3>What is a style guide?</h3>
<p>A style guide is basically a website made up of filler text which makes it easier to establish a consistent corporate identity across multiple channels. It explains how the various components should be used, how they should appear and how they interact with each other. A style guide lets businesses and agencies build websites that are not only compatible with commonly used devices and browsers but also comply with the latest corporate design rules.</p>
<p>As the <a href="https://standards.usa.gov/">US Federal Government</a> and the <a href="https://www.gov.uk/guidance/style-guide">UK Government Digital Service</a> prove a style guide is a long-term, flexible solution for anyone with a multiplatform digital presence.</p>
<h3>Why do the Swiss authorities need a style guide?</h3>
<p>Every single one of the assorted official websites of the federal authorities has to comply with the “Corporate Design of the Swiss Confederation”. A style guide in HTML, CSS and JS ensures that these rules are applied correctly.</p>
<p>In Version 3 of the federal style guide, all elements comply with the latest technical guidelines and the corporate design rule book of the Swiss Confederation. They are also accessible from and compatible with all popular browsers.</p>
<p><a href="https://github.com/swiss/styleguide">To the style guide</a></p>
<h3>Why develop a Drupal 8 starter kit?</h3>
<p>Given the sheer number of federal websites and their individual specifications, it takes more than just one CMS to do the job. However, the open-source CMS, Drupal, offers a viable and tried-and-tested alternative to the single standard system. Added to this is the fact that there are no licencing costs involved, which is welcome news for smaller-scale projects or for government offices that have to work on a limited budget. Also, as the style guide is in the public domain, it makes it easier to exploit the full potential that Drupal offers.</p>
<p>The Drupal starter kit defines the navigation modules and comes with a multilingual environment as standard – German, French, Italian, Rumantch (Switzerland's four national languages), and English. It also has a responsive layout that is compatible with all end devices and follows the Web Content Accessibility Guidelines. What this means in practice is that the various offices, departments and partner agencies of the Swiss government are able to build a basic website within the space of five minutes and save valuable time setting up different content types, thereby allowing them to focus their energies on developing the relevant additional applications. </p>
<h3>The technology behind it</h3>
<p>Courtesy of Liip, the official web style guide of the Confederation comes as a Git sub-module which automatically connects to Drupal via Composer, allows users to important sample content easily and effectively. Web developers also receive an integrated modern front-end development tool kit. Together, the  workflow tool <a href="http://gulpjs.com/">Gulp</a>, the test tool BrowserSync, and <a href="https://github.com/postcss/autoprefixer">AutoPrefixer</a>are a user-friendly and efficient <a href="http://sass-lang.com/">SASS</a>set-up.</p>
<h3>Why open source?</h3>
<p>Having worked on the official style guide, the Liip team decided to take it one step further and make it available as a Drupal theme.  They open-sourced the code in order to prevent time being wasted on needlessly reinventing the wheel, and to ensure that a wider network was involved in the implementation of the starter kit.</p>
<p>Thanks to the starter kit, project managers and developers within the federal administration or working for partner agencies can now get stuck into new web projects straight away. The Liip team also hopes that a new kind of working relationship will emerge, with users joining forces to adapt and improve the the kit in a cooperative and constructive way.</p>
<p>Liip firmly believed that open civic technology can play a key role in the digitisation of government services in Switzerland.</p>
<h3>Who is Drupal 8 starter kit?</h3>
<p>The Drupal starter kit is ideal for any institution that has multiple websites and portals which share more or less the same design and for which the use of an open-source CMS like Drupal could be an option. The ideal candidates are websites that require a high degree of flexibility and feature embedded applications.</p>
<p>The federal authorities and cantons often have multiple websites that are maintained by different institutions but still have to be visually consistent, hence the use of a style guide in HTML, CSS and JS. The starter kit is the ideal solution when multiple websites are involved as it not only guarantees a uniform appearance but it also saves valuable time and money.</p>]]></description>
                  <enclosure url="http://liip.rokka.io/www_card_2/7f5dd2f9f2418b88b1c19f8c3727c3b293b1f3dc/liip-veroffentlicht-open-source-starterkit-fur-bundes-websit.jpg" length="1434459" type="image/png" />
          </item>
        <item>
      <title>Order fulfillment with Swiss Post and YellowCube</title>
      <link>https://www.liip.ch/fr/blog/how-yellowcube-works</link>
      <guid>https://www.liip.ch/fr/blog/how-yellowcube-works</guid>
      <pubDate>Wed, 08 Jun 2016 00:00:00 +0200</pubDate>
      <description><![CDATA[<h2>Setting the stage</h2>
<p>We live in a time where more and more goods are purchased online. May it be your airline ticket or the diapers for your newborn, many things are often cheaper and more conveniently purchased online. As comfortable it is for the customer buying things this way, as challenging it can be for the seller. They need to have an online presence that is easy to use and need to have all goods in stock to sell and send them quickly.</p>
<p>This means that selling physical products requires sufficient storage space on-site, people that handle picking, packing and shipping and someone that handles returned goods. All this factors can sum up to a costly venture, especially when you don't have any infrastructure from other sales channels already.</p>
<figure><a href="https://www.liip.ch/content/4-blog/20160608-how-yellowcube-works/Architekture-PostLogistics-YellowCube-Connector.png"><img src="https://liip.rokka.io/www_inarticle/5b2e5275a9e8fec68a466c7973d57e99b86892c1/architekture-postlogistics-yellowcube-connector-300x225.jpg" alt="Architekture PostLogistics YellowCube Connector"></a></figure>
<p>The PHP-YellowCube interface is part of all YellowCube extensions for PHP based web stores</p>
<h3>What is order fulfillment?</h3>
<p>This is where <a href="https://www.post.ch/en/business/a-z-of-subjects/dropping-off-mail-items/dropping-off-business-parcels/yellowcube">YellowCube</a> comes in handy. YellowCube is a fulfillment service offered and run by Swiss Post. But what is a fulfillment service anyway? In the case of YellowCube it means everything to do with the storing and shipping of the products you sell on your store. This means receiving and storing of the products, handling of the inventory, picking, packing, shipping and handling of returns.</p>
<h3>How to implement it into your web shop?</h3>
<p>So far so good, but how does this translate into real life? Liip has, in close collaboration with Swiss Post, developed a PHP-YellowCube-SDK and also the integration for Magento and Drupal web shops. The PHP-YellowCube interface provides an object-oriented wrapper to the SOAP based interface provided by Swiss Post. The code is readily available on <a href="https://github.com/swisspost-yellowcube">Github</a>. Please feel free to contribute to the <a href="https://github.com/swisspost-yellowcube/yellowcube-php">PHP-YellowCube-SDK</a>, as well as the  <a href="https://github.com/swisspost-yellowcube/magento-yellowcube">Magento extension</a> or the <a href="https://github.com/swisspost-yellowcube/drupal-yellowcube">Drupal extension</a>.</p>
<h3>Please explain…</h3>
<p>Now that we know about the SDK, we need to know how the basic process works. I want to show you what needs to happen in order to implement YellowCube successfully into a web shop. The process is agnostic to a certain integration, so I won't go into details how it is integrated in a specific shop extension. I will explain the basic process, which applies to all web shop integrations in the same manner (more or less).</p>
<h2>Go with the flow</h2>
<p>The flowcharts below show you the process and the different “actors” involved (swim-lanes). The red coloured lanes represent the web shop and the yellow lanes show the services provided by YellowCube and exposed by our SDK.</p>
<p>First we need to have products in our web shop. For simplicity lets assume that all the products in our web shop are products handled by YellowCube.</p>
<h3>Feeding data into the system</h3>
<figure><a href="https://www.liip.ch/content/4-blog/20160608-how-yellowcube-works/Screenshot-2016-06-08-09.43.31.png"><img src="https://liip.rokka.io/www_inarticle/3d5ff7c4390b071c91aebfcdb0415d0eed3803b5/screenshot-2016-06-08-09-43-31-e1465372848934.jpg" alt=""></a></figure>]]></description>
                  <enclosure url="http://liip.rokka.io/www_card_2/29e0ffb2de794e2c574f86627cdf7aede9a09bd4/yellowcube.jpg" length="687171" type="image/gif" />
          </item>
        <item>
      <title>Les Rencontres Hivernales du Libre, deuxi&#232;me &#233;dition</title>
      <link>https://www.liip.ch/fr/blog/rencontres-hivernales-du-libre</link>
      <guid>https://www.liip.ch/fr/blog/rencontres-hivernales-du-libre</guid>
      <pubDate>Tue, 19 Jan 2016 00:00:00 +0100</pubDate>
      <description><![CDATA[<h2>Winter Libre meetup, second edition.</h2>
<p>As Swisslinux.org member, I again had the opportunity to take part to the Rencontres Hivernales du Libre (roughly translated as ‘Winter Libre meetup'), up in the jura, in St-Cergue. This week-end-long meetup, organized for the second time this year, aims at gathering all libre-related actors. This article, originally written in french, tells you the story of what happened there, who attended and did what.</p>
<h2>Les Rencontres Hivernales du Libre, deuxième édition</h2>
<p>Dans le cadre de l'association <a href="http://www.swisslinux.org/">Swisslinux.org</a> dont je suis membre, j'ai à nouveau eu le plaisir de participer aux <a href="https://rencontres.hivernal.es/">Rencontres Hivernales du Libre</a>, du 8 au 10 janvier passés. Ces rencontres, organisées pour la deuxième fois en 2016, ont pour but de rassembler les acteurs romands du Libre, dans sa définition la plus large.</p>
<h3>30 geeks à St-Cergue</h3>
<p>Dès la première édition, l'idée a été de profiter d'une période et d'un cadre moins usuel, en allant chercher la neige là où elle est. Viser une expérience de “conférence” plus large; entre informatique et loisirs extérieurs. Lors de l'édition 2015, le beau temps avait permis à plusieurs participants de profiter de chacun de ces deux aspects, entre ski et surf.</p>
<p>Le lieu choisi cette année a de nouveau été le Centre du Vallon, à St-Cergue, pour son bon compromis entre proximité aux transports publics, enneigement et coûts.</p>
<p>Malheureusement, les conditions météorologiques de l'édition 2016 ont été moins profitables, avec un faible manteau neigeux, arrosé de pluie durant tout le week-end. Bonne surprise cependant, avec l'incinération des sapins de Noël de la commune, organisée devant le local par les pompiers, qui a amené une grande bouffée de chaleur à ce week-end maussade.</p>
<h3>Il s'y est passé quoi ?</h3>
<p>Répondant à l'appel de <a href="http://www.swisslinux.org/">Swisslinux.org</a>, plusieurs associations et organismes étaient présents, favorisant ainsi les échanges inter-disciplinaires et les discussions animées. Petit tour de présentations.</p>
<figure><img src="https://liip.rokka.io/www_inarticle/b7a6eb672e54f85d87dea448214f28e662cb7f32/p1070784-300x225.jpg" alt="Map of DPMB contributions"></figure>
<p>Les bricoleurs du <a href="http://www.posttenebraslab.ch/">Post Tenebras Lab</a>(le hackerspace genevois) ont profité d'une salle d'atelier pour travailler sur un système de paiement sans fil entièrement libre (matériel et logicel). <a href="https://www.aticom.ch/">ATICOM</a>, association orientée vers l'enseignement et la pédagogie, a présenté ses activités lors d'une conférence. <a href="https://doxel.org/">Doxel.org</a> a présenté ses dernières avancées en photo-grammétrie avec des senseurs optiques non-calibrés: impressionnante combinaison de technologies pour la reconstitution de scènes tri-dimensionnelles à l'aide de photos prises par des téléphones portables. L' <a href="http://www.iapc.ch/">IAPC</a> a amené et mis en place tout le matériel nécessaire pour l'implantation d'une station radio-amateur: entre l'antenne d'un mètre cinquante et les équipements électroniques, l'ensemble en a impressioné plus d'un. Axel &amp; Frank, venus de loin, ont présenté leur <a href="http://dpmb.org">projet collaboratif de livre</a> sur les techniques d'empaquetage pour  <a href="https://www.debian.org/">Debian</a> (en allemand). La présentation a abordé les défis éditoriaux (trouver, puis convaincre un éditeur de la viabilité et de l'intérêt d'un livre libre) et les défis techniques (collaboration à deux personnes géographiquement distantes sur un même ouvrage, ouverture de la rédaction aux contributeurs externes, assurer la construction et la distribution du livre dans différents formats, etc.).</p>
<h3>Défis et Organisation</h3>
<figure><a href="https://www.liip.ch/content/4-blog/20160119-rencontres-hivernales-du-libre/CYTIdu2WQAAYQ4Q.jpg"><img src="https://liip.rokka.io/www_inarticle/ea1474da9e6a36be760f599efcd0757def3bfb0c/cytidu2wqaayq4q-225x300.jpg" alt="Fondue aux RHL16"></a></figure>
<p>20 personnes étaient déjà présentes vendredi soir, pour un souper en commun “ <em>à la bonne franquette</em>“. Le lendemain soir, 8 caquelons de fondue ont été servis aux 35 participants. Ensuite, si d'aucuns restaient sur leurs laptops, d'autres ont laissé leurs claviers de côté pour des discussions ou des jeux de société. Autant dire que la soirée ne s'est pas terminée tôt!</p>
<p>L'organisation d'une telle conférence, bien que modeste en nombre de participants, est tout de même une suite de défis à relever. Au niveau des repas, la décision a été prise de prendre une équipe professionnelle pour la cuisine: ce fut une bénédiction culinaire! Si mettre en place et maintenir une infrastructure sans fil pour 30 participants n'est pas si compliqué en théorie, en pratique, ce n'est pas le WiFi qui a failli, mais l' <em>uplink</em> Swisscom. La conférence s'est donc terminée en accédant à l'Internet par la 4G.</p>
<p><a href="http://www.swisslinux.org/">Swisslinux.org</a> remercie les différents parrains qui ont permis la tenue de cet événement: le <a href="http://www.linux-gull.ch/">GULL</a> et  <a href="https://www.aticom.ch/">ATICOM</a> pour les soutiens financiers et <a href="https://www.liip.ch/">Liip</a> pour avoir assuré la logistique et le financement du café pour tout le monde.</p>
<p>À l'année prochaine, pour une nouvelle édition, qu'on espère enneigée!</p>]]></description>
          </item>
        <item>
      <title>Drupal Hackday &#8211; Writing DRUSH extentions</title>
      <link>https://www.liip.ch/fr/blog/drupal-hackday-writing-drush-extentions</link>
      <guid>https://www.liip.ch/fr/blog/drupal-hackday-writing-drush-extentions</guid>
      <pubDate>Sun, 02 Jun 2013 00:00:00 +0200</pubDate>
      <description><![CDATA[<p>Today Patrick Jezek and I sat together to get a grip on one of the major problems we have when using Drupal in a continuous integration environment – module updates involving major updates on configuration settings and database content.</p>
<h2>Problem description</h2>
<p>Imagine a usual Drupal installation already deployed on a live server. Imagine further that there is a demand to update at least one module of this installation without human interaction, any downtime, and data loss. The default work flow when updating configuration information would either demand human interaction and/or the complete deinstallation and reinstallation of the module which, when the <code>hook_uninstall()</code> correctly implemented, will cause data loss. A third option is to write a script to setup the new module after the installation process is done but this would challenge the deployment system to support some kind of a post_deployment process.</p>
<h2>What was the goal?</h2>
<p>The goal of this hackday was to propose a solution which enables a development team to continuously deploy and maintain a Drupal installation without being forced to uninstall modules to do a major update. Further more there should be some kind of a mechanism making it possible to update modules without human interaction when deploying the modifications.</p>
<h2>Solution proposal</h2>
<p>One of the most beneficial Drupal extensions is the <a href="http://drush.org/" title="Drupal shell">Drupal shell</a> (short: drush). It provides an extensive variety of commands to maintain Drupal (e.g. managing modules, users, and basic drupal configuration). The nice thing about drush it can be handled by any shell script just calling the specific commands and processing their outcome. <a href="http://drush.ws/docs/commands.html                                                             &quot;Extending&quot;">Extending</a> drush was therefore the most natural thing we could think about when we were confronted by this task.</p>
<p>So we came up with a <a href="https://github.com/liip/LiipDrushVersionManagerCommand" title="drush extension">drush extension</a> providing a new <a href="https://api.drupal.org/api/drupal/includes!module.inc/group/hooks/7             " title="Drupal hook">Drupal hook</a><code>hook_vm_update()</code>.</p>
<h3>Custom hook_vm_update</h3>
<p>Located in the *.install files the <code>hook_vm_update()</code> will be invoked by the drush extension. Further does the extension detect the existence of the custom hook and indicates this on the command line.</p>
<pre><code>$drush vm-update  "myCustomModule, myOtherModule"

Updating myCustomModule ... no »vm_update« hook available        [warning]
Nothing to update for module »myOtherModule«                     [warning]</code></pre>
<h3>Custom scripts</h3>
<p>In order to keep track of previous installed module versions we wrote two scripts. One does write down the currently installed version into a text file. The other one invokes drush to for modules which got changed since last deployment.</p>
<h2>Further ideas</h2>
<h3>Add version information to hook_vm_update</h3>
<p>Currently the update hook will always be called when the drush command is invoked and the previous installed version is smaller then the just installed one. Having only one hook implies that this hook knows which steps needed to upgrade from one version to another (including steps in between). What about a naming convention for hooks combined with version number and a logic to call them in chronological order, up to the target version (like Drupal core updates use schema update hooks).</p>
<p>Since the hook should not invoke actions potentially dangerous or harmful in terms of data loss et. al. this should not be much of a problem. But since we can already imagine situations where it is useful to either step through past updates or make the hook decide whether it an update is to be invoked or not one of the next steps for this drush extension will be to provide version information for an update.</p>
<h3>Persist version information into the database</h3>
<p>The <em>versions.json</em> file resists on the file system and could be potentially overwritten by a new installed package. An alternative could store the version information into the database (e.g. by using the Drupal configuration with <code>variable_set()</code> ?).</p>
<h2>Final thoughts</h2>
<p>We had some fun working on a solution for this given problem. We had the chance to look deeper into <em>drush</em>. We learned yet some php functionality we never used before. Unfortunately the weather was not nice and we could not fire up the grate for lunch.</p>
<p>Last but not least thanks L//p for this opportunity!</p>]]></description>
          </item>
    
  </channel>
</rss>
