Ivan Porto Carrero

IO(thoughts) flatMap (_.propagandize)

14

Sep
2006

In All Fairness to Flight Center

Flight center has posted a comment on the post that dealt with flight center.

It’s quite lengthy so I’ll just reblog it in a proper post.

 

Hi Ivan,
Here’s our response to Craig, let me know if you have any more questions:
Hi Craig,
Your matter has now been discussed at length within our organisation, and while I can’t offer you the answer you want, I can certainly explain exactly how we have reached our conclusions, and offer further explanations to some of the questions you have posed. I have also posted this on your blog, and the other blogs that have been looking at this issue.
It’s very easy in blogs to portray a company as obstinate and heartless, but we have a very good track record of doing our utmost to solve any problem encountered by our clients – as you will appreciate, in the extremely competitive environment that is international travel, every client you have is one you try your best to keep.
But in this case we have assessed all of the evidence presented, including me personally contacting some of the people you have listed in your email, and have still come to the same conclusion – our agent would never have offered you indefinite validity on an overseas ticket.
The main reason for this are:
1. Tickets never have indefinite validity. This is one of the fundamental rules of air travel, and something our agents are trained in and reminded of on an ongoing basis. It would be just too high a liability for airlines to issue tickets such as this. In fact I can think of no tickets for services that have indefinite validity. Imagine cashing in an airfare bought in the early 1990’s for current air travel.
2. You had a complicated itinerary (hence the cost):
Outbound: Christchurch-Auckland-LA-Munich-Bratislava
Return: Bratislava-Munich-LA-Seattle-LA-Auckland-Christchurch
This is a very extensive return journey to book for an indefinite stay, something that would have been impossible to organise for indefinite travel, as you would have had to secure all these different legs to line up as indefinite.
3. You are a good client, you were spending a large amount of money with our agent whether buying one way or return, she would quickly have to take responsibility for her comments when you inevitably wanted to take up the return journey, and above all she is a well-respected and honest part of our team. Why, then, would she even consider ‘shafting’ you?
The evidence you have provided is circumstantial at best, and in a case of ‘he said, she said’, we, like any other organisation, will back our people when we are convinced our team member is genuine and the evidence compelling. She could not have said this by mistake, and the fact that not only would she not mislead you, but there would also be no real benefit from misleading you, speaks for itself.
Yes, we understand from the references you have provided that you felt you may not return. In this light, we strongly believe that you have either misheard or misjudged the terms of your tickets, thinking there would be some way to extend you tickets indefinitely. Again, it is extremely unfortunate, but there is no way to extend these tickets - we have exhausted every avenue over the past three months in searching for a way.
I apologise for bringing in the possibility of legal action, it was unnecessary, and a full and comprehensive answer should have always be the first port of call. This is the first time we have had to deal with a problem within a blog, and our response left much to be desired. I realise this will continue to be an ongoing debate within the blogosphere, but I offer anyone the chance to contact me and discuss this matter, as we want to keep our lines of communication open.
We have received a great deal of negative feedback (towards the individual concerned in particular) from the many people who have viewed this blog and the blogs that have now linked to it without offering our full side of the story. It is also our assessment that our company has already suffered a loss of business more than the costs of the refund, and will continue to suffer adverse effects from the posts. But we simply can’t pay off everyone who threatens our people with a high profile, negative blogging campaign. We will instead proactively discuss these points within whatever medium they come up, including this and any other blogs that have these threads, on a case by case basis. We would of course prefer the old method of conflict resolution, but we are quickly learning to adapt in this brave new world.
This is our point of view in a nutshell, and I hope you can understand that unless new and compelling evidence presents itself, it will not change. We would appreciate it if you could also remove the names and contact details of other participants in this dialogue; anyone wanting clarification or to make a further point is welcome to contact me on john.mcguinnessAT NOSPAMflightcentre dot co dot nz.

Yours sincerely,
John McGuinness
Communications Manager
Flight Centre (NZ) Ltd

09

Sep
2006

The Conceptual Internet

There has been some talk lately on how to define web 2.0

The Conceptual Internet

WTF is Web 2.0

In my opinion web 2.0 is something you add to the description of your application or service and have instantaneously a perceived coolness upgrade.

Everything is else is just the web.  I’m up to the point that if I hear somebody mention web 2.0 to me I’ll run out the door screaming ;-)

