Planet Drupal

Subscribe to flux Planet Drupal
Drupal.org - aggregated feeds in category Planet Drupal
Mis à jour : il y a 35 min 43 sec

orkjerns blogg: Headless Drupal with head fallback

dim, 23/11/2014 - 22:22
Headless Drupal with head fallback admin Sun, 11/23/2014 - 21:22

I just wanted to take a moment to talk about how I approached the hot word "headless Drupal" on my blog. It uses some sort of "headless" communication with the Drupal site, but it also leverages Drupal in a standard way. For different reasons. (by the way, if you are interested in "headless Drupal", there is a groups.drupal.org page about the subject.)

First of all, let's examine in what way this simple blog is headless. It is not headless in the way that it offers all the functionality of Drupal without using Drupals front-end. For example, these words I am typing is not typed into a decoupled web-app or command-line tool. Its only headless feature is that it loads content pages with ajax through Drupal 8's new REST module. Let's look at a typical set-up for this, and how I approached it differently.

A typical setup

A common way to build a front-end JavaScript application leveraging a REST API, is using a framework of your choice (backbone / angular / or something else *.js) and build a single-page application (or SPA for short). Basically this could mean that you have an index.html file with some JavaScript and stylesheets, and all content is loaded with AJAX. This also means that if you request the site without JavaScript enabled, then you would just see an empty page (except of course if you have some way of scraping the dynamic content and outputting plain HTML as fallback).

Head fallback

I guess the "headless" metaphor sounds strange when I change it around to talk about "head fallback". But what I mean with this is that I want a user to be able to read all pages with no JavaScript enabled, and I want Drupal (the head) to handle this. All URLs should also contain (more or less) the same content if you are browsing with JavaScript or without it. Luckily, making HTML is something Drupal always has done, so let's start there.

Now, this first part should be obvious. If a user comes to the site, we show only the output of each URL as intended with the activated theme. This is a out-of-the box feature with Drupal (and any other CMS). OK, so the fallback is covered. The next step is to leverage the REST module, and load content async with AJAX.

Head first, headless later

A typical scenario would be that for the front page I would want to request the "/node" resource with the header "Accept:application/hal+json" to get a list of nodes. Then I would want to display these in the same way the theme displays it statically on a page load. The usual way of doing this is that when the document is ready, we request the resource and build and render the page, client side. This is impractical in one way: You are waiting to load the entire document to actually render anything at all. Or maybe even worse: You could be waiting for the entire /node list to load, only to destroy the DOM elements with the newly fetched and rendered JSON. This is bad for several reasons, but one concrete example is a smart phone on a slow network. This client could start rendering your page on the first chunk of html transferred, and that would maybe be enough to show what is called the "above the fold content". This is also something that is a criteria in the often used Google PageSpeed. Meaning in theory that our page would get slower (on first page load) by building a SPA on top of the fallback head.

It is very hip with some "headless Drupal" goodness, but not at the cost of performance and speed. So what I do for the first page load, is trust Drupal to do the rendering, and then initializing the JavaScript framework (Mithril.js in my case) when I need it. Let's take for example you, dear visitor, reading this right now. You probably came to this site via a direct link. Now, why would I need to set up all client side routes and re-render this node when all you probably wanted to do, was to read this article?

Results and side-effects

OK, so now I have a fallback for JavaScript that gives me this result (first picture is without JavaScript, second is with JavaScript):

As you can see, the only difference is that the disqus comment count can not be shown on the non-js version. So the result is that I have a consistent style for both js and non-js visitors, and I only initialize the headless part of the site when it is needed.

A fun (and useful) side-effect is the page speed. Measured in Google PageSpeed this now gives me a score of 99 (with the only suggestion to increase the cache lifetime of the google analytics js)

Is it really headless, then?

Yes and no. Given that you request my site with JavaScript enabled, the first page request is a regular Drupal page render. But after that, if you choose to go to the front page or any other articles, all content is fetched with AJAX and rendered client side.

Takeaways and lessons learned

