Jan 30, 2009Simpelt shell-script för att dumpa ut http headers

I jobbet är jag ständigt beroende av att kontrollera http headers för diverse sidor. Som vanligt använder jag live-http-headers, dock började dyka upp konstig respons som inte stämde överens alls med andra verktyg man använder för att kontrollera headersen.

Efter lite snabbt telnettande konstaterade jag att live-http-headers ibland skickar felaktig data, och skrev ihop ett simpelt shell script som använder lynx för att dumpa ut response-headersen för en angiven sida.

#/!bin/bash
lynx -head -dump $1
 

Visst, man skulle alltid kunna lägga till ett bash-alias.

Dec 19, 2008Simpelt wordpress plugin för att dölja dashboarden

Var idag på jobbet i behov av att dölja dashboarden för användare, detta utan att in och pilla i kärnan. Resultatet efter 3 minuters intensivt kodande kan ni själva beskåda nedan:

<?php
/*
Plugin Name: Dashboard Hider
Description: This plugins hides the motherfucking dashboard, yeah.
Author: Alexander Nyquist
Version: 1.0
*/

function hide_dashboard()
{
    global $parent_file;
   
    if($parent_file === ‘index.php’)
    {
        ?>
        <script type="text/javascript">
            document.location.href = ‘edit-pages.php’;
        </script>
           
        <meta http-equiv="refresh" content="0;url=edit-pages.php">
        <?php
    }
}

add_action(‘admin_head’, ‘hide_dashboard’);
?>
 

Dec 15, 2008Smart funktion

Tänkte dela av mig utav en smart funktion:

function add($a, $b)
{
   return -(-$a)(-$b);
}

echo add(5,5); // 10
 

Dec 12, 2008FEST

print "dead" and die;
 

Dec 12, 2008Objektorientering i PHP

Den största och enligt mig bästa uppdateringen till PHP5 som släpptes för mer än fyra år sedan är den utökade objektmodellen. Tyvärr är det dock väldigt sällan man ser objektorientering utnyttjas i PHP, vilket är synd, då det ofta bidrar till bättre organiserad kod och separation av olika delar av en applikation.

I en liten miniserie om objektorientering i PHP kommer jag ta upp det mest grundläggande delarna inom objektorientering med PHP.

Vad är då objektorientering egentligen?
Objektorientering är ett sätta att programmera, där man separerar olika delar för sig. När man talar om OOP är ofta det första man hör ”Klasser” och ”Objekt”. Vad är då detta, vad är skillnaden?

En klass är en definition, en beskrivning för hur ett objekt skall se ut, samtidigt som objektet är den ”fysiska” produkten utav en klass. Detta kan enkelt relateras till bilar, där ritningen (klassen) som säger hur bilen ska se ut, vilka funktioner den skall ha (gasa, bromsa, svänga), och objektet den fysiska, tillverkade bilen.

Klasser består utav attribut (egenskaper) och metoder (funktioner). Ett attribut är en egenskap för ett objekt, där det till vår bil skulle kunna vara en färg eller ett registreringsnummer. Metoder är funktioner, som säger åt ett objekt hur det skall bete sig. Vår bil skulle till exempelvis kunna ha en metod som säger åt bilen hur den skall gasa eller svänga.

Nåja, mycket text är tråkigt att läsa, så vi drar igång med ett simpelt kodexempel:

/* Början av vår klassdefinition */
Class Bil
{
    /* Våra attribut (egenskaper) */
    private $farg;
    private $fardriktning;
   
   
    /* Våra metoder */
    public function svang($riktning)
    {
        $this->fardriktning = $ riktning;
    }
   
    public function bytFarg($farg)
    {
        $this->farg = $farg;
    }
}
 

Här deklarerar vi en ny klass, Bil. Vi specifierar även två stycken attritbut, färg och fardriktning. Till detta skapar vi även två metoder, en för att svänga, och en för att byta färg på bilen. För att skapa en bil gör vi enligt följande:

