Vem är Johan Lindfors

Jag är en passionerad utvecklare, arkitekt och tekniker, trivs med att presentera, demonstrera och implementera allt som har med programmeringa att göra. I den här bloggen har jag för avsikt att skriva om utveckling i allmänhet och på Microsofts plattform i synnerhet.

Är du intresserad av en XNA användargrupp?



Visa resultat!

Get Microsoft Silverlight

Widget Twitter not found.

Root element is missing.X

Planera ditt sociala nätverk, annars?

Fick i veckan reda på att en av mina kontakter på Facebook var på väg att uppdatera sin hantering av olika sociala medier. Det gick ut på att personen i fråga hade använt Facebook lite för offensivt och antingen accepterat andras förfrågningar om kamratskap eller själv inlett relationer utan att ha planerat i förväg och nu skulle det städas! Facebook skulle bara komma att användas för privata relationer, medans LinkedIn och Twitter skulle bli den officiella affärsrelaterade kanalen. Det innebar också att flera personer på Facebook antagligen skulle blockeras eftersom de var affärskontakter och således hörde inte den relationen hemma i det nätverket. Men vad händer om personen på andra sidan anser att det är så mycket mer än en affärsrelation? Personen kanske känner en betydligt starkare vänskap och gillar den privata dialogen som fram tills nu har hållits via olika medier? Är inte det en konflikt som heter duga…

Det som jag ser intressant och min högst privata projektion på detta är att om jag själv kände att det fanns en vänskap mellan mig och en person, och den personen plötsligt hävdade att vi bara är affärskontakter, så skulle jag nästan omedelbart upphöra att göra affärer med den personen. Det kanske låter barnsligt, men jag jobbar mycket med mage och hjärta och tar flera av mina beslut baserat på känsla, förhoppningsvis med grunder i erfarenhet och år av analys med hjärnan!

För ett par år sedan föreslog jag internt att vi skulle inventera våra relationer i arbetsgruppen och exponera om vi ansåg att alla relationer med kollegorna var som “konsument”, “producent” eller både och. Ambitionen var att vi skulle försöka identifera konflikter där vissa personer ansåg att de bara hjälpte andra men fick ingenting tillbaka och med en karta som föreslogs skulle det bli tydligt hur alla såg på varandra. Det skulle kräva mycket empati och ödmjukhet inför uppgiften men i slutet skulle alla veta vart vi hade varandra. Tyvärr så genomfördes aldrig övningen så jag har inte heller något konkret resultat att bidra med, men anser fortfarande att det hade varit spännande att få veta om mina kollegor hade samma perspektiv på våra individuella relationer som jag hade.

Vad vill jag då säga med den här krönikan? Jo, kanske att det gäller att tidigt planera sitt sociala nätverk och användningen av de mängder av kanaler som finns tillgängliga. Speciellt om du vill slippa konflikter i senare skede. Jag inser samtidigt att det är naivt av mig att tro att alla beslut jag tar idag kommer att vara skrivna i blod och sten, eftersom inte ens jag kan förutse vart vi är på väg med Internet och alla kommande tjänster. Det kanske kommer (eller redan finns) en social tjänst som inte bara bidrar med relationer utan även publikt exponerar hur relationen är definerad från båda hållen, totalt transparent, eller som modeordet skulle hävda: Öppet! Smile

Sidnot: En skönlitterär bok som jag varmt kan rekommendera som tar upp öppna sociala nätverk med avatarer och “rating-system” är The Daemon av Daniel Suarez. Den målar upp en mycket mörk och våldsam bild av hur Internet och kringliggande tekniker potentiellt skulle kunna användas för att göra världen både sämre och bättre. Det finns också en uppföljare (Freedom) som inte bör missas, men tro mig, du kommer att vilja läsa även tvåan när du lagt ned ettan efter att ha streckläst den!
Postades 8. augusti 2011 08:56 av Johan Lindfors
Taggar:

MicroIoc.Portable library evaluation