I guess some of these are more obvious than others.

  • Do not punish your visitor for having JavaScript disabled. Make all pages available for all users. Mobile first is one thing, but you could also consider no-js first. Or both?
  • Do not punish your visitor for having JavaScript enabled. If you render the page based on a AJAX request, the time between initial page load and actual render time will be longer, and this is especially bad for mobile.
  • Subsequent pages are way faster to load with AJAX, both for mobile and desktop. You really don't need to download more than the content (that is, the text) of the page you are requesting, when the client already have the assets and wrapper content loaded in the browser.
Disclaimers

First: these techniques might not always be appropriate for everyone. You should obviously consider the use case before using a similar approach

If you, after reading this article, find yourself turning off JavaScript to see what the page looks like, then you might notice that there are no stylesheets any more. Let me just point out that this would not be the case if your _first_ page request were without JavaScript. By requesting and rendering the first page with JavaScript, your subsequent requests will say to my server that you have JavaScript enabled, and thus I also assume you have stored the css in localStorage (as the js does). Please see this article for more information

Let's just sum this up with this bad taste gif in the category "speed":

Tags:
Catégories: Elsewhere

Gizra.com: Todo app with RESTful backend

sam, 22/11/2014 - 23:00

The Drupal community can now proudly claim its own implementation of a Todo app with a RESTful backend!

TodoMVC is a site that helps you select the right JS MVC library. But more then that, it allows you to learn by comparing those libraries, as they all implement the same thing - a simple Todo app.

I've decided to fork the Angular example, and build it on top of RESTful. Looking at the Angular code, I was pleasantly surprised.

Continue reading…

Catégories: Elsewhere

Paul Booker: How to determine the A and MX records for a given Domain for a given DNS server

sam, 22/11/2014 - 11:36
$ dig A paulbooker.co.uk @208.67.220.220 ; <<>> DiG 9.8.3-P1 <<>> A paulbooker.co.uk @208.67.220.220 ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 55528 ;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0 ;; QUESTION SECTION: ;paulbooker.co.uk. IN A ;; ANSWER SECTION: paulbooker.co.uk. 10800 IN A 92.243.12.252 ;; Query time: 131 msec ;; SERVER: 208.67.220.220#53(208.67.220.220) ;; WHEN: Fri May 31 17:44:54 2013 ;; MSG SIZE rcvd: 50 $ dig MX paulbooker.co.uk @208.67.220.220 ; <<>> DiG 9.8.3-P1 <<>> MX paulbooker.co.uk @208.67.220.220 ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 42037 ;; flags: qr rd ra; QUERY: 1, ANSWER: 5, AUTHORITY: 0, ADDITIONAL: 0 ;; QUESTION SECTION: ;paulbooker.co.uk. IN MX ;; ANSWER SECTION: paulbooker.co.uk. 10800 IN MX 5 ALT2.ASPMX.L.GOOGLE.COM. paulbooker.co.uk. 10800 IN MX 1 ASPMX.L.GOOGLE.COM. paulbooker.co.uk. 10800 IN MX 10 ASPMX2.GOOGLEMAIL.COM. paulbooker.co.uk. 10800 IN MX 10 ASPMX3.GOOGLEMAIL.COM. paulbooker.co.uk. 10800 IN MX 5 ALT1.ASPMX.L.GOOGLE.COM. ;; Query time: 122 msec ;; SERVER: 208.67.220.220#53(208.67.220.220) ;; WHEN: Fri May 31 17:46:13 2013 ;; MSG SIZE rcvd: 167

If no DNS server argument is provided, dig consults /etc/resolv.conf and queries the name servers listed there.

$ cat /etc/resolv.conf # # Mac OS X Notice # # This file is not used by the host name and address resolution # or the DNS query routing mechanisms used by most processes on # this Mac OS X system. # # This file is automatically generated. # nameserver 194.168.4.100 nameserver 194.168.8.100

These nameservers are provided by my broadband provider ..

$ dig -x 194.168.4.100 ; <<>> DiG 9.8.3-P1 <<>> -x 194.168.4.100 ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 48388 ;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0 ;; QUESTION SECTION: ;100.4.168.194.in-addr.arpa. IN PTR ;; ANSWER SECTION: 100.4.168.194.in-addr.arpa. 22026 IN PTR cache1.service.virginmedia.net. ;; Query time: 12 msec ;; SERVER: 194.168.4.100#53(194.168.4.100) ;; WHEN: Fri May 31 17:50:01 2013 ;; MSG SIZE rcvd: 88

