Saturday, November 14, 2009

instanceOf in renaissance

I'm learning Objective C and the GNUStep development environment. For my project I'm using the Renaissance library for my GUI. The app will allow adjustments to an image's brightness, white balance, hue, etc. Following is an image of the interface I'm using for making adjustments to these various attributes.

The stepper and slider controls do not have a direct tag representation in gsmarkup, but using the control tag with the instanceOf attribute, the Renaissance library will create these controls. As the saying goes, an example is worth a thousand man pages:

Adjustments.gsmarkup
<?xml version="1.0"?>
<!DOCTYPE gsmarkup>
<gsmarkup>

<objects>
<window title="Image Adjustments" id="WindowAdjustments" delegate="#NSOwner">
<vbox>
<box title="Brightness"><hbox>
<control instanceOf="NSSlider" id="SliderBrightness" action="setBrightnessViaSlider:" height="28" width="256" />
<textField id="TextBrightness" action="setBrightnessViaText:">000</textField>
<control instanceOf="NSStepper" id="StepperBrightness" action="setBrightnessViaStepper:" height="28" width="18" />
</hbox></box>
</vbox>
</window>
</objects>
<connectors>
<outlet source="#NSOwner" target="#SliderBrightness" key="SliderBrightness" />
<outlet source="#NSOwner" target="#TextBrightness" key="TextBrightness" />
<outlet source="#NSOwner" target="#StepperBrightness" key="StepperBrightness" />
</connectors>
</gsmarkup>

Adjustments.h
#import <AppKit/AppKit.h>
#import <Renaissance/Renaissance.h>

@interface Adjustments : NSObject
{
IBOutlet NSSlider *SliderBrightness;
IBOutlet NSTextField *TextBrightness;
IBOutlet NSStepper *StepperBrightness;
}

- (id) init;
- (void) dealloc;

- (void) setAdjustmentsDefaults;

- (void) setBrightnessViaSlider: (id)sender;
- (void) setBrightnessViaText: (id)sender;
- (void) setBrightnessViaStepper: (id)sender;
@end

Adjustments.m
#import <Adjustments.h>

@implementation Adjustments

- (id)init
{
if ((self = [super init]))
{
[NSBundle loadGSMarkupNamed:@"Adjustments" owner:self];
[self setAdjustmentsDefaults];
}
return self;
}

- (void)dealloc
{
[super dealloc];
}

- (void) setAdjustmentsDefaults
{
[SliderBrightness setMaxValue: 255];
[SliderBrightness setMinValue: 0];
[SliderBrightness setIntValue: 227];
[TextBrightness setIntValue: [SliderBrightness intValue]];
[StepperBrightness setMaxValue: [SliderBrightness maxValue]];
[StepperBrightness setMinValue:[SliderBrightness minValue]];
[StepperBrightness setIncrement: 1];
[StepperBrightness setIntValue: [SliderBrightness intValue]];
}

- (void) setBrightnessViaSlider: (id)sender
{
[StepperBrightness setIntValue: [SliderBrightness intValue]];
[TextBrightness setIntValue: [SliderBrightness intValue]];
}

- (void) setBrightnessViaText: (id)sender
{
[StepperBrightness setIntValue: [TextBrightness intValue]];
[SliderBrightness setIntValue: [TextBrightness intValue]];
}

- (void) setBrightnessViaStepper: (id)sender
{
[SliderBrightness setIntValue: [StepperBrightness intValue]];
[TextBrightness setIntValue: [StepperBrightness intValue]];
}

@end

Saturday, November 7, 2009

My first python

Well my first python code in a long time. My first was modifying a zope photo album module to work after an dist-upgrade of a Debian GNU/Linux system.

Any who--I'm working on a project which will store e-mail addresses in a relational DB. I am contemplating storing the the email in two parts--the user name and the domain name. When storing the domain name, I'm considering storing the domain name in reverse order (i.e. "roansbitsnbytes.blogspot.com" stored as "com.blogspot.roansbitsnbytes") for potentially faster indexed searching. Of course this complicates other aspects of the program (at least on the db side), but I'll deal with that as the design comes.

One of my concerns with storing the domain name this way, is not requiring the client program to have to deal with how the e-mail addresses are going to be stored. I know reversing the domain name can be done in a stored SQL based procedure, but I figure another language can probably do it more concisely (and quicker). PostgresSQL allows you to use stored functions created in Python. After a little digging around, here is the one liner I came up with to reverse the domain name:

".".join(((domainname.split('.'))[::-1]))

where domainname is a string passed to my function in PostgreSQL.

I like how concise this is. When I started I was pretty sure I would be using a split and join command. I just wasn't sure if it could all be done with one line of code. Python's slice notation for mutable sequences (aka the list of domain names created using the split command) makes this one liner nice and neat.

See this url: http://docs.python.org/library/stdtypes.html#typesseq-mutable for more on mutable sequences. Unfortunately, I can't find the original link that led me to this solution.

Friday, November 6, 2009