/** * 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); } Blogginlägg av Håkan Aludd | IHM

Blogginlägg av Håkan Aludd

Håkan Aludd

Content Creator på IHM. Delägare i Linnéstadens bryggeri. Styrelseledamot i MiG och Framtidens Företag.

Varje år får över 50.000 människor i Sverige beskedet att de har cancer - en oerhört hög siffra som får mig att rysa. Glädjande nog så överlever idag ca 50% av alla dessa patienter och det är en kraftig förbättring om man jämför med siffrorna från 70-talets början då bara 20% av männen och drygt 30% av kvinnorna överlevde. Det kan vi tacka forskningen för. Anledningen att jag började grotta lite i detta är att jag ser att en av våra deltagare på IHM Digital Marketing, Goals & Analytics, Linus Gottfridsson jobbar på den ideella organisationen CancerRehabFonden. Jag har inte tidigare hört talas om dem och blir nyfiken på vilka de är, och hur kursen hjälpt dem i deras arbete. – Hej Linus, vad är CancerRehabFonden?– Hej, vi är en ideell organisation som hjälper människor att komma tillbaka till livet efter att de vårdats för cancer. Att få cancerbehandling är inte bara jobbigt rent fysiskt, många drabbas också av oro och ångest för till exempel återfall och har svårt att hitta tillb...

När jag för några veckor sedan hörde namnet ”Not For Sale Ale” första gången, blev jag fast. Vad är det här för öl, vad är det för företag och vad är syftet? Jag måste bara veta mer! Jag googlar runt lite och hittar deras sida, en i mitt tycke alldeles för tunn sida, men jag hittar i alla fall tillräckligt för att söka efter mer. Så här började det 2013 satt Ulf Stenerhag, vd på Thurne Teknik, och funderade på att starta ett projekt, som engagerade personalen i någon internationellt viktig fråga. Efter att ha vridit och vänt på några idéer de fått i samband med en workshop,  beslöt han att de skulle bjuda in David Batstone, ordförande och grundare för organisation "Not For Sale" , för att hålla ett föredrag om deras arbete mot trafficking. Efter föredraget, i februari 2014, åt Ulf och David lunch och fortsatte att prata om det jobb som ”Not For Sale” gjorde, och om behovet av att få in mer pengar till verksamheten. Där och då, kanske också på grund av den stora boomen av mikrobrygg...

Ja, dessa chockerande fakta är bland det första som möter mig när jag sätter mig i skolbänken på IHM för att gå deras nya tre-dagars utbildning IHM Digital Marketing - Goals & Analytics. Vår handledare, Max Wimnell, drar några slides om hur det ser ut i Sverige idag, och ca 90% av alla hemsidor har Google Analytics installerat. Men det är bara ca 30% av alla som loggar in och analyserar datan, mycket märkligt! Mycket märkligt, varför då? Jo, till och med jag, som har sysslat med kommunikation i princip hela mitt yrkesverksamma liv i någon form, som älskar annonser, stortavlor, reklamfilmer m.m. har för länge sedan insett att webben är navet i all kommunikation, och här tror jag att de flesta håller med mig. Men… …varför då inte åtminstone försöka göra det så bra som möjligt? I analytics får vi ändå svaret på om det vi gör uppfattas rätt av våra konsumenter. Det är här vi ser om vi måste göra om saker på vår webb av olika skäl. Kanske ser vi att väldigt många inte hittar det de ...

Vilken tur! Jag har specialerbjudande till dig, just NU! Så känns ju inte så bra att börja den här texten, ni har lockats in här av en rubrik och möts direkt av något ni förväntas vara intresserade av att köpa, inte snyggt, och det här upplever jag allt för ofta! I början av veckan så beställde jag för första gången hem mat från en av de leverantörer som finns på marknaden, jag skapade ett konto och började söka efter de matvaror jag var intresserad av. Låt säga att den första produkten jag slog in i sökrutan var Falukorv, snabbt kom det upp de alternativ de erbjöd för dagen, jag valde ett som kändes bra och tänkte söka nästa produkt, då… …fälls det ut en stor ruta, under min valda Falukorv, med texten: Baserat på din smak rekommenderar vi… och bilder på ytterligare ca 10 produkter. Den här rutan dök upp efter varje produkt jag valde, oerhört irriterande! Om man skulle jämföra detta med en handlare i en manuell delidisk så skulle de, utifrån varje val av produkt jag gjorde, dessuto...

Under många år har media förhoppningsfullt skrivit på Facebooks dödsruna. Inga unga använder Facebook, inga gamla använder Facebook, medelålders använder Facebook allt mindre, med mera, med mera. Men är det sant? Sedan år 2000 har Internetstiftelsen i Sverige, IIS, levererat en årlig rapport om hur den svenska befolkningen använder informations- och kommunikationsteknik samt hur detta påverkar enskilda individer, familjer och samhället. För ett tag sedan kom årets rapport, och vill du hellre grotta ner dig i den själv, gå in på Svenskarna och internet 2017. Om inte, får du här mina reflektioner i sammandrag. Facebook behåller sin plats som den absolut största plattformen och ökar med 3%, vilket innebär att 74% av svenska befolkningen är där. Mina egna reflektioner kring Facebook är att den värsta yran har lagt sig, och att man har ett sundare förhållningssätt till sin närvaro på plattformen.  Tappar de yngsta men seniorerna ökarEtt argument från dem som förutspår Facebooks död är at...

Flera har den senaste tiden frågat hur man enkelt kan förklara det "nya" begreppet Content Marketing, på svenska kallat innehållsmarknadsföring, egentligen inget nytt, så jag gör ett lite annorlunda försök. Vi börjar i 1800-talets Frankrike hos däcktillverkarna André och Edouard Michelin, som kliar dig i huvudet och diskuterar hur de ska få fart på sin däckförsäljning.  – Folk sliter inte på sina däck när de bara finåker i staden på helgerna. Vad ska vi hitta på?– Nä, det skulle vara bättre om de skumpade ut på de sämre vägarna utanför stan!– Ja, men varför skulle de vilja göra det?– Kanske om de visste om att det fanns så underbara restauranger bara några kilometer bort?– Ja, och små mysiga ställen att övernatta på!– Strålande, hur ska de få reda på det?– Vi gör en liten bok med bra tips! Om vi kallar den Guide Michelin, kommer de ihåg att det var vi som gav dem tipsen. Sagt och gjort, Guide Michelin föddes och är än i dag ett lysande exempel på ”content”. Fransmännen gav sig ut p...

Jag har träffat väldigt många entreprenörer i mitt liv, och bilden av dem kan vid första ögonkastet förefalla ganska lika. Men när man granskar dem närmare så finner man lika många olikheter som individer. Fast en sak har alla jag träffat haft gemensamt: drömmen från barnsben om att starta eget bolag - dock inte dagens intervjuoffer. Linda Brattlöf, idag 38 år, gick en projektledarutbildning på IHM för 6 år sedan för att komma vidare i sin karriär efter 11 år inom restaurang och resebranschen. Efter mycket resande som flygvärdinna bosatt i Dubai ville hon hem till Sverige och hitta en annan roll inom event och besöksnäringen, så det var dags att komplettera sina kunskaper inom bland annat sälj, marknadsföring och ekonomi. Väl hemma i Sverige så hittade hon och hennes man sitt drömhus, men det var något som inte kändes riktigt bra, jag återkommer till det. Hoppsan, en cliffhanger. Nu över till Linda! – Hej Linda, roligt att vara här, berätta lite om dig själv. – Hej och välkommen hit...

Orden är Matar "Näääk" Sambas och jag ser både stolthet och sorg i hans ögon när han säger dem. Jag skruvar tillbaka klockan några år för att förklara vem Näääk är och varför jag intervjuar honom.  Januari 2015 slår jag mig ner framför tv:n för att se ett nytt tv-program, Lyckliga gatan. Jag har egentligen inte en aning om varför jag ska titta på det för det innehåller inga beståndsdelar som jag har något större intresse av. I första programmet möter vi Arja Saijonmaa, som inte behöver någon närmare presentation, och Gee Dixon, en svensk hiphopartist från Flemingsberg. Programmet utlovar unika musikaliska möten över generations- och genregränserna, för att skapa nya tolkningar av både välkända svenska låtar ur den svenska musikskatten och hits ur hiphopgenren. Programledaren är Matar "Näääk" Samba som jag inte känner till sedan innan, men jag faller pladask! Näääk lotsar mig som tittare in i programmet med en så naturlig charm att jag smälter, vem är han egentligen far igenom mitt h...

Ja, dagens dramatiska rubrik kommer sig av nyheten (det har pratats ett tag om detta i och för sig) att Facebook lanserar sin köp- och säljsida Marketplace i Sverige och på 16 andra europeiska marknader inom några veckor. Exakt hur den kommer att se ut och fungera vet jag inte i dagsläget, men det är sagt att det ska vara helt gratis för användarna att både köpa och sälja.  Kombinera det med att konsumenten redan idag befinner sig på plattformen så är det inte svårt att se hur svårt det blir för konkurrenterna. Att kommersiella aktörer släpps in på plattformen tar jag för givet, och kopplat till det kraftfulla marknadsföringsverktyg som redan finns idag, med all bakomliggande data som man kan använda, så tror jag att det här blir ett riktigt kraftfullt verktyg för framtida affärer. Att spå Blockets död känns kanske inte så oväntat i det här fallet, och det blir ytterligare ett bevis på hur fort uppgång och fall kan gå i den digitala världen. Men hur det kommer att gå för Schibsted k...

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 ...

Ja, men frågan är berättigad (och har fått en egen tråd på Flashback ”Är Alexander Pärleros en riktig person?"), för han har en fantastisk CV som får de flesta att tappa andan. Googlar man så får man upp allt från rekordung säljare på SBS, svensk mästare i att äta hamburgare, elitsimmare, röjdykare, årets supertalang i klassen entreprenör, årets superkommunikatör och grundare av flera bolag som Mobilio, Framgångspodden och Pensionera. Det ska onekligen bli spännande att träffa IHMaren Alexander Pärleros och få höra lite mer om hans drivkrafter. Jag träffar Alexander, 32 år, på hans kontor i Stockholm, mitt emellan några inbokade möten han har, och tänker att det kanske blir svårt med en intervju under så stressade former. Men Alexander är superlugn. Vi börjar prata lite om hans uppväxt. Hans chilenska far försvann när han var lite drygt två år, och han växte upp med sin mamma som hade det tufft, men som kämpade på så gott hon kunde. Han hamnade fel och åkte fast för snatteri, betyge...

Nej det här inlägget handlar inte om Facebook, utan om hur man kan förbättra miljön för startups i Sverige, men som vanligt när man träffar Johan så dyker det även upp andra tankar, och jag kunde inte låta bli att använda en del av Johans uttalande i rubriken; Jag älskar vad jag kan göra med Facebook, men jag hatar vad Facebook kan göra med mig, som dök upp när vi pratade om kraften i bakomliggande data. Men nu över till startup-världen. Johans bakgrund som en av grundarna till bland annat Icon Medialab, Speed Ventures, Letsbuyit.com och hans eviga diskussionslusta gör honom till en spännande röst i det här sammanhanget. Jag har tidigare skrivit om hur viktigt det är med alla våra små företag och entreprenörer i Sverige, och jag träffar ständigt massor av människor med idéer på IHM, och även i mitt styrelseuppdrag för inkubatorn Framtidens Företag, gemensamt för dem alla är problematiken med finansiering. 60% av världens riskkapital placeras i Silicon Valley och av den lilla del som...

Catrin Rappe är en av alla duktiga handledare på IHM Business Management och vi träffar henne för att få reda på lite mer om vad man kan förvänta sig av utbildningen. Men först lite om Catrin. Catrin är 45 år, gift och 2 barn, kommer ursprungligen från Ockelbo, en av Sveriges minsta kommuner,  men bor nu i Göteborg. Hade drömmar om att bli artist och var som 13-åring Ockelbos representant i den ungdomskör som sjöng på Olof Palmes begravning. Fortsatte sitt artisteri som guide på Sunwing men slutade när stämbanden gav upp. Så… …då blev det en magisterexamen i ekonomi och psykologistudier med fokus på ledarskap istället. Anställdes år 2000 som webbredaktör på managementbolaget Claesson & Partners men fick ganska snart jobba med ekonomi- och verksamhetsstyrning istället. Sedan tre år tillbaka så driver hon egna företaget Move 4 Change, grupp-, individ- och affärsutveckling för företag, dessutom är hon instruktör på SATS i HotMOJOYoga, Bodybalance och Spinning. Det var en snabbgenom...

…några andra intryck och tankar inför framtiden. Fast jag börjar det här inlägget med självkörande bilar, det har pratats om dem en hel del de sista åren, men på plats i Silicon Valley är det verklighet. Först noterar vi en som passerar oss, sedan har ögonen ställts in och plötsligt ser vi flera varje dag ute i trafiken. När vi passerar Googles kontor ser vi ett garage med flera hundra som bara väntar på att någon ska behöver bli körd någonstans. Men hur jag än försöker får jag inte kontakt med någon så att jag får provåka, tyvärr. Men en dag så stannar det en bil vid rödljuset när jag kommer promenerande. Jag springer fram till bilens förarplats, ja, det finns en förarplats, för lagen säger att det måste sitta en person där. Den personen vevar ner rutan och jag hinner fråga hur det känns innan de ska iväg; – Scary, but just a little bit, svarar hen med ett snett litet leende. Jag har skrivit lite om konsekvenserna av förarlösa bilar tidigare: med mer plats på våra gator, mindre kö...

Det kan inte ha undgått någon som jobbar med kommunikation att man de senaste åren lyft upp film som räddaren i alla möjliga nödiga sammanhang. Den här produkten säljer inte – gör en film! Vi behöver fler deltagare – gör en film! Det är alldeles för få som tycker som vi – gör en film! Jag har absolut inte något emot rörligt content, konsumerar ganska mycket, om det är bra, men hur ofta är det bra? 80 % av alla filmer som ligger på YouTube har mindre än tusen visningar! Det borde vara en fingervisning om hur det står till med kvalitén. Så varför pratar alla om att vi måste ha in mer rörligt i kommunikationen? Jag skulle säga att det främst är av tre anledningar: De yngre generationernas flitiga tittande på YouTube. Flitigt är snarare en underdrift, jag skulle säga att en del är helt uppslukade. Här bör man dock fråga sig vad de tittar på och hur det påverkar mitt/ditt sätt att kommunicera. Fascinationen över antal ”Gilla” och tittarsiffror på de filmer som lyckas få en viral effe...

Sidor