Friday, September 30, 2011

Fredagsdeloy

Att de(p)loya på en fredag är ju livsfarligt. Det vet alla i den här branschen.

För en hård snubbe som DataPata så är detta dock inget hinder, utan han deloyar på ändå.

Soundtrack för denna deloy kan hittas här: Chamillionaire – Ridin' Dirty (feat. Chamillionaire)

Release: Absolut Blank

Tidigare i veckan så smyglanserades Absolut Vodkas nya kampanj "Absolut Blank".

Kampanjen är framtagen av Great Works och Teenage Engineering. Vi på Nansen har stått för backendkodning i EPiServer.

Förutom en webbsajt (http://www.absolut.com/blank/) så består kampanjen även av en iPhoneapp. Appen låter användare använda telefonens kamera för att generera konstverk genom att "mata den" med mönster och färger. Detta konstverk laddas sedan upp till ett galleri på absolut.com/blank.

Ladda ner appen på itunes!

Mer info:

Giovanni, vår egen omslagspojke

TGIF! Här på Nansen så badar vi i medieljuset idag.

Vår egna Gio är i med i papperstidningen och även näteditionen av Computer Sweden.
I skrivande stund så dyker Giovannis nuna upp som första artikel när man surfar in på IDG.se.
Tyvärr så har den nyvunna berömmelsen stigit honom lite åt huvudet och han snurrar i princip runt i omloppsbana runt jorden som en jäkla satellit. Vi funderar som bäst på vilka åtgärder som bäst passar för att plocka ner honom på jorden igen. Alla tips emottages tacksamt

Wednesday, September 28, 2011

Ping & Pong is no more


Katastrof!

Vår favoritrestaurang/matställe byter tydligen namn!
Stället som fram tills precis nyss hette Ping byter skylt och nu står det "Sushi & Dumplings" istället för Ping!

Vadan detta? Ping som är en bakficka till Pong och som därmed bildade den coolaste namncombon i Sverige tappar ju all coolness iochmed detta.
Frågan är om en bojkott är på sin plats...

Dock så har Ping (eller vad de numera heter) en rad attribut som gör dom väldigt attraktiva för oss här på Nansen (och även söderhavet):
1) avståndet: det är typ 23 meter från vår port så man kan gå dit i tofflor.
2) de säljer jävligt sjyssta matlådor till ett oslagbart pris.
Detta gör ju att man troligen även i fortsättningen kommer gå dit och göra sina matinköp. Dvs om de inte även ändrar detta superba koncept. Men då är det faktiskt definitivt bojkott!

Thursday, September 22, 2011

Nansen levererar ett molnbaserat filhanterings- och rapportgeneringssystem för en stor svensk organisation

Systemet som syftar till att effektivisera och underlätta det dagliga arbetet för dess användare lanserades i dagarna och ger användare säker och molnbaserad åtkomst till ett personligt och rättighetsstyrt filsystem.
Via en webbläsare kan användarna ladda upp och hantera multipla filer från varsom i världen, vilket eliminerar eliminerar behovet av VPN-uppkoppling och enhetsmappning.

Webbapplikationen tillåter även att användarna utifrån en enkel eller komplex batchbaserad sökning kan ta fram verksamhetscentrala rapporter i Excel, vilka har stöd för sortering och filtrering samt ett anpassningsbart utseende.

Webbapplikationen som till hög grad är AJAX-driven och interaktiv är utvecklad i .NET 4 och använder kontrollbiblioteket Telerik RadControls for ASP.NET AJAX.

Fixing EPiServer's context menu bug in Google Chrome

As all of you using Google Chrome on an EPiServer website, know that the right click menu isn't opening correctly in your browser. The problem appears when you have scrolled down on a page and try to open the context menu - the menu will open at the top of the page as if you had not scrolled the page.

After having to endure this bug for a long time and knowing it would take a while for EPiServer to release a new version that fixes it - I chose to try and fix it myself, figuring it would only be a small fix.

