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

Semestern är en utmärkt tid för att skaka liv i din kreativitet och öka din kapacitet - en tid som ger dig möjlighet att stärka din personliga förändringsförmåga. Här är tipsen som gör dig till en helare människa och skickligare yrkesperson.   Ligger ett gäng lediga, lata dagar framför dig? Så bra.   Då har du chansen att rucka lite på invanda beteenden, bli av med gammalt ”bagage” som ligger och skräpar i hjärnkontoret, justera föreställningar om dig själv och tänja en smula på det du tror begränsar dig.  Modern hjärnforskning och neuropsykologi visar att vi är fast i våra tankemönster. Synapserna är liksom cementerade. De tankar du tänker i dag är till 95 % samma tankar som du tänkte igår. Och samma tankar tänker du i morgon. Snacka om begränsningar och ”invanda hjulspår”.  För att tänka nytt måste vi tvinga tanken att gå en annan väg och forcera synapserna att koppla ihop sig på nya sätt. Tänk om vi lyckas förnya våra nya tankar med någon eller några procent – vad skulle inte det...

Grattis till jobbet! Hoppas din arbetsgivare är nöjd – trots att det finns risk för att du for med osanning vid anställningsintervjun. Eller åtminstone undvek att presentera vissa delar av din person. Och använder du själv standardfrågor för att sålla ut de bästa kandidaterna, då får du en hel del lögner tillbaka. Att det är på detta sätt visar undersökningar från Stockholms Handelskammare och Kelly Servies i SvD. Standardfrågorna ligger på nätet Arbetsgivare har använt dem i decennium. Och du har säkert själv förberett dig för att svara på dem. Så tyvärr ger svaren bara en indikation på hur bra den sökande är på att skarva. Här följer några av de mest använda spörsmålen. Kan du se vilken fråga som faktiskt kan vara till hjälp för dig om du vill anställa personal? Svaret kommer längre ner i artikeln.   Varför ska vi anställa dig? Vad gör du om fem år? Vilka är dina styrkor och svagheter? Hur skulle du beskriva dig själv? Vilka ämnen tyckte du bäst och sämst om i skolan? Vad vet du...

Under måndagen, den 29 maj, beslutade eniga stämmor om att Sveriges Auktoriserade Utbildningsföretag (SAUF) går samman med Almega Utbildningsföretagen och bildar Sveriges största branschorganisation för privata aktörer inom vuxenutbildning. I och med sammanslagningen kommer Almega Utbildningsföretagen organisera 175 utbildningsföretag.  SAUF är en branschorganisation för utbildningsföretag som arbetar med kompetensutveckling av vuxna för arbetslivet. Grundbulten i verksamheten är kvalitetsauktorisationen. Almega Utbildningsföretagen är bransch- och arbetsgivarorganisationen för företag som arbetar med vuxnas lärande och kompetensutveckling. Nu går dessa organisationer samman.  Almega Utbildningsföretagen och SAUF blir därmed Sveriges ledande branschorganisation för stärkt kvalitet inom vuxenutbildningen. Genom medlemsföretagens bredd och mångfald kommer vi nu i ännu större utsträckning än tidigare bidra till att stärka Sveriges konkurrenskraft och öka innanförskapet på arbetsmarknad...

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

Jag hör ganska ofta människor säga att det viktigaste i hållbarhetsarbetet är att förankra det i styrelsen. Ganska länge trodde jag det själv. Att det var det som var det viktigaste, men lite äldre och även kanske lite visare så vill jag hellre påstå att hållbarhet bäst förankras i myllan. Det vill säga där vi står och där vi verkar och bland folk i vår närhet som vill vara med och förändra.  Naturligtvis behöver vi ju förankra beslut på rätt plats i organisationen. Men, om vi ska prata hållbarhet som förändrar vår omvärld på ett strukturellt plan, hållbarhet som leder till en annan utveckling än den som är negativ för så väl oss som kommande generationer, då är det lika viktigt, eller kanske till och med viktigare, att vi förankra vårt arbete i myllan och inte bara i styrelsen! Låt mig ge några exempel.  För ett tag sedan gick jag en utbildning som handlade om hur man ska jobba med mänskliga rättigheter, närmare bestämt Barnkonventionen, i idrottsföreningarnas barn- och ungdomsverk...

Ledarskap har blivit en lönsam industri fylld av tusentals böcker, föredragshållare och coacher som erbjuder det ena fantastiska framgångsreceptet efter det andra. Om dessa metoder fungerade i praktiken borde dagens chefer vara lysande stjärnor som leder sina medarbetare och organisationer till framgång och lycka av aldrig tidigare skådat slag. Verkligheten visar något helt annat. Det är hög tid att göra upp med leadership bullshit. Jeffrey Pfeffer, professor i organisatoriskt beteende vid Standforduniversitetet i USA, höjde ett varningens finger gentemot ledarskapsindustrin redan 2015 med sin bok Leadership BS – fixing workplaces and careers one truth at a time. Pfeffer har ägnat större delen av sitt drygt 70-åriga liv åt forskning och är klassad som en av världens främsta experter inom ledarskap.  Det största problemet när det gäller ledarskapsindustrin, menar Pfeffer, är å ena sidan att den gedigna kunskap som finns på området stöps om till lättköpt underhållning av självutnämnda...