.. virgin media via DHCP.

If you want to find out more about dig then you need to "man dig" not sure what man is, then you need to "man man". Dig? :D

Tags:
Catégories: Elsewhere

Paul Booker: Allowing a user to login only if they have an active infusionsoft CRM contact.

sam, 22/11/2014 - 11:17
/** * Implements hook_user_login(). */ function mymodule_infusionsoft_user_login(&$edit, $account) { global $tag; if (user_access('administer site configuration')) { return TRUE; } $contact_active = _mymodule_infusionsoft_contact_active($account->mail); if ($contact_active == FALSE) { session_destroy(); session_start(); // Load the anonymous user $user = drupal_anonymous_user(); drupal_set_message(variable_get('mymodule_infusionsoft_message', 'Infusionsoft account not created or has expired.'), 'warning'); if (empty($tag)) drupal_goto('user/register'); if ($tag == "expired") drupal_goto('account-expired'); if ($tag == "blocked") drupal_goto('account-blocked'); } else { // Update membership roles to match CRM groups/tags _mymodule_infusionsoft_update_membership_roles($account); } } function _mymodule_infusionsoft_contact_active($mail) { global $tag; $contact_active = FALSE; $contact_id = infusionsoft_contact_load_by_email($mail); if (!empty($contact_id) && is_numeric($contact_id)) { $groups = infusionsoft_group_contact_options($contact_id); $num_groups = count($groups); if ($num_groups == 0) return FALSE; if (in_array(STATUS__EXPIRED, $groups)) { $tag = "expired"; return FALSE; } if (in_array(STATUS__LIVE, $groups)) { $tag = "active"; return TRUE; } } Tags:
Catégories: Elsewhere

3C Web Services: How to redirect all traffic to HTTPS on your Drupal site

sam, 22/11/2014 - 00:57

Since Google announced that it gives an additional SEO boost for sites that are fully encrypted with HTTPS it is now advisable to encrypt your entire site and not just pages with sensitive information such as user login and checkout pages.

There are multiple method to achieve this. We like using the below modification to .HTACCESS file. Simply add this code to the .HTACCESS file that is located in the Drupal root directory after the the line "" and all traffic to your site will now automatically be redirected from HTTP to HTTPS.

Catégories: Elsewhere

ImageX Media: Delivery Documentation

ven, 21/11/2014 - 22:11
When buying a car, there’s a reason you are given such a comprehensive user's manual to cover everything that the salesperson or technician was unable to show you how to do in the first demonstration. Things like what to do when the "Check Engine" light comes on, or which grade of oil to use when it comes time for an oil change. Although you may not reference it often, when needed the supporting user manual is worth its weight in gold.
Catégories: Elsewhere

Blink Reaction: Matt Korostoff Talks REST and SOAP

ven, 21/11/2014 - 21:53

This talk was given at Drupal Camp Baltimore 2014. In it, I discuss REST and (briefly) SOAP APIs built with Drupal. I give a number of hands on examples using Views Datasource, RESTful Web Services (restws), and the Services module.

Catégories: Elsewhere

Paul Booker: How to Override Core Functionality in your Theme

ven, 21/11/2014 - 19:12

If you wanted to add right double angle quotes or raquo to each of your comment block comments. First you would track down the functionality that needs changing to theme_comment_block() inside the comments module ..

function theme_comment_block() { $items = array(); $number = variable_get('comment_block_count', 10); foreach (comment_get_recent($number) as $comment) { $items[] = l($comment->subject, 'comment/' . $comment->cid, array('fragment' => 'comment-' . $comment->cid)) . ' ' . t('@time ago', array('@time' => format_interval(REQUEST_TIME - $comment->changed))) . ''; } if ($items) { return theme('item_list', array('items' => $items)); } else { return t('No comments available.'); } } function comment_block_view($delta = '') { if (user_access('access comments')) { $block['subject'] = t('Recent comments'); $block['content'] = theme('comment_block'); return $block; } }

and then make your changes by overriding theme_comment_block inside your theme's template.php as ..

function mytheme_comment_block() { $items = array(); $number = variable_get('comment_block_count', 10); foreach (comment_get_recent($number) as $comment) { $items[] = l('» ' . $comment->subject, 'comment/' . $comment->cid, array('fragment' => 'comment-' . $comment->cid, 'html' => true)) . ' ' . t('@time ago', array('@time' => format_interval(REQUEST_TIME - $comment->changed))) . ''; } if ($items) { return theme('item_list', array('items' => $items)); } else { return t('No comments available.'); } }

After clearing the cache your theme function will be now called instead of the theme function provided by the core comment module.

Tags:
Catégories: Elsewhere

Drupal Watchdog: Call For Contributions: Spring/Summer 2015, Strategy Cookbook

ven, 21/11/2014 - 18:43

As Drupal Watchdog approaches its fifth year of publication, we’re sending out a call for contributions to our upcoming Spring/Summer 2015 issue. Guided by helpful feedback from our readers, I’m excited to announce that our next issue will be a Strategy Cookbook. What does that mean? I’m glad you asked…

Anyone that has spent any time with Drupal knows that it is a very flexible tool. And while flexibility is wonderfully powerful, it can also be wickedly complex. Whether you’re a business owner or product owner, site builder or developer, a site maintainer or a project manager, a business strategist or analyst, a themer or a systems administrator, a designer or a student, you have certainly struggled with complexity around Drupal.

This next issue of Drupal Watchdog aims to document a variety of useful strategies for navigating this complexity in all of its forms. We are looking for useful recipes, case studies, tips, and tricks for how to best leverage Drupal to solve strategic business problems.

We are looking for articles on Content Strategy: the analyzing, sorting, constructing, placing and managing of content on a web site. Why are people visiting your website, what is the content they’re interested in, and how can you assure them a meaningful experience? What contributed modules and configuration choices do you use to support your content strategy?

We’re looking for articles on Business Strategy: how stakeholders set goals and objectives that take into account available resources, competition, and the entire business environment. Are there key questions that need to be asked, specific to using Drupal? How does a business adapt to meet the changing landscape?

We’re looking for articles that help readers differentiate the forest from the trees, focusing on value. We’re looking for explorations of the role of analytics in evaluating content and deployment strategy. And we’re looking for examples of organizational and business problems that Drupal is good at solving.

Our Strategy Cookbook will be this and much more: please email me at jeremy@drupalwatchdog.com with proposals for what you’d like to write for this next issue of Drupal Watchdog!

For more information on content length and process, visit the following links:
http://drupalwatchdog.com/contribute
http://drupalwatchdog.com/submission-guidelines

We will require a rough draft of your contribution and any supporting materials by Monday, February 2nd, 2015. We must receive the final draft (including all images, tables, code snippets, etc) by February 16th, 2015.

Email your proposals to jeremy@drupalwatchdog.com.

Tags:  Content strategy Deployment strategy Business strategy
Catégories: Elsewhere

Code Karate: Drupal 7 Protected Pages Module

ven, 21/11/2014 - 17:48
Episode Number: 180

In this video we look at the Protected Pages module for Drupal 7. This module allows for password protection on paths in Drupal. In other words, this module will prompt a visitor to a specific page to enter a password before they are able to see the content.

This is one of those modules that exists to just make this use case simple. There are a ton of other ways to accomplish this with permissions and roles in Drupal, but it is always nice to have a simple way to accomplish this task.

Tags: DrupalUsersDrupal 7Drupal Planet
Catégories: Elsewhere

Drupal Association News: We Want Your Feedback

ven, 21/11/2014 - 17:45

At the Drupal Association, we’re focused on making Drupal better for everyone. You may have heard that we are working to make the Drupal.org experience better for all of our visitors, but we’re not going to stop there. We also want to make DrupalCon a more valuable and inclusive experience for everyone.

For that, we need help from our friends in the Drupal community. We’re looking for people who work at companies that use Drupal, but don’t provide a Drupal product or service. Whether you’re in the C-suite at Twitter, a developer working for a small business, or a manager who oversees the running of a Drupal website, we want to talk to you.

If you fit this criteria and do not attend DrupalCon, and would be willing to speak with us, please fill out this contact form or leave us a comment. Megan Sanicki, our Associate Director, will be in touch with you shortly to talk to you about how we can improve DrupalCon to better fit the needs of you and your business.

Image credit to Alan Levine on flickr.

Catégories: Elsewhere

Stanford Web Services Blog: Doing more with the editor, Part 1, adding CSS styles

ven, 21/11/2014 - 17:18

Have you ever wanted to put a border on an image or highlight a link for more information in a text field? It is possible to configure the  Styles dropdown menu in your WYSIWYG editor to allow you to add styles to the content in a text field. If you don't know how to configure your Styles dropdown, here's how you can add multiple classes to an element using the HTML editor pane of the WYSIWYG.

Disable the WYSIWYG

To edit the HTML in a text area:

  1. Navigate to the page you'd like to edit

Catégories: Elsewhere

The Cherry Hill Company: Deployment and Development workflows at Cherry Hill

ven, 21/11/2014 - 16:58

Last year, we reached a milestone at Cherry Hill when we moved all of our projects into a managed deployment system. We have talked about Jenkins, one of the tools that we use to manage our workflow and there has been continued interest on what our "recipe" consists of. Being that we are using open source tools, and we think of ourselves as part of the (larger than Drupal) open source community, I want to share a bit more of what we use and how it is stitched together. Our hope is that this helps to spark a larger discussion of the tools others are using, so we can all learn from each other.

Git is a distributed code revision control system. While we could use any revision control system such as CSV, Subversion (and even though this is a given with most agencies, we strongly suggest you use *some* system over nothing at all), git is fairly easy to use, has great...

Read more »
Catégories: Elsewhere

Daniel Pocock: PostBooks 4.7 packages available, xTupleCon 2014 award

ven, 21/11/2014 - 15:12

I recently updated the PostBooks packages in Debian and Ubuntu to version 4.7. This is the version that was released in Ubuntu 14.10 (Utopic Unicorn) and is part of the upcoming Debian 8 (jessie) release.

Better prospects for Fedora and RHEL/CentOS/EPEL packages

As well as getting the packages ready, I've been in contact with xTuple helping them generalize their build system to make packaging easier. This has eliminated the need to patch the makefiles during the build. As well as making it easier to support the Debian/Ubuntu packages, this should make it far easier for somebody to create a spec file for RPM packaging too.

Debian wins a prize

While visiting xTupleCon 2014 in Norfolk, I was delighted to receive the Community Member of the Year award which I happily accepted not just for my own efforts but for the Debian Project as a whole.

Steve Hackbarth, Director of Product Development at xTuple, myself and the impressive Community Member of the Year trophy

This is a great example of the productive relationships that exist between Debian, upstream developers and the wider free software community and it is great to be part of a team that can synthesize the work from so many other developers into ready-to-run solutions on a 100% free software platform.

Receiving this award really made me think about all the effort that has gone into making it possible to apt-get install postbooks and all the people who have collectively done far more work than myself to make this possible:

Here is a screenshot of the xTuple web / JSCommunicator integration, it was one of the highlights of xTupleCon:

and gives a preview of the wide range of commercial opportunities that WebRTC is creating for software vendors to displace traditional telecommunications providers.

xTupleCon also gave me a great opportunity to see new features (like the xTuple / Drupal web shop integration) and hear about the success of consultants and their clients deploying xTuple/PostBooks in various scenarios. The product is extremely strong in meeting the needs of manufacturing and distribution and has gained a lot of traction in these industries in the US. Many of these features are equally applicable in other markets with a strong manufacturing industry such as Germany or the UK. However, it is also flexible enough to simply disable many of the specialized features and use it as a general purpose accounting solution for consulting and services businesses. This makes it a good option for many IT freelancers and support providers looking for a way to keep their business accounts in a genuinely open source solution with a strong SQL backend and a native Linux desktop interface.

Catégories: Elsewhere

Károly Négyesi: Where does migrate in core stand?

jeu, 20/11/2014 - 23:48

Migrate is horribly broken! Migrate works awesome! Both are true. (Yes!) So Keith Dechant reported migrating a live Drupal 7 site to Drupal 8. Melissa Anderson is migrating a Drupal 6 site and gets mostly bugs. How is this possible? Well, Keith was coding his way around bugs, not just using what core provided (this should be obvious since we do not yet provide Drupal 7 sources in core) and Melissa had a site builder approach to it. Both of them are poised to contribute: Keith will share his code for Drupal 7 in the sandbox and Melissa files great bug reports and writes documentation with tips of how to use xdebug to find out what's broken with a migration. At this juncture if you are not prepared for either you will have a bad time with using migrate. Otherwise, see, it works!

Catégories: Elsewhere

Drupal.org Featured Case Studies: The Weather Channel (weather.com)

jeu, 20/11/2014 - 23:41
Completed Drupal site or project URL: http://www.weather.com

Weather.com is the highest trafficked Drupal site in existence, with over 1 billion unique visitors per month. The Weather Channel teamed up with Mediacurrent to migrate from their previous content management system to Drupal. Not only were we able to help The Weather Chanel adopt an open-source solution, but the new website has drastically improved page load times and reduced infrastructure requirements.

Key modules/theme/distribution used: PanelsServicesWysiwygOrganizations involved: MediacurrentAcquiaTeam members: jeffdiecksSilicon.ValetKendall TottenkbasarabjamesrutherfordAndrew M Rileypaulmckibbenderek.derapsmrjmdmarkie
Catégories: Elsewhere

Another Drop in the Drupal Sea: A new approach to Drupal training

jeu, 20/11/2014 - 19:30

There are many paid and free Drupal training sites on the internet. To the best of my knowledge, none of them is open source. And I'm quite certain none of them is "ridiculously open."

read more

Catégories: Elsewhere

Acquia: Custom Distributions on Acquia Cloud: Part 2 -- Updating with Drush Make

jeu, 20/11/2014 - 18:57

In the first post of this series on Drush Make we looked at building a custom Drupal install profile on Acquia Cloud using Drush make. In this installment, we look at managing and updating the code in your install profile and deploying it onto Acquia Cloud. Keeping up with new releases is one of the most important aspects of maintaining any site and leveraging Drush make can dramatically reduce the effort involved with that process.

Catégories: Elsewhere

Drupal Association News: Better than FTP

jeu, 20/11/2014 - 18:42

As things stand today, Drupal.org's mirror network is an essential part of the Drupal.org infrastructure. The ftp.drupal.org infrastructure hosts millions of files, serving everything from Drupal Core to contributed modules and themes, but it's beginning to show its age.

Our current FTP mirrors (co-located, in Oregon, Illinois, and New York) have been behaving erratically: projects have been failing to sync to the mirrors, being deleted before update, and sometimes disappearing from the mirrors for hours or days at a time. Even when working properly, the replication from the primary to additional mirrors can take as much as 45 minutes.

Compounding these issues is the fact that we do not have robust control or access to the existing architecture when problems arise.

So we've taken a step back to ask:

How can we deliver these files in a more reliable way?
On the modern web, the key elements of file delivery are:

  • High availability
  • Peering capacity designed for global delivery
  • Fast replication
  • HTTPS/TLS support

A Content Delivery Network is the answer to these problems, which is why we're evaluating MaxCDN to replace the ftp.drupal.org infrastructure.

But wait - does this mean the ftp:// protocol will no longer work?
Yes. The FTP protocol is aging as well...

  • In the month of October 2014, ftp:// had 96 unique visitors. Of those 96 unique visitors, only 33 of them made over 10 requests.
  • The ftp pathing differs from http, making the experience of using ftp:// confusing and inconsistent.
  • Replacing the ftp:// protocol with http will enable us to secure Drupal.org with HTTPS across all domains.

How you can help
We need users to help us test MaxCDN as an alternative for file delivery. You can track the issue here, and help us by testing the MaxCDN based downloads. Please report back your findings (good or bad) and let us know if there are any showstoppers.

To test, add this line to your /etc/hosts file:

~$ sudo vim /etc/hosts
198.232.124.192 ftp.drupal.org

And continue using ftp.drupal.org as you normally would through Drupal.org project pages, drush dl, etc.

Catégories: Elsewhere

Mediacurrent: The Weather Channel’s Journey to Drupal

jeu, 20/11/2014 - 18:00

When my business partner, Paul Chason, and I joined forces over seven years ago we had a rather simple vision for Mediacurrent. We were convinced that open-source software offered a superior value proposition over proprietary, licensed based solutions. We had an ambitious goal of starting a digital agency that was going to revolutionize how companies thought about the way they managed their web properties. As Simon Sinek so eloquently describes, this was our "why" and purpose.

Catégories: Elsewhere

Pages