$bil = new Bil();
$bil->bytFarg(‘Blå’);
$bil->svang(‘Vänster’);
 

Här skapar vi alltså ett ny variabel, $bil, som vi sedan sätter till ett nytt Bil-objekt. Vi byter sedan färg på bilen till blå, och svänger vänster.

Här är antagligen något nytt för PHP-programmerare som inte använt objektorientering innan, nämligen ”->”. Dessa pilar används för att anropa en metod som tillhör en klass.

Någonting annat som antagligen är okänt för en oerfaren objektorienterare är nyckelorden ”private” och ”public” i vår klassdefinition. Dessa nyckelord specifierar att en metod är privat eller publik, i praktiken innebär detta att privata metoder och attribut endast är åtkomliga från inifrån klassen, medan publika metoder och attribut är åtkomstbara överallt.

Jag använder även nyckelordet $this en hel del. Varför? Jo därför att $this refererar till det egna objektet. Som vi vet lever en variabel endast inuti en metod eller funktion, vilket innebär att vi måste referera till objektet med $this om vi vill komma åt klassens egna attribut.

MEN, måste inte en bil alltid ha en färg? Naturligtvis måste den det. Detta löser vi med någonting som kallas för konstruktor, vilket är en helt vanlig metod. En konstruktor är en metod som ALLTID körs när ett objekt skapas. Ett exempel på en lämplig konstruktor är följande:

/* Konstruktor */
public function __construct($farg)
{
    $this->farg = $farg;
}
 

Det vi gör här är alltså att definiera en konstruktor, notera att metodnamnet alltid måste deklareras enligt __construct. Vi ser även att konstruktorn tar en inparameter, $farg. Detta innebär att vi måste skicka med en färg när vi skapar vårt objekt, enligt följande:

$bil = new Bil(‘Färg’);
 

Detta var allt för idag, återkommer med nästa del vid ett senare tillfälle. Så länge håller jag tilgodo med ett simpelt program:

Class Person
{
    private $name;
    private $age;
   
    public function __construct($name, $age)
    {
        $this->age = $age;
        $this->name = $name;
    }
   
    public function getName()
    {
        return $this->name;
    }
   
    public function haveBirthday()
    {
        $this->age++;
    }
   
    public function getAge()
    {
        return $this->age;
    }
}

$person = new Person(‘Alexander’, 19);

echo $person->getName() . ‘ är ‘ . $person->getAge() . ‘ gammal.’;

$person->haveBirthday();

echo $person->getName() . ‘ är nu ‘ . $person->getAge() . ‘ gammal.’;
 

Studera och förstå! ;)

Dec 10, 2008Variabla variabler i PHP

PHP har stöd variabla variabler, vilket fungerar på detta sätt:

$foo = ‘bar’;
$bar = ‘foobar’;

echo $$foo;
 

Vilket kommer att skriva ut foobar.

Upplys mig gärna om något praktiskt användningsområde för detta.

Dec 10, 2008ORM & Kedjade metodanrop i PHP

Jag satt för en tid sedan och började bygga på ett eget ORM-framework, och funderade på olika lösningar för att bygga upp sql-satserna. Det jag kom fram till blev slutligen:

<?php
Class Query
{
    private $sql;
   
    public function getSql()
    {
        return $this->sql;
    }
   
    public function select($what)
    {
        $this->sql = ‘SELECT ‘ . implode(func_get_args(), ‘, ‘);
        return $this;
    }
   
    public function from($where)
    {
        $this->sql .= ‘ FROM ‘ . implode(func_get_args(), ‘, ‘);
        return $this;
    }
   
    public function limit($start, $limit)
    {
        $this->sql .= ‘ LIMIT ‘ . $start . ‘,’ . $limit;
        return $this;
    }
   
    public function group($what)
    {
        $this->sql .= ‘ GROUP BY ‘ . $what;
                return $this;
    }
   
    public function join($table, $key)
    {
        $this->sql .= ‘ LEFT JOIN ‘ . $table . ‘ USING(‘ . $key . ‘)’;
        return $this;
    }
   
    public function __toString()
    {
        return $this->sql;
    }
}

