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

Blogginlägg av David Stiernholm

David Stiernholm

David Stiernholm är struktör, vilket är en sorts konsult som skapar god struktur och smidiga arbetssätt i verksamheter och för nyckelpersoner. Anlitas som konsult och föreläsare av företag, alltifrån från börsbolag till entreprenöriella projekt.

En av mina strukturadepter hade för mycket att göra. När hennes chef frågade hur hon har det, sade hon: "Alltså, det är verkligen för mycket nu. De närmaste månaderna hanterar jag tolv ärenden!". Hennes chef var inte så insatt i detaljerna i hennes arbete, utan för honom betydde "tolv ärenden" inte så mycket mer än vad det betyder för dig nu, du som inte alls vet vad hon arbetade med.  Han frågade: "På vilket sätt är det för mycket?" Min adept fick nästan tunghäfta. Hon kunde inte beskriva situationen på ett bättre sätt än att det helt enkelt "var för mycket" och att hon kände sig stressad. Vad som kom ut av samtalet var inte så mycket mer än en klapp på axeln och kvar satt hon, med för mycket att göra. Låt oss excelifiera När vi träffades kom vi snabbt fram till att vi behövde göra det tydligt för chefen hur mycket tolv ärenden är. I ett kalkylblad listade vi alla de att göra-uppgifter ett ärende bestod av och hur många minuter varje uppgift tar att slutföra. Vi fick fram en summa ...

När vi har arbete att göra som kräver vår fulla koncentration, är det värdefullt att då och då boka in tid för oss själva (med stängd dörr och avstängd telefon). Men, många av oss har alltför lätt att boka av den inbokade egentiden så fort vi får frågan om vi kan ta ett möte just den förmiddagen. Så, vi tar bort noteringen "Egentid" i kalendern och går på möte. Det vi hade tänkt att göra gör vi under några sena kvällar istället och det är inte särskilt angenämt och inte blir kvaliteten av högsta klass heller. Tänk om vi värderade vår tid för oss själva högre och mer än idag stod fast vid vad vi planerat? Visst skulle det ge oss mer arbetsro? Kanske är en sådan vaneförändring inte gjord i en handvändning. Är det inte skönt att få hjälp på vägen? Gör så här Här är fyra knep att ta till för att lättare hålla fast vid din planerade tid för dig själv (och dina arbetsuppgifter). 1) Boka något som är svårt att boka av. Boka någon expert för att hjälpa dig den dedikerade tiden eller boka in...

När vi tar oss för att förbättra vår arbetsstruktur för att vi vill skapa en smidigare vardag, är det lätt att tro att det är de stora greppen som måste till för att det ska bli någon effekt.  Vi tror vi behöver göra ett riktigt röj, en rejäl uppryckning och skaffa alla nödvändiga attiraljer av senaste sort. Resultatet är ofta att det blir ett så stort projekt av strukturerandet att vi baxnar och lägger ner innan vi ens börjat. Men, jag som arbetar med det här (och bara det här) varje dag har gång efter annan sett att det istället är i detaljerna det sitter. Vi kan ha gjort rätt enligt strukturkonstens alla regler, men så halkar vi tillbaka i gamla hjulspår om och om igen, av den enkla anledningen att vi missar en liten, avgörande detalj. Det fina är emellertid att, om vi bara klarar de där detalj-fallgroparna, vinner vi mycket i struktur och får en stor skillnad i vår vardag jämfört med tidigare. Sex små detaljer Så, låt mig dela med mig av sex detaljer som avgör om din struktur hå...

