Warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in /www/webvol34/an/96qmbdpibm1sspm/danielliljeberg.se/public_html/blog/wp-content/mu-plugins/gkphp.php on line 1
Archive for maj, 2011 « Daniel Liljeberg

Arkiv för maj, 2011

Warning: Use of undefined constant archives - assumed 'archives' (this will throw an Error in a future version of PHP) in /www/webvol34/an/96qmbdpibm1sspm/danielliljeberg.se/public_html/blog/wp-content/themes/cordobo-green-park-2/archive.php on line 32

Warning: Use of undefined constant page - assumed 'page' (this will throw an Error in a future version of PHP) in /www/webvol34/an/96qmbdpibm1sspm/danielliljeberg.se/public_html/blog/wp-content/themes/cordobo-green-park-2/archive.php on line 32

Warning: A non-numeric value encountered in /www/webvol34/an/96qmbdpibm1sspm/danielliljeberg.se/public_html/blog/wp-content/themes/cordobo-green-park-2/archive.php on line 32

Warning: A non-numeric value encountered in /www/webvol34/an/96qmbdpibm1sspm/danielliljeberg.se/public_html/blog/wp-content/themes/cordobo-green-park-2/archive.php on line 32
class="post-198 post type-post status-publish format-standard hentry category-eclipse category-javascript category-php category-sql category-subversion category-video category-zend-framework">

Förslag till en samling tutorials

30 maj, 2011

Jag har funderat lite på vad man skulle kunna göra en tutorial/kurs om. Det finns ju otroligt mycket bra information på nätet redan och även om detta mest hade varit en kul liten grej så hade det varit roligt om någon lärde sig något på samma gång. Jag tror att jag kommer rikta in mig på en webapplikation av enklare slag skriven i PHP. Med enklare menar jag då, inte som omfattande. Vi skall fortfarande använda oss av abstrakta databaslager, AJAX och annat trevligt. Mycket då det saknas en del bra information för den svenska publiken om PHP men också för att det händer mycket med språket. Det möjliggör också för många att testa på det då alla delar vi kommer använda oss av kommer vara gratis (eller ha en free trial) utan att bli beroende av tredjepartslösningar som exempelvis Mono om man nu sitter i exempelvis Linux. Jag är dock inte partisk utan kan mycket väl se att vi i ett senare skede gör om exakt samam applikation i .Net för att se likheter och skillnader.

Jag tänkte försöka utgå ifrån att inte förvänta mig en massa kunskap av de som tar del av materialet. Men naturligtvis så kommer det att hjälpa om man utvecklat tidigare då jag endast kort kommer gå igenom grunder och sedan gå in på lite mera avancerade områden. Jag tänker mig följande upplägg

  1. Sätta upp lokala utvecklingsverktyg och saker att tänka på (OS, IDE, användbara plugins etc)
  2. Sätta upp server (utvecklingsstack, databas, versions hantering etc)
  3. Lite kort om PHP, karakteristiska saker med språket. Styrkor och svagheter etc.
  4. Ett antal enklare mindre program som visar lite på olika sätt att koda under PHP (och många andra språk också)
  5. Enklare introduktion till OOP och hur PHP hanterar detta.
  6. Introduktion till Zend Framework
  7. Introduktion av MVC mönstret

Sedan börjar vi knacka på vår lilla applikation och börjar då titta på hur Zend Framework hanterar views etc. Sedan går vi in på användarhantering, åtkomstkontroll, osv.

Detta är bara en idé om punkter att ta upp och jag tror att det hela, dynamisk, växer fram med tiden. Finns det några idéer eller önskemål så kom gärna med förslag.

Flattr this!

Warning: Use of undefined constant archives - assumed 'archives' (this will throw an Error in a future version of PHP) in /www/webvol34/an/96qmbdpibm1sspm/danielliljeberg.se/public_html/blog/wp-content/themes/cordobo-green-park-2/archive.php on line 32

Warning: Use of undefined constant page - assumed 'page' (this will throw an Error in a future version of PHP) in /www/webvol34/an/96qmbdpibm1sspm/danielliljeberg.se/public_html/blog/wp-content/themes/cordobo-green-park-2/archive.php on line 32

Warning: A non-numeric value encountered in /www/webvol34/an/96qmbdpibm1sspm/danielliljeberg.se/public_html/blog/wp-content/themes/cordobo-green-park-2/archive.php on line 32

Warning: A non-numeric value encountered in /www/webvol34/an/96qmbdpibm1sspm/danielliljeberg.se/public_html/blog/wp-content/themes/cordobo-green-park-2/archive.php on line 32
class="post-194 post type-post status-publish format-standard hentry category-cygwin">

apt-cyg, apt-get för Cygwin

25 maj, 2011

