Visar inlägg med etikett programmering. Visa alla inlägg
Visar inlägg med etikett programmering. Visa alla inlägg

02 juni, 2009

Programmering: Artikelserie PHP för riktiga nybörjare

Förord
Jag håller på att skriva en artikelserie om PHP för riktiga nybörjare och jag tänker ha en lista här med alla delar. Då blir det enklare för er att hitta dem och enklare för mig att underhålla.

Delar i artikelserien

Programmering: PHP för riktiga nybörjare - Del 2

Artikelserien är tillägnad min bror

Förord
Detta är del 2 i min artikelserie om PHP för riktiga nybörjare. Mitt mål är att försöka lära ut PHP till så många som möjligt och berätta på ett så enkelt och lättläst sätt som möjligt. Om något är oklart för er så tveka inte att skriva en kommentar och berätta vad ni tycker är bra och/eller mindre bra.

Delar i artikelserien
Lista med alla delar i artikelserien [6]

Vad vi kommer att gå igenom
  • Olika typer av variabler
  • Ingående om talsystem
  • Omvandla från en variabeltyp till en annan
Introduktion
I del 1 gick vi igenom de första stegen mot ett första PHP-skript, vad kommentarer används till, hur man lagrar data i s.k. variabler, lite grundläggande om text och siffror och hur man visar text på en webbsida.

I denna delen kommer jag beskriva de olika typer av variabler som finns samt hur man omvandlar data från en typ till en annan. Det kan vara rätt svårt att ta till sig allt första gången så läs gärna igenom artikeln flera gånger.

Olika typer av variabler
Vad är en datatyp för något?
I del 1 sade jag att en variabel är en slags kakburk som kan innehålla olika typer av kakor med olika smak och storlekar. En kaka i detta fallet är data som du som programmerare vill spara någonstans för att sedan göra saker med den. Man kan säga att en datatyp i PHP är vilken smak kakan har.

Kom ihåg nu att i alla framtida artiklar, inklusive den du läser nu, så är det variabler jag berättar om och inte kakor. Det är bara för att ni skall förstå lite bättre.

Exempel på datatyper
En variabel (kaka) kan vara en av följande typer. Notera att den engelska betäckningen står inom parentes.
  • Heltal (integer)
  • Decimaltal / Flyttal (float, double)
  • Boolesk: Sant eller falskt (boolean)
  • Sträng: Vanlig text (string)
  • Vektor: Lista som innehåller en eller flera datatyper vilka kan vara likadana eller olika (array)
  • Resurs: Koppling till resurser som t.ex databaser, filer, nätverksanslutningar m.fl (resource)
  • Objekt: Samla verktyg och egenskaper i ett s.k. objekt för att skapa mer återanvändbar kod (object)
Datatyperna Resurs, Vektor och Objekt är svåra att förstå och begripa så därför kräver de en ny artikel var för sig.

Överkurs
Datatypen Objekt är överkurs så jag kommer endast visa principen och några mycket enkla exempel i en framtida artikel.

Datatyper i andra programmeringsspråk
I andra programmeringsspråk så används datatyperna på ett mer låst sätt. Man kan inte göra hur som helst. Vill man skapa en variabel som man vet kommer innehålla en viss typ av data, måste variabeln deklareras först. Det betyder att man väljer datatypen först och sedan får den inte ändras. Men den kan ändras men då måste man använda andra lite svårare tekniker.

Datatyperna i PHP
I PHP omvandlas variablerna automatiskt till den datatyp som datan har när den sparas i variabeln. Om en variabel innehåller text får den datatypen "string" men om man sedan sparar några heltal i samma variabel, omvandlas datatypen automatiskt till "integer".

Det finns både för- och nackdelar med detta men jag tycker det är skönt att slippa tänka på vilka typer av variabler man använder i sin kod. Man behöver bara kontrollera data bättre för att det inte ska bli fel. Man måste även kontrollera data bättre i andra programmeringsspråk för att slippa få komplicerade fel och s.k. undantag.

Heltal
Heltal heter på engelska "integer".

Positivt och negativt

Heltal i PHP är tal/siffror som kan vara antingen positiva (+) eller negativa (-). Man använder de precis som man gör i vanlig matematik i skolan.

Nybörjartips
Ni behöver egentligen bara koncentrera er på människans talsystem i första hand. Ni kan hoppa över de andra talsystemen. De andra beskriver jag endast eftersom jag tror det finns några som vill känna till de andra talsystemet i alla fall.


Människans talsystem basen 10
Vi människor har ett talsystem från 0 till 9. Man säger att vårt talsystem har basen 10 (0 1 2 3 4 5 6 7 8 9). Vi kan alltså beskriva tal med 10 olika siffror. Det finns även andra sätt att representera heltal vilka beskrivs här nedanför.
Exempel:
10, 27, 10254, +56, +79, -62, -2, -9
Datorernas talsystem basen 2
Datorer använder basen 2 (0 1). Här får vi bara använda siffrorna 0 (noll) och 1 (ett). De kallas för binära tal.
Exempel:
101, 10010110101, 11110, 11010, 0, 1
Program och utveckling basen 16
Ett vanligt sätt att beskriva stora tal är med basen 16 i det s.k. hexadecimala talsystemet från 0 till 9, sedan från A till F (0 1 2 3 4 5 6 7 8 9 A B C D E F). Dessa tal används vanligen när man programmerar stora program och system med avancerade konfigurationer. Det är också vanligt när man arbetar med kryptering.

Ett hexadecimalt tal måste inledas med 0x eller 0X.
Exempel:
0x5, 0x2F, 0x694FA, 0x101
Oktala talsystemet basen 8
Jag har inga bra exempel på när det är bra att använda det oktala talsystemet med basen 8. Det är tal från 0 till 7 (0 1 2 3 4 5 6 7). Ett användningsområde jag känner till är i Unix/Linux när man behöver konfigurera behörigheter i filsystemet (läsa [4], skriva [2], köra [1]). Då får man tal som kan se ut så här: 777, 644, 500, 100.

För att arbeta med oktala tal i PHP måste de börja med 0 (noll).
Exempel:
0100, 08, 012, 029, 0777
Exempel i PHP med olika heltalstyper
Nu ska jag visa hur vi kan använda oss utav det jag precis har gått igenom.
<?php
// Exempel 1 på talsystem i PHP
$tal = 1234; // Positivt heltal basen 10
$tal = -1234; // Negativt heltal basen 10
$tal = 0x101FA; // Hexadecimalt heltal basen 16
$tal = 0777; // Oktalt heltal basen 8

// Binära heltal basen 2 måste skrivas som text
$tal = "10110"; // Binärt heltal basen 2
?>
<?php
// Exempel 2 på talsystem i PHP
$tal1 = 12;
$tal2 = 26;
$summa = $tal1 + $tal2;
echo $summa; // Skriver ut summan av 12 + 26 vilket är 38
?>
<?php
// Exempel 3 på talsystem i PHP
$tal1 = 0xFA2; // Hexadecimalt blir 4002 när 0xFA2 omvandlas till heltal basen 10
$tal2 = 1024; // Heltal basen 10
$summa = $tal1 + $tal2;
echo $summa; // Skriver ut summan av 4002 + 1024 vilket är 5026
?>
Heltal kan vara max 2147483647. Heltal som är större än det omvandlas automatiskt till decimaltal, eller flyttal som det även kallas.

Decimaltal / Flyttal
Decimaltal i PHP kallas även för flyttal och det är tal som kan bestå av decimaler (inte hela tal). Man separerar heltals- och decimaltalsdelen med punkt ( . ). Flyttal kallas även för "float", "double" och "real" i andra programmeringsspråk. I PHP hanteras de alla likadant.

Överkurs
Vill man ha högre precision när man beräknar data i PHP måste man använda ett s.k. bibliotek med kodverktyg som är anpassat för detta. Två exempel på bibliotek är BC Math [1] och GMP [2].

I PHP blir 1/3 = 0.333333333333 och floor( 0.1+0.8) * 10 ) blir 7 när det egentligen ska bli 8. [3]

Exempel på decimaltal
1.2 8.6 0.1 0.7
Här nedanför ser ni exempel på kod i PHP
<?php
// Använda decimaltal i PHP
$float1 = 1.2;
$float2 = 3.6;
$produkt = $float1 * $float2;
echo $produkt; // Skriver ut produkten 4.32 av multiplikationen 1.2 * 3.6
?>
Boolesk - Sant eller falskt
Boolesk heter på engelska "boolean" och är en datatyp som bestämmer att en variabel bara får innehålla värdet sant "true" eller falskt "false". Den datatypen är väldigt användbar när man vill styra programflödet i koden. Hur man styr programflödet kommer jag gå igenom i en framtida artikel.

Resultat från en uträkning eller ett resultat från ett verktyg eller funktion i PHP blir alltid sant eller falskt, även om resultatet är ett heltal.

0 (noll) i PHP är lika med falskt och alla tal under och över 0 är lika med sant.
Exempel
true = sant
false = falskt
-1 = sant (mindre än noll)
0 = falskt
1 = sant (större än noll)
Här nedaför kan ni se ett exempel på datatypen boolesk
<?php
// Test med boolean variabler
$bool1 = false;
$bool2 = true;
$bool3 = 1-2;
$bool4 = 0;

//
// Överkurs test
// - Kontrollera programflödet
//
if (bool4 == true) {
echo "sant";
} else {
echo "falskt";
}
?>
Sträng
En sträng i PHP är helt vanlig text. På engelska heter det "string". Ni kom i kontakt med denna datatyp i del 1. Då sparade vi texten "Patrik" i en variabel som vi döpte till "$variabel_3".

Strängar används väldigt ofta i PHP. Ett exempel på det är när man skickar data via formulär skapade med HTML/XHTML. Det är det man håller på med när man arbetar med webbdesign för er som inte vet vad HTML är för något.