I vår vardag på jobbet gör vi saker som går fort och saker som tar lång tid. En del uppgifter kan vi bestämma oss för att göra nu, varpå vi gör dem. Andra behöver vi komma tillbaka till litet då och då och göra delar av för att till slut gå i mål några veckor senare och få glädjas åt att sätta den där "klart!"-bocken. Håll isär Det gäller att hålla isär de här, för de är två helt olika saker. När vi skriver upp de korta uppgifterna, skriver vi precis vad vi ska göra. Men, när vi skriver upp de långa uppgifterna, formulerar vi oss mer i termer av vad som ska åstadkommas, genom många korta uppgifter efter varandra (som i bästa fall finns på vår att göra-lista). Långa uppgifter kan till exempel heta saker som "Norge-etableringen", "Nytt intranät", "Utvecklingssamtalen", "Byggprojektet X", "Höstkickoffen", "Förbättrad reklamationsrutin" och "Leveransen till kund Y", medan de korta formuleras med verb som "skriv", "ring", "skicka", "sammankalla", "fråga", "maila" och "boka". Ibland när j...

Då och då, särskilt när det är riktigt intensivt och du har mycket att göra, är det värdefullt att reflektera.  När vi reflekterar och skriver eller skissar fritt det vi reflekterar över, får vi ur oss allt det som snurrar omkring i huvudet. Allt det som vi mer eller mindre medvetet går och tänker på tar form och vi kan betrakta det utifrån. Vi får perspektiv på hur stort eller litet utrymme olika saker tar. Vi tömmer huvudet och åtminstone för mig är det otroligt skönt. Reflektion skänker mig ro. Ett verktyg värdigt verktygslådan Men, vi som vill få gjort det vi behöver ha gjort med så liten ansträngning som möjligt, ser reflektion som något mer än en terapeutisk, avstressande övning.  Reflektionen kan vara ett sätt att ta kvantsprång ditåt vi strävar, med vår verksamhet, vår karriär eller vårt projekt. För det behöver reflektionen knorr. Det är nämligen i knorren reflektionen tar skruv. Ta tanken vidare För att vara konkret: när du reflekterar fritt, närhelst du kommer på något at...

Mina största strukturförbättringar har jag gjort i samband med att jag bytt kontor och till och med jobb. När allt ändå är nytt, känns en ny vana mer eller mindre inte som så stor förändring. När jag har kursdeltagare som alldeles nyss börjat ett nytt jobb, brukar jag gratulera dem. Få har ettså gyllene utgångsläge för rutinförfining som de. Men, det finns en vardag mellan jobbytena. Då vill vi också bli mer strukturerade. Ibland förändrar vi med lätthet, ibland är det svårare. När du testat att strukturera dig men misslyckats gång på gång, är det dags att ta till radikala grepp. Det sitter något i väggarna Kognitionsforskare menar att vi minns saker lättare i den miljö där vi först lärde oss dem. Studenter får till exempel högre provresultat när provet hålls i samma lokal som de undervisats i. Det visar sig nämligen att detaljer i miljön och rummet tjänar som "minnes-triggers", även om vi är omedvetna om det. Forskaren David Neal vid institutionen för psykologi och neurovetenskap v...

Har du suttit på ett möte och precis när du lägger ut texten om varför vi verkligen behöver lösa det där problemet, surrar en telefon igång. Den är inställd på ljudlöst och ägaren låter den ligga kvar på bordet utan att svara, men vad händer? Alla tittar (och lyssnar) på telefonen och inte på dig. Helgarderar du? Visst gör vi så här på flera områden? För att klara att navigera fokuserat i en allt intensivare vardag på jobbet, väljer vi ut, planerar in, styr upp och stänger ned. Men, vi helgarderar. Vi gör något annat samtidigt, när vi ändå sitter där. Vi slänger ett getöga på nästa innan vi är klara med den här. Vi har apparaten avstängd, men inte helt. Fokusera både sinne och handling I dessa dagar tänker jag mycket på att prioritera helhjärtat. Jag menar, det jag bestämmer mig för att göra vill jag enkom göra, just i det ögonblicket. Kalla det mindfulness, distraktionsminimering eller vad du vill. Jag har nämligen upplevt så tydligt att syftet med prioriteringen blir förfelat om j...

