Oct 30, 2008Wordpress släpper 2.7 preview!

Visst, det är ett par dagar gammalt, men wordpress har nu släppt en screenshot samt information om den kommande versionen. Sidan[1] för att lägga till en ny post känns väldigt fräsch, och alla relevanta funktioner och kontroller finns inom räckhåll, vilket underlättar mycket.

Information[2] är även släppt om den nya dashboarden, där de talar om bland annat utseende och nya funktioner. Bland annat kommer en ny funktion kallad QuickPress finnas, vilket innebär att man enkelt skall kunna skapa nya inlägg direkt från dashboarden. Mycket fint.

[1] http://wordpress.org/development/2008/10/the-visual-design-of-27/
[2] http://wordpress.org/development/2008/10/the-new-27-dashboard/

Oct 30, 2008Skapa “e-postbilder” dynamiskt

Tänkte bara dela med mig utav ett skript jag knåpade ihop på ett par minuter, för att generera e-postadresser i bilder dynamiskt.

<?php
$email = htmlspecialchars($_GET[‘email’]);

header (‘Content-type: image/png’);

/* Cache settings */
$cachedir = ‘cache/’;
$cachetime = 60 * 60 * 24 * 5; // 5 days
$filename = $cachedir . md5($email) . ‘.png’;

if(file_exists($filename) && filemtime($filename) > $cachetime)
{
    require_once $filename;
}
else
{
$handle    = imagecreate        (200, 20);
$trans     = imagecolorallocate ($handle, 255, 0, 255);
$text      = imagecolorallocate ($handle, 51, 51, 51);
$font      = ‘arial.ttf’;
$fontsize  = 9;

imagecolortransparent ($handle, $transparent);

imagettftext($handle, $fontsize, 0, 0, ($fontsize+2), $text, $font, $email);
imagepng    ($handle, $cachedir . md5($email) . ‘.png’);

require_once $filename;
}
?>
 

Skriptet förklarar nästan sig själv, om inte annat, fråga om du undrar någonting.

Oct 30, 2008C# – Anropa metoder dynamiskt

Jag har tidigare skrivit ett REST-API i PHP, som jag nu av ett antal orsaker var tvungen att porta till C#, och kom på att jag faktiskt inte skrivit särskillt mycket om C# än.

I PHP använder jag Reflection-api:t för att anropa metoder dynamiskt, ungefär enligt http://rest.host.com/klass/method/parametrar. Jag googlade efter olika lösningar folk använder för att anropa methoder dynamiskt i C#, men fann inget som jag tyckte såg bra ut.

Min slutgiltiga lösning blev att använda Type-klassen samt GetType()-methoden i samma klass. Exempel på användning, utan felhantering m.m:

public partial class _Default : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        String szClass = Request.QueryString["class"];
        String szMethod = Request.QueryString["method"];
        String szParam = Request.QueryString["param"];

        object[] parameters = { szParam };

        Invoke(szClass, szMethod, parameters);
    }

    public void Invoke(String szClass, String szMethod, object[] parameters)
    {
        Type type = Type.GetType(szClass);

        type.InvokeMember(szMethod, BindingFlags.InvokeMethod | BindingFlags.Public | BindingFlags.Static, null, null, parameters);
    }
}

public class Printer
{
    public static void Print(String sz)
    {
        HttpContext.Current.Response.Write(sz);
    }
}
 

Oct 30, 2008MySQL Group by med accent

Edit: bättre lösning i slutet.

I ett projekt är jag tvungen att jämföra olika ord med varandra, ett visst antal gånger.

Logiskt nog använder jag mig utav (simplifierat) SELECT word FROM words GROUP BY word. Idag dök det dock upp problem. Ord som till exempel entré och entre grupperas som samma ord, varför? Jag har faktiskt ingen aning om hur MySQL’s group-funktion jobbar, dock provade jag att ändra teckenkodning till bÃ¥de latin1 och UTF-8, still same problem.

Lösningen för mig blev att köra SELECT word FROM words GROUP BY HEX(word), för att göra en korrekt gruppering.

Jag har gjort lite prestandatester och inte märkt någon prestandaförlust över huvud taget.
När jag får tid kommer jag undersöka detta lite närmare, och ta mig en faktisk titt över hur MySQL hanterar grupperingar.

Finns det en bättre lösning, please enlighten me!

Sjävklart så skall man använda *_bin när man vill jämföra strängar av denna typen. Bin betyder i stort sätt att man jämför strängar binärt, istället för den specifierade teckenkoalitionen.

Oct 23, 2008Paging kombinerat med Data Mapper Pattern

Jag och några andra programmerare disskuterade ett tag sen hur man bör implementera paging mot en arkitektur där man tillämpar Data mappers.