För att skapa data i PHP som ska vara en text, sätter vi texten innaför apostrofer ( ' ) eller citationstecken ( " ).
Exempel
"Emelie", "Pelle", "Anna", 'Patrik', 'Erik', 'Fredrik'
Här nedanför kan ni se ett exempel med strängar
<?php
// Använda strängar i PHP
$text1 = "Pelle";
$text2 = "Anna";
$text3 = 'Waschman';
$text4 = '<b>detta visar html kod som omvandlas till fet stil</b>';
echo "Hej och välkommen $text1 !"; // Skriver ut texten: Hej och välkommen Pelle !
?>
En text kan innehålla variabler som i sin tur kan innehålla text, heltal eller decimaltal. I exemplet ovanför, omvandlas först variabeln $text1 till värdet den innehåller som är Pelle. Sedan läggs den texten in i texten runtomkring

För att förstå ännu bättre visar jag ett exempel till
<?php
// Använda olika sorters strängar i PHP
$namn1 = "Pelle";
$namn2 = "Erik";
echo "Du heter $namn1 !";
echo ' och din kompis heter $namn2 !';
?>
Apostrofer ( ' ) omvandlar inte variabler inuti texten. Men det gör däremot citationstecken ( " ).

Överkurs
Om man arbetar med mycket text i PHP och man får många besökare till sin webbsida som använder tjänsten så att PHP körs, då är det bra att använda apostrofer iställer för citationstecken runt sina texter. Om citationstecken används söker PHP tolken efter variabler och annan data i texten. Det tar lite extra tid och processorkraft av webbservern där PHP körs. Det medför lägre prestanda och i kritiska webbapplikationer kan man tjäna flera sekunder. Innanför apostroferna söker PHP tolken inte efter några variabler och då går det snabbare att översätta PHP-koden till HTML-kod.

Flera datatyper
Jag har nämnt att det finns flera datatyper men de är lite svårare att förstå. Därför skriver jag om de i framtida artiklar.

Omvandla mellan olika datatyper
I PHP kan man omvandla en datatyp till en annan datatyp mycket enkelt. Man använder en teknik som kallas "typkonvertering". Det visas senare. Nu visar jag bara ett enkelt exempel på att en variabel kan ändra sin typ beroende på innehållet som sparas inuti den.
<?php
// Omvandla datatyper i PHP
$text1 = "Pelle";
$text1 = 34;
$text1 = 1.5;

/* Här använder vi oss utav en funktion i PHP
som vi använder som verktyg för att utföra en viss uppgift.
var_dump() skriver ut en beskrivning av variabeln och dess
datatyp samt dess innehåll. */
var_dump($text1); // Skriver ut: float(1.5)
?>
Här i ovanstående exempel ser vi att vi använder samma variabel men vi sparar olika data inuti den. Först sparar vi en textsträng i variabeln vilket ger datatypen "string". Sedan ändrar vi innehållet till ett heltal vilket automatiskt omvandlar datatypen till "integer". Till sist ändrar vi innehållet i variabeln till ett decimaltal vilket automatiskt omvandlar datatypen till "float".

I kommentarerna kan ni läsa att funktionen var_dump() [4] används som ett verktyg för att beskriva variabeln åt oss. Den funktionen används mycket när man letar efter fel i sin kod och vill undersöka sina variabler och datan som är sparad i dem.

Men hur gör man om t.ex. $text1 innehåller decimaltalsvärdet 1.5 och du vill omvandla det till ett heltal? Vi kan använda oss av typkonvertering. Det görs genom att skriva datatypen inom parentes innan variabeln som ska omvandlas.
<?php
// Typkonvertering 1 i PHP
$tal = 1.8; // Är av typen float
$nytt_tal = (int) $tal; // Nu är den av typen int
var_dump($nytt_tal); // Skriver ut: int(1)
?>
Nackdelen med typkonvertering är att man kan förlora data och viss precision. Problemet är att vi förväntar oss utskriften int(2) istället för int(1) eftersom decimaltalet 1.8 avrundas uppåt till 2, eller hur!? Detta problem inträffar även i många andra programmeringsspråk än PHP.

För att lösa problemet måste vi först använda ett slags verktyg för att avrunda ett decimaltal upp till närmaste heltal, innan vi kan omvandla det till ett riktigt heltal. Ett bra verktyg vi kan använda är round() [5].

Efter att man har använt round() använder man typkonverteringen (int) för att omvandla variabelns datatyp till heltal "int".
<?php
// Typkonvertering 2 i PHP
$tal = 1.8; // Är av typen float
$nytt_tal = round($tal); // Avrundad till 2.0 och fortfarande av datatypen float
$nytt_tal = (int) $nytt_tal; // Typkonvertera till heltal
var_dump($nytt_tal); // Skriver ut: int(2)
?>
Typkonvertering är bra att använda när man verkligen vill kontrollera att en variabel får rätt datatyp.

Sammanfattning
Vi har gått igenom lite olika datatyper i PHP och hur de kan användas. För att förstå lite mer har jag beskrivit grunderna i talsystemen med baserna 2, 8, 10 och 16.

Datatyperna vi har gått igenom är heltal "int", decimaltal "float", boolesk "boolean" och strängar "string". Jag bestämde också att beskriva några andra bra datatyper vid ett annat tillfälle i en framtida artikel.

Nästa gång kommer jag prata om vektorer som är variabler med listor av lika eller olika datatyper. Men mer om det nästa gång.

Slutord
Ni har nu läst del 2 i min artikelserie om "PHP för riktiga nybörjare". Artikelserien är tillägnad min bror och alla nybörjare inom PHP eller programmering överhuvudtaget.

Om något är oklart eller svårt att förstå så tveka inte att kontakta mig med en kommentar. Klicka på länken "Kommentarer" eller "Skicka en kommentar".

Jag försöker beskriva programmering på ett så enkelt sätt som möjligt, men eftersom jag är en erfaren programmerare så är vissa saker för självklara för mig och det kan då vara svårt att beskriva med enklare ord. Därför ber jag er snällt att påpeka eventuella problem ni har att förstå innehållet i artikeln.

Ni kan också skicka in begäran om att jag ska visa fler kodexempel om hur man använder tekniken som beskrivs.

Jag hoppas ni har haft en mycket trevlig läsning.

Källor
[1] http://www.php.net/manual/en/ref.bc.php - BC Math
[2] http://www.php.net/manual/en/ref.gmp.php - GMP
[3] http://www.php.net/manual/en/language.types.float.php - Floating point numbers
[4] http://se.php.net/var_dump - Beskriv variabler
[5] http://se.php.net/round - Funktionen round()
[6] http://waschman.blogspot.com/2009/06/programmering-artikelserie-php-for.html

20 januari, 2009

Java: Filmer för totala nybörjare inom Java programmering (på engelska)

Jag vill tipsa er alla som vill lära er Java Programmering om en webbsida [1] där man kan se guider på engelska (kräver att man har Adobe Flash installerat) om hur man kommer igång med Java och texteditorn Eclipse, vilken egentligen är en IDE som står för "Integrated Development Environment".

Jag fann sidan genom att söka på Google efter "Java nybörjare".

Jag vill även passa på att tipsa er alla om en annan webbsida som är dedikerad till alla nybörjare inom Java [2]. Dock är webbsidan också på engelska men personligen tycker jag att den är väldigt lättläst.

Referenser
[1] Eclipse and Java for total beginners - video
[2] Java Beginner Tutorial

07 november, 2008

Java: Bra tips för java programmerare

Förord
(090122) Först skall jag berätta att jag har bytt namn på inlägget samt ändrat innehållet. Inlägget riktar inte sig längre till nybörjare utan istället för de som lärt sig grunderna i Java.

Jag läser just nu (081107) Java Programmering Fortsättning på högskolan i Halmstad och nu är det lite svårare att hålla koll på allt man har lärt sig. Jag kan grunderna i Java men ibland får man hjärnsläpp eller så söker man efter lösningar på problem som verkar svåra men som egentligen har en smidig och enkel lösning.

Men vad ska då det här inlägget handla om?
Jo jag hade tänkt publicera lite Java tips under tiden som jag går utbildningen för att hjälpa mig själv och andra som har liknande problem. Tipsen lämpar sig väl för programmerare som redan känner till Java men som fortfarande inte riktigt känner sig som hemma. Inlägget är även till för de som vill fräscha upp minnet lite. Nybörjare får gärna göra ett försök att hänga men det är inget jag rekommenderar.

Själv använder jag detta inlägg som uppslagsverk för det jag inte kan i huvudet (i viss mån).

Viktigt att observera för er läsare
Detta inlägg kommer att uppdateras och redigeras allt eftersom när jag väljer att lägga till eller ta bort tips från listan. Ni själva får gärna skriva en kommentar och tipsa om era smidiga Java lösningar. Men tänk på att hålla det på en mycket grundläggande nivå.

Lista med Java tips
x Omvandla från int till String:
// Det snabbaste sättet att omvandla från heltal till textform
int tal = 5;
String text = ""+ tal;

x Använda reguljära uttryck (regular expressions) - Bra att använda om man t.ex vill matcha en text mot endast gemener, versaler och siffror (eng. alphanumeric) eller andra kombinationer:
import java.util.regex.*; // importera biblioteket

String s = "84peon68"; // Exempel på användarnamn som skall kontrolleras
Pattern p = Pattern.compile("^[A-Za-z0-9]+$");// Sök efter Versaler, gemener, siffror
if ( p.matcher(s).matches() ) {
// Träff
}

x Skapa en konstant (eng. constant) variabel:
// Notera att man måste initiera ett värde direkt vid deklarationen.
// Ett bra användningsområde är att man slipper ändra data överallt i koden och
// kan istället ändra på ett enda ställe.
final int MAX_ANTAL = 7;
final float RANTA = 0.25;

x Statiska metoder:
// Klassen Math är statisk (eng. static) för den kan
// användas för att anropa metoderna direkt:
double pi = Math.PI;
int power = Math.pow(2, 8);

x ...

Slutord
Så! Det här var en del av de tips jag kan ge till Java programmerare som precis lärt sig grunderna och vill ha lite tips. Tveka inte att titta tillbaks vid ett senare tillfälle för att se efter om listan med tips har blivit utökad.

Troligen kommer listan att utökas när jag nu (090122) läser kursen Algoritmer och Datastrukturer (Java).

Jag hoppas ni fick svar på några funderingar och att ni löste ert problem (ni som nu hade något). Om ni undrar över något och om ni är nybörjare inom Java får ni gärna skriva en kommentar och fråga om jag kan skriva om det. Jag hoppas att jag skall kunna ge er svar, men kan inte garantera något svar.


Referenser och källor
http://www.regular-expressions.info/

01 november, 2008

Javascript: Ändra bakgrundsbild dynamiskt på en webbsida

Javascript är ett smidigt skriptspråk när man vill ändra saker på en webbsida. Eftersom allt som visas på sidan är objekt så kan man komma åt dessa och ändra egenskaperna via Javascript. Det vi ska göra nu är att ändra en bild dynamiskt till vad vi vill.

Varför vill man göra detta?
Tänk dig att du t.ex har en webbsida som använder en CSS stilmall för att sköta design och layout. På sidan finns följande div-tagg innanför <body>:

filnamn: index.html
<div id="pageHeader">Titel här</div>

som innehåller en bakgrundsbild med följande kod inkluderad i stilmallen:

filnamn: styles.css
#pageHeader {
background-image: url(/images/headers/bigblue.png);
}

Då har alla undersidor med det div-ID samma bakgrundsbild och det kan vara lite krångligt att ändra manuellt. Då kom jag på att man kan ange i koden för den aktuella webbsidan en sökväg till den bild man vill ha som bakgrundsbild som då används istället för originalbilden.

Detta är användbart i följande exempel: Du har t.ex en webbsida om ett populärt resmål men vill även ha en undersida som innehåller historia om resmålet. Då tycker du att det hade passat med en annan bild som visar hur området såg ut förr.

Hur Javascriptet fungerar
Skriptet fungerar som så att det söker igenom den aktuella webbsidan efter ett unikt ID som innehåller en sökväg till en bild som ska byta ut den som redan visas på sidan. Om inget ID hittas så lämnas originalet oförändrad.

Placera följande kod som inkluderar skriptet innan taggen :
<script type="text/javascript" src="changeheader.js"></script>

Här är koden för skriptet:

filnamn: changeheader.js

//
// cross browser getElementById()
// -- väldigt smidigt sätt men det finns andra implementeringar --
function getObject(id) {
var object = null;
if( document.layers ) {
object = document.layers[id];
} else if( document.all ) {
object = document.all[id];
} else if( document.getElementById ) {
object = document.getElementById(id);
}
return object;
}

/**
* En funktion för cross-browser kompatiblititet när vi lägger till
* events på sidan.
* Den stödjer endast javascript funktioner som har 'on'
* framför (t.ex onLoad).
*/
function addEvent(element, evType, func, useCapture)
{
// Firefox?
if (element.addEventListener)
{
element.addEventListener(evType, func, useCapture);
return true;
}
// Internet Explorer?
else if (element.attachEvent)
{
var ret = element.attachEvent("on"+evType, func);
return ret;
}
else
{
// Visa ett meddelande för besökaren att webbläsaren
// måste uppgraderas för att stödja javascript
// funktionalitetet fullt ut.
var msg = "Your webbrowser doesn't support the Javascript used on this page.\n";
msg += "Please upgrade to be able to use full functionality.\n\n";
msg += "//Staff";
alert(msg);
}
}

//
// Change the headerbackground image
// -- Här är den specifika koden som ändrar bakgrunden --
//
// Copyright &copy 2008 - Waschman
// License: Open Source
//
function changeHeader()
{
// The div-header
headerBox = getObject("headerBox");
// The div that contains the path
headerPlaceholder = getObject("dynamicHeaderImage");

// Did we fint the right object?
if (headerPlaceholder == null) {
/*alert("Skriptet vet inte vilken bild som ska användas som sidhuvud!\nVar vänlig kontakta support");*/
return false;
}

// Get the path
pathToImage = headerPlaceholder.innerHTML;

// uncomment to hide placeholder if no inline-css is used
//headerPlaceholder.style.display = "none";

// change image
headerBox.style.backgroundImage = "url("+ pathToImage +")";
}

//
// Body onload
// -- Denna kod kör funktionen “changeHeader” vid body onLoad --
addEvent(window, "load", changeHeader);

Så, det var koden och nu återstår bara att lägga in följande kodsnutt innanför <body> som aktiverar ändringen. Tänk på att bara lägga in denna kod på de sidor som du vill ska ha en specifik bakgrundsbild som "header".

filnamn: historia.html
<div id="dynamicHeaderImage" style="display: none">/images/headers/new_header_red.png</div>

Det är här ni anger vilken ny bild ni vill använda. För att se ett exempel kan ni ladda ner ett komprimerat zip-paket med några testfiler.


(Tillägg 25/7-09) Flytande ramar - IFrame
Om man vill kunna komma åt dynamicHeaderImage som är placerad i en iframe, från huvudsidan, kan man använda följande changeheader.js istället.

Varning!
Observera att koden inte riktigt fungerar som den ska. Allt fungerar förutom att man måste ladda om index sidan manuellt för att bakgrundsbilden ska visas. Detta för att changeHeader() körs vid body onload(). Om något vet hur man fixar detta så skriv gärna en kommentar.

Filnamn: changeheader.js
Beskrivning: Används endast för de som använder iframes. Inte testad med vanliga ramar.
//
// cross browser getElementById()
// -- väldigt smidigt sätt men det finns andra implementeringar --
function getObject(id) {
var object = null;
if( document.layers ) {
object = document.layers[id];
} else if( document.all ) {
object = document.all[id];
} else if( document.getElementById ) {
object = document.getElementById(id);
}
return object;
}

function getIframeObject(oIframe, id) {

var newIframe = getObject(oIframe);
var innerDoc = newIframe.contentDocument || newIframe.contentWindow.document;

if( innerDoc.layers ) {
object = innerDoc.layers[id];
} else if( innerDoc.all ) {
object = innerDoc.all[id];
} else if( innerDoc.getElementById ) {
object = innerDoc.getElementById(id);
}
return object;
}

/**
* En funktion för cross-browser kompatiblititet när vi lägger till
* events på sidan.
* Den stödjer endast javascript funktioner som har 'on'
* framför (t.ex onLoad).
*/
function addEvent(element, evType, func, useCapture)
{
// Firefox?
if (element.addEventListener)
{
element.addEventListener(evType, func, useCapture);
return true;
}
// Internet Explorer?
else if (element.attachEvent)
{
var ret = element.attachEvent("on"+evType, func);
return ret;
}
else
{
// Visa ett meddelande för besökaren att webbläsaren
// måste uppgraderas för att stödja javascript
// funktionalitetet fullt ut.
var msg = "Your webbrowser doesn't support the Javascript used on this page.\n";
msg += "Please upgrade to be able to use full functionality.\n\n";
msg += "//Staff";
alert(msg);
}
}

//
// Change the headerbackground image
// -- Här är den specifika koden som ändrar bakgrunden --
//
// Copyright © 2008 - Waschman
// License: Open Source
//
function changeHeader()
{
// The div-header
headerBox = getObject('headerBox');
// The div that contains the path
headerPlaceholder = getIframeObject('iframeContent', 'dynamicHeaderImage');

// Did we fint the right object?
if (headerPlaceholder == null) {
//alert("Skriptet vet inte vilken bild som ska användas som sidhuvud!\nVar vänlig kontakta support");
return false;
}

// Get the path
pathToImage = headerPlaceholder.innerHTML;

// uncomment to hide placeholder if no inline-css is used
//headerPlaceholder.style.display = "none";

// change image
headerBox.style.backgroundImage = "url("+ pathToImage +")";
}

//
// Body onload
// -- Denna kod kör funktionen “changeHeader” vid body onLoad --
addEvent(window, "load", changeHeader);

Använd denna kod för att visa iframe:
<iframe id="iframeContent" name="iframeContent"></iframe>

Koden är nästan likadan som den förra men funktionen 'changeHeader' har modifierats och en ny funktion 'getIframeObject' har lagts till.

Lycka till!

12 oktober, 2008

Programmering: Java program för restid mellan två datum

Nu är det första gången som jag publicerar ett Java-program här på bloggen. Innan har det bara varit lite Javascript men nu kommer det riktiga.

Det är ett litet program för att räkna ut en restid mellan två datum. Det var en uppgift i kursen Programmering på högskolan i Halmstad.

Tänk på att det inte går att räkna ut restider som överlappar i veckor. T.ex går det inte att räkna ut restiden mellan Sat 05:47 och Tue 14:15!

Den smarta uträkningen är att jag först omvandlar skillnaden mellan de två tiderna till sekunder. När man sedan har antalet sekunder kan man formatera och beräkna resultatet nästan hur man vill för att få det snyggt. Jag kände att jag ville dela med mig av detta.


//***************************************
// TravelTime.java
// Name: Waschman
// Hemsida: http://waschman.blogspot.com
// Licens: OpenSource
//
// Beräkna tiden mellan två tidpunkter
//***************************************

import java.util.Scanner;

public class TravelTime
{

public static void main(String[] args)
{
Scanner scan = new Scanner(System.in);
String startTime, stopTime;
int dayA, dayB;
int minA, hourA, minB, hourB;

// Hämta tiderna från användaren
System.out.println("Trive time, please use Mon,Tue,Wen,Thu,Fri,Sat,Sun");
System.out.print("Enter start time (e.g. Mon 06:55): ");
startTime = scan.nextLine();
System.out.print("Enter stop time (e.g. Wen 08:55): ");
stopTime = scan.nextLine();

// Fixa fram specificerade data

// Hämta dagnr för vald textdag
dayA = getDayTextToInt( startTime.substring(0, 3) );
hourA = Integer.parseInt( startTime.substring(4, 6) );
minA =Integer.parseInt( startTime.substring(7, 9) );

dayB = getDayTextToInt( stopTime.substring(0, 3) );
hourB = Integer.parseInt( stopTime.substring(4, 6) );
minB = Integer.parseInt( stopTime.substring(7, 9) );

// Felkontroll
if (dayA == 0 || dayB == 0) {
System.out.println("Please enter data in correct format!");
}
else {
// Beräkna antalet sekunder som skiljer
int secDiff = ( (dayB*24)*3600 + hourB*3600 + minB*60 ) -
( (dayA*24)*3600 + hourA*3600 + minA*60 );

// Visa en snygg tid
int dd,hh,mm,rest;
dd = secDiff / 3600 / 24;// Räkna ut antalet dagar
hh = secDiff / 3600 - dd * 24;// Timmar
rest = secDiff % 3600;
mm = rest / 60;// Minuter

// Visa resultatet
System.out.println("The traveltime is "+ dd +" days, "+ hh +" hours and "+ mm +
" minutes between "+ startTime +" and "+ stopTime);
}
}


//--------------------------------------
// Convert a string representation of a
// day in the week to integer
// Return: int
//--------------------------------------
public static int getDayTextToInt(String day)
{
day = day.toUpperCase();
if (day.equals("MON")) {
return 1;
}
else if (day.equals("TUE")) {
return 2;
}
else if (day.equals("WEN")) {
return 3;
}
else if (day.equals("THU")) {
return 4;
}
else if (day.equals("FRI")) {
return 5;
}
else if (day.equals("SAT")) {
return 6;
}
else if (day.equals("SUN")) {
return 7;
}
else {
return 0;// Fel format
}
}

}

För att testa koden måste ni först kompilera den till en *.class fil.

08 oktober, 2008

Programmering: PHP Automatiskt Bahnhof inloggning Halmstad Hitnet

Hej! Jag använder Bahnhof's stadsnät i Halmstad för mitt Internet med mera. Nu är det så att man måste logga in manuellt varje gång i Halmstads hitnet-portal. Men om man däremot använder en router mellan sin dator och sitt nätverksuttag så borde det inte vara några problem.

Nu är det så att jag vill logga in automatiskt på stadsnätet med mitt användarnamn och lösenord. Hur löste jag det? Jo, jag programmerade ett väldigt litet skript i PHP som sedan anropas varje gång jag startar min dator. För er som vill veta använder jag PHP-Gtk2 i nuläget för att köra lokala PHP-skript.

Hur fungerar det?
Det är bara att köra skriptet samt tillåta trafiken genom brandväggen.

bahnhof-autologin.php
<?php

// Här anger ni inloggningsuppgifterna
$username = 'ANVÄNDARNAMN_HÄR';
$password = 'LÖSENORD_HÄR';
$realm = 'bahnhof';

// Server, port, samt data för att logga in via POST
$server = 'login.hitnet.nu';
$port = '80';
$uri = '/axs-login.do';
$content = 'method=login&username='. $username .'&realm='. $realm .'&password='. $password .'&next=Logga+in%21';

$post_results = doPost($uri, $content, $server);

//
// Credit går till "albertohf"
// på webbsidan http://www.php.net/fsockopen
//
function doPost($uri,$postdata,$host){
// Skapa en anslutning till servern
$da = fsockopen($host, 80, $errno, $errstr);
if (!$da) {
// Felkontroll
echo "$errstr ($errno)
\n";
echo $da;
}
else {
// Skapa paket-huvudet som ska skickas till servern som POST
$salida ="POST $uri HTTP/1.1\r\n";
$salida.="Host: $host\r\n";
$salida.="User-Agent: PHP Script Waschmans Autologin\r\n";
$salida.="Content-Type: application/x-www-form-urlencoded\r\n";
$salida.="Content-Length: ".strlen($postdata)."\r\n";
$salida.="Connection: close\r\n\r\n";
$salida.=$postdata;

fwrite($da, $salida);

while (!feof($da))
$response.=fgets($da, 128);

$response=split("\r\n\r\n",$response);

// Endast till för felsökning.
// Sparar resultatet från inloggningen i results.html
file_put_contents('results.html', $response);

$header=$response[0];
$responsecontent=$response[1];
if(!(strpos($header,"Transfer-Encoding: chunked")===false))
{
$aux=split("\r\n",$responsecontent);
for($i=0; $i<count($aux); $i++)
if($i==0 || ($i%2==0))
$aux[$i]="";
$responsecontent=implode("",$aux);
}//if
return chop($responsecontent);
}//else
}//function-doPost
Koden kanske även fungerar för andra Internetleverantörer i stadsnätet men det har jag lite svårt att testa eftersom jag bara har en tjänst beställd.

Jag vet inte riktigt hur många av er som kan ha någon nytta av detta men det har i alla fall jag. Tänkte att jag skulle publicera koden till allmänheten.

Tips!
Om ni använder webbläsaren Firefox med tillägget "Live HTTP Headers" så kan ni se alla paket-huvuden som skickas till servern när ni loggar in, loggar ut, eller helt enkelt surfar vanligt. Då kan ni ta reda på formatet som används för att skicka variablerna till inloggningsservern och sedan fortsätta där genom att programmera ett eget skript.

Om någon av er kära läsare får användning av detta eller vill använda koden för att sedan anpassa den för era behov så får ni gärna lämna en kommentar och berätta.

11 juli, 2008

Programmering: PHP för riktiga nybörjare - Del 1

Artikelnserien är tillägnad min bror

Förord
Nu ska jag försöka skriva en artikel om hur man kommer igång med PHP om man aldrig har programmerat förut. Det kommer bli en utmaning eftersom jag måste försöka använda enkla ord och beskrivningar. Tvivla inte att skicka en kommentar om något är svårt att förstå.

Min yngre bror försöker lära sig att programmera i PHP och designa webbsidor med grundläggande HTML så därför är guiden anpassad för honom. Han har aldrig programmerat förut men har ett starkt intresse. Artikeln måste därför vara anpassad för en ung tonåring.

Delar i artikelserien
Lista med alla delar i artikelserien [1]

Vad vi kommer att gå igenom
  • Kort om vad PHP är för något samt varför man använder det.
  • Hur man skriver kommentarer i sin kod.
  • Variabler
  • Text och siffror
  • Hur man skriver ut text på en webbsida.

Introduktion

Vad är PHP
PHP var från första början år 1994 en förkortning för "Personal Home Page". Under senare år har man börjat omvandla förkortningen till "PHP: Hypertext Preprocessor".

Vad används PHP till?
PHP används på webbsidor på en dator som vi kallar för "webbserver". Där har PHP uppgiften att göra olika uppgifter som vi kommer att gå igenom senare och i framtida artiklar om PHP. Det absolut viktigaste är att PHP används till att skapa webbsidor automatiskt utan att man själv ska behöva uppdatera och ändra koden för sin webbsida. Detta kallas för dynamiska webbsidor. Allt handlar helt enkelt om att förenkla uppgifterna för dig själv - oftast - så att man slipper uppdatera varje webbsida var för sig. Mer om sånt här kommer vi gå igenom i senare artiklar när vi lär oss mer avancerad PHP.

Man skriver alltså kod som sedan utför något. Detta kallas för att "skripta". Då kan vi nu säga att PHP är ett skriptspråk som används för dynamisk webbutveckling. Det är skillnad på webbutveckling och webbdesign.
  • Webbdesign är när man skapar webbsidor och sköter designen - färger, utseende, formgivning och så vidare.

  • Webbutveckling handlar mest om att skriva kod som styr de flesta funktionerna på en webbsida. Det kan till exempel vara att visa dagens datum på webbsidan, visa vilken IP-adress besökarna har, ta hand om en gästbok eller kanske ett forum.
Eftersom jag har sagt att PHP anpassar en webbsida beroende på vad du har valt att PHP ska göra så vet vi nu en sak som är mycket viktig: man bör kunna grunderna i webbdesign (alltså hur man skriver HTML kod) för att lyckas inom PHP programmering.

Kostar det något att använda PHP
Om man vill använda PHP så måste man ju spara sina php-filer till en webbserver som jag talade om förut. Det finns servrar att hyra och man kan sätta upp en egen server på datorn där hemma. Hur man gör detta kan ni läsa om i en annan artikel jag har skrivit - Nätverk/Server: Sätta upp egen server #2.

PHP är gratis för alla att använda och är ett "Öppen källkods" projekt. Det betyder att koden som användes för att skapa PHP är gratis för alla och öppen att titta i.


Är det många som använder PHP?
PHP används av otroligt många programmerare och webbutvecklare. Det är ett av världens mest populära skriptspråk för webbsidor.

"PHP is a widely-used general-purpose scripting language that is especially suited for Web development and can be embedded into HTML." ~ www.php.net

Om man behöver hjälp med ett problem i PHP så är chansen mycket stor att någon redan har haft det problemet innan och att någon redan har gett ett svar. Om man söker på Google eller i kända PHP-forum så bör ni hitta det ni söker.


Mitt första PHP-skript

Hur skapar man ett PHP-skript?
Det finns många sätt man kan använda för att skapa ett PHP-skript men det allra enklaste för nybörjare är att använda programmet Anteckningar i Windows. Nu ska jag visa er steg för steg hur man kan göra.
Öppna Anteckningar:
Öppna startmenyn > Alla program > Tillbehör > Anteckningar
Ett första exempel
Skriv in koden ni ser i rutan här nedanför. Koden skriver ut ett textmeddelande på en webbsida.
<?php
echo "Hello World";
?>
För att spara ert textdokument går ni till:
Arkiv > Spara som...
Nu ska vi döpa filen med exemplet:
I fältet "Filnamn" skriver ni texten "helloworld.php" och glöm inte citationstecknen runt texten.

Tryck på knappen "Spara".
Så där. Det var väl inte så svårt. Nu har ni skapat ert allra första PHP-skript. Men för att kunna se resultatet av koden så måste man skicka php-filen till en webbserver.
Nu framöver så antar jag att ni har fixat en webbserver där ni kan spara php-filerna.
Nästa steg för er blir nu att lära er lite om byggstenarna för en kod skriven i PHP.


Hur PHP kod är uppbyggd

Regler att följa
Varje programmeringsspråk har speciella regler som måste följas för att koden ska fungera. Om man bryter mot reglerna så får man fel.
Regler i programmeringsspråk heter med ett annat ord: Syntax
Visa vad som är PHP kod
När man programmerar med PHP måste man tala om för PHP-tolken när hela koden börjar och slutar. Till detta använder man <?php och ?>. Allt som står mellan dessa är PHP kod. Det är vanligt att man blandar PHP kod med HTML kod (alltså koden för webbdesignen) och då måste man tala om när PHP börjar och slutar. Annars visas PHP koden på webbsidan och det vill vi inte.

Semikolon
Efter nästan varje rad med kod så måste man avsluta kod med ett semikolon (;). Annars vet inte PHP-tolken som läser igenom koden på webbservern var den ska sluta läsa.

Alla rader i PHP behöver inte avslutas med ett semikolon men detta kommer jag gå igenom för er i en senare artikel när vi börjar lära oss kontroll-satser och loopar.

Skriva ut text och data på webbsidan
I vårt första exempel använde vi nyckelordet "echo" som används för att skriva ut allt som skrivs bakom ordet ända tills det dyker upp ett semikolon. Då stannar tolken och skickar texten till "echo" i PHP som sedan skriver ut texten på webbsidan. "echo" är en funktion, ett slags verktyg som används för att skriva ut text.

I PHP kan man göra vissa saker på många olika sätt. Till exempel så finns det en funktion som heter "print" och som gör exakt samma sak som "echo" - skriver ut text. Tyck nu inte att ordet funktion gör det krångligt. Tänk bara på att funktioner är verktyg och hjälpmedel som gör saker åt dig.


Kommentarer

Vad är en kommentar i PHP?
Tänk dig att du har programmerat i PHP i flera år och du skapar nu webbsidor och php-skript som är flera tusen rader långa och som innehåller flera miljoner bokstäver och tecken. Men hur kommer man ihåg vad en del i koden gör för något när det finns så mycket att hålla reda på?

Jo, man skapar något som kallas "kommentarer". En kommentar används för att göra det enklare för dig som programmerare att hålla ordning i din kod och samtidigt komma ihåg vad den gör. Se kommentarer som en slags beskrivning av koden. Och vet ni vad? Kommentarerna visas inte på webbsidorna. De tas bort på webbservern innan webbsidan skickas till besökaren för att visas.

Rutorna här nedanför visar några exempel på olika typer av kommentarer

<?php
// Detta är en kommentar på en enda rad
?>
<?php
# Detta är också en kommentar på en rad
?>
<?php
/*
Här är en kommentar som kan
skrivas på flera rader.

Man kan skriva en lång beskrivning om man
har php-kod som är svår att förstå
*/
?>
Det finns ett jättestort fel som många programmerare gör och det är att man helt enkelt inte orkar skriva kommentarer för att man är lat, eller helt enkelt för att man vet exakt vad koden gör för något när man sitter och skriver den och tänker att man inte behöver några kommentarer. Men tänk om man kommer tillbaks till koden igen efter ett halvår eller mer. Då är chansen mycket stor att man har glömt bort vad koden gör och man kan råka göra ett fel eller en ändring som man inte riktigt förstår eftersom att koden kanske är svår att känna igen.

Så börja skriv kommentarer redan från första början. Då blir det även enklare att leta upp fel i koden om ni får problem.


Variabler

Spara saker
I PHP finns något som kallas för "variabler". Dessa används för att spara data som text, siffor med mera. En variabel börjar med ett dollar-tecken ($).

Nu ska jag beskriva detta så enkelt som möjligt. En variabel är en slags kakburk där man kan lägga undan olika sorters kakor med olika smak och storlekar. Kakorna i detta fallet är data i någon form.

Variabler exempel
Säg till exempel att ni vill registrera er på en webbsida där man kan ladda upp bilder på sig själv och skriva lite information om vad man heter och kanske var man bor. Ni får skriva in ert namn och adressen där ni bor. När ni sedan klickar på knappen skicka eller registrera när ni är färdiga så skickas det ni har skrivit till ett php-skript på webbservern som tar hand om detta.

PHP-skriptet sparar det ni har skrivit i variabler. Sedan kan variablerna användas för att till exempel skriva ut ert namn på webbsidan när någon besökare visar information om ert nya konto.

Ett annat exempel är en webbsida där man får skriva in hur gammal man är med siffror. När man är färdig sparas siffrorna i variabler som sedan används i en slags räknare och kontrollverktyg som ser efter om ni verkligen får komma in på webbsidan eller inte.

Här visar vi ett exempel i praktiken:
<?php
// Variabler börjar med ett dollar-tecken ($)
//
$variabel_1;
$variabel_2 = 16;
$variabel_3 = "Patrik";
//
// Nu är php-skriptet slut
?>
Nu kommer en förklaring:
  • $variabel_1 är tom och innehåller ingenting.
  • $variabel_2 innehåller nu talet 16.
  • $variabel_3 innehåller nu texten "Patrik".
Så vad tror ni nu att nästa PHP kod gör?
<?php
$variabel_2 = 16;
echo $variabel_2;
?>
Helt korrekt - koden ovanför skriver ut talet 16. Se det så här:
  1. Först sparar vi kakan 16 i kakburken (variabeln) $variabel_2.
  2. Sedan använder vi echo för att hälla ut kakorna i burken på webbsidan.
  3. På webbsidan ser vi då talet 16.
Ni glömmer väl inte att ta med semikolonet? Utan det kommer koden inte att fungera. Ni får gärna testa att ta bort ett semikolon och testa se vad som händer. Då lär ni er vilka fel ni får om ni någon gång glömmer att ha med ett semikolon på rätt ställe i koden.

Vad får variabler heta?
En variabel i PHP måste inte heta $variabel utan får heta nästan vad som helst.
  • Tänk på att inte använda svenska ord med å, ä och ö.
  • Använd helst engelska ord om ni kan.
  • En variabel får inte börja med en siffra.
  • En variabel bör helst inte börja med ett understreck (_) eftersom det finns speciella variabler i PHP som använder detta.
  • Försök att ha namnen på variablerna korta men beskrivande.
<?php
// Bra exempel
$fornamn = "Peter";
$efternamn = "Persson";
$ar_gammal = 26;
$tool = "Hammare";
$email_address = "peter.persson@live.email.com";
?>
<?php
//Dåligt exempel
$fn = "Anna";
$en = "Torstensson";
$x = 32;
$real_person_fake_email_address = "anna.torstensson@live.email.com";
?>
Som ni ser så finns det bra och dåliga sätt att skriva på. Använd namn som beskriver innehållet och inte för korta. Använd heller inte för långa namn på variablerna. Man behöver inte vara för tydlig.

Det allra viktigaste man ska tänka på när man programmerar är att koden ska vara tydlig och enkel att förstå. Man ska alltså försöka att kommentera så mycket som möjligt men inte på onödiga ställen. Försök också att hålla er till ett sätt att skriva koden, bara små bokstäver, stora bokstäver, stor bokstav vid varje nytt ord, understreck mellan ord och så vidare. Välj ett sätt som är enkelt för er att hålla kvar vid.

Vi kommer märka detta mycket tydligare i senare artiklar när koderna blir större och mer avancerade. Då är det viktigt med tydlig kod.


Sammanfattning
Vi har gått igenom vad PHP är och vad det används till. Historia om PHP har vi inte gått igenom för jag tycker inte att det är så viktigt i detta skede. Det kan man lära sig senare. Vi har sagt att PHP är gratis och att det är ett skriptspråk för webbutveckling av dynamiska webbsidor.

Vi har gått igenom kommentarer, variabler, siffror och text bara för att visa några snabba och enkla exempel. Vi har även nämnt att man ska tänka på att skriva en tydlig kod som är enkel att förstå.

Och detta var allt för den här gången. Vid ett senare tillfälle kommer jag ha en snabb genomgång av det vi lärde oss i denna artikeln och sedan gå igenom nästa steg för nybörjare inom PHP.


Slutord
Artikeln är tillägnad alla som är nybörjare inom PHP och programmering överhuvudtaget. Jag försöker beskriva allt så enkelt som möjligt med enkla ord men det är svårt när man har så mycket erfarenhet och efter att man själv redan har lärt sig det som en gång i tiden var så svårt med programmering.

Jag ser programmeringen från ett annat perspektiv och därför kan det vara svårt att se mina egna fel som nybörjare har svårt med. Om just Du är en nybörjare och inte förstår en del av det jag har försökt att beskriva så tvivla ej att skriva en kommentar och fråga om hjälp. Ni kan även be mig att uppdatera artikeln efter behov om något uppfattas som oklart.

Jag kommer att skriva en fortsättning på artikeln i en uppföljande artikel men vet tyvärr inte när detta kommer ske.

Jag hoppas att ni har haft en trevlig och lättsam läsning och att ni är nöjda med slutresultatet.

Om ni vill läsa en riktig bok om PHP tycker jag ni ska läsa min artikel om "Bästa boken om PHP" (enligt mig) [2] Ni kan även läsa en annan artikel som jag har skrivit om "mitt val av bästa programmeringsspråk" [3].

"Happy Programming!"

Källor
[1] http://waschman.blogspot.com/2009/06/programmering-artikelserie-php-for.html
[2] http://waschman.blogspot.com/2008/03/php-bsta-boken-om-php.html
[3] http://waschman.blogspot.com/2007/12/php-bsta-programmeringssprket.html

23 april, 2008

Java: Programmering för mobiltelefonen

Lite kort information
Detta är egentligen ingen riktig artikel utan är än så länge bara en liten referens om man vill komma igång med javaprogrammering för mobiltelefoner. Länkarna är på engelska och innehåller guider för hur man sätter upp sitt första HelloWorld med J2ME (Java 2 Micro Edition). Lite senare framöver är det tänkt att jag ska skriva en fulländad artikel inom ämnet eftersom jag har tänkt att studera Javaprogrammering till höstterminen 2008.

Referenser
Ladda ner J2ME från Sun
Introduction to J2ME
Wireless Development Tutorial Part 1
Wireless Development Tutorial Part 2

16 mars, 2008

PHP: Bästa boken om PHP

Det finns många av er där ute som vill lära er PHP och dess möjligheter inom serverbaserad skriptprogrammering. Ibland kan det vara svårt att läsa artiklar och söka efter information på Internet om man inte vet var man ska leta. Så därför kan det vara på sin plats att införskaffa sig en bra bok inom ämnet.

Jag vill rekommendera boken PHP5 Programmering skriven av Jesper Ek och Ullrika Eriksson, ISBN10: 9163608006, ISBN13: 9789163608001. Boken är skriven på svenska och i början går de även igenom hur man sätter upp en egen Apache webbserver på både Linux och Windows.

Alla exempel i boken har relaterade bilder som visar resultatet och det är väldigt enkelt att komma igång. Personligen tycker jag att de går igenom teorin bra och i slutet har de några praktiska övningar som man kan testa på.

När jag först lärde mig PHP så var det denna boken som jag köpte och den har hjälp oerhört mycket. Efter att ha läst den ett par gånger så använder jag den bara som uppslagsverk om jag glömmer av något.

En vilseledande sak är rubriken och det är att den har PHP5 i sig. Då tror man att de går igenom det mesta som PHP5 erbjuder men det är nästan faktiskt ingen förändring om man jämför med några av deras äldre utgåvor som heter endast PHP Programmering. Jag saknar även lite mer information om objektorientering i PHP men det kan jag läsa om i boken Professional PHP Programming och på PHP's egna webbsida php.net.

31 januari, 2008

PHP: Arbeta med projekt i PHP

Förord
Tycker ni PHP är häftigt? Vill ni få tips om hur man kan arbeta med PHP som projekt? (t.ex en webbsida, forum, databas, e-handel ...) Har ni svårt att övertala er lärare, om ni nu går i skolan, att ni verkligen vill göra ett projekt med PHP? Då tror jag att denna artikeln kan vara bra för er. Jag ska nämligen tipsa om upplägg, kodning, arbete i grupp, säkerhet (inklusive skyddad kod) och liknande. Jag är ingen utbildad projektledare eller expert inom ämnet utan talar bara efter ren erfarenhet och mindre undersökningar.

Artikeln riktar sig mest till nybörjare men även till dig som redan arbetar i projekt men som vill se efter om det finns några tips att tänka på när man arbetar. Jag vill att så många som möjligt börjar använda PHP på riktigt och inte bara sitter och kodar små skript som sedan inte blir färdiga eller färdiga skript som skickas ut till diverse skriptarkiv. Jag tycker istället att man lär sig PHP ordentligt och sedan satsar på lite större skript efter att man programmerat grundläggande koder. Trevlig läsning!

Introduktion
Om man väjer att göra ett projekt med PHP som exempelvis ett diskussionsforum, statistikapplikation, nätverksövervakning, en webbsida för e-handel, rapporthantering, webbmail, en sökmotor, databashantering, databaslagring av information, fakturor och offerter, beställningar, eller liknande, så används nästan alltid samma arbetssätt och utvecklingmetoder. Men hur lyckas man med detta? Det finns många olika sätt att lösa problemen på och det är stor chans att ni får utveckla och komma på ett eget sätt för att åstadkomma ert projektmål, men sammanfattat kan jag säga att det egentligen inte finns ett "korrekt" sätt. Om ni använder ett sätt som fungerar com ni tycker är bra så tycker jag att ni borde fortsätta med det tills ni möter motgångar.

Det finns regler som helst bör följas när man arbetar med projekt, både stora som små, men om man utvecklar (i fortsättningen av artikeln kommer jag skriva utveckling som synonym till programmering) till exempel en tjänst eller en vanlig webbsida måste man även tänka på sådant som underlättar utvecklingen för samtliga parter i projektgruppen.

Upplägg
När ni har kommit på vad det är för projekt ni vill göra och tänkt igenom det noggrannt som kommer ni till hur ni ska lägga upp arbetet. Visst att ni redan har en projektplanering och en lista över sysslor och liknande men har ni tänkt på allt förarbete? När man ska arbeta med ett projekt inom utveckling är det viktigt att man först skriver upp minsta lilla krav. Detta hoppas jag ni redan har gjort i er kravlista för projektet. Detta är mycket viktigt eftersom när man väl börjar utveckla sitt projekt kan det vara knappt med tid och då är det bra att ha en kravlista med prioriteringar över vad som är viktigast för att projektet ska fungera. Har ni (eller du om du är ensam) de kunskaper som krävs för att nå projektmålet? När detta är igenomtänkt kan man sedan utesluta några punkter tills man känner att man har mera tid och man är säker på att man kommer nå sitt huvudmål nummer 1.

Det viktigaste man kan tänka på om man designar en typ av webbsida/webbtjänst är att skissa upp så mycket som möjligt på ett papper, måla modeller, använd t.ex Microsoft Visio för att visa ett händelseförlopp eller hur allt fungerar tillsammans. Webbdesignen bör skissas på några papper först så att alla får en klar bild över design och eventuell funktion. De som kodar i PHP kan diskuttera om huruvuda man ska använda redan befintliga skriptbibliotek, vilka tillägg som krävs i projektet (t.ex GD2, MySQL, eller kanske ReWriteRule i Apache). I ett projekt där man utvecklar en typ av webbsida så går nästan all tid åt till förarbete och forskning av lösningar och idéer. Mycket brainstorming samt hur mycket tid man har på sig inför varje delmoment. När allt detta sedan är klart är det bara att börja med utvecklingen, vilket inte brukar vara så svårt, eller ta så lång tid att utföra. Utvecklingen i ett projekt brukar ta cirka 20-30% av tiden men det beror givetvis även på vilket typ av projekt man tänker göra. Det är i alla fall ett estimerat värde ni kan använda i er utvecklingsprocess och förarbete.

Hur har ni tänkt dela upp arbetet?
Är ni en som designar webbsidan och designen, en som utvecklar koden i PHP, en som hanterar databasen eller filsystemet för lagring, eller är ni helt enkelt flera som arbetar inom samma område, och i så fall, arbetar ni på samma kod? Vet ni hur ni ska koppla ihop allt för att nå en slutgiltig produkt? I vilket fall kan det vara svårt att samarbeta om man inte har en väl utformad stategi för hur man ska dela upp arbetet. Det måste tydligt framgå vem som gör vad och att personen eller personerna i fråga verkligen gör det han eller hon har blivit tilldelad och inget annat.

När detta är uppklarat så kan det uppstå vissa problem. Om man är ensam så är problemen tydliga om man inte är mycket väl förberedd. Det kan vara svårt att utvärdera sin kod och fråga efter hjälp och stöd från andra plus att det är ett enormt jobb att ha koll på allt så att allt fungerar tillsammans. Det är inte omöjligt men definitivt en utmaning. Är man två eller fler så uppstår tydliga problem om någon part inte kan eller förstår den andra partens uppgift och lösningar. Ett exempel är att en person designar en webbsida (som inte kan PHP) där det sedan krävs PHP för att utföra specifika uppgifter på serversidan som sedan kommer visa ett resultat på sidan. Detta är det en annan person som arbetar med och en lösning arbetas fram. Problemet uppstår då detta slås samman; design (logik) med funktion. På sidan, tillsammans med HTML koden, visas även PHP som inte webbdesignern förstår. Om sedan designen kanske måste ändras eller om något liknande måste modifieras så kan han eller hon råka komma åt PHP koden och ändra- eller radera något av misstag. Koden kanske måste flyttas men det kan vara svårt om koden har anpassats för just den positionen (från t.ex en tabell till en annorlunda tabell eller div). Om inte webbdesignern förstår koden kan det bli krångligt plus att det blir rörigt och osmidigt med en massa PHP kod som är nästlat i HTML koden för webbsidan. För att lösa detta problem måste kan man börja med att separera logik från funktion, med andra ord "design från PHP". Detta kan göras med hjälp av ett så kallat "Template"-system eller mallar.

Hur fungerar ett "Template"-system eller mallar?
Det fungerar som så att på de platser på webbsidan där PHP måste användas för att visa information eller liknande (från t.ex ett register i en databas) ska visas eller upprepas kan man använda ett system som använder Nyckelord - speciella fraser. En sådan fras eller nyckelord kan t.ex se ut så här
  • {example_show_username}
  • [example_show_username]
  • |example_show_username|
  • (detta var bara exempel)
När mallen har fyllts med dessa på strategiska platser används ett mycket enkelt PHP skript som inkluderas med en rad kod som är enkel att förstå:
  • require_once(templatesystem.php)
  • include_once(templatesystem.php)
Det skriptet gör är att det hämtar mallen för att sedan söka upp valda nyckelord och ersätta dessa med text, bilder, varor, kommentarer, statistik eller liknande. Efter att mallen har uppdaterats med ny information skickas den till webbläsaren och den visas för slutanvändaren.

Ett populärt system som utför detta heter Smarty men det finns även många andra. Själv utvecklade jag en egen så kallad "Template-engine" för ett projekt eftersom jag inte hade tid att lära mig Smarty. Googla eller läs om det på Wikipedia för att veta mer.

Hur man kan flera personer modifiera en och samma fil samtidigt och få det rätt?
Låt oss säga att ni är två eller fler inom samma område (t.ex PHP utvecklingen), sitter och uppdaterar kod i samma skript hemma eller på jobbet som de andra, och sedan laddar upp det till projektet på servern för att se om det fungerar. Vad tror ni händer, eller kan hända? Det värsta är att en annans lösning skrivs över med kod som inte fungerar som tänkt och viktig tid har gått till spillo. Det kan också vara att två stycken sitter med samma problem och kommer upp med olika lösningar. Eller så ändrar man kod på ett annat ställe än vad det från början var tänkt. Då är nu den stora frågan: hur har man kontroll över detta för att minska eventuella problem och tiden det tar att återställa allt om det blir fel?

Lösningen på problemet som används nästan överallt i nästan varenda projekt är CVS-hantering. CVS står för "Concurrent Versions System" och hjälper till under utvecklingsprocesser för att spåra eventuella ändringar gjorda av en eller flera medlemmar i projektgruppen eller från allmänheten. Man kan enkelt se vad som har ändrats och av vem. Det är också även enklare att utvärdera flera lösningar på ett problem. Googla på CVS eller kolla upp det på Wikipedida. Kan tipsa om programmet Subversion.

Kodning
Okej, så ni har ordnat så att ert arbete är ihopkopplat, men hur ser koden ut? Är den väl kommenterad eller snabbt ihopkodad? Används samma kodstil utöver hela projektet; även kallat för kodkonvention (viktigt om ni är fler än en inom ett och samma område)? Är koden säker (mer om detta lite senare i artikeln)? I vilket fall gäller det att tänka till ordentligt. Det är bra att tänka på att någon annan redan kanske har löst ett visst problem. Kolla upp det så ni slipper "... uppfinna hjulet på nytt".

Tänk även enligt en MVC (Model View Controller) modell - ett bra sätt att dela upp funktion (kod) i olika delar som är väldigt flexibelt. Googla eller sök på Wikipedia om ni vill veta mer.

Om två stycken inom samma område arbetar i en speciell fil och utvecklar på två olika sätt. Då får man oftast mycket svårläst kod och det kan faktiskt vara svårare att förstå vad koden utför om man inte är van vid just den kodstilen - kodkonventionen. För att undvika detta är det viktigt att komma överrens om en gemensam kodkonvention som används utöver hela projektet. Det blir enklare för alla i projektgruppen att läsa och förstå koden samt att man får bättre struktur. Här nedanför kommer exempel på tre olika kodkonventioner som är vanliga:

Exempel 1
<?php
// Check if bla bla is true and then do that bla bla
if (true) callFunctionHere();
else callOtherFunctionHere();
?>


Exempel 2
<?php
if (true) {
callfunctionhere();// do something not so cool
} else {
callotherfunctionhere();//do something cool
}
?>


Exempel 3
<?php
if (true)
{
// Do important thing
call_function_here();
}
else
{
// Not so very important
call_other_function_here();
}
?>

Kan ni se skillnaderna? Jag hoppas ni gör det och att ni sedan bestämmer en gemensam kodkonvention som jag nämnde tidigare.

Arbeta i grupp
Grupparbete är väldigt vanligt när man arbetar med projektarbeten och det är många som tycker det är bra. Men det finns även de som aboslut inte tycker om att arbeta i grupp och då kan det vara svårt att kommunicera med parterna i gruppen eller komma fram till slutgiltiga beslut. Planeringen kan då bli svårt att få optimerad eftersom man kanske inte föra en diskussion med de involverade medlemmarna.

För att försöka lösa dessa problem måste man lära sig att börja tänka tillsammans - dela era åsikter med hela gruppen och lämna aldrig någon utanför. Ni är en grupp och då ska alla få ta del av all information som är nödvändig för att man ska nå projektmålet (eller deadline!). Man kan även i början hitta på aktiviteter någon dag eller två; kanske gå ut på stan och roa sig, umgås, prata och ta reda på lite information om varandra, eller ta en middag. Hitta gärna på minst en aktivitet som kräver samarbete två och två eller hela gruppen tillsammans.

När ni väl har gjort detta så kan ni sätta upp små delmål med projektet som måste nås för att klara av sin planering, om ni inte redan har gjort detta. När eller om ni når ett delmål får ni gärna belöna hela gruppen. Då är chansen större att man peppas inför nästa steg i utveckligen.

Handledning
Tala ofta med gruppens handledare för att ge statusrapporter och för att komma igång snabbt med arbetet i början. Om man vet att man måste visa upp sitt resultat så långt i arbetet för sin handledare brukar man få ett stadig flöde av arberskraft. Alla personer i gruppen gör sina delar för att sedan visa upp eller utvärderas inför nästa steg.

Om man talar med en handledare kan man också reda ut eventuella problem som gruppen har eller ställa lite mer allmänna frågor.

Projektrapport och loggbok
Detta kommer jag inte gå igenom eftersom ni redan borde kunna detta men det är en mycket viktig sak jag måste tipsa er om. Bara för att ni kan webbdesign, databashantering och PHP så är det inte säkert att er lärare/instruktör/chef kan detta. Förklara därför först väldigt ingående varför ni har valt att göra på vissa sätt, hur det fungerar och vad ni förväntar er av projektet. Ni behöver inte lära han/hon allt om PHP utan istället bara förklara enkla grunder och principer: till exempel att PHP används på serversidan för att utföra speciella viktiga uppgifter som t.ex hämta informationen ni har lagrat i en databas och sedan skicka detta till designmallen som senare omvandlas till en komplett webbsida. Det viktigaste är betoningen av Varför!

Säkerhet i PHP
När man arbetar med PHP är det även viktigt med säkerhet. Ofta när man arbetar med projekt (större arbeten) så brukar man skippa säkerheten i början för att sedan försöka implementera det när man har nått sitt mål. Detta gör man för att spara tid eftersom det alltid finns säkerhetsbrister som måste lösas, även om man redan har gjort klart projektet och implementerat viss säkerhet. Det uppstår hela tiden nya hot.

Om man börjar implementera säkerhetsrutiner när projektet är klart så är det lätt att man missar något litet som man tänkte på när man utvecklade just den koden, men som man har glömt vid projektets slut. En enkel lösning på detta är att antingen låta en tredje part - någon ni känner som har kunskaper inom PHP och säkerhet - få undersöka er kod. En annan lösning är att ni själva låter implementera säkerhet i koden vid varje delmål. Ni behöver inte skydda allt men använd i alla fall grundläggande säkerhet som att t.ex endast tillåta heltal om ni förväntar er ett heltal.

I framtiden kommer jag skriva några artiklar här på bloggen om säkerhet i PHP och vad man ska tänka på. Tills vidare kan ni söka efter det ämnet på Google.

Slutord
Så där... har ni lärt er något nytt eller har något klarnat nu som har legat dolt i er sinne? Jag hoppas i alla fall att ni har lärt er något som kan vara användbart i framtida projekt med PHP och att om ni arbetar i grupp har lärt er samarbete på högsta nivå.

Se inte problemen - se lösningarna. Om ni fastnar med något för länge så fortsätt med något annat istället. Om ni fastnar vi ett speciellt problem kan ni testa ta en paus och/eller börja tala med någon i er närnet om problemet så kanske ni till slut kommer fram till en lösning efter att sinnet har klarnat litegrann. Hjärnan måste också vila ibland.

Detta är en artikel om hur man "kan" arbeta med projekt i PHP och vad man bör tänka på under tiden och innan man väl har börjat. Själv har jag arbetat med ett par projekt, vilka två av dem har varit riktigt stora och mödosamma. Jag har arbetat både själv och i grupp och det har varit lärorikt - mycket lärorikt.

För att citera mig själv:
"Jag är ingen utbildad projektledare eller expert inom ämnet utan talar bara efter ren erfarenhet och mindre undersökningar. Jag skriver detta för att tipsa er alla och för att även tipsa och hjälpa mig själv vid framtida projekt i PHP. Jag vill dela med mig av min kunskap för att underlätta för andra."

Källor
Smarty - Template Engine
CVS - Concurrent Versions System
Subversion - CVS Application (v1.4.6 datum 080201)
Wikipedia: CVS
MVC Programmering i PHP
Gymnasial utbildning - Projektarbete (skolverket)

15 januari, 2008

Programmering: Tjäna pengar som programmerare

Freelancer // Programmerare
Är du en programmerare som arbetar självständigt och vill tjäna lite extra snabba pengar? Då har jag några tips för dig här.

Besök då sidorna här nedan för mer information:
www.guru.com
www.getacoder.com
www.elance.com
www.getafreelancer.com
www.rentacoder.com
www.phpsidan.nu - Förmedling av jobb eller tjänster inom PHP utveckling

Jag har inte besökt alla men har hört talas om dem. Det går till så att man på något sätt ger bud eller registrerar sig och så får företag och andra som behöver er kompetens söka i ett stort register. Det kan också vara sidor där ni läser om folk som behöver hjälp och kompetens där ni sedan kan anmäla er. Alla sidorna strävar efter samma mål (tror jag) vilket är att både kund och utvecklare är nöjda när arbetet är slutfört. Det kan vara allt från stora projekt till bara någon simpel kod som man kan fixa över en natt eller två.

Här kommer även lite tips för dig som är självständig programmerare
  • Skaffa ett gott ryckte genom många vänner och kontakter. Nästan som ett socialt nätverk. Då ökar chanserna för uppgifter och kanske t.o.m. jobb.
  • Våga förhandla om priset men bara efter att du har fått reda på hela uppgiften.
  • Kom noga överens om priset så att inga missförstånd uppstår när allt är färdigt.
  • Dokumentera gärna tidigare arbeten och projekt som referenser om någon vill se vad du har åstadkommit hittills.
  • Uppträdande är viktigt - även om det är via epost, telefon eller personligen. Tänk på det.
  • Var extra tydlig för din kund/arbetsgivare om det är ett större projekt. Ge statusrapporter ofta och visa även dittills utfört arbete för att få han/hon att tro på ditt jobb och ryckte.
  • Spara allt arbete och strukturera din kod så du kan återanvända koden vi ett senare tillfälle. Kanske t.o.m. i ett senare projekt?
Nu har du fått några tips som jag har snappat upp under min tid som programmerare (sedan gymnasiet) hur man kan tjäna lite extra pengar som just programmerare/utvecklare.

12 november, 2007

Programmering: En försmak av D

De flesta som är insatta vet att C är ett gammalt programmeringsspråk som sedan utvecklades till C++. Båda så kallade språken har både för och nackdelar men nu har det änligen släppts ett nytt programmeringsspråk som heter D.

Det är en blandning mellan C/C++ och Java/C#/Ruby. Faktum är att den ligger lite mitt emellan de båda grupperna. Den absolut största fördelen enligt mig och många andra är att man kan få ökad prestanda med D än med kod som är skriven i några objektorienterade språk som Java och C#. Det är som att få prestandan från C och funktionalitet samt produktivitet från andra lite mer moderna språk.

Program med prestanda i åtanke passar utmärkt för stora system och vill man komma riktigt nära hårdvaran går det också med D. Man kan till och med anropa C kod direkt i D.

En annan viktig egenskap i D är att det finns en skräpsamlare - något som allokerar och släpper minne till och från systemet. Man slipper då jobbiga pekare som kan vara svåra att arbeta med, speciellt när det blir fel.

D har funnits i snart ett år och det finns hundratals bibliotek och program som är skrivna i D.

Då kommer vi till det som alla andra programspråk börjar med och det är "Helloworld" program. Skaffa editorn Poseidon och börja med exemplet. Sedan är det bara att dreggla och börja programmera.

Hello World i D
import std.stdio;
void main()
{
writefln("Hello World!");
}


Personligen tycker jag att man ska satsa på ett lite mer populärare programmeringsspråk såsom C, Java eller PHP. Det är bara att välja o vraka.

20 november, 2006

Tjänst för skolor

Jag vet att rubriken får det hela att låta "overkill" men så svårt ska det nog inte vara. Låt mig förklara:

De flesta som vet vad Fronter är för något och som använder det, brukar säga att det suger. De tycker det är dåligt och krångligt. Det finns funktioner som nästan aldrig används och när de väl finns tillhands är det få som vet hur man använder dem.

Jag ser Fronter som en slags portal där man som elev och lärare kan kommunicera och lämna in inlämningsuppgifter i olika ämnen med mera. Det finns också delar av sidan som kallas för rum där man kan ha saker och medlemmar som rör just ett specifikt ämne.

Jag har frågat runt lite och många tycker att det borde finnas något enklare än Fronter på marknaden - för dem som elever. Visst att lärarna tycker om det, men det är väl bara för att kommunen är "kär" i det. Nu har jag tänkt igenom detta ordentligt och har kommit fram till att jag ska försöka skapa ett eget system eller Webbapplikation som det också kallas.

Det ska fungera ungefär som Fronter fast med färre funktioner och enbart det viktigaste. Det behöver till exempel inte finnas ett chattrum när alla vet att det finns MSN, Skype med flera. Som lärare ska man fortfarande kunna administrera portalen efter eget tycke: elevkonton, prov, inlämningsuppgifter, inlämningsdatum, dokument för nerladdning och lite till.

Detta gör jag mest för att det är en utmaning men också för att jag tror det kommer bli så bra nån gång i framtiden att något företag kanske köper systemet. Man får väl drömma lite ;)
Det jag vet än så länge är att det ska vara byggt i PHP och MySQL, fungera på både Windows och Linux, samt att det inte ska finnas centralt på en server. De som vill använda systemet får helt enkelt ladda ner (köpa) källkoden och köra lokalt.