Microsoft released the Portable Class Library, as an extension to Visual Studio 2010, a couple of days ago which helps in creating “ultra-portable” class libraries targeting several Windows based platforms:

  1. Silverlight 4
  2. Windows Phone 7
  3. Windows (.NET Framework 4.0)
  4. Xbox 360 (XNA)

I’m currently evaluating several different libraries which have strived for portability such as physics-libraries, IoC-containers, mvvm-frameworks and more. One of the recent successful implementations was a port of the MicroIoc library which source is available on http://microioc.codeplex.com. I managed to keep the existing implementation in complete parity with a portable version while targeting Silverlight, WP7 and .NET Framework, with all tests passing nicely. However I also added the Xbox 360 platform by removing the Property extension on the IConfiguration interface, and also had to comment out four tests which tested that feature. As of now, I’m not certain that it’s something that’s required for actual usage of the library, which I need to dive into moving forward.

One feature that I really enjoy with the Portable Class Library is the ability to reference it in both a Windows Phone 7 application and a Visual Studio Test Project, making unit-testing very easy and integrated in the overall development process. It will be very interesting to see if more frameworks adapt this practice.

Interesting find, I think?

Something that has been commonly known for a long time and for many kind of annoying is that the panorama-control in Silverlight has a “bug” when reactivating the panorama page. The problem is that when you pan to a panorama item (lets say the second one for simplicity) and unloads the application (maybe by pressing the home button) and then reactivates the application (preferably by pressing the back button) the panorama will have lost the state regarding which panorama item was active when deactivating the application. (How’s that for a problem description Smile )

This can pretty easily be handled by storing the active panorama item index and then when the application gets reactivated (not reloaded) set the DefaultItem property of the panorama to the item you need activated. Unfortunately what’s happens is that the background as well as the title of the panorama will think that the current item (which in my case is the second one) is the first and hence they will be aligned poorly (since they now think that the second item is the leftmost item).

What I find interesting is that I can find this exact behavior in the People, Pictures, Marketplace and the Media Hub, but not in the Office or Games Hub. The Office and Games Hub very nicely remembers their state and maintains the pan when coming back to them. I’ve also noticed that the Facebook application have found a solution for this behavior. Maybe someone could convince the developers to share their solution, cause Bing haven’t been able to provide me with that yet…

It has been suggested that one could use the VisualStateManager to simulate the “correct” behavior, but I still haven’t found out how to get that to work.

The find is still the differences between the so called “native hubs”. Well that was what I found out during todays lunch, don’t you feel enlightened? Smile

Postades 17. juni 2011 23:33 av Johan Lindfors

StatusBar för SketchFlow och WP7

I min iver över att använda SketchFlow för att mocka projekt för Windows Phone 7 så har jag noterat en del trista beteenden i den version som för närvarande finns tillgänglig. Bland annat så får åtminstone inte jag till ens det imagemest grundläggande när det gäller att textboxar och knappar har storlekar och “touch”-ytor som är relevanta för WP7. Jag har inte heller klurat ut ännu (men inte heller gjort några stora laborationer) över hur en pivot eller panorama lösning kan mockas på enklast sätt, med interaktion bör nämnas.

Vad jag däremot slängde ihop var en UserControl för att exponera StatusBar vid användning i SketchFlow med resultatet som kan ses här bredvid. Och om detta är något som du tror att du skulle kunna ha använding av så finns här också koden tillgänglig.

Projektet är kanske lite överdrivet avancerat med möjligheten att bestämma vilka delar av StatusBar som ska synas, välja batterinivå, text på klockan, vilket språk som syns osv… Det går även att slå på så kallade Alignment Rectangles som visar hur design-regelverket hävdar att StatusBar ska se ut med rosa och gröna rektanglar.