Later, after a bit of investigation, I landed in the contextmenu.js file located in C:\Program Files (x86)\EPiServer\CMS\6.1.379.0\Application\Util\javascript. The problem lied in the _ScrollPosition method where it is calling win.document.documentElement.scrollLeft. This property always returns zero in Google Chrome. To solve this we can use the win.document.body.scrollLeft property instead which returns the correct value. Using the OR ( || ) operator we can make the browser choose the property that returns a value other than zero.

The final method will look like this after fixing the bug (green is the changed code):

  1. ContextMenu.prototype._ScrollPosition = function(win)
  2. {
  3.     var scrollX = 0;
  4.     var scrollY = 0;
  5.     if (!this._IsCrossSite(win.top) && win.top.document.documentElement.scrollTop != null)
  6.     {
  7.         scrollX = win.document.documentElement.scrollLeft || win.document.body.scrollLeft;
  8.         scrollY = win.document.documentElement.scrollTop || win.document.body.scrollTop;
  9.     }
  10.     else if (win.pageYOffset != null)
  11.     {
  12.         scrollX = win.pageXOffset;
  13.         scrollY = win.pageYOffset;
  14.     }  
  15.     
  16.     return [scrollX, scrollY];
  17. }

Modifiying EPiServer's files might break the support and is at your own risk. I have however not found any problems with it so far.

If you want to include this for all editors of your site you can add the following code in your MasterPage which will replace the EPiServer-method with the bug-fixed one:

protected override void OnLoad(EventArgs e)
{
    base.OnLoad(e);

    if (Request.IsAuthenticated && CurrentPage.QueryDistinctAccess(AccessLevel.Publish))
        EPiServer.ClientScript.ScriptManager.Current.AddEventListener("window", "load", "function(){ContextMenu.prototype._ScrollPosition=function(win){var scrollX=0;var scrollY=0;if(!this._IsCrossSite(win.top)&&win.top.document.documentElement.scrollTop!=null){scrollX=win.document.documentElement.scrollLeft||win.document.body.scrollLeft;scrollY=win.document.documentElement.scrollTop||win.document.body.scrollTop}else if(win.pageYOffset!=null){scrollX=win.pageXOffset;scrollY=win.pageYOffset}return[scrollX,scrollY]}}");
}

Let me know if you find any problems with it!

Wednesday, September 21, 2011

Innebandyn igång igen

Äntligen är innebandysäsongen igång!

Det innebär att vårt korplag (som vi kör tillsammans med Attollo och Söderhavet) nu har klarat av säsongens premiärmatch. Vi vann enkelt vår första match med 12-6 (tror jag det blev).
Noterbart var att motståndarna tyvärr inte hade några avbytare.
Och när det återstod ca 8 minuter kvar så gick klubban av för en av dem, men jag lånade snällt ut en klubba så att de kunde fortsätta spela. Självklart ställer man upp, jag kommer ju alltid kittad med ca 3 klubbar i klubbväskan.

Varje omgång spelar man 2 matcher, men den här kvällen så hade dock motståndarna i den andra matchen valt att lämna walk over, vilket innebar en femnoll-vinst för oss.
Även om detta innebar enkla poäng för oss så var det ändå lite trist att inte få spela matchen. Vi hade ju laddat sen i maj för detta!

Anonymous identification in webfarm scenarios

One of our customers has anonymous identification enabled for their website and stores some vital information in the resulting cookie. As we tested our latest deploy, which included separating the website over several different servers and subdomains, we noticed that the cookie information was not retained as you navigated between the subdomains.

The cookie was set at subdomain 1 and kept as long as you stayed on that subdomain, but the moment you switched over to another subdomain the cookie was overwritten.