Vi får väl se hur det går i framtiden... "only time can tell!"

23 juli, 2006

PHP: Skriv text till bild med GD2

Förord
Hmm, klockan är 03:43 och jag är för pigg för att lägga mig. Kan inte förstå varför jag känner så, men jag blir nog tröttare efter att ha skrivit en liten artikel :).
Den här artikeln kommer handla om hur man skriver text till bilder i PHP. Ni kanske har sett bilder på forum som visar information om er dator; typ vilken IP-adress eller vilken Internet Leverantör (ISP) ni har. Nu kommer ni får lära er hur man visar en besökares IP-adress.


Introduktion
För att kunna hänga med i artikeln och förstå någorlunda vad jag talar om, behöver ni kunna lite PHP. Grundläggande kunskaper räcker, men ni ska helst ha vana för programmering.

Det som gör att vi kan skapa dynamiska bilder i PHP är ett bibliotek vid namn GD2 (php_gd2.dll). De som har läst min artikel om hur man "Sätter upp en egen server" har redan GD2 konfigurerat och klart. Ni andra får ta reda på om ni har det på ert webbhotel eller om ni har det på er server innan ni börjar.

Vill ni läsa lite mer om bibiloteket GD2 eller ladda ner det till er server, rekommenderar jag att ni besöker www.boutell.com/gd.

