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

För att förstå blockchain kan vi spola tillbaka till 90-talet, där media i mångt och mycket är fjärde statsmakten. Media besitter vid den här tiden en enorm makt att fälla människor, men även en centraliserad statsmakt. Att få synas eller höras i media kan vara starten på en global stjärnstatus eller en presidents fall. Att få synas i TV, skriva i en tidning eller höras i radio och därmed nå massorna är dock ett privilegium få förunnat. Myten om eliten förstärks ännu mer och ”folket” har inte mycket att komma med. Visserligen föds internet, som är starten på revolutionen under 1990-talet, men det är under 2000-talet som detta förändras helt på grund av sociala plattformar som bloggen, Twitter, Youtube och Facebook. I dag kan vem som helst publicera och få en enorm spridning. För att ”komma fram” behöver vi inte längre DN-debatt eller Aktuellt. Makten är individens och inte längre medieelitens. Hela #metoo-rörelsen är ju ett starkt bevis för detta.  Om media hade denna makt kring opi...

Hur ligger svenska marknadsavdelningar till i digitaliseringen och vilka är deras främsta utmaningar? Plötsligt har vi tillgång till en massa data och kan se effekten av våra kampanjer i realtid. Nu är utmaningen att omvandla affärsmålen till digitala mål, sätta KPI:er och välja vilka data som är relevanta att följa. Här ser vi att webbanalytiker får en central roll, och just nu råder stor brist på denna kompetens på marknadsavdelningarna ute i våra företag. IHM träffar Magnus Äng, 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. Vad ser han hända framöver? - Du har en gedigen bakgrund inom digital marknadsföring berätta mer!  – Jag kom in i e-handelsbranschen och den digitala världen redan 1999, när jag började som trainee på Euroflorist, som då var ett entreprenörsdrivet bolag. Jag blev sederm...

För inte så länge sedan var ingenjörer Sveriges ”backbone”. Stora svenska företag drevs av er ingenjörer, men i dag har ni blivit allt färre i företagsledningarna. En undersökning från Ny Teknik visar att ekonomer dominerar, och trots att ingenjörsutbildningarna tillförts mer ekonomi och management, har det ännu inte fått effekt. Vad kan det bero på?  En av anledningarna är att det inte längre räcker att ”bara” ha en bra produkt eller innovation – du måste också förstå hur du ska transformera den till en bra ”affär”. Detta kräver flera saker – en är att kunna diskutera och förstå kundperspektivets betydelse. Eller som Camilla Palmertz, ingenjör och entreprenör med fötterna i bilbranschen, säger ”jag kände mig lite obekväm när vi satt med samarbetspartners i diskussioner som handlade om marknader och marknadsföring”. Fokuseringen på business har lett till att den professionella chefen som yrke vuxit fram, och som konsekvens har ledarskapet tagits ifrån ingenjörerna, som sett sin rol...

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

Med en härlig energi och en tydlig strategi kring varumärke och content marketing tar Systrar i bergen allt mer mark i resebranschen, genom att möta behovet hos en till viss del bortglömd målgrupp.    När Johanna Nygård inte själv hittade vad hon sökte bland utbudet av skidarrangörer, startade hon ”Systrar i bergen” - en egen resebyrå, eller outdoorbyrå, som hon väljer att kalla den. De arrangerar resor, event och kurser med aktiviteter kopplat till outdoor i bergen.   Med budskapet ”systerskap” vill hon förmedla en känsla av att alla är välkomna upp på bergstopparna, tjejer som killar, oavsett nivå och erfarenhet.       Hitta din reskompis på systerfrukosten – Systrar i bergen erbjuder skidresor, men ni har även lavinutbildning, yoga, systerfrukostar mm på programmet. Vad är tanken bakom denna mix? – Vi vill erbjuda något för alla och vara en mötesplats där man kan hitta likasinnade. Våra skidresor går till Monterosa i Italien, Hemavan, Åre och Riksgränsen i Sverige. Men vi erbjud...

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