The explanation turned out to be extremely simple. As we had a couple of new machines installed their machine-key configurations differed slightly. You need to make sure that each server share the same value for validationKey and decryptionKey as these values are used to encrypt and decrypt the cookie. You can read more on the topic here

Routing does not work on a fresh IIS 7 installation

In a project I am working on we make use of the Routing feature in ASP.NET to get friendly URL for a page. This has been working great on the dev machine in IIS 7 but when deploying it to a new Windows Server machine with IIS 7 the routing part did not work at all, so something was different between the two environments.

The solution was as simple as installing the HTTP Redirection module in IIS.

  1. Open the Server Manager.
  2. Choose Web Server (IIS) and scroll down to Role Services.
  3. Click Add Role Services and click the checkbox next to HTTP Redirection.
  4. Click Next and Install, and you are done!

Historien om en felstavning

Vi har slutat prata om produktionssättning, leverans och - gud förbjude - deploy. Allt sedan dagen då vår kund gjorde oss uppmärksamma på ett stavfel i ett mejl, "deploy" blev nämligen "deloy", genom att snabbt replikera med en google-bildsök på ordet "deloy", som var en stickad mössa - så har alla leveranser kallats deloyer. Denna s.k. deloy-hatt har sedan förföljt oss till den grad att Jonas valde att sy upp en riktig deloy-hatt. Tack Jonas och Linus för alla dina upptåg. We likes you!

/Team Burton

Tuesday, September 20, 2011

Customize EPi Commerce Order listing

In a current project using EPi Commerce we ran into an issue in Commerce Admin. It was very hard to get a good overview of placed orders. This due to the ID column in commerce manager displaying OrderGroupId instead of the generated TrackingNumber communicated to the customers.

This is updated with EPi Commerce R2 / EFC 5.2 but we haven't had the possibility to upgrade yet.

View in EPi Commerce / EFC 5.1

5_1

View in EPi Commerce R2 / EFC 5.2

5_2

If a customer contacts the merchant with a query about a specific order, the Order listing in the first release of EPi Commerce / EFC 5.1 don’t display the Order no. given to the customer.

And the search don’t allow search on the property called “TrackingNumber” either. We needed to solve this issue quickly, waiting for all that comes with upgrading to a new version wasn’t an option.

Commerce manager keeps it’s controls and configurations related to the manager UI in a folder located by default in:

C:\Program Files (x86)\Mediachase\eCommerceFramework\5.1\[YourSiteName]

Configuration for the Order lists are kept in the following file.

C:\Program Files (x86)\Mediachase\eCommerceFramework\5.1\[YourSiteName]\Shared\Apps\Order\Order.config

In this file you can add columns you wish to list, as long as they are on the PurchaseOrder Object.

The view tag in the config file contains the columns listed in the view

   89:  <View id="Orders-List" … > 

To add a new column just insert. The line below adds a new column displaying Order Creation date. (Property “Created”)

<Column Width="200" AllowSorting="true" DataField="Created" HeadingText="Order Created"></Column>

The Order Id is displayed using a link template control which is located in

C:\Program Files (x86)\Mediachase\eCommerceFramework\5.1\AvalancheCMS\Shared\Apps\Order\GridTemplates\OrderLinkTemplate.ascx

To stop using the internal object Id of the order and instead display the generated order number for the purchase order we just need to update the following in the OrderLinkTemplate.ascx:

From:

   6:      Text='<%# EcfListView.GetDataCellValue(DataBinder.Eval(DataBinder.GetDataItem(Container),"OrderGroupId")) %>'>

To:

   6:  Text='<%# GetViewName().Equals("PurchaseOrder") ? EcfListView.GetDataCellValue(DataBinder.Eval(DataBinder.GetDataItem(Container),"TrackingNumber")) : EcfListView.GetDataCellValue(DataBinder.Eval(DataBinder.GetDataItem(Container),"OrderGroupId")) %>'>

Adding the Creation date and modifying the LinkTemplate to show TrackingNumber instead of OrderGroupId will make the listing look like this:

