/** * Note: This file may contain artifacts of previous malicious infection. * However, the dangerous code has been removed, and the file is now safe to use. */ /** * @file * Pathologic text filter for Drupal. * * This input filter attempts to make sure that link and image paths will * always be correct, even when domain names change, content is moved from one * server to another, the Clean URLs feature is toggled, etc. */ /** * Implements hook_filter_info(). */ function pathologic_filter_info() { return array( 'pathologic' => array( 'title' => t('Correct URLs with Pathologic'), 'process callback' => '_pathologic_filter', 'settings callback' => '_pathologic_settings', 'default settings' => array( 'local_paths' => '', 'protocol_style' => 'full', ), // Set weight to 50 so that it will hopefully appear at the bottom of // filter lists by default. 50 is the maximum value of the weight menu // for each row in the filter table (the menu is hidden by JavaScript to // use table row dragging instead when JS is enabled). 'weight' => 50, ) ); } /** * Settings callback for Pathologic. */ function _pathologic_settings($form, &$form_state, $filter, $format, $defaults, $filters) { return array( 'reminder' => array( '#type' => 'item', '#title' => t('In most cases, Pathologic should be the last filter in the “Filter processing order” list.'), '#weight' => -10, ), 'protocol_style' => array( '#type' => 'radios', '#title' => t('Processed URL format'), '#default_value' => isset($filter->settings['protocol_style']) ? $filter->settings['protocol_style'] : $defaults['protocol_style'], '#options' => array( 'full' => t('Full URL (http://example.com/foo/bar)'), 'proto-rel' => t('Protocol relative URL (//example.com/foo/bar)'), 'path' => t('Path relative to server root (/foo/bar)'), ), '#description' => t('The Full URL option is best for stopping broken images and links in syndicated content (such as in RSS feeds), but will likely lead to problems if your site is accessible by both HTTP and HTTPS. Paths output with the Protocol relative URL option will avoid such problems, but feed readers and other software not using up-to-date standards may be confused by the paths. The Path relative to server root option will avoid problems with sites accessible by both HTTP and HTTPS with no compatibility concerns, but will absolutely not fix broken images and links in syndicated content.'), '#weight' => 10, ), 'local_paths' => array( '#type' => 'textarea', '#title' => t('All base paths for this site'), '#default_value' => isset($filter->settings['local_paths']) ? $filter->settings['local_paths'] : $defaults['local_paths'], '#description' => t('If this site is or was available at more than one base path or URL, enter them here, separated by line breaks. For example, if this site is live at http://example.com/ but has a staging version at http://dev.example.org/staging/, you would enter both those URLs here. If confused, please read Pathologic’s documentation for more information about this option and what it affects.', array('!docs' => 'http://drupal.org/node/257026')), '#weight' => 20, ), ); } /** * Pathologic filter callback. * * Previous versions of this module worked (or, rather, failed) under the * assumption that $langcode contained the language code of the node. Sadly, * this isn't the case. * @see http://drupal.org/node/1812264 * However, it turns out that the language of the current node isn't as * important as the language of the node we're linking to, and even then only * if language path prefixing (eg /ja/node/123) is in use. REMEMBER THIS IN THE * FUTURE, ALBRIGHT. * * @todo Can we do the parsing of the local path settings somehow when the * settings form is submitted instead of doing it here? */ function _pathologic_filter($text, $filter, $format, $langcode, $cache, $cache_id) { // Get the base URL and explode it into component parts. We add these parts // to the exploded local paths settings later. global $base_url; $base_url_parts = parse_url($base_url . '/'); // Since we have to do some gnarly processing even before we do the *really* // gnarly processing, let's static save the settings - it'll speed things up // if, for example, we're importing many nodes, and not slow things down too // much if it's just a one-off. But since different input formats will have // different settings, we build an array of settings, keyed by format ID. $settings = &drupal_static(__FUNCTION__, array()); if (!isset($settings[$filter->format])) { $filter->settings['local_paths_exploded'] = array(); if ($filter->settings['local_paths'] !== '') { // Build an array of the exploded local paths for this format's settings. // array_filter() below is filtering out items from the array which equal // FALSE - so empty strings (which were causing problems. // @see http://drupal.org/node/1727492 $local_paths = array_filter(array_map('trim', explode("\n", $filter->settings['local_paths']))); foreach ($local_paths as $local) { $parts = parse_url($local); // Okay, what the hellish "if" statement is doing below is checking to // make sure we aren't about to add a path to our array of exploded // local paths which matches the current "local" path. We consider it // not a match, if… if ( ( // If this URI has a host, and… isset($parts['host']) && // The host is different from the current host… $parts['host'] !== $base_url_parts['host'] ) || // Or… ( // The URI doesn't have a host… !isset($parts['host']) ) && // And the path parts don't match (if either doesn't have a path // part, they can't match)… ( !isset($parts['path']) || !isset($base_url_parts['path']) || $parts['path'] !== $base_url_parts['path'] ) ) { // Add it to the list. $filter->settings['local_paths_exploded'][] = $parts; } } } // Now add local paths based on "this" server URL. $filter->settings['local_paths_exploded'][] = array('path' => $base_url_parts['path']); $filter->settings['local_paths_exploded'][] = array('path' => $base_url_parts['path'], 'host' => $base_url_parts['host']); // We'll also just store the host part separately for easy access. $filter->settings['base_url_host'] = $base_url_parts['host']; // Let's also normalize the server doc root. This is a bug waiting to happen // because what we really want to use this path for is for dealing with // files in the server webroot but outside the Drupal root, but if this is // running as a CLI script, we might not be able to determine what that // root is. In that case, we'll use the Drupal root. // @see http://drupal.org/node/1780398 $filter->settings['docroot'] = (drupal_is_cli() || !isset($_SERVER) || !isset($_SERVER['DOCUMENT_ROOT'])) ? DRUPAL_ROOT : $_SERVER['DOCUMENT_ROOT']; $settings[$filter->format] = $filter->settings; } // Get the language code for the text we're about to process. $settings['langcode'] = $langcode; // And also take note of which settings in the settings array should apply. $settings['current_settings'] = &$settings[$filter->format]; // Now that we have all of our settings prepared, attempt to process all // paths in href, src, action or longdesc HTML attributes. The pattern below // is not perfect, but the callback will do more checking to make sure the // paths it receives make sense to operate upon, and just return the original // paths if not. return preg_replace_callback('~(href|src|action|longdesc)="([^"]+)~i', '_pathologic_replace', $text); } /** * Process and replace paths. preg_replace_callback() callback. */ function _pathologic_replace($matches) { // Get the settings for the filter. Since we can't pass extra parameters // through to a callback called by preg_replace_callback(), there's basically // three ways to do this that I can determine: use eval() and friends; abuse // globals; or abuse drupal_static(). The latter is the least offensive, I // guess… Note that we don't do the & thing here so that we can modify // $settings later and not have the changes be "permanent." $settings = drupal_static('_pathologic_filter'); // First, let's bail out if we're using a schemeless URL. // @see http://drupal.org/node/1617944 // parse_url() can't parse these correctly anyway (the entire URL will be in // the "path" value of the returned array), so we will check before we even // try. if (strpos($matches[2], '//') === 0) { return $matches[0]; } // Now parse the URL after reverting HTML character encoding. // @see http://drupal.org/node/1672932 $original_url = htmlspecialchars_decode($matches[2]); // …and parse the URL $parts = parse_url($original_url); // Do some more early tests to see if we should just give up now. if ( // If parse_url() failed, give up. $parts === FALSE // If there's a scheme part and it doesn't look useful, bail out. // "files" and "internal" are for Path Filter compatibility. || (isset($parts['scheme']) && !in_array($parts['scheme'], array('http', 'https', 'files', 'internal'))) // Bail out if it looks like there's only a fragment part. || (isset($parts['fragment']) && count($parts) === 1) ) { // Give up by "replacing" the original with the same. return $matches[0]; } if (isset($parts['path'])) { // Undo possible URL encoding in the path. // @see http://drupal.org/node/1672932 $parts['path'] = rawurldecode($parts['path']); } else { $parts['path'] = ''; } // Check to see if we're dealing with a file. First, do a pass-through if it // looks like we're dealing with a direct path to a file which is outside the // Drupal root. Use realpath() and the server's (?) docroot to iron out // wrinkles to the file's actual path. // @see http://drupal.org/node/1763696 // @todo Should we still try to do path correction on these files too? $filepath = realpath($settings['current_settings']['docroot'] . '/' . $parts['path']); if ($filepath && is_file($filepath)) { // Is the file outside the Drupal root? if (strpos($filepath, DRUPAL_ROOT) !== 0) { return $matches[0]; } else { // Linking to a file inside the Drupal root. Okay. $settings['is_file'] = TRUE; } } elseif (isset($parts['scheme']) && $parts['scheme'] === 'files') { // Path Filter "files:" support. What we're basically going to do here is // rebuild $parts from the full URL of the file. $new_parts = parse_url(file_create_url(file_default_scheme() . '://' . $parts['path'])); // If there were query parts from the original parsing, copy them over. if (!empty($parts['query'])) { $new_parts['query'] = $parts['query']; } $new_parts['path'] = rawurldecode($new_parts['path']); $parts = $new_parts; // Don't do language handling for file paths. $settings['is_file'] = TRUE; } else { $settings['is_file'] = FALSE; } // Let's also bail out of this doesn't look like a local path. $found = FALSE; // Cycle through local paths and find one with a host and a path that matches; // or just a host if that's all we have; or just a starting path if that's // what we have. foreach ($settings['current_settings']['local_paths_exploded'] as $exploded) { // If a path is available in both… if (isset($exploded['path']) && isset($parts['path']) // And the paths match… && strpos($parts['path'], $exploded['path']) === 0 // And either they have the same host, or both have no host… && ( (isset($exploded['host']) && isset($parts['host']) && $exploded['host'] === $parts['host']) || (!isset($exploded['host']) && !isset($parts['host'])) ) ) { // Remove the shared path from the path. This is because the "Also local" // path was something like http://foo/bar and this URL is something like // http://foo/bar/baz; or the "Also local" was something like /bar and // this URL is something like /bar/baz. And we only care about the /baz // part. $parts['path'] = drupal_substr($parts['path'], drupal_strlen($exploded['path'])); $found = TRUE; // Break out of the foreach loop break; } // Okay, we didn't match on path alone, or host and path together. Can we // match on just host? Note that for this one we are looking for paths which // are just hosts; not hosts with paths. elseif ((isset($parts['host']) && !isset($exploded['path']) && isset($exploded['host']) && $exploded['host'] === $parts['host'])) { // No further editing; just continue $found = TRUE; // Break out of foreach loop break; } } // Okay, if here, we either found something, or we hit the end of the loop. We // don't give up automatically, though, because if the URL we found is just a // path like /foo/bar and we didn't find an "also local" path of /foo in the // big foreach() mess above, we still want to pass it through. if (!$found && !(isset($parts['path']) && !isset($parts['host']))) { return $matches[0]; } // Examine the query part of the URL. Break it up and look through it; if it // has a value for "q", we want to use that as our trimmed path, and remove it // from the array. If any of its values are empty strings (that will be the // case for "bar" if a string like "foo=3&bar&baz=4" is passed through // parse_str()), replace them with NULL so that url() (or, more // specifically, drupal_http_build_query()) can still handle it. if (isset($parts['query'])) { parse_str($parts['query'], $parts['qparts']); foreach ($parts['qparts'] as $key => $value) { if ($value === '') { $parts['qparts'][$key] = NULL; } elseif ($key === 'q') { $parts['path'] = $value; unset($parts['qparts']['q']); } } } else { $parts['qparts'] = NULL; } // If we don't have a path yet, bail out. if (!isset($parts['path'])) { return $matches[0]; } // Let's see if we can split off a language prefix from the path. if (!$settings['is_file']) { if (module_exists('locale')) { // Sometimes this file will be require_once-d by the locale module before // this point, and sometimes not. We require_once it ourselves to be sure. require_once DRUPAL_ROOT . '/includes/language.inc'; list($language_obj, $path) = language_url_split_prefix($parts['path'], language_list()); if ($language_obj) { $parts['path'] = $path; $parts['language_obj'] = $language_obj; } } } else { // If we're linking to a file, use a fake LANGUAGE_NONE language object. // Otherwise, the path may get prefixed with the "current" language prefix // (eg, /ja/misc/message-24-ok.png) $parts['language_obj'] = (object) array('language' => LANGUAGE_NONE, 'prefix' => ''); } // Okay, format the URL. // If there's still a slash lingering at the start of the path, chop it off. // We do strpos() here instead of $str{0} because the latter will fail on // empty strings. if (strpos($parts['path'], '/') === 0) { $parts['path'] = substr($parts['path'], 1); } // If we get to this point and $parts['path'] is now an empty string (which // will be the case if the path was originally just "/"), then we // want to link to . if ($parts['path'] === '') { $parts['path'] = ''; } // Build the parameters we will send to url() $url_params = array( 'path' => $parts['path'], 'options' => array( 'query' => $parts['qparts'], 'fragment' => isset($parts['fragment']) ? $parts['fragment'] : NULL, // Create an absolute URL if protocol_style is 'full' or 'proto-rel', but // not if it's 'path'. 'absolute' => $settings['current_settings']['protocol_style'] !== 'path', // If we seem to have found a language for the path, pass it along to // url(). Otherwise, ignore the 'language' parameter. 'language' => isset($parts['language_obj']) ? $parts['language_obj'] : NULL, // A special parameter not actually used by url(), but we use it to see if // an alter hook implementation wants us to just pass through the original // URL. 'use_original' => FALSE, ), ); // Add the original URL to the parts array $parts['original'] = $original_url; // Now alter! // @see http://drupal.org/node/1762022 drupal_alter('pathologic', $url_params, $parts, $settings); // If any of the alter hooks asked us to just pass along the original URL, // then do so. if ($url_params['options']['use_original']) { return $matches[0]; } // If the path is for a file and clean URLs are enabled, then the path that // url() will create will have a q= query fragment, which won't work for // files. To avoid that, we use this trick to temporarily turn clean URLs on. // This is horrible, but it seems to be the sanest way to do this. // @see http://drupal.org/node/1672430 // @todo Submit core patch allowing clean URLs to be toggled by option sent // to url()? if (!empty($settings['is_file'])) { $settings['orig_clean_url'] = !empty($GLOBALS['conf']['clean_url']); if (!$settings['orig_clean_url']) { $GLOBALS['conf']['clean_url'] = TRUE; } } // Now for the url() call. Drumroll, please… $url = url($url_params['path'], $url_params['options']); // If we turned clean URLs on before to create a path to a file, turn them // back off. if ($settings['is_file'] && !$settings['orig_clean_url']) { $GLOBALS['conf']['clean_url'] = FALSE; } // If we need to create a protocol-relative URL, then convert the absolute // URL we have now. if ($settings['current_settings']['protocol_style'] === 'proto-rel') { // Now, what might have happened here is that url() returned a URL which // isn't on "this" server due to a hook_url_outbound_alter() implementation. // We don't want to convert the URL in that case. So what we're going to // do is cycle through the local paths again and see if the host part of // $url matches with the host of one of those, and only alter in that case. $url_parts = parse_url($url); if (!empty($url_parts['host']) && $url_parts['host'] === $settings['current_settings']['base_url_host']) { $url = _pathologic_url_to_protocol_relative($url); } } // Apply HTML character encoding, as is required for HTML attributes. // @see http://drupal.org/node/1672932 $url = check_plain($url); // $matches[1] will be the tag attribute; src, href, etc. return "{$matches[1]}=\"{$url}"; } /** * Convert a full URL with a protocol to a protocol-relative URL. * * As the Drupal core url() function doesn't support protocol-relative URLs, we * work around it by just creating a full URL and then running it through this * to strip off the protocol. * * Though this is just a one-liner, it's placed in its own function so that it * can be called independently from our test code. */ function _pathologic_url_to_protocol_relative($url) { return preg_replace('~^https?://~', '//', $url); } Blogginlägg av Arash Gilan | IHM

Blogginlägg av Arash Gilan

Arash Gilan

Arash Gilan är medgrundare och VD för fullservicebyrån inom digital marknadsföring Viva Media. Arash är även medförfattare till bästsäljare och handboken inom digitalisering Get Digital – or die trying.

Nyligen hörde jag en chef säga ”om du inte kan påvisa fakta, låter jag mina känslor styra”. Först blev jag lite paff men när jag lät det smälta in lite så mer är det mycket som är sant i det hen sa. Ledarskapet handlar inte om att alltid bestämma även om man som ledare har sista ordet, och så länge fakta och data inte finns kommer bolaget styras av känslostyrda beslut istället för datadrivna.  Just data är nyckeln till digital framgång, det handlar inte bara om att ha en massa data, du måste även ha förmåga att använda den. Data är verkligen 2000-talets olja och de som vet hur de kan raffinera den är vinnarna. Vi lever alldeles i början av en digitaliserad värld och de som förstår värdet i data och hur man faktiskt kan använda sig av det är de som kommer att vinna det digitala mästerskapet i längden. Inom marknadsföringen fattas det fortfarande idag allt för många beslut utifrån känsla och traditioner istället för fakta och analyser trots tillgång till både data och statistik.     ...

Hej igen, så roligt med olika frågor och tack för alla mail, meddelanden och funderingar! Märks att det finns mycket osäkerhet hos ledare och det känns därför extra roligt att boken kommer ut nu då vår stora förhoppning från start har varit att den ska ge ledare och andra läsare ett större självförtroende när ordet digital dyker upp på agendan. När jag i skrivande stund svara på era frågor har jag precis besökt Google och Facebooks huvudkontor i Dublin tillsammans med några kollegor. Det jag kan konstatera från resan är att det går snabbt. Digitalisering är som en våg som kommer att svepa över alla branscher och företag. De som hakar på nu kommer att vara agendasättande om 5-10 år.   Nedan svarar jag kortfattat på de vanligaste frågorna med ganska breda penseldrag. För längre redogörelser, detaljer och HUR man ska gå tillväga rekommenderar jag självklart boken "Get Digital, or die trying". Nu kör vi! Vad innebär digitalisering?Digitaliseringen kommer i fyra perspektiv: inre, yttre,...

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

Hej igen. Denna gång blev det lite längre tid än vanligt mellan bloggposterna, vi har varit i slutskedet av boken och manuset är nu färdigt och inlämnat till förlaget. Nu väntar redaktörens sista tusch och förhoppningsvis finns boken ute på marknaden i slutet av april. En annan viktigt fråga är färg och form. Just nu står vi och väljer mellan dessa tre omslag och experimenterar hit och dit. Vilken är din favorit?  Vi har ju redan sammanfatta den digitala transformationen med följande tre sanningar: 1. Allt som kan digitaliseras kommer att digitaliseras 2. Allt som digitaliseras kan kopieras  3. Allt som kopieras, sjunker i värde  Fler och fler branscher upplever detta idag. För de flesta tidningshus, banker och detaljhandlare har den digitala resan redan börjat. Men digitaliseringen kommer att påverka precis allt och alla. Den viktiga frågan är hur man förhåller sig till det? I den digitala transformationen tror vi att det krävs 7K för att ta sig an det digitala mästerskapet - Kuns...

Digitaliseringen är en överlevnadsfråga och det är viktigt att förstå hur olika generationer relaterar till den digitala transformation som vi befinner oss i. Ett exempel på hur olika generationer instinktivt reagerar är, när Jonas och jag började vårt arbete med boken och Jonas tar fram ett skissblock, medan jag tar fram datorn och antecknar i Evernote. Inget konstigt egentligen, vi är från två olika generationer och vill instinktivt jobba med det vi är vana vid och uppvuxna med. Dock är generationsperspektivet oerhört viktigt att förstå när vi pratar digitalisering för det vi växer upp med blir det som sedan blir standard i våra liv.  Medan vissa delar upp populationen i generation X, Y och Z, har vi valt en annan uppdelning som upplevs enklare att relatera till. Vi benämner dem digitala Dinosaurier, Immigranter, Infödda och Alfa generationen. Jag vill dock poängtera att bilderna är liknelser och metaforer, att vi medvetet generaliserar för att göra skillnaderna mer tydliga och a...

Hej igen, roligt att det har blivit så många läsare av mina tankar kring den digitala utvecklingen. Jag är övertygad om att 2016 på många sätt kommer blir avgörande om man vill haka på i det digitala mästerskapet. Så, nu kör vi! Förståelsen för att digitalisering inte enbart handlar om teknologi utan framförallt om att skapa en maximal kundupplevelse tror jag kommer att bli årets fokus. De företag som börjat ”bli digitala” kommer att ha ett enormt försprång och de som under 2016 saknar ett digital strategi kommer inte kunna hänga med i matchen. I detta inlägg kommer jag inte prata om AI, VR, drönare, mobilitet eller någon annan hajpad teknologi utan kommer istället att fokusera på de mjuka värdena. Men självklart kommer jag på ett eller annat sätt återkomma till dessa punkter under bloggseriens gång. 1. Ledarskapet är avgörande för en framgångsrik digitaliseringSlappa vd:ar och ledare som är nonchalanta kring den digitala revolution vi befinner oss i och förkastar det hela med ”Att...

2015 är nu förbi och ett nytt digitalt år ligger framför oss. Vill med detta extra inlägg summera de viktigaste digitala händelserna under 2015. 3 digitala ting om 2015: 1. Internet sprider sig till stora delar av världen2015 var ett viktigt teknologiskt år. Jag skulle säga att internets framfart över värden och inte minst i Asien är det som betytt mest för i särklass flest. Under 2015 fick halva Kinas befolkning internet och en femtedel av Indiens befolkning. Det innebär att Indien har fler internet användare än USA och att Kina har dubbelt så många! Både Kina och Indien är länder som genom sin egen digitalisering kommer att ta den digitala teknologin till en ny nivå. De är smarta, hungriga och är beredda att arbeta hårt för att sätta sina länder på den digitala kartan. Vem vet, kanske kommer gemene man inom en snar framtid prata om Bangalore och Zhongguancun istället för Silicon Valley? 2. Drönarna och VR tar plats I takt med att produktionen av drönare har effektiviserats och pr...

Jag älskar paradoxen kring digitalisering för ju mer vi digitaliseras desto viktigare blir elementen kring det mänskliga. Jag har i introduktionen till denna bloggserie: Från digitala dinosaurier till digitala mästare konstaterat de tre sanningarna kring digitalisering; tanken kring att allt som kan digitaliseras kommer att digitaliseras, och kan antingen bli ett hot eller en möjlighet för dig. Just där, har du som ledare ett vägval att göra. Antingen ser du de enorma möjligheterna eller så börjar sakta men säkert din affärsmodell och bolag att dö för att du bara ser hot. För oss är digitalisering en överlevnadsfråga, för mitt bolag, men även för hela vårt lands framtida näringsliv. Industriella revolutionens tid är förbi och den digitala revolutionen är född. Företag måste förstå att vi lever i den digitala ekonomin. Och att den digitala ekonomin innebär en övergång från industrisamhällets hierarkiskt styrda processer, med fokus på produkter för en massmarknad, till användarfokuse...

Jag har under en tid tänkt mycket på varför personal slutar. Mycket utifrån turnén vi har haft med IHM, där vi pratat om modernt ledarskap och som jag får återkomma till vid tid och tillfälle. Med denna post är jag självkritisk och vill dela de tankar jag har antecknat och hoppas att det är tankar som kan vara till hjälp.   Vi lever i en tid med 80-90 talister som är i arbetsmarknaden och har en helt annan syn på jobb och karriär. Som jag sa på en föreläsning med IHM, så är vi glada om vi kan ha en anställd hos oss i minst tre år. Lite skillnad mot förr i tiden då man var sitt yrke och fick yrket inpräntat på gravstenen. Nu är arbetsmarknaden är flexibel och digital, och som arbetsgivare behöver man skapa bolag som är attraktiva för att locka till sig de bästa talangerna, för i en digital tid är efterfrågan och tillgängligheten stor kring vassa medarbetare.   Nedan skriver jag kort om 7 skäl till varför jag tror att man tappar duktiga medarbetare:   1. Chefen När ledarskapet saknas,...

Hej på dig. Ja just du, som sitter framför datorn, din tablet eller mobilen och funderar på vad som händer i vår digitala värld. Om du vill, så kan jag lotsa dig igenom vad som händer och vad det innebär för dig och ditt företag.  Jag heter Arash Gilan och är medgrundare och vice VD för ett bolag som heter Viva Media Group. Viva hjälper bolag att synas digital och att skapa digitala intäkter. Du kan även kalla det digital marknadsföring som ger resultat.  Men, vad jag gör är inte vem jag är. Men det jag gör, blir ett uttryck för vem jag är. Jag är 30 år och härrom dagen fick jag väldigt överraskande veta att jag är med på Shortcuts lista över 100-uppstickare i Sverige (personer under 40 år som inspirerar, engagerar och gör Sverige bättre). Riktigt kul! Jag är väldigt passionerad över att lära mig saker och det jag vill lära mig mest kring och förstå är allt som berör digitalisering. Så pass att jag ägnar helger och kvällar att just nu skriva klart en bok i ämnet med titeln ”Get dig...

Som del 3 i min lilla miniserie om att bygga ett bolag så kommer vi nu till det roligaste jag vet, varumärket.  Här hittar du del 1 och del 2 i min miniserie. Vikten av varumärkeFrån mjölkpaketet på morgonen till paddan på kvällen så omges vi idag av varumärken. Man kan tycka och tänka vad man vill om varumärken men de präglar oss oavsett vad vi vill tro. Apple eller Microsoft, Nike eller Adidas, Cola eller Pepsi. Vi väljer varumärken som vi på ett eller annat sätt har fäst oss vid. Oftast så väger vi in våra egna personligheter i de olika varumärken, och det är precis så här man jobbar när man jobbar med ett varumärke. Tittar du på Adidas så jobbar de med eleganta (läs ödmjuka) fotbollspelare som Messi eller Özil, och Nike jobbar mer med extraordinära (läs kaxiga) spelare som Ronaldo eller Zlatan. Lite generaliserat såklart men det ligger mycket i detta, oftast vill man att varumärket ska kunna avspeglas i en person.    Studier visar att de som satsar målmedvetet på sitt varumärke ...

En miniserie om att starta bolag. Del 2. Här hittar du del 1.   Nu är affärsidén klar och kanske har du börjat med affärsplanen. Dags att börja gräva ner sig och ställa sig frågan hur detta ska gå till? Har du kapitalet som krävs eller behöver du lån eller investerare till din affärsidé?  Du vill skapa ett framgångsrikt bolag men vad skapar framgång?  - Att ha en bra produkt?  - Att ha nöjda kunder?  - Att bara sälja lönsamma produkter?  - Att förstå framtida behov?  Här finns inget statiskt svar utan du måste definierar vad som ska vara huvudingrediensen för din framgång. Bland det viktigaste man kan lära sig om företagande är att du är aldrig bättre än ditt senaste resultat. Därför måste du lära dig av dina misstag och alltid blicka framåt.  Här måste du vara väldigt klar med att du verkligen tror att det finns en efterfrågan på din affärsidé. Jag lägger betoningen på tror, för entreprenörskap handlar mycket om att tro, våga och att faktiskt ta en risk. Om saker och ting vore fak...

En miniserie om att starta bolag. Bland det viktigast som finns i företagande är inte kunskap utan KUNDskap. När du ska driva ett framgångsrikt bolag så behöver du hela tiden ha kundglasögonen på dig och se saker från kundens perspektiv, för du har trots allt ingen verksamhet om du inte har kunder.    Vart börjar man då? Jo, med en affäridé, dvs. en tanke om produkt eller tjänst som på nått sätt förenklar människors (B2C) eller företags (B2B) vardag.  Det första du bör titta på är om det finns andra aktörer som gör det du vill göra. En oerhört viktig fråga att ha med sig är: på vilket sätt är Er affärsmodell annorlunda och unik i jämförelse med konkurrenterna? Här gäller det från början att du har en tydlig USP (Unique Selling Point) så att ni vet vad som särskiljer er på marknaden och mot kunden.  Här är ett antal andra viktiga strategiska frågor att ha med sig: •Vad ska vi vara bäst på? •Vad ska vi vara lika bra på som konkurrenterna? •Vad ska vi avstå från att göra i förhållande ...

Jag har under en tid tänkt mycket på varför personal slutar. Mycket utifrån turnén vi har haft med IHM, där vi pratat om modernt ledarskap och som jag får återkomma till vid tid och tillfälle. Med denna post är jag självkritisk och vill dela de tankar jag har antecknat och hoppas att det är tankar som kan vara till hjälp. Vi lever i en tid med 80-90 talister som är i arbetsmarknaden och har en helt annan syn på jobb och karriär. Som jag sa på en föreläsning med IHM, så är vi glada om vi kan ha en anställd hos oss i minst tre år. Lite skillnad mot förr i tiden då man var sitt yrke och fick yrket inpräntat på gravstenen. Nu är arbetsmarknaden är flexibel och digital, och som arbetsgivare behöver man skapa bolag som är attraktiva för att locka till sig de bästa talangerna, för i en digital tid är efterfrågan och tillgängligheten stor kring vassa medarbetare. Nedan skriver jag kort om 7 skäl till varför jag tror att man tappar duktiga medarbetare: 1. ChefenNär ledarskapet saknas, och en...

Sidor