dinsdag 13 november 2012

Postgresql subquery hack

Blijkbaar als een subquery geen resultaat vind, geeft deze een lege recordset terug. Als je deze dan concatenate met een char waarde geeft deze een empty field.

For example,

SELECT resource_resource.name ||' '|| hr_employee.surname || ' : ' ||  (SELECT jfs_partner_contact_details.value FROM

Zal als resultaat een lege record terug geven. Een hack die ik hiervoor heb gebruikt is de volgende.

SELECT resource_resource.name ||' '|| hr_employee.surname || ' : ' ||  (SELECT COALESCE(MAX(jfs_partner_contact_details.value),'NO EMAIL FOUND') FROM

Door MAX() te gebruiken zal bij een lege recordset de waarde null worden teruggeven, die we dan vervangen door COALESCE() te gebruiken.

vrijdag 12 oktober 2012

YAML testing OpenERP

Ik dacht laat ik eens een module nemen, deze dropen in mijn 6.1 OpenERP addons folder en er mee aan de slag gaan. Na enkele verbeteringen te hebben gedaan leek het me geschikte opportuniteit om deYAML test scenario's voor versie 6.0 (and up) te gebruiken.

Na wat trial en error zoekwerk ben ik tot een werkende oplossing gekomen.






Het is vrij eenvoudig om deze functionaliteit te gebruiken. Je plaatst in je __openerp__.py file de volgende tag:
'demo_xml': ['test/hr_car_testing.yml'],
Zoals je kan zien bevat de demo_xml tag het path en de de naam van de YAML file.

De volgende stap houd in dat je de server opstart met het volgende commando.

python openerp-server.py -i hr_car --log-level=test

Als de server is opgestart en je bent ingelogd zou de output van de testen te zien moeten zijn in je logfile of de stdout. Afhankelijk van hoe je de YAML test hebt geschreven krijg je ongeveer volgende output.

2012-10-13 05:55:02,756 5524 INFO sandbox openerp.modules.loading: module hr_car: loading test/hr_car_testing.yml  
2012-10-13 05:55:02,767 5524 TEST sandbox openerp.tools.yaml_import: Creating !record {model: hr.car.make, id: new_make}:
 with {'name': 'testingmake11111111'}
2012-10-13 05:55:02,776 5524 TEST sandbox openerp.tools.yaml_import: Creating !record {model: hr.car.model, id: new_model}:
 with {'make_id': 'new_make', 'name': 'testingmodel'}
Om het plaatje volledig te maken zet ik hier ook de YAML file die ik heb gebruikt om dit voorbeeld uit te werken. Het is ver van af omdat het in principe crud operaties zou moeten omvatten van de objecten binnen de module. OPGELET voor de spatie indentatie van YAML syntax, kan je wel eens de mist mee ingaan.


#HR_CAR test testing scenario
-
 !record {model: hr.car.make, id: new_make}:
  name: testingmake11111111
-
 !record {model: hr.car.model, id: new_model}:
  name: "testingmodel"
  make_id: new_make

Referenties :
http://doc.openerp.com/v6.0/developer/5_16_data_serialization/yaml_serialization.html#writing-yaml-tests
http://doc.openerp.com/v6.0/contribute/15_guidelines/coding_guidelines_testing.html#tests-are-run-on-the-server-side



Opzetten van OpenERP development omgeving. (windows)

Aangezien mijn vriendin op dinsdag en donderdag werkt, heb ik besloten om die dagen te besteden aan het updaten van men blog en programmeren van allerhande zaken. Ik was bezig met het opzetten van mijn development omgeving voor OpenERP en dacht dat het misschien handig kan zijn om hierover een blog post te schrijven.

Repository

Het eerste dat ik gedaan heb is het opzetten van een code repository bij assembla. Het kwam erg aangeraden door kennissen en het leek me een betere optie dan bijvoorbeeld Google code. Een account aanmaken is erg gemakkelijk en je krijgt de keuze om het privaat of open te maken. Ik heb gekozen voor Subversion als versiebeheersysteem omdat ik dat systeem al erg gewoon ben.

Python

Ik maak gebruik van  versie 2.7.3.

Ide

Als ide koos ik voor eclipse, niet speciaal een voorkeur voor maar het heeft alles wat ik nodig heb om  aan de slag te kunnen. Daarbij heb ik ook nog enkele plugins geïnstalleerd.

OpenERP source code

Ik heb eerste een nieuwe repository location toegevoegd via de SVN Repository Exploring Perspective en hier dan het url van de assembla repository ingegeven. Als je een location aanmaakt zie je dat deze ook een nieuw project toevoegd in je PyDev package explorer. Ik heb via rmb->Team->Update er voor gezorgd dat beide locaties gelijk zijn.

In de trunk folder heb ik dan de laatste versie van de OpenERP source code geplaatst. Ik heb de source tarball All-in-one genomen.

Python packages

Voor je de server kan draaien vanuit de source heb je een aantal Python packages nodig. De requires.txt in de folder openerp.egg.info liet me weten welke extra modules ik nodig had.

Voor de meeste modules kan je gebruik maken van python's setuptools easyinstall.exe
  • Setuptools
    • babel
    • feedparser
    • gdata
    • lxml
    • mako
    • psycopg2
    • pydot
    • python-dateutil < 2
    • python-ldap
    • python-openid
    • pytz
    • pywebdav
    • pyyaml
    • reportlab
    • simplejson
    • vatnumber
    • vobject
    • werkzeug
    • xlwt
    • zsi
    • pyopenssl (enkel voor ssl)
Op onderstaande website vind je ook een hoop binaire packages die snel en gemakkelijk te installeren of te verwijderen zijn.
Een andere manier om snel aan de slag te gaan is gewoon de code downloaden, openerp-server hernoemen naar een python file (de extensie veranderen naar een .py) en deze dan uitvoeren. Normaal gezien krijg je dan een warning of crash van de server als er een module ontbreekt.

Ik run de server altijd vanuit Eclipse, als er dan iets misgaat heb je altijd een console uitput / stack trace die ja kan helpen om het probleem te vinden.

Database

Als database voor Openerp gebruikt men Postgres RDBMS. Het volstaat om deze te installeren en een user aan te maken met adminrechten. In de config file van OpenERP gebruik je deze user om een verbinding met de server te maken. Start hierna OpenERP op en creëer een nieuwe database via het setup scherm van OpenERP zelf. 

maandag 2 april 2012

Ik ben echt verschoten !

Ik ben nu al een tijdje met Google Go, Mongo-DB en mgo bezig. Ik heb me nog nooit zo verwend gevoeld, zulk een mooie documentatie van alle 3 de producten. Zulk een logische code en zo een behulpzame community. Ik sta er zo versteld van dat ik er een blog-post aan wijd. Ik ben bezig met een code-snippet pagina voor mgo, die ik binnenkort met jullie zal delen.In ieder geval, het is fantastische en bijzonder leuk om deel van deze community uit te maken. Ik ben dan ook laaiend enthousiast.

woensdag 28 maart 2012

Google Go1 is live gegaan!!!

Ik heb vandaag een berichtje gekregen dat google Go zijn eerste stabiele release uit heeft gebracht. GO1
Ik ben het onmiddelijk gaan uit testen en was zeer onder de indruk over de 'out of the box' functionality voor de windows release. Installeren ging vlotjes, het toevoegen van extra packages was ook geen probleem. Ik ben onder de indruk.

Google Go en Mongo database

Na het spelen met een tiny webserver in Google Go leek het me wel leuk om die webserver eens te laten verbinden met een database. Hierbij dacht ik niet aan een alledaagse entity relation database, maar eens iets anders. Hierbij kwam ik al vlug uit op Mongo DB. Het installeren ging heel vlug en ik had al gelezen over een package speciaal voor deze database.

De package die ik moenteel gebruik noemt MGO en kan je vrij eenvoudig installeren door het volgende commando uit te voeren. 

go get launchpad.net/mgo

Ik zeg er wel bij dat dit me niet lukte voor de release van Go1. Daarom had ik het even opzij gelegd en ben nu opnieuw begonnen. Deze download en installeerd de packages onder de folder C:\Go\src\pkg\launchpad.net.
Daarom dat je bij het importeren van deze packages volgende path gebruikt.

"launchpad.net/mgo"
"launchpad.net/mgo/bson"

Volgend script maakt het mogelijk om iets in de database weg te schrijven en terug op te halen.

package main

import (
        "fmt"
        "launchpad.net/mgo"
"launchpad.net/mgo/bson"
)

type Person struct {
        Name string
        Phone string
}

func main() {
session, err := mgo.Dial("localhost")
if err != nil {
panic(err)
}
defer session.Close()
c := session.DB("journal").C("people")
err = c.Insert(&Person{"Ale", "+55 53 8116 9639"},
  &Person{"Cla", "+55 53 8402 8510"})
if err != nil {
panic(err)
}

result := Person{}
err = c.Find(bson.M{"name": "Ale"}).One(&result)
if err != nil {
panic(err)
}

fmt.Println("Phone:", result.Phone)
}

zaterdag 11 februari 2012

Kleine webserver met html template

Na wat voorbeelden te zoeken en deze voorbeelden aan te passen naar werkende code. Heb ik nu een kleine webserver opgezet die html toont met behulp van Go's template package. Ik vermoed dat mijn template package wat verouderd is en dat daardoor veel verschillende voorbeelden niet werkte. Ik heb hiervoor de google go versie gebruikt die je in men eerdere blog posts kan terugvinden.

Hieronder staat de code voor mijn main.go

// Webserver project main.go
package main
// Importing packages
import (
    "fmt"
    "http"
    "template"
)
// Data structure
type foo struct{
    Title string
    Header1 string
}
// In the Handler
func sayHello(w http.ResponseWriter, r *http.Request) {
    //creating our parser
    t, _ := template.ParseFile("./h1.html", nil)
    //creating our data struct
    f := &amp;foo{Title:"NewTitle",Header1:"Header1"}
    //parsing our template and data struct
    t.Execute(f, w)
}
// Our main
func main(){
    fmt.Printf("Starting http Server ... \n")
    http.Handle("/", http.HandlerFunc(sayHello))
    err := http.ListenAndServe("0.0.0.0:8080", nil)
    if err != nil {
       fmt.Printf("ListenAndServe Error :" + err.String())
    }
}

Hieronder staat de code voor h1.html

<!DOCTYPE html>
<html>
  <head>
    <title>{.section Title}{@}{.or}SomeoneForgotTheTitle{.end}</title>
  </head>
  <body>
    <h1>{Header1}</h1>
  </body>
</html>
    

dinsdag 7 februari 2012

Meer interesante videos over Google Go

maandag 6 februari 2012

Waarom Go programmeren?

donderdag 2 februari 2012

Nabootsen van de while loop

Go heeft maar 1 soort lus en dat is de 'for', we kunnen echter het gedrag van een 'for' zo beinvloeden dat het een while lus word.

    //normal loop
    for i := 10; i >= 0; i--{
        fmt.Printf("Normal loop : %d\n",i)
    }
    
    //while loop
    var i int = 10
    for {
        fmt.Printf("While loop : %d\n", i)
        if i == 0 {
            break;
        }
        i--
    }

We kunnen ook gebruik maken van het continue; statement, dit stelt ons in staat door te gaan met onze lus en de overige statements over te slaan.


    //continue
    for i:=30; i>=0; i--{
        if i%5 !=0{
            continue;
        }
        fmt.Printf("Did not continue : %d\n",i)

strconv.FloatSize werkt niet in Google Go?!

    fmt.Printf("The size of floats is : %d\n", strconv.FloatSize);
    fmt.Printf("The size of ints is: %d\n", strconv.IntSize);

Bij het volgen van een voorbeeld uit het boek dat ik vermelde in mijn vorige blog post ben ik een fout tegen gekomen. Ik krijg volgende foutmelding :

    main.go:16: undefined: strconv.FloatSize


Ongedefinieerde functie, variabele? IntSize werkt wel. Na wat Google zoekwerk vond ik IntSize gedefinieerd als constante op het strconv package, maar geen FloatSize. Dus ik vermoed dat in de oude versie er wel degelijk een FloatSize aanwezig was maar dat deze er is uitgehaald.

dinsdag 31 januari 2012

Go Programming by J.P Baugh


Bij het verzamelen van informatie over Go ben ik het boek Go programming van jpbaugh tegen gekomen. Het boek was bedoeld als introductie voor mensen die Go wilde leren. Het boek stemt nog van voor de periode dat de documentatie van Go zo uitgebreid was als ze nu is. Daarom lijkt het mij ook een ideaal boek om eens door te lezen als extra bijlage bij de tutorials op de Go website zelf. Meeste van de dingen vind ik wel op de Google Go website maar ik merkte toch dat mijn kennis van interfaces beperkt was. Het is dan ook lang gelenden dat ik een interface heb moeten programmeren, nu wil het dat dit in het boek uitgebreid aan bod komt. Eens kijken of we dit ergens goedkoop op de kop kunnen tikken.

Kleine valkuil bij beginnende Go ontwikkelaars

Go gebruikt ook de puntkomma om het einde van een statement aan te duiden. We zien deze niet omdat deze door de compiler word geplaatst. Dit houd in dat we ten alle tijden moeten vermijden de open accolade op een nieuwe lijn te zetten. Ik ben zelf al in deze valkuil gevallen vandaar een kleine boodschap ter waarschuwing.
Het onderstaande is juist :
if i < f() {
    g()
}
Dit is fout :
if i < f()  // wrong!
{           // wrong!
    g()
}

maandag 30 januari 2012

Google Go


Op 29/02/2012 ga ik een lezing volgen over Google Go. Het lijkt me zeer boeiend te worden en ik ben wel eens benieuwd waar Google Go zich positioneert tussen al een massa aan programmeer talen. Verder ben ik zelf al eens aan het kijken wat je zoal met deze programmeer taal kan aanvangen.

Omdat ik het nog aan het testen ben doe ik voorlopig alles nog op Windows, maar het lijkt me duidelijk dat Google Go's root zich in de Linux OS sfeer bevinden. Na wat zoekwerk kwam volgende IDE aan het licht. golangide nog niet de kans gehad om er mee aan de slag te gaan maar dat zal zeker nog wel komen.

Wat de code/syntax betreft van Go lijkt me deze een allegaartje van verschillende talen bij elkaar, een beetje van python, wat van de C varianten en wat Java.
Naast de Ide heb je natuurlijk ook nog Google Go zelf nodig. Ik ben deze win32 Beta release die voorlopig wel moet volstaan om wat basis functionaliteiten uit te testen. Tijd om wat te experimenteren :) Have fun!