/** * 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 | IHM

Blogginlägg

Så som jag minns det från skolan så trodde man ända fram till slutet av 1400-talet att jorden var platt och att detta förändrades först när Christofer Columbus seglade mot Indien. Detta, trots att han seglade ganska mycket fel. ”1492 Columbus fann Amerika på”, minns ni ramsan man tragglade för att komma ihåg årtalet? Rädslan för att segla över kanten och trilla av jorden ledde så klart till massa olika problem. Man blev rädd. Man vågade inte utforska det okända. Man bromsade den positiva utvecklingen genom att inte tillskansa sig ny kunskap. Idag är jorden rund (sägs det) och sitter dessutom ihop mer än någonsin. Alla kan ta ett varv runt jorden precis när som helst åtminstone genom en snabb resa på Internet. Det till och med tycks som om jorden krympt en aning. Ändå innehåller kartan enorma vita fläckar. Fläckar som symboliserar okända områden för alla och en var. Det är som om vi tror att jorden fortfarande är platt och att vi riskerar att trilla av den så fort vi närmar oss det ...

Svenska chefer får toppbetyg i den medarbetarrapport som Netigate släppte i början av juni i år. I undersökningen deltog drygt 10 000 personer från 91 olika organisationer. Fyra av fem uppger att de har högt förtroende för sin chef – ett förtroende som är högre än vad medarbetarna visar sig ha för både vd och ledning i samma undersökning. Skälet är, enligt Netigate, att svenska chefer tar sig tid för sina medarbetare och ställer rimliga krav. Däremot blir betyget mediokert för svenska chefers förmåga att ge feedback, både när det gäller positivt beröm och konstruktiv kritik för sämre prestationer. Medarbetarna efterlyser också chefer som är bättre på att motivera och inspirera.  Bara en av tre rekommenderar sin arbetsplats Undersökningen visar dessutom att endast en av tre skulle rekommendera sin arbetsplats för andra. Efter det första anställningsåret ses även en dramatisk minskning i både nöjdhet och lojalitet, enligt Anna Tjernström, analytiker och HR-expert på Netigate. Hur ska ...

Magnus Äng är entreprenören bakom flera lyckade internetsatsningar. En visionär som drivs av att tidigt upptäcka trender inom digital teknik och applicera dem i sina bolag. Utöver detta håller han även föreläsningar och utbildningar, bland annat på IHM Yrkeshögskola.   Du har en gedigen bakgrund inom digital marknadsföring berätta mer!    – Kom in i e-handelsbranschen och den digitala världen 1999 när jag började som trainee på Euroflorist, som då var ett entreprenörsdrivet bolag. Jag blev sedermera vd i Danmark, därefter i Sverige och var med på expansionen från 3 till 8 länder. Mina sista år var jag ytterst ansvarig för Digital Marketing & E-commerce för alla 8 europeiska länder och en del av koncernledningen.   Efter mina 10 år hos EuroFlorist  började entreprenörskulturen minska i takt med att grundaren lämnade och då var det dags även för mig att röra på mig.  Även om mitt hjärta fortfarande bultar för EuroFlorist, och jag är delägare i företaget, så är jag inte aktiv på n...

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

Behovet av digital kompetens och analys har aldrig varit större. Företagen flyttar mer och mer över sin affär till den digitala sfären, vilket ökar kraven på förståelse för och korrekta analyser av kundernas digitala beteende. Webbanalys har blivit ordet på allas läppar, och rättmätigt så. Här är fem anledningar till varför alla företag behöver kompetensen i organisationen: Webbanalys ger svaret på vilka insatser som fungerar, men ännu viktigare vad som inte fungerar. Att utvärdera resultatet av marknadsinsatserna har alltid varit centralt, men aldrig så enkelt som på den digitala arenan. Varje insats går att följa upp hela vägen från klick till köp, kan jämföras mot andra insatser, och siffrorna talar sitt tydliga språk.   Intern investering i digital analys ger en långsiktig ekonomisk lönsamhet. Många företag har börjat arbeta med webbanalys redan idag, men har valt att lösa kompetensen kortsiktigt genom externa konsulter istället för att satsa långsiktigt och ta in den kompetense...

Jag misstänker att du liksom jag inte vill upplevas som en krängare. Någon som ringer och ringer. Men söker inte du kontakt – då missar du affärer. Lösningen på problemet hittar du i historien som ledde till att jag fick stalkervarning. Allt började med ett bra säljsamtal över telefon Vd ville skapa en mer affärsmässig kultur på företaget. På så sätt skulle kollegorna upptäcka och fånga fler affärsmöjligheter. Direktören trodde att det skulle leda till ett mindre beroende av en stor kund och öka omsättningen med cirka trettio procent.    Företagsledaren gillade mitt förslag med en workshopserie om att sälja komplexa tjänster. Priset däremot tyckte hen var för högt, om man delade det med antal timmar workshopparna skulle ta. Jag berättade att workshoptiden bara var en tredjedel av min totala arbetstid. Jag skulle först göra en kompetensanalys av alla deltagare och intervjua ett par av dem, för att höra om deras säljerfarenheter och deras syn på försäljningen. Därefter skulle jag an...

Veronica är inne på sitt andra år av YH-utbildningen Digital Marketing & Sales Analytics. En ambitiös tjej full av energi som utöver utbildningen även hinner med att jobba i stort sett heltid, driva hemsida och podd, sitta med som elevrepresentant i utbildningens ledningsgrupp samt ta hand om barn och djur på hemmaplan. Efter att ha arbetat några år som bland annat frilansjournalist, med försäljning och digital marknadsföring bestämde sig Veronica Ermanbrik, 33 år, för att börja plugga igen. Frågan var bara vad? – Det jag hade med mig var att företag generellt saknar spetskompetens i att analysera och förstå data och även om jag redan hunnit jobba en del med detta, så behövde jag lära mig mycket mer. Hon sökte en del utbildningar bland annat Digital Marketing & Sales Analytics och E-commerce Manger på IHM. Och kom in på båda, varför blev det just Digital Marketing & Sales Analytics? – Innehållsmässigt liknar utbildningarna varandra en del, och det var svårt att välja vi...

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

Delarna gör helheten. Pusslets olika bitar ger tillsammans hela bilden. Tänker jag när jag hör Stefan Löfven prata om hur regeringen styr landet. Statsministern pratar på presskonferens (ang Transportstyrelsen) om hur landet och regeringen styrs. Han pratar "stuprör" - en modell där varje departement sköter "sina egna" frågor och inte lägger sig i, bryr sig om, andra departements och avdelningars utmaningar och problem. Statsministern säger att så "fungerar det och så har det alltid varit". Lite nervös blir jag.  Men, statsministern är inte ensam. Även i näringslivet stöter jag alltför ofta på samma tankesätt. Jovisst pratades det om samordning och öppenhet, och jag får se powerpoints med horisontella linjer i organisationsscheman som visar hur det skall fungera. Men gör det verkligen det? Ibland kanske, men lika ofta inte.  Två exempel: 1. Jag föreläser om mångfald och oftast, mer fokuserat, på jämställdhet. Samtidigt arbetar jag med rekrytering sedan snart 35 år. Det senare innebä...

Så här första månaden efter semestern brukar privatekonomin vara i behov av lite återhämtning. Sent bokade resor, fördyrade semestervanor och det lilla extra tycks ha lämnat ett tomrum efter sig på bankkontot. Visst har det varit värt det, men tanken på att vara mer klok och långsiktig nästa semester dyker upp likt ett brev på posten i mina tankar. Det är nog lätt att känna igen sig i detta för de flesta av oss då jag tror att många med mig jobbar i ettårs cykler när det gäller semesterplanering. Inget fel med det, tvärt om. Men, om vi vill kunna uppleva det där som ligger lite längre bort än vad vi lyckas spara ihop till under året så behöver vi vara lite mer långsiktig.   För vem vill inte kunna unna sig tillträde till sitt personliga ”paradis”? Min upplevelse är att detsamma gäller för hållbarhetsarbetet i flera företag. Jag menar inte att ekonomin nödvändigtvis tar stryk under semestern, utan det jag tänker på är att avsaknaden av beslutet att långsiktigt investera i hållbarhet ...

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

Förhoppningsvis är du ledig och njuter för fullt av sommarens alla möjligheter. Om du har tid över kommer här några lästips från oss på IHM, som kan inspirera, glädja och skapa funderingar. Trevlig läsning!   Konflikträdsla banar väg för psykopater på jobbet AI kommer förändra allt. Var drar vi gränsen? Bör vi dra en gräns? 8 steg att rusta din organisation att möta ständig förändring Från en dröm till en annan en resa i sig Toppbetyg till kursen som lär dig dra nytt av digitaliseringen När utmaningar blir möjligheter Undervisningen är direkt kopplad till verkligheten 5 områden som inte kan digitaliseras Att försöka förstå framtidens jobb Gör tvärtom i sommar Det känns så rätt, det är detta som jag vill göra Ni har väl kommit ihåg att framtidssäkra verksamheten? Fantomen var är du? Du behövs i digitaliseringen! Ny forskning sätter ljuset på destruktiva ledarbeteenden Att komma ut på en arbetsplats och kunna knyta kontakter var avgörande för mig   Trevlig sommar, önskar vi på IHM!  

Den fjärde industriella revolutionen är här, och den kommer att förändra mer än vad vi kan ana. Den första industriella revolutionen startades 1784 när ångmaskinen började produceras. Revolution nummer två startade 1870 när elektricitet kunde användas för att massproducera. Den tredje revolutionen påbörjades 1969 när IT, datorer, elektronik och automatiserad produktion startade. Och nu, 2017, står vi startgropen för en ny revolution där precis allting som kan kopplas mot nätet kommer att kopplas upp - Internet Of Things (IOT). Det leder till att en enorm stor mängd data blir tillgänglig. Data i sig har ju inget värde utan likt olja måste den raffineras för att få fram intelligenta underlag. Idag sker mycket tolkning av data manuellt men framöver kommer robotar alltmer att tolka data åt oss, och börja fatta egna beslut. Detta fenomen kallas, som många av er redan vet, Artificiell Intelligens (AI).  Robotar bygger idag våra bilar och våra telefoner, ja de kan till och med laga mat. En...

Sidor