Ni som använder Cygwin har kanske irriterat er på att behöva dra igång “Setup.exe” någon gång för att installera något litet program ni saknat. Då önskar man att något i stil med “apt-get” eller “yum” funnits för Cygwin.

“apt-cyg” är just detta. Syntaxen påminner en hel del om just “apt-get”.

  • "apt-cyg install <package names>" to install packages
  • "apt-cyg remove <package names>" to remove packages
  • "apt-cyg update" to update setup.ini
  • "apt-cyg show" to show installed packages
  • "apt-cyg find <pattern(s)>" to find packages matching patterns
  • "apt-cyg describe <pattern(s)>" to describe packages matching patterns
  • "apt-cyg packageof <commands or files>" to locate parent packages

Projektet finns på Google Code och kan således hämtas via SVN.

Installera

Använda

Flattr this!

Warning: Use of undefined constant archives - assumed 'archives' (this will throw an Error in a future version of PHP) in /www/webvol34/an/96qmbdpibm1sspm/danielliljeberg.se/public_html/blog/wp-content/themes/cordobo-green-park-2/archive.php on line 32

Warning: Use of undefined constant page - assumed 'page' (this will throw an Error in a future version of PHP) in /www/webvol34/an/96qmbdpibm1sspm/danielliljeberg.se/public_html/blog/wp-content/themes/cordobo-green-park-2/archive.php on line 32

Warning: A non-numeric value encountered in /www/webvol34/an/96qmbdpibm1sspm/danielliljeberg.se/public_html/blog/wp-content/themes/cordobo-green-park-2/archive.php on line 32

Warning: A non-numeric value encountered in /www/webvol34/an/96qmbdpibm1sspm/danielliljeberg.se/public_html/blog/wp-content/themes/cordobo-green-park-2/archive.php on line 32
class="post-176 post type-post status-publish format-standard hentry category-cygwin category-windows">

Cygwin + Console2 = Linux terminal i Windows

25 maj, 2011

Även om jag länge använt windows så har jag alltid saknat en användbar terminal. När man jobbat med linux och OSX så vänjer man sig fort vid hur snabbt det går att jobba i terminalerna på dessa OS.

cmd.exe

I Windows har vi länge haft “cmd.exe” att vända oss till när vi vill jobba I någon form av terminal.

image

“cmd.exe” har dock lämnat mycket att önska och speciellt för folk som arbetat I Linux och vant sig vid Linux terminal. I Linux är terminalen något kraftfullt medan det I Windows ofta ses som något nödvändigt ont.

Powershell

För att göra Windows shell lite mera användarvänlig så kom Microsoft med “Powershell”. Här närmade man sig Linux shell lite och erbjöd program med välkända namn för de som jobbat I Linux shell. Exempelvis fungerar “ls”, “grep” osv i Powershell. Dock så är syntaxen ofta lite annorlunda än vad man kanske är van vid. Men för den som saknat ett “fungerande” shell I Windows så var det ett steg I rätt riktning.

image

Cygwin

För att lösa avsaknaden av ett fungerade shell i Windows så brukar jag dock installera Cygwin. Om du är helt ny till Cygwin så skulle man kunna likna det vid att du kör Linux I ditt Windows. Nu är det inte riktigt så och det är ingen VM som ligger och snurrar eller någon form av emulation som fortgår. Istället är Cygwin är en uppsättning av välkända program ifrån Linux så som "“grep”, “ls”, “cat”, “tail” osv. som alla fungerar precis som i Linux. De är ofta kompilerade ifrån samma källkod. Du kan köra en bash shell och installera välkända komponenter ifrån Linux så som “Cron”, “OpenSSH”, “Apache” med mera. Det mesta av detta kan du installera även i Windows vanligtvis, men genom Cygwin kan du sedan jobba med dem som om du arbetade i en Linux installation.

image

Du kan även installera en X server i Cygwin och köra X spplikationer om du har behov av detta. Du kan då kompilera de flesta Linux applikationer ifrån källkod och köra dem under Cygwin.

Jag använder dock oftast Cygwin för att få en “fungerande” shell in Windows. Det enda som varit lite jobbigt med Cygwin har varit att det ser ut att använda sig av Windows vanliga konsol. Så samma begränsningar som finns i cmd.exe har också funnints i Cygwin. Du kan tex inte dra i ditt fönster för att göra det bredare än 80 tecken osv.

Console2

Men här kommer Console2 som en liten räddare i nöden. Console2 ger dig möjlighet att skala om ditt fönster, öppna flera konsoler i tabbar osv, osv. Om du sedan går in i Edit/Settings och väljer Console så kan du där välja Shell att använda. Låt oss nu säga att du installerat Cygwin i "C:\cygwin". Då kan du där skriva

