Stavelin.com

- Resultater etter prøv og feil metoden.
Å kjøre cron-jobber er et spennende skritt videre fra å kun scripte for kode som trigges av brukeres aktivitet. Med cron-jobber kan prosesser kjøres automatisk på tidspunkt etter dine preferanser.

For orden skyld;
jeg har har et webhotell hos subsys.no. Cronjobber er en tjeneste som sjeldent kommer som standard hos webhotelltilbydere.

Å sette opp cronjobber fordrer at du kan logge deg inn på serveren via kommandolinjen (SSH), og videre redigere innstillingene for oppsettet i terminalen. For meg var det ikke intuitivt hvordan dette skulle gjøres i praksis, så her er hvordan jeg gjorde det hos subsys.

Koble til med SSH.

ssh -L 8888:server10.subsys.no:3306 brukernavn@server10.subsys.no

Kvitter med passord.

Så skriver du inn crontab -e

[brukernavn@server10 ~/mevi]$ crontab -e

-e står for "edit", du kan lese mer om handlingsrommet ditt her.

Hos subsys.no kjører de freeBSD, og der åpnes contab-filen i en "editor" i terminalen, denne heter nano(?). Du kan skrive inn tekst i filen (som er helt blank i utgangspunktet og som ikke vises/finnes via en ftp-klient), lagre, bla, osv. Hva du kan gjøre listes under det som i første omgang er en helt hvit terminal.

Rediger filen etter mønsteret "alle" guider for crontab gir, du kan f.eks. ta wikipedias tekst om saken som utgangspunkt.

$HOME fungerer fint i stede for å skrive inn hele adressen som er noe slikt som home users  brukernavn

$HOME fungerer fint i stede for å skrive inn hele adressen som er noe slikt som /home/users/brukernavn/.

Her er et eksempel på mine redigeringer:

MAILTO=gjett@stavelin.com
30 * * * * $HOME/pythonscript/python.py
0 0 * * * $HOME/phpscript/phpfil.php

MAILTO er en glimrende sak som sender deg en rapport på mail hver gang oppgaven utføres. Den er særlig nyttig når du setter dette opp for første gang, for å sjekke at ting fungerer som det skal, event hva som ikke fungerer.

Den første oppgaven jeg satt opp var å kjøre et pythonscript. Husk

#!/usr/local/bin/pytho

i starten av filen, slik at scriptet vil kjøre. Husk også å sette rettighetene på filen slik at den blir kjørbar (executable), med

chmod +x filnavn.py

Slike ting avslører feilmeldingene som jeg fikk på mail fram MAILTO-biten.

Når det kommer til tidsaspektene hvor når disse kommandoene skal gå av, så finner du også mye dokumentasjon rundt om. Selv hadde jeg en hvis glede av denne crontab kalkulatoren. Kodene jeg bruker i eksemplet over leser du slik:
30 * * * * betyr det 30. minuttet, hver time, hver dag, hver måned, alle ukedager. aka hver eneste time, 30 minutter over hel. Altså 24 jobber i døgnet.
0 0 * * * betyr det 0. minuttet, den 0. timen hver dag, hver måned, alle ukedager. aka første minutt den første timen i døgnet. Altså ved midnatt hvert døgn.

Håper dette er nyttig for noen, det hadde vært det for meg for noen dager siden.

Du har en fil med tabseparerte verdier, og ønsker å ha den som kommaseparerte verdier. Det hadde i alle fall jeg i dag, og dette er slik jeg løste problemet.

Åpne TextMate, marker alt, og høyreklikk. Velg 'Filter Through Command..' og bruk følgende snippet:

tr '\t' ','

Jeg valgte 'input: selection' (fordi jeg markerte alt først) og 'output: Create New Document', for å være på den sikre siden.

Slik ble alle tab-karakterene (hvordan visualisere en ikke-alfanumerisk karakter?) konvertert til komma (,)

Den godeste tanketom kvitret i dag at konamikoden også fungererfacebook. Jeg kan ikke si jeg ble veldig imponert over easteregget som ble avduket, men likevel: nerdete moro.

Facebook er jo ikke aleine om å bruke konamikoden på nett, så jeg antok at det er lett å finne ferdig javascriptkode for å få til dette på egen side, og det var det:

 
    if ( window.addEventListener ) {
            var kkeys = [], konami = "38,38,40,40,37,39,37,39,66,65";
            window.addEventListener("keydown", function(e){
                    kkeys.push( e.keyCode );
                    if ( kkeys.toString().indexOf( konami ) >= 0 )
                            window.location = "http://ejohn.org/apps/hero/";
            }, true);
    }
 

Denne snutten er btw fra jquerys webside. Har kun testet i Firefox.

Da jeg ikke vet helt enda hva jeg selv ville skule bak konamikoden på stavelin.com har jeg kun lagt den inn på startsiden stavelin.com slik som vist i eksemplet over.

Hva ville du ha brukt konamikoden til på din side?

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

 
<?php
/**
 * A function for making time periods readable
 *
 * @author      Aidan Lister <aidan@php.net>
 * @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 &aring; - med riktig bruk av charset er dette muligens unødvendig.
    $periods = array (
        '&aring;r'      => 31556926,
        'm&aring;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:

 
<?php
echo time_duration($sekunder_til_noe_skjer);
?>
 

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.

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.

« Eldre innlegg