Glöm inte att sätta oanvända klasser till Obsolete

Något som jag måste bli bättre på är att markera oanvända kodstycken som Obsolete. Det innebär alltså att klassen helst inte ska användas längre och har tagit ett steg vidare mot avveckling. Man kan skriva ett meddelande också som kommer upp i kompilern som påminnelse för att man ska ta bort dem.

Exempel från MSDN.

 

[Obsolete("This class is obsolete; use class B instead")]
class A{
public void F() {}
}
By Jesper Lind

Code Odyssey - Nästa kapitel

Ja då kör vi igång igen och nu på ny bloggmotor och ny fin design. Borde skriva ett långt och bra inlägg om bloggens utveckling hittills och allt det där, men orkar inte nu. Det har vart en lång natt med att brottas med de sista detaljerna inför lanseringen.

Vill passa på att tacka alla som vart inblandade i utveckligen av bloggmotorn. Erik, Johan (Har gjort designen ni ser nu), Glenn, Carl och Andreas. Kul att man har några galningar med sig som fortfarande känner för att bygga sin egen bloggmotor i dessa dagar då Wordpress regerar. Om ni är intresserade att använda bloggmotorn så ber vi er att kontakta oss genom Nodestar, där vi tar emot beställningar. Våren börjar bli fullbokad med för oss men vi kanske vi kan klämma in något projekt till om du är riktigt sugen.

För bloggen Code Odyssey så kommer vi fortsätta i samma spår och skriva om allt möjligt som är relaterat till webbutveckling, användarvänlighet, design, css, asp.net, c#, skriptbibliotek som jQuery med mera.

Det kommer nog även bli en hel del ASP.NET MVC också eftersom vi har jobbat med den plattformen under cirka sex månader och börjar få grepp på den. Den nya bloggmotorn är byggd på detta ramverk och det har varit en fröjd. Äntligen har vi användarvänliga url:er, snygg html-kod utan massa viewstate-bös och konstiga server-id. Bara ren html-kärlek.

Bloggen tänker vi förbättra successivt och lägga på nya funktioner. Bland annat göra om etiketterna till ett moln, lägga till Open-ID för kommentarerna, formattera kodexempel med färger för syntax och andra finesser. Givetvis kommer vi blogga om det under tiden så ni också kan få hjälp med hur man gör.

Så nu får det räcka på detta inlägget. Måste bara se hur RSS:en blir när jag postar. Den finns förresten på en ny adress, så prenumenera gärna på den. Den gamla ska fortfarande fungera.

Kommentera gärna så vi ser hur det fungerar och kom med input om vad ni tycker om förändringarna.

By Jesper Lind

Bloggdvala råder men snart vaknar vi igen

http://www.codeodyssey.se/upload/resource/blog/sleeping-statue.jpg

Här på Code Odyssey har det inte hänt så mycket den senaste tiden p g a av några olika skäl. Framförall så har min egenutvecklade bloggmotor blivit något föråldrad och det är därför inte så kul att blogga här som det borde vara. Helt galet att den fortfarande körs på en Access-databas för att nämna en teknisk detalj.

Men nu är det dags att göra något åt detta och jag kommer under början av år 2009 försöka att importera all data till ett nyare system som vi har jobbat med. Vi kör en första version av detta på Nodestar om någon vill ha en förhandsgranskning. 

Vi kommer även att använda det nya ramverket ASP.NET MVC som enligt Scott Guthrie kommer att släppas som release candidate i januari. Fördelarna är många och jag gillar verkligen att man får total kontroll över hur html rendereras. En bra routingmodell finnns inbyggd och äntligen kommer det bli användarvänliga url:er. Något jag viljat ha länge

Vi har även fått en sponsringspartner som kommer stå för driften av bloggen, så det är riktigt roligt. Mer info om detta längre fram.

Nu ska jag läsa artikeln How to Restart a Dead or Dormant Blog för att få lite inspiration till om hur man kickar igång en blogg i dvala.

Så länge kan jag tipsa om ett besök på Martin Söderlunds blogg där det skrivs mycket flitigare.

Gott nytt år!

Bliden ovan på den sovanade statyn är lånad av användaren Trapac på Flickr. 

By Jesper Lind

Felsök: Sys.ArgumentNullException: Value cannot be null

Något av det värsta som finns är att debugga Ajax-funktioner. AJAX Control Toolkit kan slänga ur sig en del väldigt konstiga felmeddelanden och de är inte lätta att lösa. Tänkte nu börjar dokumentera dem innan jag blir allt för galen.

Nyss fick jag detta i IE7:

Error: Sys.ArgumentNullException: Value cannot be null. Parameter name: element

På Firefox visas ett ändå mer förbryllande meddelande:

