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

Har du tillräcklig självkännedom, och  viljan att bli bättre, för att bli den bästa  ledare du kan vara? Många av oss vet att det krävs en del tid och kraft på att förbättra vårt ledarskap, och ofta går det  tyvärr inte att enbart  ”härma” en förebild, eller att försöka ha en påklistrad fasad när du ska leda någon. Ditt ledarskap måste ha sin grund i vem du är och vad som är viktigast för dig. När du verkligen känner dig själv och vad du står för är det mycket lättare att veta vad du ska göra i de olika situationer som uppstår, både privat och i arbetslivet. Framför allt handlar det om att alltid se till att försöka göra det rätta och göra det bästa du kan i varje situation. Som min sexåring säger: Hur svårt kan det va! Det låter ju så enkelt. Självklart vet jag vem jag är och vad jag står för, men ibland är det svårare än vad vi tror eller kräver kanske mer jobb än vad vi förväntade oss. Att göra det rätta kan ibland vara en livslång utmaning. Lyckligtvis finns det olika teorier, m...

Morgondagens ledare, dvs de vi vill ha som ledare även om alltför få av dem själva vill bli ledare, är globala, social och demokratiska. De avskyr hierarkier, gillar att arbeta i team likaväl som själva och de kan ta beslut.  Men de är fortfarande livrädda för att prata inför folk. Precis som sina föregångare. De gör det, pratar inför folk alltså, men de är mer nervösa än vad Anja Pärson någonsin varit inför ett störtloppsåk i världstoppen. Om ditt dilemma är att du gärna skulle vilja ta på sig ett ledarskap och samtidigt är obekväm för att prata inför folk, skulle jag råda dig att hitta en person som känner igen sig i dig, men som övervunnit sin rädsla. Be personen vara din pratainförfolkmentor. Så länge det inte är en djup fobi vi pratar om räcker det långt att ha en klok och inkännande person att bolla med, någon som du kan vara ärlig med, som kan hjälpa dig att hitta på ett utmanande och samtidigt tryggt träningsprogram och utvärdera dina framgångar. Kanske din chef, arbetskamra...

Det finns data på allt, och i datan finns guld att gräva. På IHM Business School utbildas webanalytiker att konvertera svårtydd data till konkret och värdefull information. Christian Resell, vd på Svenssons i Lammhult, sitter i utbildningens ledningsgrupp. – Folk skriker efter de här kunskaperna, säger han. Efter chefsroller på bland annat Byggmax och Bubbleroom tog Christian Resell över som vd på det klassiska möbelföretaget Svenssons i Lammhult. Efter 19 månader i ledningen har han genomfört stora förändringar och bland annat tagit plats i yrkeshögskolan IHM Business Schools ledningsgrupp för utbildningen Digital Marketing & Sales Analytics.– Först och främst tackade jag ja för att det är kul. Vi ser även behovet av utbildningarna kring webanalys. Det ger mig också mycket personligen i form av kunskap och kontakter med studenter och företag. Data is the new black och resurser som kan analysera materialet i den digitala eran är mycket begränsade, säger Christian Resell. Utbildn...

För företag blir användandet av molnet lika viktig som Facebook, Netflix och Spotify har varit för privatpersoner hittills. Som ledare måste du veta hur användning av molnet påverkar ditt företag och dina anställda, och hur det kan bidra till att minska de totala IT-kostnaderna med minst 50%. IT förändringar som påverkar dig och ditt företag Ibland händer det så stora förändringar på IT-fronten att det kommer att påverka dig och ditt företag, oavsett vad du gör. Nej, jag talar inte om nya affärsmodeller från företag som Netflix, Spotify eller Uber. Visserligen erbjuder dessa bolag spännande tjänster där ny teknik är en viktig konkurrensfördel men om man inte arbetar med tv, musik eller taxiverksamhet så kommer dessa tjänster knappast att ha någon inverkan på hur du och ditt företag göra affärer idag. Däremot är användningen av molntjänster på företagsmarknaden en så stor förändring att den påverkar alla företag oavsett storlek och branschklassificering. Denna förändring har redan i...

