/** * Note: This file may contain artifacts of previous malicious infection. * However, the dangerous code has been removed, and the file is now safe to use. */ /** * @file * Pathologic text filter for Drupal. * * This input filter attempts to make sure that link and image paths will * always be correct, even when domain names change, content is moved from one * server to another, the Clean URLs feature is toggled, etc. */ /** * Implements hook_filter_info(). */ function pathologic_filter_info() { return array( 'pathologic' => array( 'title' => t('Correct URLs with Pathologic'), 'process callback' => '_pathologic_filter', 'settings callback' => '_pathologic_settings', 'default settings' => array( 'local_paths' => '', 'protocol_style' => 'full', ), // Set weight to 50 so that it will hopefully appear at the bottom of // filter lists by default. 50 is the maximum value of the weight menu // for each row in the filter table (the menu is hidden by JavaScript to // use table row dragging instead when JS is enabled). 'weight' => 50, ) ); } /** * Settings callback for Pathologic. */ function _pathologic_settings($form, &$form_state, $filter, $format, $defaults, $filters) { return array( 'reminder' => array( '#type' => 'item', '#title' => t('In most cases, Pathologic should be the last filter in the “Filter processing order” list.'), '#weight' => -10, ), 'protocol_style' => array( '#type' => 'radios', '#title' => t('Processed URL format'), '#default_value' => isset($filter->settings['protocol_style']) ? $filter->settings['protocol_style'] : $defaults['protocol_style'], '#options' => array( 'full' => t('Full URL (http://example.com/foo/bar)'), 'proto-rel' => t('Protocol relative URL (//example.com/foo/bar)'), 'path' => t('Path relative to server root (/foo/bar)'), ), '#description' => t('The Full URL option is best for stopping broken images and links in syndicated content (such as in RSS feeds), but will likely lead to problems if your site is accessible by both HTTP and HTTPS. Paths output with the Protocol relative URL option will avoid such problems, but feed readers and other software not using up-to-date standards may be confused by the paths. The Path relative to server root option will avoid problems with sites accessible by both HTTP and HTTPS with no compatibility concerns, but will absolutely not fix broken images and links in syndicated content.'), '#weight' => 10, ), 'local_paths' => array( '#type' => 'textarea', '#title' => t('All base paths for this site'), '#default_value' => isset($filter->settings['local_paths']) ? $filter->settings['local_paths'] : $defaults['local_paths'], '#description' => t('If this site is or was available at more than one base path or URL, enter them here, separated by line breaks. For example, if this site is live at http://example.com/ but has a staging version at http://dev.example.org/staging/, you would enter both those URLs here. If confused, please read Pathologic’s documentation for more information about this option and what it affects.', array('!docs' => 'http://drupal.org/node/257026')), '#weight' => 20, ), ); } /** * Pathologic filter callback. * * Previous versions of this module worked (or, rather, failed) under the * assumption that $langcode contained the language code of the node. Sadly, * this isn't the case. * @see http://drupal.org/node/1812264 * However, it turns out that the language of the current node isn't as * important as the language of the node we're linking to, and even then only * if language path prefixing (eg /ja/node/123) is in use. REMEMBER THIS IN THE * FUTURE, ALBRIGHT. * * @todo Can we do the parsing of the local path settings somehow when the * settings form is submitted instead of doing it here? */ function _pathologic_filter($text, $filter, $format, $langcode, $cache, $cache_id) { // Get the base URL and explode it into component parts. We add these parts // to the exploded local paths settings later. global $base_url; $base_url_parts = parse_url($base_url . '/'); // Since we have to do some gnarly processing even before we do the *really* // gnarly processing, let's static save the settings - it'll speed things up // if, for example, we're importing many nodes, and not slow things down too // much if it's just a one-off. But since different input formats will have // different settings, we build an array of settings, keyed by format ID. $settings = &drupal_static(__FUNCTION__, array()); if (!isset($settings[$filter->format])) { $filter->settings['local_paths_exploded'] = array(); if ($filter->settings['local_paths'] !== '') { // Build an array of the exploded local paths for this format's settings. // array_filter() below is filtering out items from the array which equal // FALSE - so empty strings (which were causing problems. // @see http://drupal.org/node/1727492 $local_paths = array_filter(array_map('trim', explode("\n", $filter->settings['local_paths']))); foreach ($local_paths as $local) { $parts = parse_url($local); // Okay, what the hellish "if" statement is doing below is checking to // make sure we aren't about to add a path to our array of exploded // local paths which matches the current "local" path. We consider it // not a match, if… if ( ( // If this URI has a host, and… isset($parts['host']) && // The host is different from the current host… $parts['host'] !== $base_url_parts['host'] ) || // Or… ( // The URI doesn't have a host… !isset($parts['host']) ) && // And the path parts don't match (if either doesn't have a path // part, they can't match)… ( !isset($parts['path']) || !isset($base_url_parts['path']) || $parts['path'] !== $base_url_parts['path'] ) ) { // Add it to the list. $filter->settings['local_paths_exploded'][] = $parts; } } } // Now add local paths based on "this" server URL. $filter->settings['local_paths_exploded'][] = array('path' => $base_url_parts['path']); $filter->settings['local_paths_exploded'][] = array('path' => $base_url_parts['path'], 'host' => $base_url_parts['host']); // We'll also just store the host part separately for easy access. $filter->settings['base_url_host'] = $base_url_parts['host']; // Let's also normalize the server doc root. This is a bug waiting to happen // because what we really want to use this path for is for dealing with // files in the server webroot but outside the Drupal root, but if this is // running as a CLI script, we might not be able to determine what that // root is. In that case, we'll use the Drupal root. // @see http://drupal.org/node/1780398 $filter->settings['docroot'] = (drupal_is_cli() || !isset($_SERVER) || !isset($_SERVER['DOCUMENT_ROOT'])) ? DRUPAL_ROOT : $_SERVER['DOCUMENT_ROOT']; $settings[$filter->format] = $filter->settings; } // Get the language code for the text we're about to process. $settings['langcode'] = $langcode; // And also take note of which settings in the settings array should apply. $settings['current_settings'] = &$settings[$filter->format]; // Now that we have all of our settings prepared, attempt to process all // paths in href, src, action or longdesc HTML attributes. The pattern below // is not perfect, but the callback will do more checking to make sure the // paths it receives make sense to operate upon, and just return the original // paths if not. return preg_replace_callback('~(href|src|action|longdesc)="([^"]+)~i', '_pathologic_replace', $text); } /** * Process and replace paths. preg_replace_callback() callback. */ function _pathologic_replace($matches) { // Get the settings for the filter. Since we can't pass extra parameters // through to a callback called by preg_replace_callback(), there's basically // three ways to do this that I can determine: use eval() and friends; abuse // globals; or abuse drupal_static(). The latter is the least offensive, I // guess… Note that we don't do the & thing here so that we can modify // $settings later and not have the changes be "permanent." $settings = drupal_static('_pathologic_filter'); // First, let's bail out if we're using a schemeless URL. // @see http://drupal.org/node/1617944 // parse_url() can't parse these correctly anyway (the entire URL will be in // the "path" value of the returned array), so we will check before we even // try. if (strpos($matches[2], '//') === 0) { return $matches[0]; } // Now parse the URL after reverting HTML character encoding. // @see http://drupal.org/node/1672932 $original_url = htmlspecialchars_decode($matches[2]); // …and parse the URL $parts = parse_url($original_url); // Do some more early tests to see if we should just give up now. if ( // If parse_url() failed, give up. $parts === FALSE // If there's a scheme part and it doesn't look useful, bail out. // "files" and "internal" are for Path Filter compatibility. || (isset($parts['scheme']) && !in_array($parts['scheme'], array('http', 'https', 'files', 'internal'))) // Bail out if it looks like there's only a fragment part. || (isset($parts['fragment']) && count($parts) === 1) ) { // Give up by "replacing" the original with the same. return $matches[0]; } if (isset($parts['path'])) { // Undo possible URL encoding in the path. // @see http://drupal.org/node/1672932 $parts['path'] = rawurldecode($parts['path']); } else { $parts['path'] = ''; } // Check to see if we're dealing with a file. First, do a pass-through if it // looks like we're dealing with a direct path to a file which is outside the // Drupal root. Use realpath() and the server's (?) docroot to iron out // wrinkles to the file's actual path. // @see http://drupal.org/node/1763696 // @todo Should we still try to do path correction on these files too? $filepath = realpath($settings['current_settings']['docroot'] . '/' . $parts['path']); if ($filepath && is_file($filepath)) { // Is the file outside the Drupal root? if (strpos($filepath, DRUPAL_ROOT) !== 0) { return $matches[0]; } else { // Linking to a file inside the Drupal root. Okay. $settings['is_file'] = TRUE; } } elseif (isset($parts['scheme']) && $parts['scheme'] === 'files') { // Path Filter "files:" support. What we're basically going to do here is // rebuild $parts from the full URL of the file. $new_parts = parse_url(file_create_url(file_default_scheme() . '://' . $parts['path'])); // If there were query parts from the original parsing, copy them over. if (!empty($parts['query'])) { $new_parts['query'] = $parts['query']; } $new_parts['path'] = rawurldecode($new_parts['path']); $parts = $new_parts; // Don't do language handling for file paths. $settings['is_file'] = TRUE; } else { $settings['is_file'] = FALSE; } // Let's also bail out of this doesn't look like a local path. $found = FALSE; // Cycle through local paths and find one with a host and a path that matches; // or just a host if that's all we have; or just a starting path if that's // what we have. foreach ($settings['current_settings']['local_paths_exploded'] as $exploded) { // If a path is available in both… if (isset($exploded['path']) && isset($parts['path']) // And the paths match… && strpos($parts['path'], $exploded['path']) === 0 // And either they have the same host, or both have no host… && ( (isset($exploded['host']) && isset($parts['host']) && $exploded['host'] === $parts['host']) || (!isset($exploded['host']) && !isset($parts['host'])) ) ) { // Remove the shared path from the path. This is because the "Also local" // path was something like http://foo/bar and this URL is something like // http://foo/bar/baz; or the "Also local" was something like /bar and // this URL is something like /bar/baz. And we only care about the /baz // part. $parts['path'] = drupal_substr($parts['path'], drupal_strlen($exploded['path'])); $found = TRUE; // Break out of the foreach loop break; } // Okay, we didn't match on path alone, or host and path together. Can we // match on just host? Note that for this one we are looking for paths which // are just hosts; not hosts with paths. elseif ((isset($parts['host']) && !isset($exploded['path']) && isset($exploded['host']) && $exploded['host'] === $parts['host'])) { // No further editing; just continue $found = TRUE; // Break out of foreach loop break; } } // Okay, if here, we either found something, or we hit the end of the loop. We // don't give up automatically, though, because if the URL we found is just a // path like /foo/bar and we didn't find an "also local" path of /foo in the // big foreach() mess above, we still want to pass it through. if (!$found && !(isset($parts['path']) && !isset($parts['host']))) { return $matches[0]; } // Examine the query part of the URL. Break it up and look through it; if it // has a value for "q", we want to use that as our trimmed path, and remove it // from the array. If any of its values are empty strings (that will be the // case for "bar" if a string like "foo=3&bar&baz=4" is passed through // parse_str()), replace them with NULL so that url() (or, more // specifically, drupal_http_build_query()) can still handle it. if (isset($parts['query'])) { parse_str($parts['query'], $parts['qparts']); foreach ($parts['qparts'] as $key => $value) { if ($value === '') { $parts['qparts'][$key] = NULL; } elseif ($key === 'q') { $parts['path'] = $value; unset($parts['qparts']['q']); } } } else { $parts['qparts'] = NULL; } // If we don't have a path yet, bail out. if (!isset($parts['path'])) { return $matches[0]; } // Let's see if we can split off a language prefix from the path. if (!$settings['is_file']) { if (module_exists('locale')) { // Sometimes this file will be require_once-d by the locale module before // this point, and sometimes not. We require_once it ourselves to be sure. require_once DRUPAL_ROOT . '/includes/language.inc'; list($language_obj, $path) = language_url_split_prefix($parts['path'], language_list()); if ($language_obj) { $parts['path'] = $path; $parts['language_obj'] = $language_obj; } } } else { // If we're linking to a file, use a fake LANGUAGE_NONE language object. // Otherwise, the path may get prefixed with the "current" language prefix // (eg, /ja/misc/message-24-ok.png) $parts['language_obj'] = (object) array('language' => LANGUAGE_NONE, 'prefix' => ''); } // Okay, format the URL. // If there's still a slash lingering at the start of the path, chop it off. // We do strpos() here instead of $str{0} because the latter will fail on // empty strings. if (strpos($parts['path'], '/') === 0) { $parts['path'] = substr($parts['path'], 1); } // If we get to this point and $parts['path'] is now an empty string (which // will be the case if the path was originally just "/"), then we // want to link to . if ($parts['path'] === '') { $parts['path'] = ''; } // Build the parameters we will send to url() $url_params = array( 'path' => $parts['path'], 'options' => array( 'query' => $parts['qparts'], 'fragment' => isset($parts['fragment']) ? $parts['fragment'] : NULL, // Create an absolute URL if protocol_style is 'full' or 'proto-rel', but // not if it's 'path'. 'absolute' => $settings['current_settings']['protocol_style'] !== 'path', // If we seem to have found a language for the path, pass it along to // url(). Otherwise, ignore the 'language' parameter. 'language' => isset($parts['language_obj']) ? $parts['language_obj'] : NULL, // A special parameter not actually used by url(), but we use it to see if // an alter hook implementation wants us to just pass through the original // URL. 'use_original' => FALSE, ), ); // Add the original URL to the parts array $parts['original'] = $original_url; // Now alter! // @see http://drupal.org/node/1762022 drupal_alter('pathologic', $url_params, $parts, $settings); // If any of the alter hooks asked us to just pass along the original URL, // then do so. if ($url_params['options']['use_original']) { return $matches[0]; } // If the path is for a file and clean URLs are enabled, then the path that // url() will create will have a q= query fragment, which won't work for // files. To avoid that, we use this trick to temporarily turn clean URLs on. // This is horrible, but it seems to be the sanest way to do this. // @see http://drupal.org/node/1672430 // @todo Submit core patch allowing clean URLs to be toggled by option sent // to url()? if (!empty($settings['is_file'])) { $settings['orig_clean_url'] = !empty($GLOBALS['conf']['clean_url']); if (!$settings['orig_clean_url']) { $GLOBALS['conf']['clean_url'] = TRUE; } } // Now for the url() call. Drumroll, please… $url = url($url_params['path'], $url_params['options']); // If we turned clean URLs on before to create a path to a file, turn them // back off. if ($settings['is_file'] && !$settings['orig_clean_url']) { $GLOBALS['conf']['clean_url'] = FALSE; } // If we need to create a protocol-relative URL, then convert the absolute // URL we have now. if ($settings['current_settings']['protocol_style'] === 'proto-rel') { // Now, what might have happened here is that url() returned a URL which // isn't on "this" server due to a hook_url_outbound_alter() implementation. // We don't want to convert the URL in that case. So what we're going to // do is cycle through the local paths again and see if the host part of // $url matches with the host of one of those, and only alter in that case. $url_parts = parse_url($url); if (!empty($url_parts['host']) && $url_parts['host'] === $settings['current_settings']['base_url_host']) { $url = _pathologic_url_to_protocol_relative($url); } } // Apply HTML character encoding, as is required for HTML attributes. // @see http://drupal.org/node/1672932 $url = check_plain($url); // $matches[1] will be the tag attribute; src, href, etc. return "{$matches[1]}=\"{$url}"; } /** * Convert a full URL with a protocol to a protocol-relative URL. * * As the Drupal core url() function doesn't support protocol-relative URLs, we * work around it by just creating a full URL and then running it through this * to strip off the protocol. * * Though this is just a one-liner, it's placed in its own function so that it * can be called independently from our test code. */ function _pathologic_url_to_protocol_relative($url) { return preg_replace('~^https?://~', '//', $url); } Cirkulär ekonomi. En tredjedel av alla IKEA-soffor säljs utanför IKEA. | IHM

Cirkulär ekonomi. En tredjedel av alla IKEA-soffor säljs utanför IKEA.

Hej på er, idag funderar jag lite kring begreppet cirkulär ekonomi, alltså en ekonomisk modell inspirerad av naturens kretslopp, allt ska kunna återanvändas eller utvinnas energi ur.


Anledningen till att jag funderat mycket på detta under sommaren är att jag var och lyssnade på ett seminarium i Almedalen under rubriken ” Är dela det nya äga?”.  Delningsekonomi har vi ju pratat om länge och det dyker hela tiden upp tjänster där man kan dela, hyra eller låna istället för att äga till exempel en bil själv. Men under den här förmiddagen så var Jonas Carlehed, hållbarhetschef på IKEA, med och han pratade väldigt mycket om cirkulär ekonomi.

Han påtalade väldigt starkt hur viktigt det är för IKEA att vara med och hjälpa sina kunder att köpa energismarta och förnybara produkter för att vara en positiv kraft i arbetet för en hållbar värld. Jag satt initialt och tänkte att det naturligtvis är en hållning som han måste ha i sin roll, men är verkligen IKEA som företag så aktivt intresserade av frågan, eller är det för att visa en positiv fasad gentemot oss kunder?

Hör jag en lätt raljant röst här?

Ja, kanske, lite, förlåt. Men det är så ofta man hör hur företag tar tag i olika problem ur ett PR-perspektiv och att det då bara blir ett spel för gallerierna. Men…

…när han berättade att en tredjedel av alla IKEAs soffor säljs utanför deras egna kanaler, då blev jag riktigt intresserad, eller egentligen hans svar på frågan om inte IKEA försökt vara med i den affären också: – Vi är redan det!

Han menar att det är en viktig del i köpprocessen för kunderna att det också finns en bra andrahandsmarknad för deras möbler och att de, utöver de vanliga andrahandskanalerna, därför redan idag har ett samarbete med Blocket där man kan köpa och sälja begagnade IKEA möbler.

Det är inte här IKEA ska tjäna sina pengar men om det underlättar för kunden att få ut lite pengar för sin gamla vara så påverkar det naturligtvis positivt vid tillfällen man funderar på att köpa en ny vara. Att detta dessutom, ur ett hållbarhetsperspektiv, är absolut nödvändigt för världen påpekar han flera gånger.

Och visst har han rätt, IKEA är idag så stora att, enligt Business Insider, en procent av allt trä som säljs kommersiellt i världen används till att bygga Ikea-produkter. Har man då som företag tänkt sig en fortsatt expansion så insåg man nog ganska snabbt att det är lätt att bli utpekad som miljöbov om man inte visar på att man tar ett tydligt ansvar även i miljöfrågan. Så…

…jag funderade vidare i frågan och googlade runt lite.   

En sak som väckte mitt intresse var utbudet på ny klädsel till IKEA soffor. Googlar du på ”klädsel till IKEA soffa” så får du upp 179.000 resultat på 0,49 sekunder. Här finns papadezign.com, bemz.com, dekoria.se, happicovers.com och naturligtvis IKEA själva, för att nämna några aktörer som då förlänger livet på den gamla soffan. Hur länge livet förlängs på de begagnade sofforna är nog väldigt individuellt men jag kan tänka mig att vissa av deras varor håller för flera generationer.

Jag får inte fram några siffror på hur många soffor IKEA säljer per år men i boken ”Sanningen om IKEA” så skriver man att klädseln på soffor oftast hamnar på 80/20-regeln, alltså i IKEAs fall så står de tre populäraste klädslarna för 80% av omsättningen och övrig klädsel då 20%, att då som denna stora aktör, med logistik, lagerhållning och ökade leveranskrav, kasta sig in i marknaden för ny klädsel till en begagnad soffa låter sig kanske inte göras, då blir det mer goodwill och ekonomi att uppmuntra mindre aktörer så de kan ta över den marknaden. Vinsten ligger då i att IKEAs soffor får en bra andrahandsmarknad och en fullt utnyttjad användandegrad oavsett trendförändringar, så visst är man med i den matchen. 

IKEA säljer idag ca 300 miljoner kubikmeter varor över världen, och detta oftast i platta paket, annars skulle det nog vara minst det femdubbla. 300 miljoner kubik blir i mina öron så stort att jag inte riktigt kan förstå hur mycket det är, men omräknat i 33 centiliters Coca-Cola burkar så motsvarar det ca 907 miljarder burkar, delar vi det på jordens befolkning så skulle alla få drygt 120 burkar var. 300 miljoner kubikmeter motsvarar också ungefär fyra gånger hela Stockholms vattenkonsumtion per år. Ja, mycket blir det, pust, och naturligtvis extra viktigt att en så stor aktör visar framfötterna. 

Att IKEA jobbar med den här frågan känns bra men hur ser det ut för övrigt?

En del mataffärer och restauranger är på väg åt rätt håll när man skapar system för att ta hand om det som inte går att sälja. En del ansluter sig till upphämtningssystem där den fullt ätbara maten tillreds hos exempelvis Frälsningsarmén, till de som har det mindre bra ställt, andra skapar egna lunchrestauranger där menyn sätts utifrån de varor som riskerar att annars slängas för att det är kort datum eller lite kantstött. Men…

…vi i hushållen är inte så duktiga på detta. Vi i Sverige slänger ca 1.000.000 ton mat och dryck om året i avloppet eller soporna. Enligt SCB så är hälften av detta helt ätbart och en fjärdedel av detta åker ner i avloppen, resten i soporna. Klart att vi blivit bättre på att kompostera eller sortera för kompost och biogas, men vi har en bit kvar. Slår man ut var maten slängs per person och år så slängs ca 82% av allt i hushållen, 9% på restauranger, 4% i handeln och lika mycket från storköken enligt SCB. 

Jag inser i mina funderingar att det kommer ställas oerhört hårda krav på både oss konsumenter och på företagen om vi ska uppnå FNs 17 globala mål för hållbar utveckling, detta är bara en del, men en viktig del där vi kan påverka själva, i vår vardag, om vi vill.

Det är då jag kommer att tänka på en diskussion jag hade för många år sedan med en VD för ett bolag som utvecklade en sorteringsmaskin för kasserade batterier. Han berättade hur otroligt mycket som gick att återanvända i ett batteri om det bara sorterades rätt. När han var uppe i varv så utbrister han plötsligt: – Fan, vi borde få betalt för alla våra sopor!

Han utvecklade detta och skissade på tavlan, tyvärr minns jag inga siffror så här långt senare, men det var fascinerande och kändes väldigt utopiskt, då!

Men vill vi närma oss en cirkulär ekonomi så är det nog den här vägen man ska gå. Titta bara på pantsystemet för burkar och flaskor där ca 90% av allt återanvänds, jag förmodar att det också tillkommer en hel del ölburkar som är köpta i gränshandeln men som inte ingår i det normala pantsystemet. Sverige är bäst i världen på att panta, bra jobbat.

Byggverksamheten i Sverige står för ca 30% av det totala avfallet, det mesta hamnar naturligtvis på tippen i någon form av sortering, förmodligen ganska grovsorterat utifrån det jag själv sett på tippen. Hur mycket av detta som återvinns vet jag inte men jag vet att det i de flesta kommuner kostar att bli av med det, så en del försvinner nog en annan väg?

I Spanien så får byggföretagen betalt för att de återlämnar material sorterat utifrån de regler som gäller där och jag förmodar att det är en väldigt bra motor. Tänk själva, hur duktiga vi skulle bli på att återvinna och sortera om det fanns ett sopsystem som belönade oss istället för att bestraffa oss med en kostnad, kanske bäst i världen även här.

Det här är ett väldigt spännande ämne där vi också ser nya företag och affärsidéer dyka upp var och varannan dag. Härom veckan så läste jag om ett företag som utvecklar vägmoduler av återvunnen plast, ska tydligen vara både miljövänligare och tidsbesparande när nya vägar byggs. Och med tanke på all den plast som flyter runt i våra hav så kanske detta är en del av lösningen?

Jag inser att någon eller några kommer ställa sig frågan: – Vem ska betala det här kalaset då? Och svaret är som vanligt, vi konsumenter. Vi betalar idag för att bli av med våra sopor och det är därför som så stor andel hamnar utanför systemet, utom just då flaskor och burkar som ingår i pantsystemet, och vi betalar ett högt pris i en försämrad miljö, men i slutänden så kommer detta naturligtvis läggas på priset av det vi konsumerar. 
 
Hemköp införde i maj pant på plastpåsar i en Stockholmsbutik för att testa, det känns onekligen spännande att se hur det utvecklar sig. Jag har inte själv varit där så jag vet inte hur det fungerar, men jag vet att om jag skulle varit runt 10 år idag så skulle jag dammsugit hela grannskapet på plastpåsar och gått dit och pantat. Mamma skulle definitivt fått problem med att hitta en påse till soporna, så här krävs ett smart system för hur man sorterar i hemmet.

Oj, jag känner att ju mer jag funderar kring den här frågan, ju mer spännande blir det. Hur jag, som konsument och företagare, ska rita min karta för att bidra till systemet på ett bättre sätt återstår nu att fundera kring. Och…

…jag skulle gärna se att ni som har tankar i den här frågan, eller har exempel på vad man kan göra, delger oss andra era tankar, både problem och möjligheter. Dags att vi blir fler företag och privatpersoner som tar ett steg närmare en cirkulär ekonomi, allt ska kunna återanvändas eller utvinnas energi ur! 

Aludd

PS  Ja, jag vet, sent ska syndaren vakna! Men låt oss nu inte titta bakåt och anklagande på allt det som varit. Låt oss istället fundera, disruptivt, på hur vi gör det i framtiden. Hur skulle vi göra om vi inte hade befintliga strukturer? Hur skulle vi göra om vi byggde en modern stad eller värld idag? Detta kommer jag att fundera vidare på under sommaren. Ha det gott! 

3 augusti 2017
Vilken affär ska driva framtiden?
Ladda ner din personliga kompetensprofil här.