I min verksamhet har jag just nu särskilt fokus på att skala av och göra mig av med material, uppgifter, till och med verksamhetsgrenar som inte längre tillför lika mycket som tidigare, utan mer tar plats och tid. Ju mer vi skalar av, desto mer tid, utrymme och kraft får vi till det som verkligen är viktigt, för oss och för den verksamhet vi arbetar i. När det är som mest intensivt, är det lätt hänt att vi prioriterar bort allt vad rensning heter (kanske är det helt rätt prioritering precis då). Men, man behöver inte ta sig mycket tid för att bli av med en hel del som annars distraherar och irriterar. Allt annat än olycksbådande 13 Här kommer 13 idéer på vad du kan rensa om du blott har tio minuter över. 1) Öppna den mapp där ditt senast använda dokument ligger. Ta bort alla filer du inte längre behöver. Har du minuter över, rensa också mappen där ditt näst senast använda dokument ligger. 2) Om du har många lästa och hanterade mail kvar i din mailinkorg, skapa en undermapp kallad "T...

Hur ser din perfekta vecka ut? Troligen är den inte fem dagar på en solig strand i ett varmt land, även om det kanske är den första bilden som dyker upp när man ställs en sådan fråga. Nej, också en sådan tillvaro tröttnar man på efter ett tag. Vad jag menar är den perfekta arbetsveckan.  Jag gissar att den innehåller en del arbete i avskildhet och en del arbete i möte med andra, en skopa högt tempo och ett rågat mått reflektion.  Man kan se det som ett pussel att få ihop, men jag tycker också om den metafor min gode affärsvän med konstnärligt förflutet använde när vi åt lunch häromdagen. Han beskrev veckan och det vi gör i den som en komposition. Genom att plocka ihop olika komponenter i noggrant avvägda proportioner, får veckan balans, som ett väl komponerat fotografi, musikstycke eller målning. Var en vardags-visionär Skapa din egen veckonorm, det vill säga, designa din ideala vecka och sträva efter att uppfylla den. Det är klart att vi kan låta veckorna bli som de blir och parera...

Att etablera ett mer strukturerat arbetssätt i vardagen på jobbet är inte gjort i en handvändning. Tar vi för stort grepp på en gång, blir lätt förändringen så tung att vi halkar efter, börjar känna dåligt samvete och tappar sugen. Men, med många små förändringar över längre tid får vi snart njuta av den goda strukturens sköna effekter, för oss och för verksamheten. Nu finns det en app för det. I samband med publiceringen av min bok "Klart! - Bli superstrukturerad på 31 dagar!" i april har vi skapat en gratis iPhone-app där du kan dels testa hur strukturerad du är, dels göra alla övningarna i bokens träningsprogram i struktur. I 31 steg tränar du upp din struktur på jobbet genom de tre etapperna Organisera, Fokusera och Automatisera. Allteftersom du gör klart en övning, kan du bocka av den i appen och glädjas åt att du tagit ett steg mot en mer välstrukturerad vardag. Och sedan ännu ett. De senaste dagarna har jag börjat få mail från läsare som kommit en bit på väg genom träningspro...

Har du svårt att koppla bort jobbet på helgen? Du är inte ensam om det. Många jag möter som har engagerande arbeten upplever samma sak. En del trivs med det och ser inget problem med att tänka på eller rent av jobba med arbetsuppgifter också på helgen. Men, de flesta (jag inkluderad) låter helst helgen vara ett par dagar av på sin höjd distanserad reflektion över det vi sysslar med under arbetsdagarna. Motstridiga känslor bemöts bäst med konkretisering Har vi svårt att sluta tänka på jobbet även när det blivit lördag, hjälper det sällan att bara säga till oss själva att skärpa oss och omedelbart sluta upp med det. Nej, istället, gör något konkret för att stänga arbetsveckan på fredag eftermiddag (senast) så kommer du att känna dig mer ledig när du är ledig. Här kommer åtta idéer på vad du kan göra. Gör så här 1) Motivera för dig själv varför du vill koppla bort jobbet på helgen. Skriv gärna ned det och spara undan. Du har nytta av dina egna kloka ord till dig själv när du frestas at...