Lösningen vikom fram till presenterar jag nedan. Kort sagt fungerar det så att en Pager-klass tar ett Mapper-objekt, en limitering och ett startvärde på pagingen i konstruktorn. Pager-objektet anropar sedan mapper-objektet med de vart man vill börja hämta raderna och vart man vill börja.

Koden:

/* mapper.php */
Interface IMapper
{
    public function __construct($table, $primary_key);
    public function fetchAll($offset, $limit);
}

Abstract Class Mapper Implements IMapper
{
    public $table;
    public $primary_key;
   
    public function __construct($table, $primary_key)
    {
        $this->table        = $table;
        $this->primary_key = $primary_key;
    }
}

/* pager.php */
/* Simple pager interface */
Interface IPager
{
    public function fetchAll($page);
    public function countRows();
    public function printLinks($page);
}

/* The pager base-class */
Abstract Class Pager Implements IPager
{
    public $mapper;
    public $limit;
   
    public function __construct(IMapper $mapper, $limit)
    {
        $this->mapper = $mapper;
        $this->limit = $limit;
    }
   
    public function countRows()
    {
        $db = DB::getInstance();
       
        $stmt = $db->prepare(‘SELECT COUNT(‘.$this->mapper->primary_key.‘) FROM ‘ . $this->mapper->table . ‘ LIMIT 1′);
        $stmt->execute();
       
        $result = $stmt->fetch(PDO::FETCH_ASSOC);
        return $result[‘COUNT(‘.$this->mapper->primary_key.‘)’];
    }
   
    public function fetchAll($page)
    {
        return $this->mapper->fetchAll(($page1) * $this->limit, $this->limit);
    }
}

/* handler.php */
require_once "pager.php";
require_once "mapper.php";

Class User
{
    public $id;
    public $username;
}

Class UserMapper Extends Mapper
{
    public function __construct($table, $primary_key)
    {
        parent::__construct($table, $primary_key);
    }
   
    public function fetchAll($offset, $limit)
    {
        $db = DB::getInstance();
        $users = array();
       
        $stmt = $db->prepare(‘SELECT * FROM ‘ . $this->table . ‘ ORDER BY ‘ . $this->primary_key . ‘ DESC’ . ‘ LIMIT ‘ . $offset . ‘,’ . $limit);
        $stmt->execute();

        foreach($stmt->fetchAll() as $row)
        {
            $user = new User;
            $user->id = $row[‘user_id’];
            $user->username = $row[‘user_name’];
           
            $users[] = $user;
        }
       
        return $users;
    }
}

Class UserPager Extends Pager
{
    public function countRows()
    {
        return parent::countRows();
    }
   
    public function printLinks($page)
    {
        $links = $this->countRows();
        $retval = ;
       
        for($i = 0; $i < $links / $this->limit; $i++)
        {
            $retval .= ‘<a href="?page=’.($i+1).‘"><li>’ . ($i + 1) . ‘</li></a>’;
        }
       
        return $retval;
    }
}

$page = $_GET[‘page’];

$uMapper = new UserMapper(‘users’, ‘user_id’);
$uPager = new UserPager($uMapper, 4);

/* template */
<html>
    <head>
   
    </head>
    <body>
        <ul>
            <?php echo $uPager->printLinks($page); ?>
        </ul>

        <table border=1>
            <tr><th>Username</th></tr>
        <?php foreach($uPager->fetchAll($page) as $user): ?>
            <tr>
                <td>
                    <?php echo $user->username; ?>
                </td>
            </tr>
        <?php endforeach; ?>
        </table>
    </body>
</html>
 

Jag har tyvärr inte tid att gå in mer på djupet om hur det fungerar just nu, skulle det dock vara någon som vill det är det inget problem.

Värt att notera är även att alla inte var helt 100% med på den här lösningen, och som alltid finns det spridda meningar om hur man bör kombinera och använda olika patterns.

Oct 7, 2008Magiska metoder

I PHP 5 finns det ett antal magiska metoder, vilka du bara drar nytta utifall du programmerar objektorienterat.D

De nya metoderna är:

  • __construct
  • __destruct
  • __autoload
  • __call
  • __callStatic
  • __get
  • __set
  • __isset
  • __unset
  • __sleep
  • __wakeup
  • __toString
  • __set_state
  • __clone

I detta inlägg kommer jag dock bara ta upp de vanligaste, nämligen __construct, __get, __set, __autoload samt __toString.

__construct…

…är konstruktorn för ett objekt och anropas varje gÃ¥ng en klass instansieras. Ett exempel är:

Class HelloWorld
{
    public function __construct($name)
    {
        echo ‘Hello world, ‘ . $name . ‘!’;
    }
}

$world = new HelloWorld(‘Alexander’);

 

Vilket kommer att skriva ut “Hello world, Alexander!”.