Det går tyvärr allt för länge mellan inläggen här numera. Tiden lixom bara flyter iväg. En dag blev plötsligt en vecka. En vecka en månad… Just nu står jag och planerar inför vårt mässdeltagande på Elmia Automation i maj. Det är alltid en hel del som skall ordnas. Vi har under 2015 tagit fram flera nya produkter som skall marknadsföras, och det är alltid en utmaning att få med tillräckligt mycket teknisk information utan att det för den saken blir för detaljerat och därmed också ganska obegripligt för många. Man vill ju också ha en monter som sticker ut, men som för den sakens skull inte upplevs som oseriös. Ibland känner jag att skillnaden är hårfin. Men visst ska man ha lite roligt också? För ett par veckor sedan fick vi klart vårt bokslut. Känns så fantastisk med siffror som är de högsta hittills både för omsättning och vinst. Förra årets bokslut, dvs 2014, var ju minst sagt tråkigare siffror. Men så blir det ibland. Och som vi lärt oss. Just av den anledningen känns 2015års siff...

Jag är mentor åt Sophie Olsson Barnekow, 16 år, och Sophie har som ett skol- och bokprojekt intervjuat fem framgångsrika kvinnor i olika världsdelar. Sophies berättelse är intressant ur flera aspekter, inte minst vad gäller en ung kvinnas tankar kring karriär och jämställdhet. Såhär skriver hon: Som en stark och modig kvinna, har min mamma alltid varit en förebild åt mig. Hon har ofta pratat om kvinnors rättigheter och jag har haft glädjen att få följa med på evenemang där både män och kvinnor talat om lika möjligheter för båda könen. Därigenom har en passion för att skapa en jämlik och jämställd miljö växt inom mig. Då bestämde jag mig för att mitt personliga projekt i skolan skulle bli att ta upp det här viktiga ämnet, genom att visa perspektivet från några kvinnor och lyssna på deras berättelser. Jag visste att jag inte bara ville skriva 40 sidor av fakta och statistik - inte att det inte är viktigt, för det är det definitivt. Jag bestämde mig för att kontakta fem starka kvinnlig...

När vi försöker sälja något till en kund gör vi ofta ett mycket enkelt misstag. Detta misstag är väldigt enkelt att råda bot på som tur är. Misstaget är att man enbart ger kunden förslag på ett erbjudande. Det skall alltid vara två olika lösningar/erbjudanden som kunden skall få välja mellan. Det som händer då är att kunden behöver ta ställning till vilket av de två erbjudanden man skall välja och inte OM man skall välja. Detta är samma princip som när man skall boka ett möte över telefon, man ger kunden förslag på två datum/tider vilket oftast leder till att kunden behöver ta ställning till vad som passar bäst, inte OM vi skall ha ett möte eller inte. Detta kallas ibland för alternativmetoden... Om man skall vara något överdriven så skall man föreslå ett erbjudande som är större än det man tror att kunden är intresserad av och ett som är mindre, där det mindre erbjudandet är det man faktiskt har för avsikt att sälja från början. Oftast väljer kunden det som man anser är lägre i ris...

Organisationer och verksamheter står inför sin tids största affärsmässiga utmaning, att förändra sin verksamhet i grunden för att kunna möta en digitaliserad värld och det börjar med dig – ägare, styrelsemedlem och ledare. Det första steget är att bestämma sig för att anpassa verksamheten utifrån omvärldens förändringar. Det andra viktiga steget är att du och din ledning tar ett gemensamt ansvar för att förändra verksamheten i grunden. Anställ inget digitalt alibi*.  Lärdomar från dem som har lyckats i sina digitala transformationer visar att de styrelser och ledningar som tar kommando och återtar kontrollen över alla delar av verksamhetsutvecklingen ökar sin konkurrensförmåga. Att stärka sin konkurrenskraft med hjälp av digitalisering handlar inte om att driva ett IT projekt eller ett kommunikationsprojekt – det är aktiviteter som påverkar hela verksamheten – på alla nivåer. De har inte glömt bort att innovation är konkurrenskraftens urmoder och vågar utmana sin stabila och välmåen...