"C:\cygwin\bin\bash.exe –login -i"

vilket nu gör att Console2 kommer köra Cygwins bash shell istället för Windows tråkiga konsol. Efter detta har man en terminal som i mångt och mycket fungerar precis som man vant sig vid ifrån Linux.

image

Så nu kan man med enkelhet sitta i Windows och administrera Linux burkar, svn repos osv utan att behöva påminnas om det faktum att man just sitter i Windows Winking smile

Alternativ till Console2

Alternativ är att installera “rxvt” via Cygwin. Den finns i en version som kräver X server och en som klarar sig utan.

image

Eller så kan man installera Terminator som är en cross platform terminal som på Windows kräver Cygwin och Cygwin Ruby.

image

Dock upplever jag Terminator som rätt seg att starta och att den ibland låser sig.

Mintty finns även det att installera via Cygwin och är ett värdigt alternativ.

image

Xterm kompatibel vilket gör att många kommer känna sig hemma, drag-and-drop stöd (vilket även Console2 har) osv. Dock tyvärr inget stöd för tabbar och en del interaktiva program kan ibland ha lite problem. (tackar för tippset Torbjörn)

Flattr this!

Warning: Use of undefined constant archives - assumed 'archives' (this will throw an Error in a future version of PHP) in /www/webvol34/an/96qmbdpibm1sspm/danielliljeberg.se/public_html/blog/wp-content/themes/cordobo-green-park-2/archive.php on line 32

Warning: Use of undefined constant page - assumed 'page' (this will throw an Error in a future version of PHP) in /www/webvol34/an/96qmbdpibm1sspm/danielliljeberg.se/public_html/blog/wp-content/themes/cordobo-green-park-2/archive.php on line 32

Warning: A non-numeric value encountered in /www/webvol34/an/96qmbdpibm1sspm/danielliljeberg.se/public_html/blog/wp-content/themes/cordobo-green-park-2/archive.php on line 32

Warning: A non-numeric value encountered in /www/webvol34/an/96qmbdpibm1sspm/danielliljeberg.se/public_html/blog/wp-content/themes/cordobo-green-park-2/archive.php on line 32
class="post-173 post type-post status-publish format-standard hentry category-okategoriserade">

Vilket språk skall man välja? :)

24 maj, 2011

Funderar på att skapa lite video tutorials/kurser om jag får tid. Funderar på om jag skall göra dem på svenska eller engelska. Jag har medvetet valt att skriva på svenska här då det finns så mycket information att få på engelska, men då allas engelska inte är flytande så ville jag kunna erbjuda information även till dem. Men vad tycker ni, svenska eller engelska?

Flattr this!

Warning: Use of undefined constant archives - assumed 'archives' (this will throw an Error in a future version of PHP) in /www/webvol34/an/96qmbdpibm1sspm/danielliljeberg.se/public_html/blog/wp-content/themes/cordobo-green-park-2/archive.php on line 32

Warning: Use of undefined constant page - assumed 'page' (this will throw an Error in a future version of PHP) in /www/webvol34/an/96qmbdpibm1sspm/danielliljeberg.se/public_html/blog/wp-content/themes/cordobo-green-park-2/archive.php on line 32

Warning: A non-numeric value encountered in /www/webvol34/an/96qmbdpibm1sspm/danielliljeberg.se/public_html/blog/wp-content/themes/cordobo-green-park-2/archive.php on line 32

Warning: A non-numeric value encountered in /www/webvol34/an/96qmbdpibm1sspm/danielliljeberg.se/public_html/blog/wp-content/themes/cordobo-green-park-2/archive.php on line 32
class="post-171 post type-post status-publish format-standard hentry category-sql">

SQL IN() utan dynamisk SQL

16 maj, 2011

Fick en fråga för ett tag sedan hur man kunde lösa ett problem som involverade en sql stored procedure innehållande en ‘IN’ vilkens data man skulle skicka in till proceduren. Detta var löst så som många löser det, med dynamisk SQL. Detta kan liknas vid att du bygger upp din SQL fråga av strängar i din SP och sedan exekverar queryn. Exempelvis

‘ids’ är här en komma sepparerad lista av id’n som vi vill göra vårt uppslag emot. Den dynamiska SQL queryn är inte en del av vår SP utan körs i sitt eget scope. Nackdelen med denna approach är dock att det inte är så lätt för query optimizern att kunna luska ut hur din query bäst skall köras. Utöver detta så måste användare av vår SP nu också ha SELECT rättigheter på alla tabeller som vi i vår dynamiska query hämtar data ifrån. Detta behöver man inte för en SP då rättigheterna sätta på SP’n och det sedan inte spelar någon roll vilka tabeller vår SP hämtar data ifrån. Att dynamiskt generera sin query kan också lämna dörren öppen för SQL injections. Om du hamnar i en situation då du måste använda dynamisk SQL, försök att alltid exekvera dem med ‘sp_executesql’.