I konstruktorn skall alla privata variabler instansieras, dock är det även användbart att göra till exempel anslutningar mot databaser m.m.

__get & __set

Dessa två magiska funktioner används när man till exempel vill skapa eller komma åt en variabel som inte existerar, eller är skapad dynamiskt. Ett exempel är:

Class HelloWorld
{
    public function __get($key)
    {
        return $this->$key;
    }

    public function __set($key, $value)
    {
        $this->$key = $value;
    }
}

 

Skulle vi sedan utföra något liknande:

$world = new HelloWorld;

$world->name = "Alexander"; // __set

echo $world->name;           // __get

 

Skulle vi helt enkelt skriva ut Alexander. Notera att det inte finns någon privat variabel som håller mitt namn, utan den skapas dynamiskt via vår __set-method, och hämtas sedan vårt __get-anrop.

__autoload…

… är en funktion jag använder i vartenda projekt jag bygger. Med auto loading kan vi tillämpa lazy loading, vilket innebär att man inte hämtar nÃ¥gonting förrens man behöver det. Det betyder att vi inte behöver nÃ¥gra rader som require_once ‘helloworld.class.php’, utan allting sköts automatiskt

Exempel:

function __autoload($class)
{
      require_once $class . ‘.php’;
}

$class = new HelloWorld;
 

När vi anropar $class = new HelloWorld, kommer PHP märka att vi inte har laddat klassen, och istället för att kasta en E_WARNING eller E_NOTICE, kommer klassnamnet skickas till vår __autoload(), som sedan inkluderar rätt fil. Detta är väldigt användbart då man kan spara stora resurser på det.

__toString

Denna magiska method berättar helt enkelt för PHP hur klassen skall omvandlas till en sträng. När vi kör till exempel echo $class, får vi object of class Class could not be converted to string. Skulle vi däremot definiera  en __toString skulle PHP skriva ut det vi specifierar i vår magiska method.

Exempel:

<?php

Class HelloWorld
{
     private $name;

     public function __construct($name)
     {
            $this->name = $name;
     }

     public function __toString()
     {
          return ‘Hello world, ‘ . $this->name . ‘!’;
      }
}

?>
 

Kör vi:

$class = new HelloWorld("Alexander);

echo $class;

kommer sÃ¥ledes “Hello world, Alexander!”

Aug 15, 2008Google visar resultat från OS 2008

Ja, Google har under OS 2008 en funktion för att visa resultat och schema för alla grenar under os. Skulle vi gå in och söka efter exempelvis Bordtennis, kommer google visa senaste resultatet. Söker vi däremot efter Brottning eller Tyngdlyftning, kommer google nu att spotta ut schemat för turneringen.

Sweet dude!

Aug 15, 2008Wordpress 2.6.1

Ja, såhär efter släppet av Wordpress 2.6 kommer nu första buggfix-versionen. Totalt är över 60 stycken problem fixade. På Wordpress blogg säger man dock att det inte är några kritiska buggar, så att uppdatera till 2.6.1 är inte helt nödvändigt, och fungerar 2.6 fint, finns det ingen anledning att uppdatera.

Wordpress 2.6.1 på Wordpress blogg.

Skillnader mellan 2.6.1 och 2.6. Alla buggar på Wordpress Trac för 2.6 är fixade.

Jag kan säga att jag har uppdaterat Iocore genom att ladda ner 2.6.1, ladda upp alla filer utom content-mappen. När jag sedan loggade in via admin-panelen var jag tvungen att göra detta, tog då backup på all data och tryckte sedan vidare. Uppgraderingen gick smärtfritt och allt fungerar på exakt samma sätt som tidigare.

Aug 15, 2008Tabbar och färger till Putty

Många av oss använder SSH och Putty dagligen, därför kan det vara bra att göra processen så smidig som möjligt. Något som är riktigt intressant och jag har önskat länge är ett tabbat gui till Putty, vilket nu finns tillgängligt.  I Putty Connection Manager får du ett tabbat gui, en connection manager som är mycket smidigare än nuvarande inbyggda.

För att ladda ner Putty Connection Manager, besök Putty Connection Manager. Notera att det ännu inte finns någon stabil version tillgänglig.

En annan sak att ta upp är färgerna i Putty, vilka går att anpassa precis som man vill. Igvita.com har producerat två stycken scheman som jag gillar skarpt. Custom PuTTY Color Themes.

Aug 14, 2008Lista på böcker om C# och Php programmeringsböcker

Nu har jag uppdaterat Iocore och lagt till en ny sida, nämligen “Bokhyllan”. PÃ¥ bokhyllan kommer du kunna läsa recensioner och kommentarer om böcker jag äger.

Programmeringsböcker

Tips:
Köksluckor