Tillsammans med en kompis startade Christofer Brandin ett UF-företag under gymnasietiden. Bolaget utvecklades med framgång under några år innan han så småningom beslöt sig för att återvända till skolbänken. Efter att ha varit inne och vänt på såväl Handels som Chalmers i Göteborg, föll valet slutligen på IHM och YH-utbildningen Säljare IT Solutions B2B. Mitt i centrala Göteborg ligger den digitala produktionsbyrån Provide-IT, där Christofer just nu gör sin första LiA-period. Vi slår oss ner i hans rum och börjar några år bakåt i tiden. Tillbaka på gymnasiet då han och en vän startade sitt UF-företag. Affärsidén gick till en början ut på att göra hembesök och hjälpa personer med tekniska prylar som krånglade. –  Det gick bra för oss och vi vann till och med en del priser. När vi insåg att vi kunde tjäna pengar på detta så startade vi ett handelsbolag. Det här var under killarnas sista gymnasieår. Bolaget fortsatte att utvecklas mot att arbeta med företagskunder och man fick avtal me...

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

Det är lördag, sen eftermiddag, och dimman lägger sig som ett täcke över villakvarteret. Nej, nej det är inte dåligt väder på ingång. Tvärt om. Det är bra väder i antågande. För visst är det så - Allt väder är bra (grill)väder nu när det äntligen är grillsäsong. Nu ska den fram! Kommandobryggan. Hangarfartyget. 57 cm i diameter ishockeyarena till de stackars grillkorvarna. Har vi kol? Hur tänkte någon när någon ställde grillen längst in i förrådet? Varför har inte någon gjort rent den? Sen. Äntligen. Dags att tända. Det är lite som en högtidsstund. Nästan som meditation. ”Jaså, du kör fortfarande gasol?” Grannen. ”Bytte tillbaka till kolgrill i år, mer ekologiskt hållbart”, fortsätter han. Biter mig i tungan. Ler. Precis då kommer frun ut genom altandörren och ropar glatt ”Här kommer jag med Kobebiffarna”. ”Mmm, inte speciellt närproducerat”, påpekar grannen. Jag går in, drar ned rullgardinen. Men, måste det vara så komplicerat? Det är ju ”bara” grillning? Nej, så klart inte. Att v...

Förändring är numera en integrerad del av vår vardag – ett fullständigt självklart normalläge. Därmed är förändringsledning som begrepp och metod för att säkerställa företags innovations- och konkurrenskraft passé. Dagens arbetsliv kräver Change by default.   Och hur jobbigt är inte det!     Insikten om att vi måste ta oss an arbetslivet via Change by default är tuff. Den innebär att de allra flesta måste lära nytt och lära om. Det som var framgångsrikt igår är fällor i dag.    Jag har jobbat 30 år i flera stora, etablerade företag. Som medarbetare, som arbetsledare och som högsta chef. Jag har själv sett och levt med kontraproduktiva system, omoderna metoder för såväl ledar- som affärsutveckling samt dysfunktionella processer för möten, beslut och medarbetarutveckling.    Sedan ett år är jag konsult och jobbar med just förändringsarbeten. Det ger mig möjlighet att titta på verksamheterna med ett utifrånperspektiv.    Jag ser chefer som vantrivs. Jag hör medarbetare som helt tappat...

Om man tränar mycket blir man bra på det man gör. För att bli riktigt bra behöver man, utöver talang, även lägga ner ungefär 10 000 timmars träning. Malcolm Gladwell myntade för snart tio år sedan 10 000-timmarsregeln i sin bok Outliers. Talang är dock en överskattad komponent för framgång menar Anders Ericsson, professor i psykologi vid Florida State University i USA. Han har ägnat 30 år av forskning på hur experter blir experter och har nyligen kommit ut med boken PEAK – vetenskapen om att bli bättre på nästan allt.  Enligt professor Ericsson kan vem som helst bli duktig på i stort sett vad som helst. Lösningen ligger i att träna på rätt sätt med en bra handledare, vara fokuserad och målmedveten samt hitta rätt nivå på utmaningen och få bra feedback – bara man vågar lämna sin bekvämlighetszon. Det låter lovande för alla som sysslar med Talent Management och ledarskap.   Att vara extremt duktig på sin sak är heller inte genetiskt betingad, visar Ericssons forskning. Däremot har de ...

