Nodevore : Using convore with node.js

by trouf on 26/05/2011

It’s been quite a while since I fell in love with node.js, but only recently have I tried my hand at actually writing a npm module.

While working on a project involving node.js, I needed to get build and test results from my deployment enviroment into convore somehow for other members of the team to see. I checked around a bit and it seemed that noone had actually written a convore API wrapper… .. so I went ahead and made this

It’s really straight forward really. Just install and use like any other node.js module.

All of the API methods are supported at the time of writing, including the live API.


No Comments

Resharper & Entity Framework Generated Code

by trouf on 18/05/2011

Been looking for a way to get Resharper to ignore the code that is generated by Entity Framework for a while. Sure, I can ignore the entire project, but since we also had some repo/Unit Of Work implementations in the same project, that’s really not an option.

The final solution was to edit the code generating T4 (.tt) templates of Entity Framework to wrap the code in a custom region, i.e. ”EF Generated code”.

Then tell Resharper to simply skip checking anything that is within region ”EF Generated Code” from ReSharper -> Options -> Generated Code


No Comments

MVC3 Ajax partial view validation

by trouf on 5/05/2011

Ran into a wall of trouble after getting Ajax to work properly in my previous post. Turns out that validation rules are not applied to partial views loaded with Ajax (Even when using the provided Ajax.ActionLink helper).

Thanks to this excellent blogpost i managed to work it out. But not until after bashing my head against the wall until numb.

The main problem was not so much the actual validation scripts, it was pretty clear to me that the validation rules would have to be rebuilt after injecting new objects into the DOM, but the fact that MVC refused to acually render the data-val / data-val-required properties for the elements that needed validating.

These properties are usually rendered by Html.EditorFor / ValidationMessageFor when used as in the example above.

This is how it should look:

<input class="text-box single-line" 
       data-val-required="This field is required!" 

But when including a partial view through Ajax inside this outer form, the ability to use BeginForm inside that partial view is lost due to the fact that we can not have nested forms. And without BeginForm, no data-val properties 🙁

The key to getting the partial view to render the properties was to wrap the contents like the following code snippet:

@using(new MvcForm(ViewContext))
    <div class="editor-label">
        @Html.LabelFor(model => model.Property)
    <div class="editor-field">
        @Html.EditorFor(model => model.Property)
        @Html.ValidationMessageFor(model => model.Property)