Jag tänker inte gå igenom i detalj hur ni skapar PHP-dokument för det borde ni kunna fixa på egen hand.


Då börjar vi
Börja med att leta fram den bild du vill använda. Ni kan använda den bifogade bilden om ni vill för det är den jag har använt.



Öppna sedan ett nytt PHP-dokument och skriv följande kod:

<?php
// Hämta bilden som ska visas
// Observera att bildtypen måste vara av typen PNG (mime: image/png)
$img = imagecreatefrompng('C:/bilder/sunset_small.PNG');


Nu har vi öppnat bilden och lagrat en referens till den i en variabel $img. I nästa kodsnutt definierar vi de färger vi vill kunna använda till texten:

// Definiera färger
// Vi använder RGB-värden från 0-255 (röd, grön, blå)
$black = imagecolorallocate($img, 0, 0, 0);
$white = imagecolorallocate($img, 255, 255, 255);
$blue = imagecolorallocate($img, 0, 0, 200);
$red = imagecolorallocate($img, 200, 0, 0);


Sedan sätter vi storleken på texten till den inbyggda storleken 3. Det finns följande storlekar för de som vill testa sig fram: 1 (minst), 2, 3, 4 och 5 (störst).

// Sätt en inbyggd teckenstorlek för imagestring()
$font = 3;