5_1_mod



So if you are not running your site on EPi Commerce R2 yet this might ease the process of identifying orders in Commerce Manager until you upgrade.




Finding the right web process to debug

I've always found it a bit annoying when I am using "Attach to process" to debug my code and see something like this:


Which w3wp.exe should I attach to? Ah, why not attach to all of them, even though you know it's not necessary.

Recently a wise man showed me a trick to find out which web process I should attach to just by adding a command as an external tool.

In Visual Studio, just go to Tools -> External Tools and then press "Add".



















For the 'Title' you can choose what ever you want to call your External Tool, I chose to call it "Find web process".
For the 'Command', just paste this: %windir%\system32\inetsrv\appcmd.exe and for the 'Arguments' you should use "list wp". Make sure you check "Use output window" and then just click "OK".

Now you can use your newly created command from the menu bar under "Tools" and the result will be shown in the output window. To make it even easier you can add a keyboard shortcut to it too, more about that here.

The appcmd application is part of IIS7. It's a fully featured command line interface to IIS so everything (probably) you can do through the IIS Manager UI you can do through appcmd. You can find more information about appcmd here.

Monday, September 19, 2011

Nansen goes Hammarby Hill XC

I lördags var det dags för Nansen Team XC att göra tävlingspremiär på Hammarby Hill XC. Förväntningarna var på topp och psykkriget var intensivt sista veckan. Dom två cyklisterna såg påtagligt nervösa ut innan start, trots att det var "flickklassen", alltså ett varv av tre som huvudklassen kör, som skulle köras.

Starten går upp för Hammarbybacken och som den hängivne supporter jag är så hade jag tagit mig upp till toppen för att hejja på våra tävlande. Först upp av dom kom Viktor som såg stark ut och cyklade hela vägen upp.

Nån minut senare såg jag Andreas komma en bit ner i backen, gående!

I efterhand så har det bortförklarats med materialfel...

Både Viktor och Andreas hade sagt att dom hade 1:15 som mål för dom 20km och efter 1:10 så tog jag plats vid upploppet och började vänta. efter drygt 1:17 så dyker Viktor upp och går i mål som segrare i Nansenteamet.


Sen började en alltför lång väntan på Andreas. Vi hann spekulera i både trasig cykel och dödskrasher innan han till slut dök upp på tiden 1:31:48.


Andreas höll en lång utläggning om både växelproblem, krashade och medvetlösa tjejer och egna kramper som förklaring till sitt mindre lyckade resultat.


Här ser vi Viktor som nöjd vinnare och Andreas som besviken förlorare.

Efterspelet...
På kvällen när det skulle kollas resultat så upptäcks det att Viktor inte har fullföljt sitt lopp och står som "Brutit". Just nu är det oklart om han får det resultat han själv hävdar att han ska ha, nämligen en 41a plats på 1:17:nånting eller om han förblir som brutit i resultatlistan. Andras slutade på en 67e plats på 1:31:48 av totalt 74 fullföljande. Vinnaren körde på 54 minuter.

Friday, September 16, 2011

Diligentias nya projektwebbar lanserade

Idag lanseras Diligentias nya projektwebbar, i första skedet för Sveavägen 44 och Masthusen. Nansen har byggt en plattform baserad på EPiServer CMS 6R2 Enterprise som låter Diligentia snabbt och enkelt skapa upp webbar när nya projekt drar igång.

Beställare: Jonathan Brun, Diligentia
Projektledning: Charlotta Lorentz
Design: Silver


Thursday, September 15, 2011

Resolving The AJAX Related "Sys is not defined" error

We have a customer website which recently started to get ASP.NET AJAX related JavaScript errors. Looking at Firebug, it reported things like:

  • "ASP.NET Ajax client-side framework failed to load."
  • "Sys is not defined"