Ett sätt att behålla möjligheten att dynamiskt skicka data till din ‘IN’ men slippa dynamisk SQL är att skapa en funktion som splittar upp din komma separerade lista och spara ner värdena i en temporär tabell som du sedan gör ett uppslag emot.

En funktion för att splitta en sträng kan göras på många sätt. Nedan följer en variant som gör det möjligt att välja vilken character man vill splitta på.

Nu kan du använda dig av denna funktion och splitta din sträng innehållande dina id’n.

Dynamisk SQL är dock inte alltid av ondo och kan ibland vara precis rätt väg att gå. Så testa båda lösningarna och se vad som passar bäst för just ditt ändamål. Men håll koll på säkerhets detaljerna.

Flattr this!

Warning: Use of undefined constant archives - assumed 'archives' (this will throw an Error in a future version of PHP) in /www/webvol34/an/96qmbdpibm1sspm/danielliljeberg.se/public_html/blog/wp-content/themes/cordobo-green-park-2/archive.php on line 32

Warning: Use of undefined constant page - assumed 'page' (this will throw an Error in a future version of PHP) in /www/webvol34/an/96qmbdpibm1sspm/danielliljeberg.se/public_html/blog/wp-content/themes/cordobo-green-park-2/archive.php on line 32

Warning: A non-numeric value encountered in /www/webvol34/an/96qmbdpibm1sspm/danielliljeberg.se/public_html/blog/wp-content/themes/cordobo-green-park-2/archive.php on line 32

Warning: A non-numeric value encountered in /www/webvol34/an/96qmbdpibm1sspm/danielliljeberg.se/public_html/blog/wp-content/themes/cordobo-green-park-2/archive.php on line 32
class="post-170 post type-post status-publish format-standard hentry category-php">

Abstrahera databaslogiken ytterligare en nivå

13 maj, 2011

Hanteringen och kopplingen till datakällorna går ofta igenom en mognadsprocess ju mer en utvecklare lär sig. Det är inte ovanligt att man ser kod i stil med

Många som jobbat lite med databasdrivna applikationer börjar förr eller senare att abstrahera bort databaslogiken. I ett första steg kan detta te sig som så att man skapar objekt som har fint namngivna funktioner, exempelvis ett User objekt med funktioner så som getName() osv. I dessa funktioner sker sedan databasanrop annat. Men det publika interfacet av objektet blir mycket trevligare.

Nästa steg är ofta att hämta ut all relevant data i konstruktorn av User och således inte hämta den varje gång du anropar getUsername(). Sedan bygger man vidare med cachning av datan osv, osv.

Jag satt själv och funderade på detta för ett tag sedan och tänkte att man egentligen bör abstrahera det så pass att User objektet i detta fallet inte har någonting med databasen att göra. Data bör kunna sparas på olika ställen utan att vår User egentligen skall behöva förändras. Så all logik kopplad till lagring av data bör således inte ligga i klassen som definierar vår User.

Istället bestämde jag mig för att göra som så att min modell, User i detta fallet, endast innehöll data, samt funktioner för att manipulera denna data. Att sedan hämta och lagra datan hanteras istället av en annan klass. Jag valde att kalla dessa för Gateways. På detta sätt kan man skapa Gateways som jobbar emot olika datakällor utan att behöva pilla på våra modell klasser. Detta lämpar sig tex om man sitter och utvecklar ny funktionalitet och vill ha testdata lokalt i en XML fil istället för att jobba mot databasen. När det sedan är dags att jobba emot databasen så använder man sig bara av en annan Gateway och så är det löst.

För att uppnå detta skapar vi en basklass för våra modeller. I denna basklass har vi funktioner för att fylla på data, samt att hämta ut data. Vi inför en standard som säger att data i våra datakällor sparas i formatet ‘foo_id’ och att vår modell i så fall kommer innehålla funktioner som heter ‘setFooId()’ och ‘getFooId()’.

En klass för en User hade då sett ut i stil med.

 

Denna modell kan nu innehålla data, men hur skall vi då sköta lagring av våra modeller? Här kommer våra Gateways in. Även här börjar vi med en basklass med det som är gemensamt för alla våra Gateways. En specialanpassad gateway för att spara till DB kan sedan se ut enligt följande.

Som synas så jobbar vår Gateway emot Core_Db_Table_Abstract objekt. Dessa är egentligen bara en specialisering av Zend_Db_Table_Abstract. Det hade även gått att ha SQL kod direkt i vår Gateway om man så önskar. Core_Db_Table_Abstract ser ut som följer.