Nu anger vi x- och y koordinaterna på bilden där vi vill att textens övre vänstra hörn ska börja. Om ni använder en annan bild än den bifogade så måste ni naturligtvis ändra på koordinaterna. Kom bara ihåg att koordinaten (0, 0) i GD2 biblioteket (och på flera andra ställen) börjar längst upp till vänster på alla bilder:

// Ange koordinater där texten ska börja
$x = 125;
$y = 160;


Nu väljer vi den text som vi vill skriva till bilden. Det är en ledtext och besökarens IP-adress som slås ihop till en ända sträng:

// Skriv den text ni vill ska användas
$text = 'Du har IP: ';
$ip = $_SERVER['REMOTE_ADDR']; // Lagra IP-adress
$text .= $ip;


Nu ligger hela texten lagrad i variabeln $text så nu kan vi skriva den till bilden med referensen $img. Ni kan byta ut variabeln $white (vit) mot någon annan av de färger vi definierade i början av koden:

// Skriv texten till bilden
imagestring($img, $font, $x, $y, $text, $white);


Vi använder funktionen imagestring för att använda referensen $img, med textstorleken $font, koordinaten $x och $y (125, 160), texten $text och färgen $white.

Nu måste vi bara tala om för webbläsaren att det kommer en PNG bild istället för en vanlig hemsida:

// Berätta för webbläsaren att det nu kommer en bild av typen png.
header('Content-type: image/png');

// Skicka bilden till webbläsaren
imagepng($img);


Slutligen så frigör vi minnet för att göra servern och systemadministratören glad:

// Frigör minne (viktigt!)
imagedestroy($img);
?>


Om ni använder ett annat format än PNG kan ni testa byta ut png i koden till ert format. GIF kan dock krångla pga licenser.


Testa
Spara nu PHP-dokumentet som "dynamisk_bild.php" och kör den på den server ni använder.


Slutord
Hoppas ni fick det att fungera och att ni har lärt er något nytt ;)
Nu är jag väldigt trött och ska gå och lägga mig!

Zzz Zzz


Källor
www.boutell.com/gd
www.php.net/gd

20 juli, 2006

Vad är PHP-GTK2

Förord
De flesta vet väl vad PHP är för nåt - ett serverbaserat skriptspråk som används för att skapa dynamiska hemsidor. Nu har det även släppts en annan variant av PHP där man kan skapa körbara program - PHP-GTK2!


Introduktion
I den här artikeln ska jag introducera er för PHP-GTK2 - en utbyggnad för programmeringsspråket PHP som implementerar GTK+ (Gimp Tool Kit) bibiloteket. Detta tillhandahåller ett Objekt Orienterat (OO) gränssnitt för de flesta klasser och funktioner inom GTK+, som underlättar skapandet av klient-side och multi-platform (Unix, Linux, Solaris, Windows etc) program.