$q = new Query;

$q->select(‘this’)->from(‘that’)->group(‘this’)->limit(0, 10);

echo $q;
?>
 

vilket kommer att skriva ut
SELECT this FROM that GROUP BY this LIMIT 0,10

Hemligheten bakom detta är att man returnerar $this i varje metod, vilket gör att man kan kedja kommandon, mycket smidigt!

Finns intresse kommer jag antagligen släppa hela versionen av mitt ORM här på Iocore om ett tag..

Dec 10, 2008Formatera strängar i PHP

Någonting som jag ofta använder mig av i både PHP och C# är metoder för att formatera strängar. I PHP är det främst sprintf som används, och String.Format i C#.

Sprintf fungerar på följande vis:

echo sprintf(‘Hej, jag heter %s’, ‘Alexander Nyquist’);

Första argumentet till sprintf är strängen man vill formatera, och de efterföljande argumenten värdena som nycklarna i strängen skall ersättas med.

*printf-funktionerna stöder ett antal olika nycklar, varav de vanligaste är %s och %d. %s använder du när du vill skriva ut en strän, och %d när du vill skriva ut en integer.

Situationer där det är smidigt att kunna formatera strängar är vid till exempel skapandet av sql-satser, exempelvis:

echo sprintf(‘INSERT INTO users(user_id, user_name) VALUES(%d, "%s")’, 1, ‘admin’);
 

En annan användbar funktion i samma familj är vsprintf, som tar två argument, där första är strängen man vill formatera, och andra en array med värdena. Till exempel:

echo vsprintf(‘INSERT INTO users(user_id, user_name) VALUES(%d, "%s")’, array(1, ‘admin’));
 

*printf-funktionerna är även användbara för att formatera och bestämma precisionen för hel och flyttal. Skriver vi till exempel:

echo sprintf(‘Jag är %b år gammal’, 19)
 

Kommer det skrivas ut Jag är 10011 år gammal, där alltså %b är den binära representationen av 19.

Man kan som sagt även bestämma precisionen av hel och flyttal, till exempel.

echo sprintf(‘Jag är %b år gammal’, 19.05);   
 

där vi alltså skickar in ett flyttal och får ut ett avrundat heltal, jag vet, heltal kan inte vara flyttal.

Dec 9, 2008Parsa XML med PHP

PHP5 kommer som standard färdigkompilerat med biblioteket SimpleXML, vilket är fruktansvärt användbart om när man snabbt vill läsa ut data från en XML-fil.

En simpel kodsnutt för att läsa ut de senaste inläggen från min favoritblogg Gratis tårta skulle kunna se ut enligt följande:

<?php
$feed = ‘http://www.jenst.se/feed’;
$xml = simplexml_load_file($feed);
?>

<h1><?php echo $xml->channel->title; ?></h1>
<em>Senaste inlägg</em>
<ul>
    <?php foreach($xml->channel->item as $item): ?>
        <li>
            <a href="<?php echo $item->link; ?>"><?php echo $item->title; ?></a>
        </li>
    <?php endforeach; ?>
</ul>
 

Hoppas ni förstår melodin!

Nov 11, 2008Accordion och Collapsible panel i AJAX control toolkit

Ja, varför ligger dessa (bland flera) i AJAX control toolkitet när de inte har någonting som helst med AJAX att göra? Jag trodde glatt att jag kunde dra in en accordion och flera accordion panels, och sedan få dessa att hämta datan dynamiskt när man expanderade den, men icke, all text bara döljs och visas sedan med JavaScript. Usch. 2008? Nej.

Det blir antagligen att bygga något liknande med JQuery istället, dock går man ju miste om alla events m.m man kan använda sig av om man bygger det i enbart .net.

Tips:
Företagsevenemang - Flyttstädning Göteborg