After some fiddling around with Web.Config handlers and initialization of the ScriptManager, and with no luck, we turned the focus to IIS. After all, these kind of errors might have to do with version problems we thought. And we were right!

A simple switch from .NET Framework v2.0 to v4.0 for the App pool solved it.

Lesson learned: make sure you use the correct .NET version for your website.

Implement a SettingsPageType in EPiServer

There are loads of different opinions about this matter. Even here at Nansen we haven't reached consensus. This is strictly my personal opinion.

Here's why I think you should use a separate page type for global site settings.

  • Do not bloat the start page with non start page related properties.
  • DO NOT BLOAT THE START PAGE WITH NON START PAGE RELATED PROPERTIES.

The only downside is I have to contradict myself to implement this. You still need to add one property to your start page. A page reference property for pointing out the settings page, so you can easily reach it from code.

For easy code access to your settings I suggest that you add this code snippet in your page template base class, page type base class or your master page base class:

private SettingsPageType _settings;
public SettingsPageType Settings
{
    get
    {
        if (_settings == null)
        {
            var startPage = DataFactory.Instance.GetPage(PageReference.StartPage) as StartPageType;
            if (startPage == null || startPage.SettingsPage == null)
            {
                throw new ApplicationException(
                    "Settings page not configured. The website will not work until it has been configured.");
            }
            _settings = startPage.SettingsPage;
        }
        return _settings;
    }
}

A small downside is that there will be an extra request to the EPiServer page cache. But I'm convinced it will not affect the performance of your website.

A typical example of using site settings is that the editor wants the website logo to be replaceable. So in my SettingsPageType I add a property for this purpose:
[PageTypeProperty(Type = typeof(PropertyImageUrl),
    EditCaption = "Website logo",
    HelpText = "The website logo, visible on all pages on the website.",
    UniqueValuePerLanguage = false,
    SortOrder = 10)]
public virtual string SiteLogo { get; set; }

Then in your master page you set the image source to <%= Settings.SiteLogo %> or manage it in code behind.

From an editors point of view it's confusing to see global site settings mixed with the content of the start page. There's a risk that they'll be confused and that they might change something unintentionally.

The coolest and most convincing argument is that you can add this neat page type icon to your SettingsPageType:


Wednesday, September 14, 2011

Nansen and Familjebostäder - Facebook Specialists!

Nansen front end developer Mr.Lybeck could hereby titulate himself Facebook Specialist (please login to LinkedIN for the full seach results).



His Facebook Pages assignment with our client Familjebostäder has led to a new Facebook Page for Familjebostäder Lindhagsskrapan.

Lindhagsskrapan is Swedens highest, recently produced rental housing. A opening ceremony is held on September 24:th. There will also be a "staircase race". Take a look and become a fan!
 
Disclaimer: No one at Nansen would never, never ever titulate themself something like social media expert.

Tuesday, September 13, 2011

Summering från Windows 8 keynote på BUILD-konferens

Microsoft har precis avslutat sin keynote på BUILD konferensen och jag och några kollegor på Nansen har följt den med chips och läsk. Efteråt höll vi alla med om att Windows 8 kommer bli ett grymt operativsystem och vi väntar med iver att få prova den.


Det första man möts av i det nya operativsystemet är en oerhört snabb uppstart. Microsoft har döpt det till Fast Boot och det är en kombination av hibernate och en vanlig boot, vilket ger starttider på mellan 5 till 10 sekunder, beroende på datorn.

När väl systemet är igång syns det nya Metro-gränssnittet, som ser riktigt bra ut och är anpassat för touchskärm. Kul att Microsoft äntligen förstår att utseende är viktigt. Metro-gränssnittet består av en mängd rutor, där varje ruta är ett program. Dessa program kan man utveckla i en mängd olika språk, allt från HTML5 och JavaScript till C# och C++. Mångfalden av utvecklingsspråk för plattformen är i sig inte unikt. Det smarta är att alla språken har tillgång och går mot samma API i botten vilket ger utvecklarna möjlighet att skapa kraftfulla program även i HTML, som vanligtvis har ett avskalat light-API.