Nu kan man alltså inte bara använda PHP till dynamiska hemsidor - man kan även skriva program som fungerar på de flesta operativsystem utan några större ändringar i koden.

Jag ska bara gå igenom några av de viktigaste punkterna som berör PHP-GTK2 så att ni kan komma igång lite enklare. Jag kommer också hålla mig till Windows platformen i den här artikeln.


Nyheter och likheter
I PHP-GTK2 kan man använda nästan alla funktioner och klasser som finns tillgängliga i PHP, så om du har en dynamisk hemsida som kontaktar exv. en MySQL databas, kan du åstadkomma ett program som gör samma sak väldigt enkelt.

Exempel
Utdrag från: Dynamisk hemsida:
$dbh = mysql_connect('localhost', 'username', 'password') or die(mysql_error());
...
mysql_close($dbh);


Utdrag från: PHP-GTK2 applikation:
$dbh = mysql_connect('localhost', 'username', 'password') or die(mysql_error());
...
mysql_close($dbh);


Det enda man måste göra är att modfiera eller justera koden så att den passar ihop med din PHP-GTK2 applikation. I slutet av artikeln tänker jag visa några exempel på hur man skriver enkla PHP-GTK2 program.

En positiv egenskap hos PHP-GTK2 är att det använder PHP 5.1 och 5.2 i skrivande stund. Det är den version av PHP som har bäst stöd för Objekt Orienterad Programmering (OOP). Man bör lära sig OOP om man vill bli en seriös programmerare :).