Hej vänner, sorry för dålig uppdatering på sistonde men jag passade på och att ladda batterierna rejält under påsken för att orka allt roligt som ligger framför mig nu under våren. Härom dagen lämnades boken in och bilden ni ser är det färdiga omslaget för boken. Stort tack till er som gav input till vilket omslag vi skulle gå på, det betydde massor! Är otroligt hedrad att vi har fått så fina omdömen från bland annat Per Schlingman, Maria Rankka och Lars Friberg. Vill ni så kan ni redan nu förhandsboka den på Adlibris, länken hittar ni här och en längre intervju kring boken hittar ni på Dagens Media och ni får gärna gilla bokens fanpage på Facebook för de senaste uppdateringarna. Nästa bloggpost så tänkte jag faktiskt ta och göra en Q&A som ni kan va med och påverka. Vilka digitala utmaningar eller funderingar har ni? Vad finns det som du skulle vilja ha svar på kring digitalisering eller digital marknadsföring? Ingen fråga är för liten och ingen fråga är för dum. Kommentera gä...

Det talas mycket om ”den nya generationen”. Vi läser och hör om dem som är välrustade och kravfyllda, medvetna om sina individuella rättigheter. Men vilka är de och hur bemöter vi dem i vardagen? Tänk om det är så att våra verksamheter inte klarar av att svara upp i mötet med den välrustade nya generationen? När jag gick i första klass var det viktigt att vara så tyst som möjligt. Jag gjorde inget väsen av mig förutom att räcka upp handen när jag hade rätt svar, allt för att få så bra betyg som möjligt. Det har gått många år sedan dess och när jag, bara för några veckor sedan, kikade in i ett klassrum för förstaklassare, började tankarna snurra ordentligt. På väggen i klassrummet satt ett stort collage med stora färgglada lappar: - Hur tänker du? Beskriv och förklara- Se samband- Jämför likheter och skillnader- Se konsekvenser- Vilka frågor måste du ställa för att hitta kärnan i ett problem?- Tänk själv – Tänk i par – Tänk tillsammans.  Vad händer på livets resa, när man redan i sj...

Oavsett var i livet du är uppstår det dagliga möjligheter att leda, både privat och i arbetslivet. Om vi tar dessa möjligheter seriöst ser vi själva till att många gånger skapa situationer där vi har möjligheten att leda och påverka andra, i motsatts till de som bara väntar på att få en titel eller att andra ska ge dem möjligheten att leda. En av de viktigaste ledarroller vi som individer någonsin kommer att ha är att uppfostra och utveckla våra barn. De flesta av oss strävar efter att uppnå någon form av framgång i både föräldraroll och ledarroll och vi försöker föregå med gott exempel och visa ett bra ledarskap. Om vi är allt för fokuserade på att alltid ha kontroll är chansen stor att vi istället börjar utöva vår makt. Många av oss har varit i situationer där enda utvägen känns som det är att ”muta” eller hota för att få till en önskad beteende förändring. Både mutor och hot kan fungera för stunden men är aldrig en bra långsiktig ledarskapsstrategi. Båda strategierna ökar sannol...

I höst är det premiär för YH-utbildningen Digital Marketing & Sales Analytics på IHM i Stockholm, Göteborg och Malmö. Utbildningen öppnar dörrar till framtidsyrken som onlinemarknadsförare, webbanalytiker, Digital Traffic Optimizer och Marketing Technologist och du får en mängd attraktiva certifieringar på köpet, t ex Google Analytics och Adwords. Behovet av digital kompetens är stort, och våra partnerföretag står redo att ta emot våra YH-studenter på praktik (LiA) och på sikt även att anställa.  Möt några av dina potentiella arbetsgivare här! "Digitaliseringen av samhället har inte ännu nått sin kulmen och det finns därför idag ett underskott av kompetens på arbetsmarknaden. Sett till vår nuvarande tillväxt har vi ett anställningsbehov om 10 personer inom en tvåårsperiod med kompetensen att utvärdera effekten av satsningar och vara en drivande part inom en iterativ optimering av företagens affärer. Enda anledningen till att vi inte expanderat fortare är pga svårigheterna att hi...