But let’s talk a bit more about conceptual url’s as Alex has called them. I feel they should be more self-describing urls. Alex and I have been discussing this way of forming url’s for a wee while now.

Self describing urls are urls that mean something to everybody also your mum and nana. When talking to users I often find that they don’t get anything that comes after http://www.somedomain.com/FooBar

However if it were common to implement a scheme like http://www.somedomain.com/MyAccount, http://www.somedomain.com/Blog
That is something they also grasp but what they don’t get (want to or need to) is why there is sometimes .aspx, .php, ….. and definitely the question mark is where the look in their eyes becomes fully glazed.
So a common schema to implement  could be protocol://domain/DomainObject/View/RowIDOrFilter/Action/DomainObject/View/RowIdOrFilter/Action…. Now why do i feel that they should be called self describing. The reason is because you can read them in plain english :
At domain Get me the domainObject as a view with only RowIdOrFilter and do Action with it/make it Action/apply Action to it

http://www.nblogr.com/Category/DetailByName/Venues/ShowSublist/Entry/List/ would be valid and would say then at nblogr.com get me the categories By name Venues and from those show me a sublist of entries as a list. Now that is something my grandfather with alzheimer still understands and quite possible could navigate.

That way url’s are in fact really easy to remember if you make them all up of meaningful words so that would make internet more transparent for everybody to use.

This theory poses a problem when there are complex filters to be applied. However filters can be foreseen and hence be named upfront.  And the biggest problem I see here is to come to a world wide consensus on which naming to use for commonly used filters ect.  But in fact with predefined standards really everybody would benefit from it.

In asp.net with virtual path providers you can store your whole website in sql server and never have a real physical website running

Needless to say that I can’t wait for IIS 7 to get rid of the aspx extensions etc on my projects.

I’d say back to the basic idea of the computer/internet is here to assist people into doing better jobs not to confuse the hell out of them.

02

Sep
2006

Preview Release of NBlogr

Today I put a preview release of NBlogr online.

I still have to change the online site but will do so very shortly.

This release has very basic functionality and is not yet feature complete so a lot may change later on.

If anybody feels like joining the project do not hesitate :) All help I get is extremely welcome.

            [http://www.codeplex.com/Release/ProjectReleases.aspx?ProjectName=Nblogr](http://www.codeplex.com/Release/ProjectReleases.aspx?ProjectName=Nblogr)

I’m heading into a very busy week/couple of weeks so I’m not sure if I will be able to spend as much time as I’ve been spending lately on the project.  But I think every week I will be able to show some progress at least.

If you feel like it go ahead and give it a try but don’t upgrade your blog just yet :).

I’d be keen to know what your thoughts are on the subject.

01

Sep
2006

FileUploading for NBlogr

To upload files in nblogr. I wanted the user to have the possibility to upload as many files as they wanted but only show one file element.

The upload procedure has to work without reloading the page entirely but there is no way of getting the size or the bytes of a file through the html input file control from clientscript without popping up a security warning.
And what do I personally think about security warnings : they are a necessary evil but limit you a lot in the development of contemporary sites with rich client interaction.
If I am to present a site to my parents and they have to figure stuff out themselves I’m pretty sure that once the read the words : Security warning, Potential risk etc… they will click no ==> site doesn’t work ==> site == crap

I wanted to include an upload with progress bar but decided to let that idea go and just give an implementation of a multiple file upload with a single inputelement. Maybe I will put this in during the next iteration. That way I can probably release a ctp this weekend and start thinking about a plugin architecture (thanks for the idea JD)

Because of the file issues i have to run it in an iframe :-s and have the page and the frame talk to eachother.

29

Aug
2006

Did Teched Have an Impact

In my case I guess it did.

First of all there were the presentations on Presentation Foundation which were really cool and made me want to start playing with it right away.

Unfortunately for my playing time, currently I am in a really busy period professionally so I’ll just have to stick with what I know already.

However I will start using communication foundation whenever possible as well as workflow foundation these two pieces are too useful for me not to use them.
Also it made me rethink the way I’ve been using atlas and how I’ve been evolving with the development of websites in atlas.

In the beginning I was doing atlas I used update panels like everybody else. But soon I came across a lot of limitations of the update panel. Where they weren’t flexible enough etc. That’s when I started talking to webservices directly and did to everything client-side. This had as drawback that once you started to put a reasonable amount of functionality in the page the initialisation process takes a really long time. In meantime atlas has evolved for the better I must say. Also the control toolkit has grown a lot.