En dålig egenskap hos PHP-GTK2 är att koden inte går att kompilera till maskinkod (den kod som processorn kan förstå), eller också kallat EXE-filer som de flesta av er borde känna igen. Det finns i och för sig tredjeparts program som kan kompilera PHP-GTK kod, men än så länge har de inte stöd för PHP-GTK2. Detta betyder i nuläget att om ni väljer att distribuera era program, så kan vem som helst läsa källkoden och själv göra ändringar i den.

Tips!
Det finns ett program vid namn "Zend Encoder" som "kodar" om din källkod till svårförstådd text. Det kostar pengar och om ni vill veta hur det fungerar får ni vända er till källorna i slutet av artikeln.


En IDE för att skapa PHP-GTK2 program
Först ska jag tala om vad en IDE är? En IDE (Intergrated Development Environment) är ett program som typ Microsoft Visual Studio som underlättar kodning av program oerhört. En IDE brukar ha en inbyggd hjälp med funktioner, klasser, konstanter med mera, och en inbyggd dokumentation för det programmeringsspråk den är till hjälp för.

För PHP-GTK2 finns en IDE vid namn Glade (v2.12.1-rc1 i skrivande stund), men exakt hur man får den att fungera kan jag inte förklara i nuläget. Jag får uppdatera artikeln vid ett senare tillfälle och lägga till en text om hur man gör. Försök hitta information bland artikelns källor så länge.

IDE:n fungerar som så att man kan "rita" knappar och andra objekt i ett fönster som representerar den slutliga applikationen. Då skapas kod "on-the-fly" så att man själv slipper skriva kod som exv. skapar ett nytt fönster: $wnd = new GtkWindow().

En IDE brukar också ha "syntax highlightning", vilket betyder att all kod färgläggs i olika färger. T.ex. strängar blir röda, kommentarer blir orangea, funktioner blir svarta, nyckelord blir blå etc. Då är det mycket enklare att hålla ordning och reda på sin kod.


Skaffa och Installera PHP-GTK2
Om ni använder Windows och känner att ni vill testa på PHP-GTK2, kan ni navigera till följande sida gnope.org och ladda ner (i skrivande stund) "Release 1.5.1" i sektionen "Windows Downloads". Det paketet har allt ni behöver för att komma igång. I alla fall för tillfället!

Nu går jag igenom steg-för-steg hur man gör för att få PHP-GTK2 att fungera.
Jag använder Windows XP Professional SP2!
  1. Ladda ner Gnope 1.5.1 som innehåller
    • PHP 5.1
    • gtk2 (Win32) module
    • Gnope Apprunner
    • Gnope PEAR Installer
  2. Kör filen "GnopeSetup-1.5.1" som ni precis laddade ner
  3. Tryck på "Next" och "I Agree"
  4. Kryssa i alla rutor du ser i fönstret
  5. Tryck på "Next"
  6. Låt det stå "C:\PHP-GTK2" så slipper vi krångla till det, men ni kan ju alltid ändra om ni vill.
  7. Tryck på "Install" och när en ruta poppar upp och ställer frågan: "Change the environment for all users..." svarar ni "Ja".
  8. När installationen är klar klickar ni på "Next" och sedan "Finish".
Efter att ni klickat på "Finish" borde programmet "PHP-GTK2 Applications" starta upp (om ni valt det förstås). I fönstret klickar ni på "Game_Snake" för att testa ett litet Snake spel. Om det fungerar vet ni nu att er PHP-GTK2 installation fungerar.

Pröva med att trycka på någon av piltangeterna på ert tangentbord i Snake, så borde ni se att en mask börjar röra på sig. Uppgiften är att ta så många äpplen som möjligt, men det vet ni väl redan!

PHP-GTK2 fungerar nu som det ska (om det inte uppstått några problem för er), så stäng av Snake och stäng också programmet "PHP-GTK2 Applications".

Följande steg följer ni bara om ni vill testa ett simpelt 'Hello World'-program:
  1. Gå till "Mina dokument"
  2. Skapa en ny mapp vid namn "PHP-GTK2 Projekt"
  3. I den mappen skapar ni en mapp vid namn "hello"
  4. Följ nu instruktionerna för hur man skapar det 'Hello World'-program som finns i slutet av artikeln tillsammans med alla exempel.
  5. Om ni gjort allt rätt borde ni nu ha en fil vid namn "hello.phpw" i mappen "hello" som ni precis skapat.
  6. Innan ni kör ert nya program ska vi skapa en så kallad batch-fil, som vi kommer använda för att samla upp eventuella felmeddelanden. Skapa den på samma sätt som ni skapade filen "hello.phpw", fast nu döper ni den till "debug.bat" och matar in följande data i den:

    debug.bat
    @echo off
    php hello.phpw
    pause
    exit


  7. Nu kan ni testköra ert nya program genom att dubbelklicka på "debug". Om ert program spottar ut en massa felmeddelanden kommer ni kunna se dem i den svarta rutan som poppat upp.
  8. Programmet visar texten "Hello World!" om allt fungerar, så nu kan ni stänga av det genom att trycka på krysset uppe i högra hörnet.
  9. Markera nu den svarta rutan och tryck på en valfri tangent för att få den att försvinna.
Exempelfilen associerad med det vi precis gått igenom heter "hello.zip" och skapar alla filer och mappar som behövs automatiskt.


Exempelfiler
Det finns inga att ladda ner


Dokumentation
Den vetgirige kan besöka gtk.php.net och lära sig allt på egen hand. Ta också gärna del av dokumentationen, för om det är något ni undrar över om PHP-GTK2 så hittar ni det nästan garanterat där. Annars kan ni alltid avända wiki:n.

Om ni vill testa ett litet program får ni gärna använda ett i slutet av artikeln, eller så kan ni använda ett enkelt "Hello World!" program från den officiella hemsidan gtk.php.net. En modifierad version av det programmet hittar du i slutet av artikeln.


Kodexempel
Hello World:
<?php
if (!class_exists('gtk')) {
die("Please load the php-gtk2 module in your php.ini\r\n");
}
$wnd = new GtkWindow();
$wnd->set_title('Hello world applikation'); // Titel

// Koppla en signal som avslutar PHP-GTK2 när man avslutar programmet
$wnd->connect_simple('destroy', array('gtk', 'main_quit'));

// Skapa en simpel text
$lblHello = new GtkLabel('Hello World!'); // Skapa ny widget

// Lägg till texten till fönstret (objektet $wnd)
$wnd->add($lblHello);

// Visa alla så kallade widgets (manicker)
$wnd->show_all();

// Starta programmets huvudloop
Gtk::main();
?>


Kopiera koden till ett nytt textdokument (*.txt) i anteckningar eller er favoriteditor och spara det som "hello.phpw". Dubbelklicka på filen och det borde startas ett program med texten "Hello World!" inuti.

I nästa exempel ska jag visa hur ni skapar ett PHP-GTK2 program som ansluter till en MySQL databas. Observera att det bara fungerar om ni har tillgång till en installerad MySQL server på er dator, eller om ni har ett konto på exv. nåt webbhotell någonstans. Om ni har tillgång till en MySQL databas måste ni ladda in MySQL i PHP-GTK2 via ett "tillägg" (eng. extension) innan ni kan få det att fungera. Det kanske jag beskriver i en framtida artikel!
Det är ingen idé att ni testar om ni inte har lärt er MySQL än, men det kan vara lärorikt att ta del av felmeddelandena.

Ni kommer få följande felmeddelande om ni inte har konfigurerat MySQL korrekt:
Fatal error: Call to undefined function mysql_connect() in ...

MySQL Test PHP-GTK2:
<?php
if (!class_exists('gtk')) {
die("Please load the php-gtk2 module in your php.ini\r\n");
}
$wnd = new GtkWindow();
$wnd->set_title('MySQL applikation'); // Titel

// Koppla en signal som avslutar PHP-GTK2 när man avslutar programmet
$wnd->connect_simple('destroy', array('gtk', 'main_quit'));


$dbh = mysql_connect('localhost', 'username', 'password') or die('Kunde inte ansluta till MySQl :: '. mysql_error());
// Gör inget!
mysql_close($dbh);

// Hit kommer vi om vi lyckades!!!
$lblHello = new GtkLabel('Vi lyckades ansluta till en MySQL-databas!'); // Skapa ny widget

// Lägg till texten till fönstret (objektet $wnd)
$wnd->add($lblHello);

// Visa alla så kallade widgets (manicker)
$wnd->show_all();

// Starta programmets huvudloop
Gtk::main();
?>



Spara det precis som ni gjorde i förra exemplet - i formatet *.phpw.
Jämför koden för PHP-GTK med följande exempel som syftar på en dynamisk hemsida i PHP

MySQL Test - Dynamisk Hemsida:
<html>
<head></head>
<body>
<?php
$dbh = mysql_connect('localhost', 'username', 'password') or die('Kan inte ansluta till MySQL :: '. mysql_error());
echo '<p>Vi lyckades ansluta till MySQL!</p>';
mysql_close($dbh);
?>
</body>
</html>

Det skiljer inte mycket, eller hur?
mysql_connect() är bara en av många funktioner i PHP som går att använda tillsammans med PHP-GTK2. Testa till exempel funktionen date('Y-m-d H:i:s').

Alla ni som vill lära er mera om PHP-GTK2 kan gå till gtk.php.net och följa alla instruktioner och exempel.


Hjälp
Om ni behöver hjälp eller får problem vid något som rör det som beskrivits i artikeln, får ni kontakta de som är experter på området. Ställ en fråga i ett forum eller nåt!

Kontakta mig inte och be om hjälp förutom om ni känner mig. Då hjälper jag ju er såklart.


Källor
http://gtk.php.net
www.gnope.org
www.zend.com
www.php.net
http://gladewin32.sourceforge.net Information om Glade
http://skylane.t35.com/blog/download

Välkomna till bloggen

Välkomna ska ni vara kära besökare. Jag skriver om IT för att det är kul och för att jag vill dela med mig av information och kunskap. Jag försöker hålla bloggen så kategoriserad som möjligt för att ni enklare ska hitta intressanta länkar och artiklar.