Nu finns det två sätt att använda detta exempelprojekt på:

  1. Skapa en referens till antingen projektet direkt alternativ en binär-version. Då kan du sedan lägga till en StatusBar med hjälp av ToolBox i Blend genom att som vanligt söka upp kontrollen och lägga till den, däremot så kommer den då inte synas som en ComponentScreen i SketchFlow Map.
  2. Kopiera bilder, kod och xaml in i ditt befintliga SketchFlow projekt. Det är betydligt pilligare och går i runda slängar ut på att du skapar en egen ComponentScreen i kartan och döper den förslagsvis till StatusBar. Sedan påbörjas övningen med att klippa och klistra in koden från exempelprojektet till ditt egna. Håll tungan rätt i mun bara så kommer det ordna sig. Glöm inte heller att lägga till en katalog med namnet StatusBarImages och lägg till alla bilderna där.

Det du behöver för att få till detta är alltså:

  1. Expression Blend Preview 5
  2. SketchFlow projektmall för Windows Phone 7
  3. Mitt exempelprojekt

Eventuellt så kan det vara bra att läsa den här artikeln som hjälper dig igång med SketchFlow för WP7!

Lite tips… Vänstermarginal 54 och toppmarginal 93 brukar positionera ut allt korrekt Smile

Lycka till och hör av dig om du har några kommentarer.

“Know thy LINQ”

LINQ är något som jag mycket gladeligen använder i mina applikationer, jag anser det vara ett tydligt och enkelt sätt att både filtrera och transformerera resultat precis på det sätt som applikationens aktuella tillstånd kräver.

Men det gäller att hålla tungan rätt i munnen, annars går det att åka på rejäla prestandaförluster, och här är ett exempel som jag hoppas är föga förvånande för just dig, men något som jag dessvärre har noterat i ett presentationsmaterial om just riktlinjer och rekommendationer.

Säg att du har en stor samling med data som du vill presentera i din applikation, och antagligen med en skräddarsydd vy-modell i förhållande till den vanliga data-modellen i applikationen.

class Person {
public int Age { get; set; }
public string Firstname { get; set; }
public string Lastname { get; set; }
}

class PersonViewModel
{
public int Age { get; set; }
public string Name { get; set; }
}

Låt mig sedan för enkelhetens skulle också skapa en statisk samling som jag kan filtrera och jobba med senare:

private static List<Person> _people = new List<Person>
{
new Person { Age = 4, Firstname = "Max", Lastname = "Lindfors" },
new Person { Age = 25, Firstname = "Johan", Lastname = "Lindfors" },
new Person { Age = 25, Firstname = "Lina", Lastname = "Lindfors" },
new Person { Age = 9, Firstname = "Matilda", Lastname = "Lindfors" },
};

Om jag sedan skapar en metod som kan användas för att projicera/transformera/anpassa modellen till vy-modellen så skulle den potentiellt kunna se ut så här:
 
private PersonViewModel GetPersonViewModel(Person person)
{
return new PersonViewModel {
Age = person.Age,
Name = string.Format("{0} {1}", person.Firstname, person.Lastname) };
}

Än så länge är det inga konstigheter hoppas jag. Transformering i det här fallet är enkel och tar inte mycket tid att processa. Nu finns det lite olika sätt att använda den här projiceringen på, och här är det första exemplet i LINQ:

var children = from p in _people
where p.Age < 18
select GetPersonViewModel(p);

Jag väljer i det här fallet att anropa projiceringen som “select” och får då en samling av vy-modeller tillbaka.

Ett alternativ är att istället explicit använda de “extensions” som bygger upp LINQ-språket, och det är då som det börjar bli intressant, här nedan följer två stycken kod-rader som resulterar samma resultat och samlingar, men med potentiellt helt olika resultat i prestanda för applikationen:

var children1 = _people.Select(GetPersonViewModel).Where(p => p.Age < 18);

var children2 = _people.Where(p => p.Age < 18).Select(GetPersonViewModel);