Now the control toolkit holds the control I’ve anticipated the most : the animation control. Also for about every bit of functionality you have a blueprint in the control toolkit that let you extend every server control on your page to do pretty much anything you want.

Where I was in doubt last week if atlas was really the best choice to go the ajax route. Now these doubts have been erased.

At tech ed I got a chance to have a chat with Scott Guthrie, who for a really smart guy knows how to communicate really well and certainly better than me :), and he couldn’t say what was on the horizon atlaswise but just that it was going to be really cool. Even cooler than Nikhil Kothari’s script sharp, I for one can’t wait to set what they have in store for us.

In short teched was excellent in my case and would love to do it again :)

29

Aug
2006

A Generic Builder for Unit Tests

I’ve been using base4 quite a lot lately :). And obviously I like it. But anyway for unit testing i found myself writing virtually the same builder class over and over again.

And since it is just test data that needs to be removed later it is always very similar. I started thinking about my problem and came to the conclusion that I could easily enough build a generic class that iterates over the object and takes all the properties that belong to that type and not to any of the parent types and fill them with valid data for their returntype.

I got to work and not so long after that I came up with the following class:

                    using System;





                    using System.Collections.Generic;





                    using System.Text;





                    using Base4.Storage;

 

                    namespace NBlogr.NUnitTests.HelperClasses

{

    publicclassBuilder where T : class,IItem,new()

    {

        privateList items;

 

        publicList Items

        {

            get

            {

                if (items == null) items = newList();

                return items;

            }

            set { items = value; }

        }

 

        publicvirtual T Add()

        {

            return Add(null);

        }

 

        public T Add(int? index)

        {

            T t = new T();

            return Add(t, index, true);

        }

 

        publicvirtual T Add(T t, int? index, bool generateValues)

        {

            IItem item = t;

            if (generateValues)

            {

                foreach (PropertyImpl p in item.TypeDefinition.Properties)

                {

                    switch (p.ReturnTypeName)

                    {

                        case”bool”:

                        case”Boolean”:

                        case”System.Boolean”:

                            item[p.Name] = index.HasValue;

                            break;

                        case”string”:

                        case”String”:

                        case”System.String”:

                            if (index.HasValue)

                                item[p.Name] = string.Format(“Unittest {0} {1}”, item.TypeDefinition.Name, index);

                            else

                                item[p.Name] = string.Format(“Unittest {0}”, item.TypeDefinition.Name);

                            break;

                        case”uint”:

                        case”short”:

                        case”int”:

                        case”long”:

                        case”Int16”:

                        case”Int32”:

                        case”Int64”:

                        case”System.Int16”:

                        case”System.Int32”:

                        case”System.Int64”:

                            item[p.Name] = index.HasValue ? index.Value : newRandom().Next();

                            break;

                        case”byte”:

                        case”Byte”:

                        case”System.Byte”:

                            item[p.Name] = index.HasValue ? Convert.ToByte(index.Value) : newbyte();

                            break;

 

                        case”double”:

                        case”Double”:

                        case”System.Double”:

                            item[p.Name] = index.HasValue ? Convert.ToDouble(index.Value) : newRandom().NextDouble();

                            break;

 

                        case”byte[]”:

                        case”Byte[]”:

                        case”System.Byte[]”:

                            Byte[] bytes = newbyte[128];

                            Random rnd = newRandom();

                            rnd.NextBytes(bytes);

                            item[p.Name] = bytes;

                            break;

 

                        case”Guid”:

                        case”System.Guid”:

                            item[p.Name] = Guid.NewGuid();

                            break;

                    }

                }

            }

            item.Save();

 

            items.Add((T)item);

 

            return item as T;

        }

 

        publicvoid BuildList()

        {

            BuildList(5);

        }

 

        publicvoid BuildList(int length)

        {

            if (items == null) items = newList();

 

            for (int i = 0; i < length; i++)

            {

                int index = i + 1;

 

                Add(index);

            }

 

        }

 

        publicvoid CleanUp()

        {

            if (items != null && items.Count> 0)

            {

                foreach (IItem item in items)

                {

                    item.Delete();

 

                }

            }

        }

    }

}

To top