Sys.ArgumentNullException: Value cannot be null. Parameter name: element Sys$CultureInfo$_getAbbrMonthIndex("")ScriptRe...=15a6fa0c (line 6391) ScriptResource.axd?d=Mp3wOTv2U48tSwOzRbx9I5sb41bR8P9ogeRdPKRzZ5RBTNpXVRJNcEL9psPGosr4vyEbYVFfS05BUAtE2hlW2Q2&t=3004b210()()ScriptRe...=3004b210 (line 499) [Break on this error] this._upperAbbrMonths = this...s.dateTimeFormat.AbbreviatedMonthNames);

Googlade och började förstå att det hade med ModalPopupExtender att göra.

Min såg ut så här:

<ajaxToolkit:ModalPopupExtender ID="uxAddToProductModalPopupExtender" runat="server" TargetControlID="modaldummy" PopupControlID="uxAddToProductPanel" BackgroundCssClass="modalBackground" CancelControlID="uxCancelAddToProduct">
</ajaxToolkit:ModalPopupExtender>

Lite längre ner på sidan ligger knappen som visade sig vara boven i dramat.

<asp:Button runat="server" ID="uxCancelAddToProduct" Text="Stäng" Visible="false" />

Den var gömd med Visible="false" och skapade alltså null-exception i extendern. Sätter jag Visible till true få försvinner felet.

By Jesper Lind

Filtrera DataSet

Ja även fast det är spännande att jobba med nya databas-tekniker som LinqToSQL och Subsonic, så kan det vara bra att kunna lite hederliga DataSet-operationer.

Just nu så hade jag ett problem med Subsonics Paging-funktioner, där en Where-sats inte kom med. Jag fick dubbla poster hur jag än gjorde. Då kom jag på att jag kunde filtrera DataSet:et i efterhand och skrev följande lilla funktion.

private static DataSet FilterDataSet(DataSet ds,string filter)
{
    DataSet clone = ds.Clone();

    DataRow[] foundRows = ds.Tables[0].Select(filter);

    for (int i = 0; i < foundRows.Length; i++)
    {
        DataRow row = foundRows[i];
        clone.Tables[0].ImportRow(row);
    }

    return clone;
}

Anropar den sedan på följande vis. I detta fallet ville jag ha ut texter på en visst språk, och inte alla språk i databas-tabellen som Subsonic envisade sig med att returnera.

return FilterDataSet(q.ExecuteDataSet(),"Culture='sv-SE'");

Är du sugen på liknade exempel, så kan jag rekommendera tidigare inlägg där vi skrivit om hur man sorterar ett DataTable eller hur man skapar nya kolumner i DataSet och sparar det i Cacheminne.

By Jesper Lind

Parametervärden i resursfiler

Tänkte visa ett exempel på hur man kan byta ut parametrar i resursfiler. I mitt exempel hämtar jag ut en text för copyright-meddelande och byter ut en parameter {0} med string.format mot aktuellt år.

I resursfilern har jag en nyckel som heter Copyright och lägger in följande sträng.

Copyright © 2004-{0}, Code Odyssey, all rights reserved.

Sen på aspx-sidan lägger jag in strängen på följade vis.

<%=String.Format((String)GetLocalResourceObject("Copyright"), DateTime.Today.Year )%>

Och så slipper man gå in och ändra vid varje nyår.

Sen angående Copyright så funderar jag på att ändral licens på denna sajten. Kanske Copyleft eller nån Creative Common-variant.

By Jesper Lind

Nybörjare på Terminal i OS X

 Är själv nybörjare på UNIX-kommandona i Terminalpå OS X. Kommer här skriva ner kommandon allt efter som jag lär mig dem.

Visar gömda filer i Finder

defaults write com.apple.finder AppleShowAllFiles True
Killall Finder

För att återställa det så kör man samma kommando fast med "False".

Flusha DNS

dscacheutil -flushcache
By Jesper Lind

Spara filer som Unicode UFT-8 i Visual Studio

http://www.codeodyssey.se/upload/resource/blog/vs-utf-8.jpg

Som jag har letat efter inställningen för var man väljer vilken kodning ens filer ska sparas med i Visual Studio. Började tvivla på att det var möjligt att välja över huvud taget, men idag hittade jag äntligen instruktioner för hur man gör:

Välj "Spara fil som", och klicka sen på den lilla fliken som ni ser markerad på bilden här ovan.

By Jesper Lind

Reseed identity på SQL Server

Lärde mig just hur man gör så att nyckleln på en tabell i en SQL Server databas börjar på ett visst nummer. Bra om man gjort massa tester och vill återställa dem innan man börjar lägga in riktiga data.

-- Reseed identity on [dbo].[Products]
DBCC CHECKIDENT('[dbo].[Products]', RESEED, 0)
GO

Ännu bättre är ju ifall man inte lägger in data alls, utan istället använder transaktioner för att rulla tillbaks testdata. Läs mer hos Johan Lindfors, teknisk chef på Microsoft, om detta.

By Jesper Lind