Den enda skillnaden på raderna ovan är naturligtvis ordningen på filtrering och projicering, vilken anser du vara korrekt och således bör den andra vara felaktig? Jag vill med det starkaste rekommendera det andra alternativet där filtreringen sker först och projiceringen efteråt, helt enkelt eftersom jag vill försöka anropa projiceringen så sällan som möjligt, speciellt om projiceringen är mer avancerad än i det här fallet. I “phoneBeat” hämtas ytterligare information från en lokal databas i vissa fall och då blir det naturligtvis ännu mer aktuellt att vara tydlig i ordningen. Tyvärr var det just det första alternativet som jag hittade i kod-exemplet och som fick mig att skriva det här lilla inlägget.

Att notera: Om du väljer att använda LINQ-uttrycket ovan så har åtminstone inte jag lyckats att få till ett “negativt” beteende eftersom det där just används ett “From-Where-Select”

Postades 23. maj 2011 10:43 av Johan Lindfors
Taggar:

Snart dags för ett nytt utseende

Har som sidoprojekt de senaste dagarna tittat betydligt mer än tidigare på Orchard och är mycket positivt lagd till den “nya” bloggmotorn som Microsoft har annonserat och även lanserat med hjälp av Web Platform Installer. För att verkligen försöka komma igång så har jag valt att påbörja en migrering från BlogEngine.NET som programmeramera.se idag körs på till Orchard inom kort.

image

Under tiden så kan jag förhoppningsvis sukta med en liten skärmdump över hur det kan komma att se ut. Jag har fortfarande inte riktigt fått grepp på hur jag ska hantera svenska och engelska i mina inlägg, men det får jag nog fundera ytterligare på framöver.

Postades 2. maj 2011 22:11 av Johan Lindfors
Taggar:

List of news in PhoneBeat

It’s almost embarrassing but I just came up with this very simple solution to a problem I’ve come across in several applications that I’ve designed and developed. In the PhoneBeat client I’m currently building I want to visualize news in a manner similar to the “recent” list in the people hub. Here is a screenshot of the proposed panoramic main page.

ScreenShot_50

As you probably can see the “what’s new” items is not a simple list but a somewhat more advanced view with animated content and dynamic in it’s construction based on what type of information exists for the current news item.

I’ve investigated using specially templated buttons, wrap-panels and usually came down to the major pain that when not using a control that had a “SelectedChange” event the interaction got broken terribly when panning in the panorama back and forth, accidentally hitting mouse-up or mouse-down events. But then a ListBox caused a bouncy behavior which also was ugly and distracting.

I finally came to the following solution which suits my needs perfectly fine:

Use a ListBox but retemplate it as follows:

   1: <ListBox>
   2:     <ListBox.Template>
   3:         <ControlTemplate>
   4:             <ItemsPresenter/>
   5:         </ControlTemplate>
   6:     </ListBox.Template>
   7:     <ListBox.ItemsPanel>
   8:         <ItemsPanelTemplate>
   9:             <toolkit:WrapPanel/>
  10:         </ItemsPanelTemplate>
  11:     </ListBox.ItemsPanel>
  12: </ListBox>

Notice two things:

1. I remove the ScrollViewer from the original template which removes the bouncy behavior (but also makes it impossible to scroll in the control)

2. I’ve included the Silverlight toolkit for Windows Phone which gives me the excellent WrapPanel which possibly could be replaced with a simple grid but then again, I want to have the dynamic feature of adding additional news item if any exists.

WCF Service in one single file

Having done some SharePoint development with WCF, Silverlight and other technologies recently I had the need to test if some WCF services was reachable on the SharePoint site. I used the following solution to help me isolate any potential issues:

I created a file in the directory in which the other services was deployed called Test.svc and wrote the following lines of code:

   1: <%@ ServiceHost Service="GreetingService"
   2:                 Factory="CustomServiceHostFactory" 
   3:                 Language="C#" %>
   4: using System;
   5: using System.ServiceModel;
   6: using System.ServiceModel.Activation;
   7: using System.ServiceModel.Description;
   8:  
   9: [ServiceContract]
  10: //[AspNetCompatibilityRequirements(
  11: //    RequirementsMode=AspNetCompatibilityRequirementsMode.Required)]
  12: public class GreetingService
  13: {
  14:   [OperationContract]
  15:   public string SayHello(string name)
  16:   {
  17:     return string.Format("Hello {0}", name);
  18:   }
  19: }
  20:  
  21: public class CustomServiceHostFactory : ServiceHostFactory
  22: {
  23:     protected override ServiceHost CreateServiceHost(
  24:         Type serviceType, 
  25:         Uri[] baseAddresses)
  26:     {
  27:         ServiceHost serviceHost = new ServiceHost(
  28:             serviceType, 
  29:             baseAddresses);       
  30:         serviceHost.AddServiceEndpoint(
  31:             typeof(GreetingService), // Contract
  32:             new BasicHttpBinding(),  // Binding 
  33:             "");                     // Address
  34:         ServiceMetadataBehavior behavior = new ServiceMetadataBehavior();
  35:         behavior.HttpGetEnabled = true;
  36:         serviceHost.Description.Behaviors.Add(behavior);
  37:         return serviceHost;
  38:     }
  39: }

In the code above I simply create both the service and a custom service host, which make the service “self-serviced” and hence requires no configuration or other files. It’s currently configured for an IIS-pool running pre-4.0 of .NET Framework and if you want to test in SharePoint also uncomment the AspNetCompatibilityRequirement attribute.

To test the service, it’s very easy to use the WcfTestClient.exe and point it to the url.

Postades 25. april 2011 09:59 av Johan Lindfors

AutoCompletePrompt for Windows Phone 7

In the phoneBeat application I’m currently developing for Windows Phone 7 I have a couple of “special” needs that have emerged, one of them is to being able to display some sort of popup with a picker of activities that should return what the user is selecting. I’ve tried several different paths but finally settled in for customizing the InputPrompt that accompanies the Coding4fun toolkit to leverage an AutoCompleteBox from the Silverlight Toolkit.

I simply downloaded the latest bits of the Coding4fun toolkit (available here) and the Silverlight toolkit (available here) and then inherited my AutoCompletePrompt from the UserPrompt base class. I then copied code and patterns from the other prompts (InputPrompt, PasswordPrompt) and customized the attached solution. I still haven’t come to complete satisfaction with the Themes/Generic.xaml requirment for the actual templating of the control, but I’m still learning this technology.

Here are some screenshots of the attached solution:

image   image   image   image

Download the source code and try it out, there’s still a couple of useful dependency properties that needs to be implemented, but the developed solution was enough for my purpose!

Useful? Let me know!

Postades 9. april 2011 19:03 av Johan Lindfors

Slippa starta emulatorn när den inte behövs

Om du utvecklar en lösning och har ett Windows Phone 7 projekt i din lösning i Visual Studio 2010 så kan du ha märkt att emulatorn kommer att startas oavsett vilket projekt i lösningen som du väljer att starta. Om du vill komma ifrån det beteendet så finns här en lösning som säkerligen kan användas i flera andra fall.

imageDet som jag brukar välja att göra är att skapa en ny konfiguration för kompilering med hjälp av “Configuration Manager”.

Där har jag möjligheten att stänga av “Deploy” för Windows Phone 7 projektet, det är naturligtvis kopieringen till emulatorn som gör att den startas. Så varför inte helt imageenkelt avmarkera “Deploy” för alla konfigurationerna då? Jo, helt enkelt eftersom du då måste gå in och markera detta alternativ igen när du vill starta telefon-projektet. Istället anser jag det enklare och bättre att skapa en ny konfiguration som baseras på “Debug”-konfigurationen och förslagsvis kalla den för “NoPhone”. I den konfigurationen kan du då imagestänga av “Deploy” och sedan är det helt enkelt så att att du väljer vilken konfiguration som ska vara aktiv när du startar exekveringen av projektet.

Den här bloggen använder BlogEngine.NET 1.6.0.0
Temat anpassat av Johan Lindfors