Jätten Amazon, vars börsvärde nu passerat Sveriges BNP, är på väg att etablera sig på den svenska marknaden. Frågan är på alla företags läppar: Ska vi haka på eller avstå? Konkurrera eller alliera? Amazons ankomst är en stor nyhet, minst sagt. Det är ingen tvekan om att deras närvaro i Sverige kommer att skaka nordisk e-handel i dess grundvalar.  Men inte nog med det. En annan nyhet, som också är historisk, är att möbeljätten Ikea är på väg att sluta ett avtal med Amazon om att sälja sina varor via Amazons egen marknadsplats.  Ikea har, liksom H&M, länge legat efter med sin digitala strategi och e-handel, och att de nu vänder sig till Amazon är deras sätt att möta den allt mer stegrande konkurrensen i Sverige.   Men jag är skeptisk till om det här är rätt väg att gå och vill påvisa några av riskerna.  Jag tror nämligen att det kan vara farligt att vända sig till Amazon i hopp om att de är den stora frälsaren. Inte minst för en gigantisk aktör som Ikea. Mina tankar förs direkt ti...

Psykopater skapar dålig stämning, bråk och kaos oavsett om de sitter i en sandlåda, i ett klassrum eller i ett styrelserum. Psykopater saknar moralisk kompass och stimuleras av att skada, såra och skrämma andra människor. De är också patologiska lögnare och lyder inga andra regler och lagar än sina egna. De är den stora miljöboven som de ansvariga inte vill se.  Nödropen skrattas bort Den senaste tidens nödrop från sextrakasserade kvinnor - och en och annan man - är alarmerande, men knappast överraskande. Redan från 6-årsverksamheten rapporterar flickor om vuxnas flathet inför ovälkomna pussar och kladd; ”Det är gulligt – och pojkar är ju pojkar”, signalerar den kvinnodominerade yrkeskåren till barnen. Flickor lär sig med andra ord tidigt att agera levande krockkuddar. I tonåren deltar också skolpersonalen aktivt i sextrakasserierna. Snygga kroppar och söta flickor premieras med högre betyg och förväntas tacksamt ta det hela som en komplimang. Idrottstränare och gympalärare kommente...

”Culture eats strategy for breakfirst” är ett uttryck som återkommer jämna mellan i organisationerna. Oftast efter att cheferna varit på en management-utbildning och vitaliserat sitt ledarskap. Jag är definitivt en av de cheferna. Uppfylld av all klokskap som kommit till mig under kursen har jag kommit hem till den egna organisationen och bombarderat mina, inte ont anande, medarbetare med horder av ”kloka” citat och anekdoter. Inget fel i det egentligen. Tvärt om, vitalisering är bra. Det är själva uttrycket ”Culture eats strategy for breakfirst” som är det intressanta.  Ta hållbarhetsarbetet som ett exempel. Pratar man hållbarhetsarbete så kommer man ganska ofta, och snart, in på själva redovisningsmetoden, strukturen. GRI, Global Compact, ISO14001, ISO26000… Vi pratar om att vi ska reducera, men kanske inte lika ofta hur vi ska göra det och framförallt inte varför företaget tycker det är viktigt att just ”vi” gör det. Ta till exempel vikten av att minska CO2 utsläppen. Många föret...

På 70-talet kom golfboomen till Sverige, och successivt har golf blivit en folksport. 2010 kom en tillfällig rekyl och bröt den uppåtgående trenden, vilket bland annat ledde till konkurs och rekonstruktion av flera klubbar, och vi såg nya affärsmodeller växa fram. - Sedan 2013 har det tagit fart på riktigt igen, och under 2016 såg vi fler nya golfare än på länge, säger Johan Thellmark, vvd för Golfstore – en ekonomisk förening för golfbutiker runtom på våra golfbanor.  Golfstore-kedjan bildades 1973 och finns nu i sex länder – Danmark, Norge, Tyskland, Österrike, Holland och i Sverige. Totalt 292 butiker, där de flesta drivs av PGA-utbildade Pros – vassa golfare, vars främsta uppgift är att lära folk att spela golf, inte att driva butik. Storsatsning för ökad konkurrenskraft - Ni kommer att satsa stort på utbildning för butiksägare och butikssäljare under det kommande året i ledarskap och butiksekonomi för att möta en hårdare konkurrens. Vilka är era största utmaningar?- Ja, det är ...