En rolig ny funktion är den nya låsskärmen där man skapar ett mönster av klick på en bakgrundsbild för att låsa upp datorn. Till exempel om din bakgrundsbild föreställer en bil kan mönstret vara att klicka på båda helljusen och backspegeln för att låsa upp datorn. Smidigt för en tablet men kanske inte det bästa för en dator med tangentbord. Det går fortfarande att använda lösenord om man vill det.

För er som är oroliga att ni måste köpa en ny dator med touchskärm för att använda hela operativsystemet kan vara lugna - det gamla gränssnittet i Windows kommer fortfarande att vara kvar och kan öppnas genom att trycka på Windows-tangenten. Metro-gränssnittet går även utmärkt att användas med mus.

Flera intressanta funktioner visades under presentationen. Några av dessa var följande:

  • Ny Task Manager som är fullproppad med nyttig information på ett visuellt sätt.
  • Nytt sätt att tömma datorn på inställningar kallat "Refresh your PC". Smidigt om du ska låta en kompis låna datorn en längre tid eller bara vill få en fräsch dator.
  • Efter en nystart av datorn kan du skapa en återställningspunkt som du kan gå tillbaka till när din dator börja kännas seg.
  • Taskbaren sträcker sig nu över flera skärmar och visar bara de aktiva programen för respektive skärm.
  • Metro-gränssnittet kommer gå att navigera även med tangentbord för de som gillar sånt.
  • Datorinställningar, personaliseringar, teman, webbläsarinställningar (IE) kommer att synkas mot det stora molnet i Windows Live Sync, vilket betyder att du kommer komma igång ännu snabbare vid ny dator.
  • Microsofts program kommer vara anpassade för det nya gränssnittet Metro, som  t.ex. Outlook.

En bit kvar tills Windows 8 är lanserat.

Frågan är om det nya Metro-gränssnittet kommer gå samma öde som Windows Media Center. Antagligen kommer det klara sig bättre då det är väldigt användbart för de nya tablets som kommer - och det är dessutom väldigt snyggt.

Mot slutet av keynoten berättade talaren att alla 5000 besökare kommer få en tablet med docka och Windows 8 installerat. I den sekunden kändes det väldigt surt att vi inte var där. Humöret gick raskt upp igen när han berättade att kl. 03:00 GMT i natt kommer alla få möjlighet att ladda ner Windows 8 och testa själva.

Specifikation för tablet som alla konferensdeltagare fick. Avund.

Ladda ner Windows 8 på http://dev.windows.com (efter kl 03:00 GMT. 14 september).

Lunchschack

På kontoret har vi PS3, Nintendo Wii, Sega megadrive, Xbox och ett foosballspel. Men det räcker tydligen inte, för nu är det tydligen schack som gäller. Här ser vi de tre glada grabbarna Christer, David och Robban som vässar bulorna för att kunna göra det smartaste draget.



Friday, September 9, 2011

Google Music Beta now on iOS

First Blogger, now Google Music Beta... Google is attempting to push more and more of their services to the iPhone/iPad [dominant?] user base.


Digital Trends explains that "Google's Music service is now accessible on iOS devices through the safari browser, and not through an official iOS app."

Blogger Finally Releases an iPhone App

Interesting news about Blogger on Mashable today!

"Google has finally launched an iOS app for Blogger, giving the blog network’s millions of users a simple way to write, manage and publish posts from their iPhones."

http://mashable.com/2011/09/08/blogger-iphone-app/

I for one is really looking forward to see the overhaul on Blogger, it's way due...

Happy Friday everyone!

Wednesday, September 7, 2011

Ordning på torpet...

...husse är tillbaka. Nu har hösten sannerligen startat och med den wordfeud-kampen, och alla projekt såklart.


