Saturday, July 14, 2012

Thinkpad x220

Bought Lenovo Thinkpad x220 (with core i5, tn-film display, no ips configurations where available for less than $2000), installed xubuntu. Everything works out of the box, had to tune hdd power management: hdparm -B 254 /dev/sda to extend hdd's live. Also installed hdapsd for active shock protection and tp-smapi-dkms. Really good device for work and hobby.

Friday, June 15, 2012

Nimrod macro

So finally some macro stuff in Nimrod programming language I managed to write.
import macros

when false:
    dumpTree:
        type
            PMyObj* = ref TMyObj 
            TMyObj* = object of TObject
                a, b : int

        proc newTMyObj*() : PMyObj =
            var o : PMyObj
            new(o)
            #initTMyObj(o[])
            return o    
    
#proc initTMyObj*(o : var TMyObj) = nil
    
when false:
    proc newTMyObj*() : PMyObj =
        var o : PMyObj
        new(o)
        #initTMyObj(o[])
        return o
    
    
macro objdecl(clsbase : expr) : stmt =
    result = newNimNode(nnkStmtList)#, clsbase)
    #for i in 1..clsbase.len-1:
    #echo(repr(clsbase[i]))
    let clsName = repr(clsbase[1])
    let baseName = repr(clsbase[2])
    let tname = "T" & clsName
    let pname = "P" & clsName
    echo("base = " & baseName & ", type = " & tname)
    var fields = clsbase[3][0][0] # [0] skip stmt list, [0] skip var section
    
    
    echo("fields = " & repr(fields))
    
    
    # start 'type' section
    var tsection = newNimNode(nnkTypeSection)
    result.add(tsection)
    
    block:
        # define 'type' node for Pclass * = ref Tclass
        var tnode = newNimNode(nnkTypeDef)
        tsection.add(tnode)
        
        # define type name with * operator
        var tpostf = newNimNode(nnkPostfix)
        tpostf.add(newIdentNode("*"))
        tpostf.add(newIdentNode(pname))
        tnode.add(tpostf)
        
        # don't know why but need an empty node
        tnode.add(newNimNode(nnkEmpty))
        
        # the actual type = ref
        var reft = newNimNode(nnkRefTy)
        reft.add(newIdentNode(tname))
        tnode.add(reft)
    
    
    block:
        # define 'type' node for Tclass * = object of base
        var tnode = newNimNode(nnkTypeDef)
        tsection.add(tnode)
        
        # define type name with * operator
        var tpostf = newNimNode(nnkPostfix)
        tpostf.add(newIdentNode("*"))
        tpostf.add(newIdentNode(tname))
        tnode.add(tpostf)
        
        # don't know why but need an empty node
        tnode.add(newNimNode(nnkEmpty))
        
        # the actual type = object of
        var objt = newNimNode(nnkObjectTy)
        tnode.add(objt)
        
        # needed, don't know why
        objt.add(newNimNode(nnkEmpty))
        
        var inh = newNimNode(nnkOfInherit)
        objt.add(inh)
        inh.add(newIdentNode(baseName))
        
        var recs = newNimNode(nnkRecList)
        objt.add(recs)
        
        recs.add(fields)
        
        #var identDefs = newNimNode(nnkIdentDefs)
        #recs.add(identDefs)
        
        #identDefs.add(getAST(fields))
        #for i in 0..len(fields)-1:
        #    identDefs.add(fields[i])
            
            
        # needed, don't know why
        #identDefs.add(newNimNode(nnkEmpty))
        
    
    #echo(fields.len)
    echo(treeRepr(tsection))
    #echo(repr(tsection))
    
    
    
    
    
    #tnode.add(new
    
    
template declClass(clsName : expr, baseCls : expr, fields : stmt) : stmt = 
    
    
    objdecl(clsName, baseCls, fields)
    when false:
        #`P clsName`* = ref `T clsName`
        #`T clsName`* = object of baseCls
        #    putfields

    proc `new clsName`() : `P clsName` =
        var o : `P clsName`
        new(o)
        return o
        
    
        
# ----- the usage:
    
 
declClass MyTempClass, TObject:
    var x, y : int
    

      
var o = newMyTempClass()
o.x = 3
echo("x,y = " & $o.x & " " & $o.y)

Wednesday, May 23, 2012

Nimrod programming language

Very interesting language, spotted when looking for Vala (generates C code) -)

http://nimrod-code.org/index.html

Tuesday, May 22, 2012

Java image editor

With sources for filters etc.

http://www.jhlabs.com/ie/

Monday, May 14, 2012

Dangerous C++ preprocessor

It took me three weeks to find this mistake in a huge code base. Program suddenly crashes after the changes  that look obviously innocent. And the root of all evil was not memory leaks or so but the #ifdef.

header.h

struct mystruct : somebasestruct {
   mystruct();

#ifdef FEATURE_X

int somefield;

#endif

};


module1.cpp

#include ....
#include "header.h"

sizeof(mystruct) = 8

module2.cpp

#include ....
#include "header.h"

sizeof(mystruct) = 4



And guess why? Yes, check building settings, what is defined or not...

Tuesday, March 20, 2012

Collision detection, 2d physics

http://gdlinks.hut.ru/cdfaq/
http://www.wildbunny.co.uk/blog/2011/04/20/collision-detection-for-dummies/
http://www.wildbunny.co.uk/blog/2011/05/12/how-to-make-angry-birds-part-1/

Monday, March 5, 2012

Panasonic HM-TA2

Absolutely love this mini camcorder! Although there are no manual settings you can adjust except for video resolution (fullhd, 720p25, iFrame) and turn on/off LED light.

iFrame mode produces big files suitable for editing with maximum quality.

I use 720p mode and the video is really awsome clear and detailed when outdoors. Stereo sound quality is also way better than any smartphone's.

I'll publish sample video as soon as something interesting gets into sight.