And then to get the validation going, call xhalent’s brilliant js-function after appending the results of the Ajax request to the DOM.

  data: {},
  success: function (data) {             

1 Comment

Simple and painless Ajax in MVC3

by trouf on 27/04/2011

Even though Microsoft really came through with MVC3 and added a lot of sweetness, I still find myself reluctant to use the provided Ajax-functionality.

Here’s why:

This approach is nice and simple, yes. But what if I don’t like having global javascript functions all over the place to handle the results of the action. It kind of pains me to see that I can use ”unobtrusive” validation functionality in MVC3 but not unobtrusive Ajax handling.

This is solved by implementing the ”ajaxification” of a normal Html.ActionLink in a separate javascript,
such as proposed here

I needed a more reusable way of doing this, but portable enough to be painlessly lifted to other projects and easy to use for other developers in the project. So i slapped together this jQuery plugin…

Using it is quite straightforward, or at least it seems to me at the time of writing this.

First, we create the controller action that we want to call with the Ajax link:

This action returns a view, so a view will have to be created as well. A simple plain text partial view will do fine. Be sure not to load any layout for this though. The action could have returned JSON as well,
as both cases can be handled by the jQuery plugin.

With a controller action and a view in place, we create the ActionLink in the view where we need the Ajax functionality:

There we go!, now we can declare all our events and handlers well outside the view layout as demonstrated in the following gist:

No Comments

iPhoneOS : Arkivera egna objekt

by trouf on 12/03/2010

Låt oss anta att vi vill designa en applikation som innehåller ett antal egendefinierade objekt.

Dessa behöver vi spara på något sätt, t.ex. när användaren stänger av applikationen eller om användaren skulle få ett telefonsamtal under tiden som applikationen körs.  Utifall att detta händer vill vi att applikationens variabler ska bevaras, och att även våra egendefinierade objekt ska sparas på samma sätt som andra inställningar sparas.

Att spara användardata är en återkommande punkt i de flesta iPhone-applikationer, och jag brukar använda NSUserDefaults för att på ett enkelt sätt spara och hämta data.

Data sparas på följande sätt

NSInteger intToSave = 23;

NSUserDefaults *preferences = [NSUserDefaults standardUserDefaults];

[preferences setInteger:intToSave forKey:@"keyToSavedInt"];

Och hämtas pÃ¥ följande sätt…

NSInteger intToRetrieve;

NSUserDefaults *preferences = [NSUserDefaults standardUserDefaults];

intToRetrieve = [preferences integerForKey:@"keyToSavedInt"];

I min mening det absolut smidigaste sättet att hantera användardata pÃ¥… det vill säga sÃ¥länge som man bara sparar Obj-C datatyper. Men om man däremot vill spara en array av egendefinierade typer, ja dÃ¥ blir det lite mindre smidigt.

Extra smidigt blir det om det dessutom är en hierarki av objekt.

Säg att vi har en applikation som ska hålla koll på lastbilar och deras last.

Låt oss använda en NSMutableArray för att hålla koll på alla lastbilar, och sedan definiera en klass för lastbilar, och en klass för last.

En näst intill pinsamt förenklad implementation av klassen Lastbil följer här.


#import <Foundation/Foundation.h>
#import "Last.h"

@interface Lastbil : NSObject {
	Last *last;

@property(nonatomic,retain) Last *last;



#import "Lastbil.h"

@implementation Lastbil
     @synthesize last

    if (self = [super init])

    return self;

- (void)dealloc
    [self.last release];
    [super dealloc];


Och sÃ¥ lasten…


#import <Foundation/Foundation.h>

@interface Last : NSObject {
	NSString *beskrivning;

@property(nonatomic,copy) NSString *beskrivning;



#import "Last.h"

@implementation Last

@synthesize beskrivning;

- (id)initWithBeskrivning: (NSString*)b
	self.beskrivning = b;
	return self;

- (void)dealloc
    [self.beskrivning release];
    [super dealloc];


Ja nåt i den stilen. Blind kod och en knapphändig implementation, precis som det ska va.

Då är själva objekten deklarerade, det som återstår är att.. ja.. använda dem.

NSMutableArray *lastbilar = [[NSMutableArray alloc] init];

Lastbil *lastbil1 = [[Lastbil alloc] init];
Lastbil *lastbil2 = [[Lastbil alloc] init];

lastbil1.last = [[Last alloc] initWithBeskrivning:@"Fisk"];
lastbil2.last = [[Last alloc] initWithBeskrivning:@"Kött"];

[lastbilar addObject:lastbil1];
[lastbilar addObject:lastbil2];

[lastbilar release];

Då har vi en datastruktur som innehåller två lastbilar, den ena med fisk i lasten och den andra med gott, mört kött i lasten.

Om vi nu vill spara denna datastruktur till NSUserDefaults så skulle vi kunna göra det genom att först arkivera den till ett NSData-objekt med NSKeyedArchiver..

NSData *lastbilData = [NSKeyedArchiver archivedDataWithRootObject:lastbilar];

MEN detta är inte rumba, och kommer inte att fungera då våra egendefinierade objekt (Lastbil, Last) inte implementerar NSCoding protokollet. Alla objekt måste, om de ska kunna arkiveras, implementera metoder för hur de ska arkiveras och hur de ska avarkiveras. Enligt NSCoding måste alltså våra objekt implementera följande metoder.

- (void)encodeWithCoder:(NSCoder *)encoder
- (id)initWithCoder:(NSCoder *)decoder

Så låt oss implementera dessa metoder först i Lastbil.m. Det vi vill göra är att specifiera vilka av objektets egenskaper som ska arkiveras, och under vilka nycklas värdena ska arkiveras, detsamma för avarkivering.

- (void)encodeWithCoder:(NSCoder *)coder;
	[coder encodeObject:self.last forKey:@"last"];


- (id)initWithCoder:(NSCoder *)coder;
     if (self = [super init])
		self.last = [coder decodeObjectForKey:@"last"];

    return self;

…och sedan i Last.m

- (void)encodeWithCoder:(NSCoder *)coder;
	[coder encodeObject:self.beskrivning forKey:@"beskrivning"];


- (id)initWithCoder:(NSCoder *)coder;
     if (self = [super init])
		self.beskrivning = [coder decodeObjectForKey:@"beskrivning"];

    return self;

That’s pretty much it.

Nu går det bra att arkivera hela objekthierarkin, eftersom alla objekt i hierarkin kan arkiveras (NSCoder).

NSData *lastbilData = [NSKeyedArchiver archivedDataWithRootObject:lastbilar];

Och ett objekt av typen NSData går givetvis att spara till NSUserDefaults precis som motsvarande enkla datatyper.

NSUserDefaults *preferences = [NSUserDefaults standardUserDefaults];

NSData *lastbilData = [NSKeyedArchiver archivedDataWithRootObject:lastbilar];

[preferences setObject:lastbilData forKey:@"Lastbilar"];

Och går att läsa tillbaka, med minimal ansträngning.

NSUserDefaults *preferences = [NSUserDefaults standardUserDefaults];

NSData *lastbilData = [preferences objectForKey:@"Lastbilar"];

	if (lastbilData != nil)
		NSArray *gamlaLastbilar = [NSKeyedUnarchiver unarchiveObjectWithData:lastbilData];

			if (gamlaLastbilar != nil)
				//Presentera information

Och så gör man alltså för att arkivera sina egna objekt!

Andra bloggar om: , , ,

1 Comment

Between The Buried And Me – The Great Misdirect

by trouf on 9/03/2010

Det är nästan obehagligt att lyssna pÃ¥ en ny skiva av BTBAM efter Alaska + Colors som ju varit lyft pÃ¥ lyft. Om jag för ett Ã¥r sen hade fÃ¥tt välja en skiva som skulle vara den enda skivan jag fick lyssna pÃ¥ resten av mitt liv sÃ¥ hade det nog blivit Colors. Den betyder sÃ¥ oerhört mycket för mig, det är sÃ¥ mycket minnen knutna till just den perioden i mitt liv sÃ¥ det gör ont att ens behöva tänka tanken ”What if?”. Vad i hela världen ska jag ta mig till om The Great Misdirect visar sig vara BTBAMs svar pÃ¥ The Human Abstract – Midheaven.

Jag brukar bete mig som en 5-åring när det gäller min favoritmusik. Det räcker med en dålig skiva för att jag ska bli bitter och börja göra kirurgiska ingrepp i mina playlists för att radera alla spår av den skyldiga artisten, lite som att göra slut. Men allting har sin tid, allting börjar och tar också oundvikligen slut så det är väl lika bra att ta tjuren vid hornen och lyssna på skivan medan öronen fortfarande fungerar.

Det är två saker som jag tänker vara extra uppmärksam på med tanke på tidigare album.

Främst så är det den tekniska aspekten av musiken. Colors var en ren lektion i musikteori som visar exakt var skåpet ska stå för progressiv musik. Det laboreras med allt! Resonans, dissonans, tonartsbyten, genreövergångar, takter och ja det mesta. Colors ligger för mig på samma nivå som Beethoven vad gäller musikalitet, och det sätter ju en del press på The Great Misdirect.

Sedan albumets upplägg, där Colors var på gränsen till för långa låtar, medan Alaska precis tangerar den låtlängd som jag tycker är acceptabel för ett album. Låtarna får inte bli för långa i min mening. Jag vill ha definition mellan spåren annars blir ju albumet bara en enda röra.

Jag brukar vara den som lyssnar mer på texter än på musik, men på senare tid märker jag att det är varken det ena eller det andra som får mig att gilla en låt. Utan det är balansen mellan innehåll/musik som gör att det blir bra, och hur texten framförs, alltså rytmen i sången tillsammans med rytmen i musiken. Speciellt i denna typen av musik där komplexiteten är så pass hög. Enklare musik följer enklare regler.

Ok enough, dags att dyka in i detta dimhöjda, mystiska album. Förstaspåret är just det, mystiskt. Det bygger upp en förväntning om något nytt. En stilla gitarr och en sorgsen sång. En stämma blir två på ett nästan matematiskt beräknat sätt. Trummor rullar över ljudlandskapet och fångas upp av en dansande baslinje. Allt på sin plats. Ordning och reda. Det känns lite för statiskt för att vara BTBAM, väldigt mörkt och väldigt behärskat.

Man undrar när det ska explodera, men det dröjer, för andraspåret tar vid innan någon verklig explosion inträffar och här känner vi igen ett av de mest klassiska elementen i BTBAMs musik. Det vill säga de ständigt föränderliga riff som blir lite av ett tveeggat svärd. Dels gör det ju musiken intressant, för det händer alltid något nytt. Men samtidigt så blir det ibland för lite av det goda, man fastnar för ett visst riff, man hinner precis uppskatta en passage och vips så är den borta och ersatt med något annat. Lite av dilemmat med progressiv musik, när den når en sådan komplexitet att den snarare beter sig som en livsform. Lätt fånget och lätt förgånget.

Hela skivan präglas av just denna föränderlighet. Inget är detsamma i mer än 30 sekunder och det tar lång tid att lyssna in sig. Man skulle kunna säga att man behöver lära sig skivan utantill för att kunna uppskatta den, och det kan ju kännas som en last, men för mig så är belöningen i slutet helt klart värd det.

Det mesta känns igen frÃ¥n Colors, och jag tycker snarare att The Great Misdirect känns som en förängning av Colors. Det är en hel del riff som Ã¥terkommer, liknande skalor och liknande ackordföljder, men med lite spännande tillägg. Jag hör en häst gnägga, jag hör industriella effekter, jag hör en ökad användning av syntheffekter, piano, blÃ¥sinstrument, bongotrummor… ja listan kan göras mycket längre än sÃ¥. Vid flera tillfällen känns det tyvärr som om det är lite för mycket. Om man till varje pris mÃ¥ste producera nÃ¥got som verkligen är progressivt, ja dÃ¥ är väl ett hästgnägg det givna ljudet, men som lyssnare behöver man ibland andrum emellan attackerna av progressiva element. De första 3 lyssningarna av albumet var verkligen pÃ¥frestande, rent uttröttande.

Det spÃ¥r som enligt mig sticker ut mest är ”Desert Of Song”. Jag var mest förvÃ¥nad över att kunna lyssna igenom ett helt spÃ¥r som behÃ¥ller samma tema, och som hÃ¥ller sig inom tydligt definierade ramar. Jag fÃ¥r massiva Opeth-vibbar av denna lÃ¥t, och det känns helt rätt. Definitivt ett tema som jag skulle vilja höra mer av frÃ¥n BTBAM.

Sen är det ju det där med lÃ¥nga spÃ¥r. ”Swim To The Moon” klockar in pÃ¥ 17 minuter och 54 sekunder vilket är lite väl lÃ¥ngt, men det är ocksÃ¥ ett av skivans bästa spÃ¥r enligt mig. Vi känner igen de typiska skalorna, men här fÃ¥r vi ocksÃ¥ smaka lite pÃ¥ en massiv crossover mellan det mesta. Min favoritpassage är helt klart 6:40 in där bongotrummor, horn, visselpipor, gitarrer och growl möts i ett av de absolut galnaste breakdowns pÃ¥ denna sida av merkurius.

Det mÃ¥ste sägas att detta är en oerhört ”svÃ¥r” skiva som kräver väldigt mycket av lyssnaren och att det framför allt är en gitarr-skiva. Det vill säga att om man gillar gitarr och förstÃ¥r vad som krävs för att skapa denna typen av musik, dÃ¥ har man en tendens att lyssna pÃ¥ ett annat sätt, pÃ¥ ett mer respektfullt sätt.

Och så till slutsatsen,

Detta är Paul Waggoner & co. i sin rätta miljö. Det finns många musiker som är sanslöst bra, snabba och tekniska men i min mening så är detta album ytterligare ett bevis på inte bara fingerfärdighet av astronomiska mått, utan även musikalitet som ju är så viktigt. Det måste ju låta bra också. För mig är detta BTBAMs svåraste album hittils, och jag brottas med den emellanåt överdrivna progressiva sidan. Vissa spår känns som en enda lång uppladdning inför en explosion som aldrig kommer, och jag känner mig ibland besviken över den slutgiltiga musikaliska destinationen. Samtidigt är det en vanesak. The Great Misdirect är ett album som växer ju mer man lyssnar på det och som har en oändlig potential som endast begränsas av lyssnarens fantasi och uthållighet. En skattkista av gyllene toner med ett ordentligt lås.

Jag tycker dock att spÃ¥ren är för lÃ¥nga, och hoppas att det inte är en trend för kommande album. IsÃ¥fall kommer nästa album ha 3 spÃ¥r pÃ¥ 20 minuter vardera och nästnästa album kommer vara ett enda spÃ¥r pÃ¥ 60 minuter. Please don’t.

Det råder ingen tvekan om att BTBAM kan leverera upp till förväntningar även om att försöka leva upp till Colors måste anses vara en omöjlighet. Jag tycker detta är ett bra album som tar vid där Colors slutar och fortsätter den berättelsen. Det jag gillar främst är att The Great Misdirect öppnar upp en hel del nya spår för BTBAM, och det ska bli spännande att se vad vi får höra härnäst.

Om den lilla musikfén uppenbarade sig för mig och gav mig en musikönskning, skulle jag önska ett projekt med Paul Waggoner och A.J. Minette sida vid sida. Det vore nästan värt en njure.

Avslutar med Selkies för lite nostalgi.

Andra bloggar om: , , , ,

No Comments

NOFX – Coaster

by trouf on 9/03/2010


oj va fiffigt omslag

”NY” skiva av feta Micke Ã¥ grabbarna i örat. Har varit lite väck och borta det senaste Ã¥ret, vilken nog kan ses som helt normalt dÃ¥ en blev tvÃ¥ och tvÃ¥ blev tre snabbare än du kan lista ut vad det innebär. Ja det är attityd, för det ska recenseras punk, och dÃ¥ mÃ¥ste man göra det med attityd. Hur fan ska det annars gÃ¥ till?

Till objektet i fråga då. Ny skiva från vid det här laget legendariska NOFX, och frågan på min och alla andras läppar är ju då: Är det värt att lyssna på?

Det ska sägas att sedan jag recenserade förra skivan (Wolves) så har jag uppfyllt ett av mina livsmål, vilket var att se Fat Mike live och knappt överleva. Det är nu alltså gjort, och även om det är en berättelse i sig så kan jag hinta om att det var sjukt grymt och en av de absolut bästa om inte den bästa konserten jag någonsin varit på, och då har jag sett en och annan och en tredje.

Det  är mycket förväntningar på ett skivsläpp som detta, oerhört mycket förväntningar men det börjar också oerhört bra. Då syftar jag främst på omslaget till skivan. En nonchalant gliring åt vem? Åt mig som skivköpare känns det som. Åh tack, jag har precis betalat en kvarts timlön för ett drinkunderlägg, och herrarna har varit goda nog att inkludera lite musik på köpet om det vore så att jag vill ta en paus i mitt drickande av billig Amerikansk whiskey. Men det är bra, punk är attityd så det gör inget om det känns som jag blir idiotförklarad, det är snarare hedrande.

Det är med ivriga fingrar jag letar efter playknappen för att komma igång och suga i mig lite av vad som enligt backspegeln bör vara ett av de bästa skivsläppen 09, och det tar ungefär 7 sekunder av första spåret att inse att denhär skivan inte riktigt är som alla andra.

Det är fortfarande samma skarpa texter, samma ironi, samma känsla i budskapet och tyvärr samma budskap. Men även om orden som levereras är något som vi antagligen redan hört så levereras de på ett snyggt sätt och det som sticker ut direkt är det rena ljudet. Det är ett annat tempo på Coaster, det känns lite som ett flygplan som kommit upp på marschhöjd och slår av motorerna lite för att glida och spara bränsle. Men är det inte lika skönt att flyga även om inte motorerna går på max? Detta är nya NOFX, det är Fat Mike och grabbarna nyktra i frack och fluga med välstämda instrument och glimten i ögat.

Efter tre ganska mediokra spÃ¥r är det första spÃ¥ret som fastnar pÃ¥ min trumhinna  ”My Orphan Year”. Främst eftersom jag tycker att hela NOFX utveckling destillerat till en och samma lÃ¥t kan representeras av just denna lÃ¥t. Den öppnar lugnt med ett harmoniskt riff, och vi som lyssnare vet redan att snart kommer Erik och lägger ner ett sÃ¥ntdär Erik-beat som fÃ¥r en att börja trumma pÃ¥ skrivbordet och bara vänta pÃ¥ att lÃ¥ten ska lyftas till högan sky av en stadig gitarrmatta innan Fat Mike gör sin grej. Och han gör den bra. Det är lÃ¥ngt ifrÃ¥n alla som kan leverera en berättelse om hur det känns att förlora bÃ¥da sina föräldrar, och samtidigt förmedla en känsla som inget annat band i denna genre kan. PÃ¥ knappt tre minuter gick jag frÃ¥n glad skrivbordstrummis till ledsen och föräldralös och känslan sitter i nästan lite för länge.

Efter en sÃ¥n lÃ¥t blir givetvis efterföljande lÃ¥tar lidande. Jag hör lite kritik mot kristendomen, lite skämt om lesbiska kvinnor med ishockeyfrisyr som nästan lyckas lyfta mitt humör. Bör tilläggas att Fat Mike har fÃ¥tt mycket skit frÃ¥n gaylobbyn för ”Creeping Out Sara/Tegan”, vilket gör mig glad för dÃ¥ har han lyckats med det han gör bäst nämligen att provocera som ingen annan.

Vi fortsätter med vad jag antar är en het kärleksberättelse om herrarna i Iron Maiden som inte riktigt nÃ¥r hela vägen fram, men som lockar fram ett leende med falsettsÃ¥ng och gitarrharmonier, och stannar pÃ¥ ”Best God In Show”. Här har vi ett spÃ¥r som inte alls lÃ¥ter som NOFX. PÃ¥ tidigare skivor har alltid alla brytlÃ¥tar varit ska-inspirerade med blÃ¥sinstrument och gladbeats, men här görs ett försök att leverera reggae som uppskattas, men jag har väldigt svÃ¥rt att ta det pÃ¥ allvar.

Däremot gillar jag ”Suits And Ladders” skarpt, för jag är en gammal gubbe nu, och dÃ¥ gillar jag sÃ¥dant som pÃ¥minner mig om hur det var förr i tiden dÃ¥ vi var unga och lyckligt ovetande om livets kval. Detta är skivans tidsmaskin, som visar att det fortfarande finns lite skit kvar under naglarna pÃ¥ grabbarna även om skivan i övrigt känns väldigt ren och redo att visa upp för svärföräldrarna.

Därefter händer inte så mycket mer i min mening, det är repetition, och hur bra repetitionen än är så är det ändå repetition. Vi har hört det förut.

Jag vill gärna tro att jag förstår NOFX, att jag har bättre öron än andra för denna typ av musik. Jag vill tro det eftersom detta är musiken jag växte upp med, detta är musiken som peppade mig när jag bad farsan dra åt helvete istället för att klippa gräsmattan utan protest, detta är soundtracket till MITT liv. Men samtidigt så är det min last, för jag är dömd att automatiskt älska all musik som dessa självgoda, numera välgödda herrar släppt.

Men inte längre.

Jag har vuxit upp, så är det, och hur mycket jag än försöker så kan jag inte längre hitta det som måste finnas där i ett band som NOFX. Jag har vuxit upp och det har även Fat Mike. Det märks att det inte längre är vad det brukade vara, det känns på tonen att det börjar bli lite slitsamt nu, att åren kryper på och med åren kommer skrumplevern och kavajen. Det låter bra men det saknar själ och det saknar framför allt attityd. Att leverera en skiva som är ren och fin i tonen känns ändå väntat, men är en utveckling som jag inte tycker passar.

Det är repetition av för mÃ¥nga teman och det enda som är nytt är soundet. Det har hänt sÃ¥ oändligt mycket i soundet sen ”Maximum Rocknroll”, det har varit en transition frÃ¥n oljud till välljud, en förvandling frÃ¥n garagepunkare till studiomusiker, frÃ¥n punkfester till skrumplever. Nytt sound är inte riktigt min grej, men det är väl en del av den naturliga utvecklingen. Nya lyssnare, dagens NOFX-kids, har kanske lättare att knyta an till ett sound som detta medan jag sitter här och är bitter över att skivan inte peppar mig som gamla skivor gjorde i början av 90-talet. Fan ocksÃ¥ det mÃ¥ste va nÃ¥got fel pÃ¥ mina öron.

Jag fÃ¥r ta det för vad det är, ett glänsande, 99-kronors drinkunderlägg med alternativa anvädningsomrÃ¥den. Helt plötsligt känns skivans titel och omslagsbild som en medveten gardering till en medvetet medioker skiva som kommer att, iallafall för mig,  gÃ¥ till historien som ”The Decline”, bokstavligt talat. Nu mÃ¥ste jag kurera mig med just den och annat frÃ¥n min favoritperiod. Den och ”Dinosaurs Will Die”, ”The Separation Of Church And Skate” och ”It’s My Job to Keep Punk Rock Elite”


Andra bloggar om: , , , ,


iPhoneOS : Framerate independence

by trouf on 8/03/2010

Närsom man animerar ett objekt på egen hand (OpenGL) så måste man vara beredd på att saker och ting kan hända i resten av operativsystemet under tiden som animeringen pågår. Detta leder då till osmakliga hack i de annars så vackra rörelsemönstren.

För att lösa detta gör jag två saker.

1. Sätter upp en ”target” framerate som är referens vid alla beräkningar.
2. Räknar ut skillnaden mellan faktisk framerate och target-framerate och multiplicerar alla rörelser på skärmen med detta värde.

NÃ¥got i denhär stilen…

- (void)render {

NSDate *startDate = [[NSDate date] retain];

float wantedTime = 0.025; //Target framerate = 40 fps, dvs 1/40

Rendering sker här, vi använder mätvärde från föregående frame för rörelsekompensation

self.speedFactor = [[NSDate date] timeIntervalSinceDate:startDate] / wantedTime;


Alla rörelser multipliceras sedan med speedFactor, såsom

obj.Ypos = (sin(obj.direction*(M_PI/180))*BSPEED) * self.speedFactor;

Inga fler hack när iPhoneOS kollar din mail, uppdaterar din plats eller skickar hemliga data till Steve Jobs medan du spelar!

Andra bloggar om: , , , ,

No Comments


by trouf on 18/11/2008

No Comments


by trouf on 18/11/2008

No Comments