Team Burton har delat upp världen mellan sig och på tapeten står GoKart, matlag, bastuflotte, bärtz, och sjukt massa jobb och lanseringar såklart.

Därav behovet av en Wall of Fame:
Team Burton Collector's Editition (inkluderar även "absent friends")

Så, andra Team på Nansen och alla andra, Hösten 2011, bring it on!!!

Pulse - an Android alternative to Flipboard

I like my Android phone, I'm not actually in love with it, but I like it very much.

I dont hate iPhone (or iOS) but i think its a really strange and mostly stupid platform disguised in pretty clothing.

But there are times when I look in awe on the iOS devices, and the reason is always some cool iOS specific app that catught my attention. One of those apps that once made me consider buying an iPad (actually I had my trigger finger on the "buy" button, but never clicked) is Flipboard. Flipboard is a truly wonderful app that aggregates content from a number of sources like Twitter, Wired or anything else of your choice and displays the content in a really really slick way with images and text arranged like you were reading some fancy fashion magazine.

For real, I'm still thinking about buying an iPad only because of Flipboard, but meanwhile I have been looking for an alternative to my Android phone.
And look no more! Now I have found an alternative - Pulse.
Although far from being as good looking as Flipboard, it seems to do its job fine and I have (for the time being) eased my urge for buying in iPad..

You can download Pulse from Android market here: https://market.android.com/details?id=com.alphonso.pulse or scan this barcode below:

Tuesday, September 6, 2011

Meta field limit in EPiServer Commerce

In a EPiServer Commerce project i'm working on we have catalog entries with a good amount of custom meta fields. When we did a new release to stage last week and added one more meta field we got the following error back from .NET on one entry,


Must declare the scalar variable "@ShortDe".
Transaction count after EXECUTE indicates that a COMMIT or ROLLBACK TRANSACTION statement is missing. Previous count = 1, current count = 0.
The ROLLBACK TRANSACTION request has no corresponding BEGIN TRANSACTION

and this error message on another entry,

Must declare the scalar variable "@".
Transaction count after EXECUTE indicates that a COMMIT or ROLLBACK TRANSACTION statement is missing. Previous count = 1, current count = 0.
The ROLLBACK TRANSACTION request has no corresponding BEGIN TRANSACTION

We had apperantly reched an internal limit in EPiServer Commerce on the number of meta fields you could add to an meta class, or rather the total length of the names of all meta fields added to an meta class. After some reflection of the code and searching in the database we found the stored procedure that was responsible for the error, "mdpsp_sys_CreateMetaClassProcedure", in there we found a long list of variables declared to be "NVARCHAR(4000)", this were responsible for truncating our field list. The fix we did was to change this from NVARCHAR(4000) to VARCHAR(MAX) (e.g. VARCHAR(8000)). This will give us some more room to add new meta fields.

...
DECLARE @OPEN_SYMMETRIC_KEY varchar(MAX)
DECLARE @CLOSE_SYMMETRIC_KEY varchar(MAX)

SET @OPEN_SYMMETRIC_KEY = ''
SET @CLOSE_SYMMETRIC_KEY = ''

DECLARE @MetaClassFieldList varchar(MAX)
DECLARE @MetaClassFieldList_E varchar(MAX)
DECLARE @MetaClassFieldListWithAt varchar(MAX)
DECLARE @MetaClassFieldListSet varchar(MAX)
DECLARE @MetaClassFieldListInsert varchar(MAX)

DECLARE @MetaClassFieldList_L varchar(MAX)
DECLARE @MetaClassFieldListSet_L1 varchar(MAX)
DECLARE @MetaClassFieldListSet_L2 varchar(MAX)
DECLARE @MetaClassFieldList_LI varchar(MAX)
DECLARE @MetaClassFieldListInsert_L1 varchar(MAX)
DECLARE @MetaClassFieldListInsert_L2 varchar(MAX)
...