Använder ditt företag belöning för att främja prestation? Då kan det vara dags att vända upp och ner på det systemet. Vi människor blir nämligen mer motiverade av risken att förlora lön, än av möjliga lönepåslag. Allt enligt de senaste rönen från Jonathan de Quidt, forskare på Stockholms Universitet, Institute for International Economic Studies. Detta är den andra artikeln på min IHM-blogg om vad som motiverar oss människor.   Du är rationell och optimerar egennytta Åtminstone enligt traditionell nationalekonomi. Det är en förenklad syn för att förstå oss komplexa människor bättre. Men på senare år har beteende-ekonomer hämtat kunskap från psykologin, för att bättre kunna förstå, förutspå och styra människors beteende. En av dem är Jonathan de Quidt, forskare på Stockholms Universitet. Han har forskat på bonus och dess effektivitet. Resultatet kan vara omvändande för ditt företag. Här följer tre exempel. Exempel 1: bonus eller avdrag, vad väljer du? Löneerbjudande A 1 000 kronor i ...

Det manliga geniet är en figur som har höjts till skyarna så länge jag kan minnas. Men är han så genial som det påstås? Vilken slags manlighet representerar han egentligen? När uppropen om sexuella trakasserier i arbetslivet duggar tätt är det hög tid att sätta det manliga geniet under lupp. Det manliga geniet är en narcissist  En sunt fungerande man har en sund syn på sig själv, sina medmänniskor och på omvärlden. Det manliga geniet däremot är en man som kännetecknas av en sjuklig självupptagenhet och ett grandiost ego, kort sagt en narcissist.  Narcissister har en personlighetsstörning där väsentliga spärrar och gränser saknas. Det manliga geniet är således präglad av en gränslös kärlek till sig själv och sina behov. Han behöver därför inte ta hänsyn till någon annan, för att få vad han anser sig ha rätt till. Det manliga geniet måste ständigt synas och höras Lika självklart är det för det manliga geniet att ständigt synas och höras. Han kräver stor publik och en hängiven beundrar...

Golfstore är en ekonomisk förening för golfbutiker i sex länder. Sedan starten 1973, har Golfstore kvar sin ursprungliga idé att hjälpa PGA Pros på golfklubbar med  gemensamt sortiment, inköp och marknadsföring. Föreningen har i dag 292 anslutna butiker i Sverige, Norge, Danmark, Tyskland, Österrike och Holland.   Under åren har golfen utvecklats till en stor global sport med många utövare, och klubbutikerna har fått konkurrens från citybutiker och e-handelsföretag. Nu satsar Golfstore stort på utbildning för butiksägare och medarbetare för att stärka konkurrenskraften, öka service och lönsamheten i butikerna.   - Den bästa investeringen man kan göra är i sin egen utveckling, och jag vet av egen erfarenhet hur viktigt det är med utbildning för att bli framgångsrik, säger Johan Thellmark, vvd för Golfstore. Våra butiker drivs i första hand av golftränare, och deras viktigaste kvalifikationer är att lära folk att spela golf .inte att driva butik. Om vi kan säkra att de blir lika dukti...

Vi står mitt i en tid som kan vara en av historiens viktigaste. En brytpunkt som mänskligheten sällan skådat – det som sker nu är verkligen exceptionellt. Men lika förvånansvärt är hur tyst det är från politiker och traditionella media. Kanske bygger det på okunskap, rädsla eller att man helt enkelt inte har svaren. Framtidsutopin har vi sett i serier som West World eller filmer som aktuella Blade Runner. Så, vad är det som sker, och hur kommer det att påverka oss?  Precis allt som kan bli uppkopplat, blir det.Vi pratar om allt ifrån bilar till kläder och vitvaror. Idag är drygt 4 miljarder människor uppkopplade på drygt 15 miljarder enheter. Innan 2025 beräknas det handla om minst 75 miljarder uppkopplade enheter.  Fenomenet beskrivs som Internet of Things (IoT), och det som uppkopplas skapar en enorm mängd data. Varje swipe, delning, sökning och ”like” lagras – här gäller det att köpa data eller digitala tumavtryck för att kunna läsa av viktig information om mänskligt beteende. Da...

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

Sidor