113 dager er 3 måneder og 3 uker

Å jobbe med datoer, det være seg i mattestykker eller programmering, har jeg tidvis funnet vrient. Det er lett å finne ut hvor mange dager det er siden sommerferien var over, eller hvor mange dager det er til jul, men vi mennesker teller ikke tid i ti-tall men i måneder, uker, dager og timer. I denne posten viser jeg hvordan du kan telle ned dagene til jul, på en pen menneskevennlig måte, i PHP.
Koden i denne posten er hentet fra Aidan Lister. Det eneste jeg har gjort er å oversette months til måneder, osv.


 * @version     2.0.0
 * @link        http://aidanlister.com/2004/04/making-time-periods-readable/
 * @param       int     number of seconds elapsed
 * @param       string  which time periods to display
 * @param       bool    whether to show zero time periods
 */
function time_duration($seconds, $use = null, $zeros = false)
{
    // Define time periods
// jeg har skrevet å som å - med riktig bruk av charset er dette muligens unødvendig.
    $periods = array (
        'år'      => 31556926,
        'måneder' => 2629743,
        'uker'          => 604800,
        'dager'         => 86400,
        'timer'         => 3600,
        'minutter'      => 60,
        'sekunder'      => 1
        );
    // Break into periods
    $seconds = (float) $seconds;
    foreach ($periods as $period => $value) {
        if ($use && strpos($use, $period[0]) === false) {
            continue;
        }
        $count = floor($seconds / $value);
        if ($count == 0 && !$zeros) {
            continue;
        }
        $segments[strtolower($period)] = $count;
        $seconds = $seconds % $value;
    }
// Build the string
// dette er endret til å fungere med norske suffix
    foreach ($segments as $key => $value) {
        $segment_name = substr($key, 0, -2);
//        $segment_name = substr($key, 0, -1);
        $segment = $value . ' ' . $segment_name;
        if ($value != 1) {
//            $segment .= 's';
            $segment .= 'er';
        }
        $array[] = $segment;
    }
    $str = implode(', ', $array);
    return $str;
}
?>

Denne funksjonen kan du lime rett inn i php-dokumentet ditt, kanskje helst inn i en klasse av noe slag?

Så når funksjonen kjøres:

Funksjonen tar antall sekunder som parameter, så…
..var det de pokkers sekundene da.

$dag   = 21;     // Dagen vi teller ned til 
$maaned = 12;      // Måned vi teller ned til 
$ar  = 2009;   // Året vi teller ned til 
$tidspunkt  = 23;     // Klokken (hele timer) vi teller ned til 
$sekunder_til_noe_skjer = ((mktime ($tidspunkt,0,0,$maaned,$dag,$ar)-time(void))); // sekunder

Og funksjonen kjøres:


Resultatet er en nedteller som gir et resultat i dette formatet:

3 måneder, 3 uker, 19 timer, 26 minutter, 3 sekunder

Og slikt liker vi.

PS: jeg har også lagt koden på snipplr, og du kan lese Aidans post om koden sin her.

IndentationErrors i django med TextMate

Jeg har begynt å snuse på django, og snubla raskt over «IndentationErrors». Koden jeg jobber med er fra «komme-i-gang-totorialene» på prosjektets websider, og var ofte «feilfri». Med det mener jeg at koden ser helt lik ut som i eksemplene.