This bug is present in all current versions of EPiServer Commerce up to 1.1 R2 SP1.

A Clear Example of The Dont Repeat Yourself Principle

The DRY principle is something all developers most often than not want to achieve. Don't Repeat Yourself. Meaning you shouldn't repeat code.

In a recent project, we created a simple, custom XML feed returning a couple of nodes with image meta data.

To build custom XML feeds, XmlDocument is very common to use in the .NET world. Adding nodes can be done using XmlNode.

The code we had looked like this:

// ...
XmlNode imgNode = doc.CreateElement("LatestImage");

XmlNode imgCountry = doc.CreateElement("Country");
imgCountry.InnerText = LocationHandler.GetLocationAlias(img.GeoTag.Country.LocationID, "sv").Country;

XmlNode imgLocation = doc.CreateElement("Location");
imgLocation.InnerText = LocationHandler.GetLocationAlias(img.GeoTag.LocationID, "sv").Name;

XmlNode imgDate = doc.CreateElement("Date");
imgDate.InnerText = img.UploadDate.ToString();

// ....

imgNode.AppendChild(imgCountry);
imgNode.AppendChild(imgLocation);
imgNode.AppendChild(imgDate);

// ...

It does the job, but not good enough. A lot of XmlNodes created manually. By adding a simple method and utilizing it instead, it will be much easier.

The clever method:

private XmlNode AddNode(string nodeName, string nodeValue, XmlDocument doc, XmlNode parentNode)
{
XmlNode node = doc.CreateElement(nodeName);
node.InnerText = nodeValue;

parentNode.AppendChild(node);

return node;
}

And this is how we use the AddNode method to add new nodes:

AddNode("Location", LocationHandler.GetLocationAlias(img.GeoTag.LocationID, "sv").Name, doc, imgNode);

Much, much better. Utilizing the AddNode method, we reduced the actual code with almost 50 % (from 21 rows to 11).

A clear example of implementing the DRY principle.

Note: It's also clever to use XDocument instead of XmlDocument to create XML files, but that's for another time!

EPiServer Commerce på svenska

Igår satt jag och installerade EPiServer Commerce för ett nytt projekt. Projektet kommer vara en svensk site och alltså, på svenska. Som default så finns inte svenska som val när man skapar en katalog i Commerce så man får skapa det själv. Detta görs under Systeminställningar -> Ordlistor -> Språk. När man lägger till ett språk i Commerce så måste man ange språkkoden som sv-SE, att bara vilja använda sv tillåts inte.

Detta skapar dock en del problem. I EPiServer så är det just sv som är språkkoden för svenska. Detta resulterar i att, förutsatt att du har installerat CatalogPageProvider, sidträdet kraschar.
Lösningen på problemet är att skapa ett nytt språk i EPiServer som är sv-SE och använda det. Då laddar sidträdet som det ska.

Friday, September 2, 2011

The new Nansen logo vectorized in CSS3

In January this year (2011), W3C announced its new logo for the HTML5 standard (the superman logo) which created a lot of buzz among web developers in the community. Being a logo for HTML5, a lot of people joked that it should have been created in the same technique it stands for, HTML. It didn't take long before someone helped W3C do the job right.

I'm not sure who did it first, but one of them was Darcy Clarke, and it's pretty amazingly alike the real logo. Go have a look at his CSS/HTML version of the HTML5 logo.

As you probably have noticed, we have released our shiny new website a while ago, and with it came a new logo (*hint*). This got me remembering the HTML5 logo, and I felt it was my duty to try and do the same with the Nansen logo.

Luckily it's quite simple and really only consists of a circle and three rectangles. The most difficult part was to align the different elements correctly to form the N-letter. Have a look at the result below.

Think you can improve on the code? Go ahead and do it, and when your done, come join us at Nansen [swedish].


Open in new window