När vi är inne i en intensiv arbetsperiod och våra verktyg är e-posten, att-göra-listan och kalendern, är det lätt att tappa översikt. Visst, i kalendern kan du kika både framåt och bakåt hela månader i stöten, men hur informativa är egentligen dessa månadsvyer? Om vi vill undvika att plötsligt upptäcka att "Va? Var det redan nästa vecka?!", behöver vi då och då lätt kunna se var vi är, vad vi gjort det senaste och vad som vankas framöver. Kanhända vill du snabbt stämma av hur ni lagt era avstämningsmöten i relation till andra kritiska aktiviteter i projektet du driver. Har du en avgörande deadline om några veckor, vill du ofta få en känsla för hur långt det är kvar, hur många dagar av arbete du har till förfogande och vad som ska hända på vägen. Om du är som jag, har du ibland mulna dagar då du inte tycker att du gör några framsteg alls, utan att det bara tuggar på utan att du åstadkommer något särskilt. Då skulle du må bra av att på ett smidigt sätt bli påmind om vilka steg du fak...

Ibland när jag berättar att jag är struktör, får jag frågan: "OK. Du som arbetar med sånt, vad ska jag göra? Jag har ett himla kaos och en massa högar, men jag skulle verkligen vilja få bättre struktur. Hur börjar jag?" Det här är vad jag brukar svara. Gör så här 1) Först behöver du bestämma dig för var du ska ha dina att-göra-uppgifter. Det ska bara vara på ett enda ställe. Har du ett CRM-system där kundrelaterade uppgifter, men inget annat, ska ligga, behöver du två ställen. Du kommer att kunna leva med det, men sträva efter ett ställe. Det spelar ingen roll om det är digitalt eller på papper. Du behöver ett att-göra-uppgift-ställe (eller -lista), eftersom det döljer sig en massa saker du har att göra i högarna. De här uppgifterna kommer fram när du börjar röja och de behöver en hemvist. 2) Töm sedan huvudet på allt du kan komma på att du har att göra och skriv upp alla uppgifterna utförligt i att-göra-listan. Definiera uppgifterna så smått att var och en skulle ta mindre än en da...

Om du har en tendens att tacka ja till för mycket och sedan ångrar dig, eftersom du får för mycket att göra, då är du inte ensam. Du är heller inte utan hjälp. Tillhör du dem för vilka det ständigt kör ihop sig och som får jobba över fler kvällar i veckan än vad som är önskvärt, då är du i gott sällskap av många jag möter dagligen. Synliggör det nu osynliga Såvida du inte bara arbetar när du sitter i möte, är din veckas arbetskvot fylld långt innan kalendervyn är så full av möten att den ser ut som en välkaklad badrumsvägg. Tittar vi i vår kalender, blir tiden vi behöver för att göra uppgifter på egen hand tämligen osynlig, vilket lätt leder till att vi tackar ja till möten och aktiviteter så länge det finns en lucka. Men, gör du också "på egen hand"-tiden tydlig för dig själv, skapar du ett sanningsenligt underlag för beslut när du får erbjudande om att göra något innan ett visst datum och när dufår en mötesinbjudan. Tydlighet gör det enklare att ta rätt beslut Gör därför en plan ö...

När vi arbetar så strukturerat att vi använder en att göra-lista i någon form för att slippa komma ihåg det vi har att göra och för att lätt få översikt över alla uppgifter, finns det en fallgrop vi bör akta oss för. Då vi skriver in en ny uppgift i vårt digitala att göra-listverktyg, visst är det frestande att ange "hög" (eller "1") i "prioritet"-rutan om uppgiften är viktig? Akta dig för det. Högt idag - lågt imorgon Vilka uppgifter som har högst prioritet varierar nämligen med tiden. Det som är högprioriterat idag, kan ha lägre relativ prioritet imorgon, om det då har tillkommit nya, högre prioriterade uppgifter. Konsekvensen av att sätta prioritet för tidigt blir lätt att du har en lista som är prioriterad, men fel. Då tvingas du se förbi de prioriteringar du tidigare satt (prioriteringen är alltså helt ogjord) eller lägga tid på att ändra prioriteringen till det den är nu istället. Ändrar du till dagens prioritering och inte slutför allt, är den inaktuell imorgon och du får ige...

Sidor