Feilmeldingene på testserveren (http://localhost:8000, etter python manage.py runserver) sier:

...
unexpected indent (admin.py, line 16)
Exception Type: IndentationError
Exception Value: unexpected indent (admin.py, line 16)
...

Problemet er at innrykkene (indent, som lages ved å trykke på tab-tasten, ⇥ på mactastaturet, ↹ på standard tastatur) som kommer med ved å kopiere koden fra tutorialen ikke er «det samme» som det innrykket et trykk på tab-tasten gir. Så lenge alle innrykker laget på samme måte, så skal det visstnok gå bra, men det løser ikke problemet.

Slik får du TextMate til å lage «myke innrykk».

Løsningen er å la redigeringsverktøyet lage mye innrykk (soft tabs). Jeg benytter textmate, så her er framgangsmåten for det.

soft tabs i django

«Soft tabs» gjør at koden ser pen ut, men uten å lage «IndentationErrors».

Som du kan se av bildet har jeg Python Django bundlen installert (dette er nok ikke nødvendig, dog). Til høyre for dette valget vises «Tab Size», som jeg satt til 4. Dette avstanden i et trykk på tab-tasten, målt i mellomrom, tror jeg. Underst i denne dropdown-menyen finnes «Soft Tabs (Spaces)» som gjør at når tab-knappen trykkes inn, så skrives ikke et normal innrykk, men nå 4 mellomrom.

Og så forsvant alle tilfellene av IndentationError etter denne endingen.

Fremtidens medier

Framtidens medier ligger på nett, i flere betydninger. Først og fremst ligger Eirik Solheims foredrag på nett. Både hos nrkbeta og på vindkast.uib.no.

Nrkbeta ber om tilbakemelding om hvordan embed-koden deres fungerer, så her tester jeg den.

Fremtidens Medier UiB 2009 Del 1 . Det er 4 deler. Alle kan nåes både hos nrkbeta & uib.

For de som vil vite mer om hvordan videoen ble filmen og redigert kan lese om det her. Kurt George «tengil» Gjerde forklarer.

nrkbata ber om hjelp til å teste embed-kode, men også uib tilbyr dette. Slenger derfor med del 2 fra uib litt lenger nede.

UiB bruker object-html-elementet, som er mer vanlig. Den likner mer på det youtube tilbyr. Nrkbeta har skrevet en egen sak, som bare er en lenke til et javascript, med parametrene høyde og bredde på filmen. javascriptet skriver så avspiller-koden til websiden din. Når siden lastes. Du kan lese detaljene her. I stedet for et object-element så får vi et embed-element. Object-koden som uib tilbyr gjetter jeg på at er noe flash spytter ut automatisk, da den er over flere linjekoder og ser stygg og fæl ut.

Denne problematikken kan du lese mer om på alistapart.com
.
Når jeg trykker lagre her, så får vi se om det betyr noe i virkeligheten. Det er uansett sjeldent at jeg gjør annet med slik kode annet enn copy/paste. Men joa, noen ganger kan det være like greit å slanke ut unødvendige elementer, jeg ser for meg at enkelte av parametrene som ligger med uib (flash) sin kode, kan fjernes.

Vell. Det funket ikke. UiB sin object-kode strippes ut av wordpress. Jeg må altså finne ut hvordan jeg omgår dette…

Etter å ha forsøkt ulike kombinasjoner, så fant jeg ut av at ved å fjerne litt «white space» (mellomrom mellom noen parametre i obcjet-taggen), så fungere likevel UiBs avspiller. Men ikke ved direkte copy/paste. Så: pass på at det er ikke er mer enn et mellomrom mellom hver av prametrene/attributtene. Når dette var på plass ble object-koden ikke strippet bort.

Det vi ser over er del 2 av Eirik Solheims forelesning om fremtidens medier, fra uibs server vindkast.uib.no

Erfaringene

  • nrkabetas kode fungerte «ut av boksen», men den tar litt mere plass. Det grå området under videoen, med kontroll-knapper, ser ikke veldig bra ut. Den legger også automatisk inn to lenker under videoen, som gjør at bildeteksten min ser malplassert ut. Lenkene går dog til relevante og nyttige steder (til websiden der videoen kommer fra, og direktelink til videofilen.).
  • UiBs kode funket ikke «ut av boksen», men avspilleren ser litt bedre ut (litt viemo?).

Bilder i wordpresskommentarer.

Si det med bilder!

Jeg har irritert meg over at det ikke funker å legge inne bilder i kommentarene i wordpress. Det er greit at det er «skrudd av» for folk flest av sikkerhets-hensyn, men jeg sjekker alle kommentarene som dukker opp i bloggen, og ser gjerne gjennom koden også. I denne posten viser jeg deg hvordan du kan tillate bilder i kommentarene i en wordpress-blogg.

Praktica

Jeg vil tro at det skal funke å klippe/lime rett fra flickr nå, da både a-taggen og img-taggen er lovlig.

Dette er en av fordelene med fri programvare, wordpress er open source. Fri programvare. Dette betyr at jeg kan selv tilpasse wordpress til mine behov.

Slik tillater du bilde-tagger i wordpress:

Åpne og rediger filen kses.php som vist under. kses.php ligger i /wp-includes/ som du finner i roten.

Rediger inn:

$allowedtags = array(
'a' => array(
'href' => array(),
'title' => array(),
'rel' => array()),
'img' => array(
'src' => array(),
'alt' => array(),
'width' => array(),
'height' => array()),
'abbr' => array('title' => array()),

enklere, putt inn:

'img' => array(
'src' => array(),
'alt' => array(),
'width' => array(),
'height' => array()),

mellom arrayen for ‘a’ og ‘abbr’.

Denne koden fant jeg på forumet til wordpress, og det er skrevet av carthik.

Dette bør du vite:

  • kses.php er en fil som ligger i en del av filsystemet som ikke skånes ved oppdateringer. Det betyr at du lett kan overskrive denne filen når du oppdaterer, uten å være klar over det.
  • Det finnes mer sexy måter å gjøre dette på, f.eks. å skrive en plugin som overstyrer tilatte tagger i denne arrayen fra en fil i /plugins/-mappen. Det er helt klart mye lurere.
  • Dette er «skrudd av» av sikkerhetshensyn, dette bør du kun gjøre om du føler at du har sånn nogen lunde teknisk kontroll, og stålkontroll på innholdet i bloggen din.

Men altså nå kan du kommentere i bilder på stavelin.com!

Snipplr – ekstern kode for tomt hode.

Jeg er nok ingen utpreget programmerer-type, men desto bedre grunn til å holde orden på koden. HTML, CSS, SQL og javascript, det kan lett gå i surr, og hvordan fikk jeg til den kule greia den gangen..?

Snipplr - code 20

Snipplr er ekstern hukommelse i praksis – for deg som forholder deg til kode i ny og ne.

Snipplr lar deg lagre kodesnutter som du kan dele med verden, eller ikke. Den store fordelen med snipplr er at koden ligger lagret utenfor prosjektet jeg jobber med i nuet, men er tilgjenglig med et tastetrykk via min favoritt-editor TextMate.
(se denne for hvordan)

Skattejakt.

Programmerere er mye flinkere til å dele på godene enn andre. En drøy påstand? –Kanskje. Men det er fortsatt enormt mange prosjekt med åpen kildekode. Dette er både en mulighet til å lære, og til å løse problemer andre har løst før deg. Snipplr har ikke hele prosjekter, men kun små kodesnutter.

Mye lettere å holde oversikt over, og mye lettere å få bruk for.

Jeg lover ingenting, men her er mine greier.

Å snoke rundt på snipplr.com er som en skatejakt. Det er mye grums, som jeg ikke skjønner eller har bruk for, men på samme tid riktig sted i elva å grave. Du kan finne gull.

Legger med et eksempel på siste snutt jeg la inn: hvordan hente ut verdier fra HTML-skjemaer med jQuery.
[snippet=11893]