Kvinnorna hävde sig in genom bilfönstret. Sex armar med bananklasar i händerna och en kakofoni av hårdsälj på Swahili. Min son tog fotot från baksätet. Det blev tyst i och med att vår guide Vincent betalade en av kvinnorna och tog en klase.  När vi senare körde genom några byar ber Vincent oss att dra upp rutorna, ifall vi skulle behöva stanna vid något hinder. Annars är risken stor att bilen stormas av gatuförsäljare som står längs vägen. De inte bara hårdsäljer utan kan helt resolut lämpa in sina varor genom bilrutorna, för att därefter kräva betalning för gjord leverans. I det läget är förhandlingsläget något begränsat för den bilande turisten. Det kan bli en dyr affär.  Vår guide berättade även om gatusäljarnas behovsanalys. De svarar ja på allt vad köparen frågar efter, sedan ger de vad de råkar ha och kräver betalt för det. Han ville själv köpa ett stycke rött Massajtyg. Det blev ett blått med kommentaren – It’s good for you.  Krängsälj verkar vara världens mest spridda säljt...

Hej, alla av er har säkert läst och hört om Uber och AirBnb åtskilliga gånger som bevis på hur digitaliseringen förändrar vår värld. Men har ni hört allt? Uber startade 2009 i San Francisco och finns idag i storstäder i ca 55 länder och expansionen fortsätter i snabb takt, så det kanske har tillkommit något land när ni läser detta, även om Uber också stött på patrull i vissa delar av Europa. Det har varit mycket kritik i både Frankrike och Sverige, och framförallt har det handlat om möjligheten till skattefusk och att förarna inte tvingas betala de licenser som den vanliga taxinäringen tvingas till. Kritiken mot skattefusk visade sig vara befogad åtminstone i den numera nedlagda delen som hette UberPOP, och som var en typ av samåkningstjänst. Av de 764 privatpersoner som Skatteverket har utrett som kört via tjänsten UberPOP, var det bara 32 som hade redovisat inkomsterna i deklarationen. Men… …var det verkligen inkomster? Jag återkommer till detta! I ett uttalande i SvD är Claudio ...

Det här är en siffra som dyker upp flera gånger när jag åker runt i Dalen (som svenskarna här säger), det är svårt att få den verifierad men efter åtta dagar på plats så kan jag iallafall konstatera att väldigt mycket av världens riskkapital placeras här. Och kanske det räcker för att locka er att åka över och känna på atmosfären, för det är enormt spännande även om jag personligen inte skulle vilja jobba där så ÄR det fascinerande. Silicon Valley har inga officiella gränser var det börjar och slutar och det växer hela tiden men i stora drag kan man säga att det är Santa Clara, San Jose, Mountain View, Palo Alto och delar av San Francisco, och om jag inte missuppfattat det helt så är det ungefär lika stort som Skåne. Och det byggs, överallt! Apple bygger ett nytt kontor för 18.000 anställda till en kostnad av ca 6 miljarder dollar, Salesforce bygger en skyskrapa, Facebook har tagit över det insomnade Suns lokaler som är stort som ett större kvarter, det är inte utan, att man här i ...

Affärsutmaningar, kommunikationsutmaningar, organisationsutmaningar… de finns där hela tiden. Det är spännande att få ta del av utmaningar med det är också en fantastisk känsla när man knäcker koden och vänder utmaningen till att bli en möjlighet. Jag får ofta frågan från mitt nätverk vilka utmaningar som andra har inom kommunikation och marknadsföring, och då gärna med betoningen på content marketing. Och som lärare på IHM Business School och som kommunikationsrådgivare på Chimney har jag en förmån i att löpande kunna ta del av företags olika utmaningar. Några av de utmaningar som jag har stött på under det senaste året tänkte jag dela med mig av här, tillsammans med exempel på vad som kan göra utmaningen till en möjlighet. Utmaning: Vi är fast i produktorienterad kommunikationDet finns många ursäkter till att fortsätta göra som man alltid har gjort. Och när det kommer till att kommunicera sina produkter och tjänster så fortsätter man gärna på samma sätt som tidigare. ”Vi måste öka...

... en modell som funkar vid lönesamtal, säljmöte, medarbetarsamtal – och femtioårskalas? Vi som gör podden ”Retoriskt!”, som IHM sponsrar, vill berätta om en metod som hjälper till att göra övertygande dragningar för mängder av sammanhang. Det här är en sjustegsmodell som vi har haft nytta av i pitcher och privata tal; om del i längre samtal; när vi har behövt bryta ner frågor och övertyga om förändringar.  Om du lär din 12-åring den lovar vi att du får det jobbigare när veckopengen ska förhandlas.   Inledning Fakta, underlag Motargument Argument för din lösning Lösning Konsekvens av lösningen (hur bra det kommer att bli) Avslutning Gör så här: Skriv först ner ditt underlag, punkt för punkt, i den här ordningen: 5, 6, 4, 3, 2, 1, 7 (det blir enklast). Kör sedan framförandet i sifferordning 1–7. Effekten är tydlig. Nu blir det exempel! Se på det här klippet från filmen ”Any given Sunday”. I ett avgörande ögonblick ska tränaren Al Pacino motivera sina spelare att fungera som ett lag...

Sidor