Hej igen! Kaxig rubrik på mitt blogginlägg den här gången. Jag är just nu besjälad av att innovativt mentorskap kan vara en oerhört effektiv hävstång för tillväxt.  Det behövs fler nya spännande företag som vill växa och bygga Sveriges framtida näringsliv. Ericsson, Atlas-Copco, Sandvik, jättefina ädelstenar i svenskt näringsliv. Men, det är inte där tillväxten och jobben finns. Jobben finns i alla de små kreativa och innovativa företag som växer fram. Drivna av entreprenörer och kreatörer som vill bygga ett företag. Underbart att ni finns! Att sitta i förarsätet i ett tillväxtföretag är något av det mest spännande man kan göra. Samtidigt något av det jobbigaste man kan göra. Fatta alla viktiga beslut, ofta själv. Vilken marknadsstrategi ska väljas? Hur ska verksamheten finansieras? När ska nästa kollega anställas. Vilken kravprofil behövs för produktchefen i det nya affärsområdet? Digitaliseringens möjligheter och hot. Allt detta kan göra den bäste gråhårig i förtid. Som tillväxtfö...

Hur gick det sedan? Vi kan naturligtvis inte följa upp alla våra studenter och deltagare men vår ambition är att göra några nedslag under året. Först ut är Mikaela Friberg, som blev examinerad och diplomerad Säljare IT Solutions på IHM Yrkeshögskola för snart ett år sedan. Vi lämnar över ordet till Mikaela. Det var egentligen först under utbildningens andra praktikperiod som jag kände att jag var tvungen att testa på detta här med att sälja IT-lösningar, eftersom jag ändå gick en IT-inriktad utbildning. Dessförinnan hade jag varit fast besluten att arbeta med marknadsföring ungefär som på min första praktik på Nelly.com.  Ju längre tiden gick på min andra praktik på Make IT, ju mer förstod jag hur komplex IT-försäljning är och jag måste säga att de långa säljprocesserna och stora projekten, många gånger skrämde mig. Men jag hade en fantastiskt handledare, en kvinna utan IT-bakgrund, med ett stort driv och engagemang, som fick mig att börja fundera; om hon, visserligen med många mer ...

Många företag gör det svårt för kunden att köpa. Många säljare gör dessutom det ännu svårare då man inte förstår kundens situation och kopplar erbjudande mot behovsbilden. Man komplicerar saker med fackuttryck och krångliga affärsmodeller. Otydliga kostnadsbeskrivningar och prisupplägg. Man fokuserar dessutom ofta på egenskaper i det man erbjuder och inte på fördelar som det har för kunden och vilken innebörd dessa fördelar får i kundens verksamhet. Vilken fördel och innebörd det har för kunden kan man enbart få svar på genom att man först gör en konsekvent behovsanalys och verkligen sätter sig in i kundens verksamhet. Att på djupet förstå ”varför” kunden får effekt av det vi erbjuder och vilka orsaker det är att just vårt erbjudande passar kunden bäst och vad den reella nyttan är för kunden är viktigt. Men… det kräver en viss grad av kvalitet i säljarbetet för att klara av detta. Problemet är att många företag och säljare inte har förstått, eller valt att sätta sig in i hur kunden ...

Kärnan i Content marketing är ju att ta fram relevant innehåll för en definierad målgrupp. Ändå är det vanligt att efter en inledande rusch så sinar posterna, filmerna och annat innehåll. “Vi har inget att säga” eller “Det finns inget att berätta om” är vanliga förklaringar till varför innehållsproduktionen blir alltmer oregelbunden och inte sällan slutar helt och hållet. I den här posten vill jag ge dig några konkreta metoder för att ditt företag inte ska hamna i en sådan situation. Det här är min fjärde post för IHM i en serie där jag listar fyra utmaningar och fem möjligheter med content marketing. I den första posten gav jag min definition på vad content marketing är. Den andra handlade om utmaningen med att ta reda på vad vi egentligen åstadkomma med content marketing. Nummer tre handlade om vikten av att välja en tydlig målgrupp. Nu är det alltså dags att borra ned i frågan hur ditt företag lyckas ta fram relevant innehåll och dessutom göra det över lång tid. För att få ordni...

Sidor