Quick tryouts: Websockets

By YopY on Sunday 9 January 2011 21:00 - Comments are closed
Category: -, Views: 2.994

So the other day I was in Hilversum with a few dozen developers at Xebia, running along with the programmers there in their bi-weekly off-duty experimentation slash competitions slash self-educating program (I recommend such an event to everyone out there, by the way), and I ended up in a team trying out WebSockets.

WebSockets is a new server / browser communication technology currently being drafted up by the W3C Web Applications Working Group, based on a proposal by Opera, whose goal is to provide two-way communication between a (web) server and a client, which usually is a web browser. WebSockets' main purpose is to provide a means for low-overhead communication, including a server taking the initiative to send a message to the browser.

This is contrary to AJAX, where the browser is the party taking the initiative. In a situation where a client would like to get real-time updates, such as in collaborative software (ex: Google Docs, Wave), this usually means the client would have to poll the server every few moments - even if there are no updates.

Before WebSockets was conceived, several methods were proposed and put in action to come up with a similar effect - Comet, Long polling, Flash sockets, and possibly even ETags, which greatly reduce the overhead and server-side processing for AJAX requests.

Anyways, at Xebia we went out to see how mature the technology was, and if it was ready to be put in use already. We used a library called Atmosphere, which provides both a server- and clientside library for WebSockets and similar technologies. Atmosphere is a promising project, I'd reckon, because it's more than just a WebSockets implementation (based on the unfinished WebSockets standard) - it provides graceful degradation based on browser and server support. So if you have a browser that doesn't have WebSockets implemented (or activated), the Atmosphere library automatically falls back to other available techniques - long polling, comet, the works.

Our experimentations weren't really successful, it seemed, but that's to blame on a few factors:

* WebSockets is not a proper standard yet. Any implementation is half at best. Same for HTML5 and similar technologies which, despite having become extremely popular last year, are still not finished.

* WebSockets have been disabled in all major non-IE browsers due to security issues uncovered early last December.

* Possibly, Atmosphere does not degrade gracefully at all times. The example we used didn't work when selecting websocket or automatic detection of used communication method, for example, whilst an echo test did work properly.

* We didn't actually spend a lot of time on it. The event was from 4 to 9, with dinner and a new year's reception in between, and a lot of time spent trying to get the example to work.

Anyways. I figured I'd just write an intro to a blog post on the Xebia App Incubator blog, but it turned out to be a bit longer than that. Without further ado, here's the actual official results and blog post on the matter:

Xebia App Incubator: Some quick experiments with web scokets using Atmosphere

Java generics - Sublist method

By YopY on Monday 3 January 2011 13:00 - Comments (5)
Category: -, Views: 4.381

Short random post.

Sometimes you have a list, and you want to retrieve a specific sublist out of that one, for example to filter out empty list elements or to get a list of values that matches a condition. You could write a method like this for every list you have - here's one to filter blank, empty or null strings out of a List of strings, for example:


Java:
1
2
3
4
5
6
7
8
9
public static List<String> filterEmptyStrings(List<String> input) {
    List<String> output = new ArrayList<String>(input.size());
    for (String s : input) {
        if (s != null && !"".equals(s.trim())) {
            output.add(s);
        }
    }
    return output;
}



This'll get tedious in the long run though, as you'll need to create a new method for every object type you want to filter in every way. Java Generics to the rescue!


Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
public interface SublistCondition<T> {
    public boolean matches(T inputObject);
}

public static <T> List<T> subList(List<T> input, SublistCondition<T> condition) {
    List<T> result = new ArrayList<T>(input.size());
    for (T value : input) {
        if (condition.matches(value)) {
            result.add(value);
        }
    }
    return result;
}



Example usage, same result as the first example:


Java:
1
2
3
4
5
6
7
public static List<String> filterEmptyStrings(List<String> input) {
    return subList(input, new SublistCondition<String>() {
        public boolean matches(String input) {
            return input != null && !"".equals(input.trim());
        }
    });
}



It's not that much less code in this example, but you could move this particular SublistCondition into a separate object, so you can use it in every place you want to filter empty strings from a list:


Java:
1
2
3
public static List<String> filterEmptyStrings(List<String> input) {
    return subList(input, ListUtils.EmptyStringSublistCondition());
}

JavaFX Taalfeatures - Kekke serietitel dag 2 nl

Door YopY op donderdag 1 juli 2010 23:00 - Reacties (1)
Categorie: -, Views: 3.764

Dag en deel twee van de kekke serie over kekke dingen, nu met extra leip. In deel 1 van deze te wause serie postte ik een halfbakken inconsistent verhaal over dingen die ik tegen kwam terwijl ik door de eerste pagina's van de JavaFX tutorial kroop, maar aangezien niemand dat wil lezen zal ik bij deze post beter mijn best doen.

In deeltje 1 merkte een observante lezer op dat, voor zover hij aan de hand van mijn post op kon merken, JavaFX eigenlijk een soort Java-met-Javascript-achtige-dingetjes was, met daarbij de suggestie dat het misschien beter was om de JavaFX functionaliteit via een Java API beschikbaar te maken.

En dat vroeg ik mij dus ook af. Dus in deze post poog ik een overzichtje te maken van taalfeatures die echt niet in Java zelf zitten, met daarbij een analyse waarom het beter zou zijn voor de doeltoepassing van JavaFX - rich internet applications, GUIs, dat soort zaken.

Sowieso lijkt het me logisch (van te voren gezegd) dat JavaFX veel minder technisch is, en ook door niet-hardcore Java developers makkelijk op te pakken is. Dus: Minder boilerplate code, minder technisch geneuzel met types, generics en dat soort zaken, minder kennis nodig van verschillende API's en uitgebreide documentatie die daarbij zit, maar gewoon uit je hoofd en een beetje vlot code kloppen. Tenminste, dat zou ik verwachten van een RIA scripttaal - mogelijk zit ik ernaarst, maar met deze blogpost krijgen we daar hopelijk een antwoord op (al dan niet gedeeltelijk).

We beginnen. Bij hoofdstuk 3 welteverstaan, getiteld Using Objects

Object Literals

JavaFX biedt een intuitieve en vlotte manier om objecten te instantiëren. Een class declareer je eigenlijk net zoals in Java, bestandje, public class Nogwat, class variabelen, functies, etc, maar het instantieren kun je door middel van de Object Literal notatie. Noot: Voor degenen die Javascript kennen zal het volgende bekend voorkomen:


code:
1
2
3
4
5
6
7
8
9
10
var customer = Customer {
     firstName: "Henk";
     lastName: "Naecktgeboorhen";
     phoneNum: "0123 456 789";
     address: Address {
        street: "Klaassenstraat 3";
        city: "Pietjendam";
        zip: "1337 XX";
    }
}



Lijkt me logisch, en lekker intuitief - geen geklooi meer met constructors, getters en setters... toch? Even kijken naar de class declaratie zelf :


code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class Customer {
     public var firstName: String;
     public var lastName: String;
     public var phoneNum: String;
     public var address: Address;

    public function printName() {
        println("Name: {firstName} {lastName}");
    }

    public function printPhoneNum(){
        println("Phone: {phoneNum}");
    }
}



Zoals gezegd, lijkt verdacht veel op gewoon Java (alleen heb je vars en staat het type achter de declaratie). Wat hier opvalt is dat er hier gebruik gemaakt wordt van public variabelen - en dat vind ik gek, aangezien mij altijd geleerd is dat public variabelen verschrikkelijk evil zijn en weet ik veel wat. Toegegeven, het alternatief - getters en setters maken - is bijna net zo evil (ook aangezien ze meestal klakkeloos op elke class variabele losgelaten worden, nodig of niet - maar da's een andere discussie).

Ik ben er nog niet achter wat ik hiervan moet vinden. Wat vinden jullie?

Inline expressies in strings

In deeltje één liet ik hiervan al iets zien toen variabelen bijna direct in een string geplaatst werden om de inhoud van deze vars weer te geven, maar het blijkt dat je nog meer in een string kunt doen in JavaFX - eenvoudige conditionals, bijvoorbeeld.


code:
1
2
def mongol = true;
var s = "Zijt ge een mongol? {if (mongol) "Awel!" else "Neen"}";



Dit lijkt me wel handig voor directe feedback aan gebruikers. Het Java equivalent ziet er, om te vergelijken, zo uit:


Java:
1
2
3
4
5
6
7
boolean tarzan = true;
String olioliooo = "Houdt u van apen? " + (tarzan) ? "JOAH!" : "Nein!";

// of, uitgebreider en in dit geval totaal onnodig:
StringBuilder toybox = new StringBuilder("I am Tarzan from jungle, ");
toybox.append((tarzan) ? "You can be my friend" : "I am Jane and I like to ride an elephant");
String fritzl = toybox.toString();



Hier breidt ik later misschien nog eens op uit - de tutorial gaat op dit punt niet verder nog.

het Duration datatype

Binnen JavaFX heb je het standaard rijtje types - Strings, Integers, Booleans, maar ook Void en het Function type (hier later meer over) (mogelijk heb ik het verkeerd met het scharen van Function onder datatypes).

Maar één datatype dat interresant lijkt is het Duration datatype. Omdat JavaFX gericht is op GUI applicaties en, aldus, directe feedback met de gebruiker, maar ook animaties en dergelijke, hebben ze het Duration datatype toegevoegd om zeer direct hieraan gerelateerde waarden mee te geven. Er zijn - voor zover ik na kan gaan - vier verschillende tijdseenheden om een Duration aan te geven - milliseconden, seconden, minuten, of uren.


code:
1
2
3
4
def uurtje = 1h;
def minuutje = 1m;
def seconde = 1s;
def zonet = 1ms;



Als je met Java een tijdseenheid aan wilt geven - bijvoorbeeld hoe lang een bepaalde animatie moet duren - moet je dit meestal in milliseconden aangeven. Op zich is dat niet zo'n grote stap - aangezien je met basisschooniveau tijdsrekenen en de basisrekenfuncties van Java eenvoudig genoeg uit kunt laten rekenen hoeveel milliseconden er in een uur gaan - maar toch vind ik dit wel een interresante toevoeging. Sowieso is het voor de leesbaarheid wel prettig - mits je het verschil tussen ms, s, m en h goed kunt zien.

Functies naar variabelen -> Closures?


code:
1
var funk : function(:Object, :Integer) : String;



Met bovenstaande maak je een variabele funk aan die een functie kan bevatten - het datatype van funk is in bovenstaand voorbeeld Function, maar dan specifiek een functie die een Object en een Integer verwacht, en een String teruggeeft. Je kunt vervolgens een implementatie van een functie aan funk toekennen:


code:
1
funk = function(obj : Object, k : Integer) { "Objectje: {obj}, cijfertje: {k}" }



Vervolgens kun je de functie aanroepen via de variabele:


code:
1
2
println(funk(1m, 1337));
// output: Objectje: 60000.0ms, cijfertje: 1337



Ik zette 'Closures' in de heading van dit hoofdstuk met een vraagteken, omdat ik op dit moment nog niet kan zeggen of dit nu daadwerkelijk closures zijn - ook omdat ik niet echt een specifieke definitie van closures heb, slechts een oppervlakkige kennis. Echter, als dit wél closures blijken te zijn, zou het maar zo kunnen zijn dat je JavaFX als functionele programmeertaal zou kunnen vergelijken. (met de nuance erbij dat ik ook geen goeie definitie heb van een functionele programmeertaal, dus voor hetzelfde zit ik uit m'n nek te lullen).

Een mogelijk doeleinde hiervoor in een grafische omgeving is om gemakkelijker action handlers mee te geven aan GUI elementen. Vroegah, in mijn tijd, had je in Java anonymous (inner) classes, welke veelvuldig toegepast werden in GUI programmeren. Je stelde een ActionHandler in op een GUI element door aan de setActionHandler inline een subclass (of implementatie) van de ActionHandler interface te maken. Echter, hierbij was veel boilerplate nodig - een class defintie, braces, een functie definitie, en de functie zelf. (Als alternatief mocht je natuurlijk ook een volledige 'echte' class schrijven natuurlijk.)

Met deze notatie kun je de class notatie en een deel van de overige boilerplate achterwege laten. Hier moet ik het mijne nog van uitvinden natuurlijk.

End

Ik vind - en mogelijk ook anderen met mij - dat ik behoorlijk lange epistels schrijf, dus voordat jullie gek worden breidt ik er een eind aan voor deze aflevering. Volgende keer meer - en natuurlijk zijn julle opmerkingen altijd welkom!

Kekke serietitel dag 1: JavaFX Script nl

Door YopY op dinsdag 29 juni 2010 23:00 - Reacties (6)
Categorie: -, Views: 4.458

Dit is een eerste deel in een nieuwe serie (mogelijk onsamehangende) posts die door mijn andere serie heen gaat (die mogelijk gewoon onderbroken wordt), waarin ik probeer om nieuwe dingen te leren in het gebied van programmeren. Dit voornamelijk omdat ik toch het idee heb dat ik op mijn werk niet veel dingen meer kan leren, en zoals elke werkende Tweakert zou moeten weten: Stilstand is achteruitgang.

Deze blogpost begin ik met wat willekeurige opmerkingen over JavaFX. Ik speelde wat met het idee voor een soort van website beheer applicatie (waarmee je vanuit één applicatie een brede reeks (web) applicaties kunt beheren, details laat ik even achterwege ivm rant-gehalte), maar liep tegen één belangrijk aspect aan: de GUI.

Het is alweer enige jaren geleden dat ik voor het laatst een GUI maakte in Java's Swing, en zoals velen weten is de default Swing look & feel ongelofelijk lelijk, terwijl juist een mooie en vooral ook gebruiksvriendelijke en vlotte applicatie zo belangrijk is tegenwoordig.

offtopic:
App n [Diminutive of "application"] The irrelevant 10 percent of your code lurking beneath, and well-nigh inaccessible from, the glamorous, marketable GUI layer. bron


Dus ik denk, JavaFX is nieuw en voor grafische dingen, misschien kun je er ook goeie GUIs mee maken? Daar komt nog bij dat JavaFX een tijd terug aangekondigd is, maar een stille dood gestorven is - mede dankzij het feit dat nagenoeg tegelijkertijd Microsoft's Silverlight en Adobe Flex uitkwamen,

Maar eerst moet je een stukje leren en kijken wat je ermee kunt doen. Aldus geschiedde.

Men neme: Een X hoeveelheid tijd, een tutorial, een geïnstalleerde NetBeans IDE for JavaFX, en een glaasje water of twee.

Deze post zal voornamelijk over zaken gaan die ik tegenkom in de Getting Started tutorial, in dit geval waarschijnlijk voornamelijk de taal zelf en handigheidjes of dingen die mij opvallen, dus waarschijnlijk zal de rest van deze blogpost bestaan uit willekeurige onsamenhangende opmerkingen.

Men beginne.

Tutorials en copypasta van code

Hm, de tutorial begint met het maken van een project in Netbeans en de instructie "Kopieer deze code"... Ben ik niet zo'n fan van, maar het is voor een persoon met enige ervaring in wat voor programmeertaal dan ook wel te snappen. Zou het voor een beginner echter niet aanraden. Ik had vroegah ook een hekel aan boeken en dergelijke die je een of twee pagina's code voorschotelden met het bericht "Neem dit over, en het wordt niet van je verwacht dat je er geen fluit van snapt, dat wordt allemaal later uitgelegd!1". Tot zover mijn eerste poging Ruby (on Rails).

JavaFX als taal / Strings formatteren

De taal zelf is een stuk eenvoudiger dan Java (en ja, ik ga het voornamelijk daarmee vergelijken), lijkt me iets vlotter te typen. Het plaatsen van variabelwaarden in strings kan ik ook waarderen, da's iets dat me behoorlijk begint te ergeren bij Java.


code:
1
2
3
4
def numOne = 100;
def numTwo = 200;
def result = numOne + numTwo;
println("{numOne} + {numTwo} = {result}");



Ter vergelijking, het Java alternatief zou zijn:


Java:
1
2
3
4
int numOne = 100;
int numTwo = 100;
int result = numOne + numTwo;
System.out.println(MessageFormat.format("{0} + {1} = {2}", numOne, numTwo, result));



Werkt ook, en het zal intern misschien naar iets vergelijkbaars vertaald worden, maar de JavaFX notatie vind ik prettiger - beter op volgorde en dergelijke. Het is natuurlijk wel uitkijken met accolades in je string, ;).

Declaratieve syntax

is wat ze het noemen, blijkbaar. Moet even bijspijkeren wat dat precies is om daar een oordeel over te kunnen vellen. Eerste wat opvalt: types van variabelen en functie return types komen achter de variabele / functiedeclaratie ipv ervoor. Kan me voorstellen dat dit wat logischer is, taalkundig gezien 'functie pietje henk() { return new pietje() };' tegenover functie henk(): pietje. De tweede lees je als "functie henk geeft pietje terug". Alhoewel dit bij variabelen weer minder geldt - ik kan net zo goed zeggen 'nummer piet' als 'piet is een nummer' ( int piet; vs piet: integer). Maar vooruit.

Java functies aanroepen

JavaFX Script en Java zelf zijn dikke matties, en dat blijkt ook uit het volgende voorbeeld: strings parsen naar integers. Volgens de tutorial moet je daarvoor een Java methode aanroepen, en wel als volgt:


code:
1
2
3
4
function run(args : String[]) {
    def numOne = java.lang.Integer.parseInt(args[0]);
    def numTwo = java.lang.Integer.parseInt(args[1]);
}



Da's weer een minpunt - de "fully qualified classname" moeten gebruiken om een functie aan te roepen. Ik zou in dit geval toch de voorkeur geven aan een eenvoudige aanroep naar parseInt(args[0]), waarbij de compiler automagisch aanneemt dat je Integer.parseInt bedoelt. En als 'ie toch hulp nodig heeft, dan toch gewoon integer.parseInt, of anders args[0].toInt();.

Readonly, onlyread, var, def, bind

Oké, JavaFX Script variabelen 101:

* Met 'var' definieer je een variabele.
* Met 'def' definieer je een constante.

Maar hier zijn uitzonderingen op. Ik haat uitzonderingen.

* De enige vars die read-only zijn, zijn diegenen die gedefinieerd zijn met "bind".
* Defs kunnen van waarde veranderen als ze "bound" zijn.

Verwarrend? Vondt ik wel, en ook inconsistent.


code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
// Bound vars
var y;
var x = bind y;
println("Is Y read only? {isReadOnly(y)}");
println("Is X read only? {isReadOnly(x)}");
// output:
Is Y read only? false
Is X read only? true

// Bound defs

var a = 1337;
def b = 12;
b = 13; // You cannot change the value of B
def c = bind a;
println(c);
a = a * a;
println(c);

// output
1337
1787569



Lijkt erop dat JavaFX pointers weer hip probeert te maken. Mogelijk zal het doel hiervan zich later openbaren. Vooralsnog lijkt het wat tegenstrijdig. (Spoiler: Heb verderop gezien dat je ook functies aan vars kunt toekennen, dus mogelijk heeft het daarmee te maken).

Spanje wint van Portugal met 1-0, en ik sluit voor vandaag af. Indien dit lichtelijk interresant is zal ik nog wel eens een deeltje twee schrijven, en anders horen jullie nog wel eens van me over een volledig anders onderwerp. Erlang, ofzo, of misschien iets over frustraties van moderne softwareontwikkeling ("ik wil feature X, dat moest gisteren af, in zo weinig mogelijk uren. Nee je krijgt geen tijd om die 7 jaar oude code te gaan refactoren. Watte? Alle primitives worden met objecten gedaan? Huh? Alle data retrieval functies staan in één grote service class en doen allemaal aan het ophalen van een connectie en aanroepen van commit en rollback functies? De fok? Alle DAOs zijn verzamelingen static functies met een bakkes prepared statements? Vector? Wasda?")

Edit: Deel twee is uit :)

[FGJ] The Value of Social

By YopY on Monday 31 May 2010 10:00 - Comments (6)
Category: -, Views: 4.133

I was tempted to renew my WoW subscription today. Then I forced myself to open up the mindmap I made the other day and try to write some of the points down. Then I went to look at the competition, and from that I suddenly wrote an essay on market research, news websites, social interaction, user submitted and generated content, social networks, and other endless ramblings. Below is the result.

I wrote this last Friday after working out, pizza and beer, intentionally set it to be published a few days later for maximum exposure and because my last post was only published a day prior. I haven't proofread or made much adjustments to the text below, just added some links and intended to add some images but failed. It's also quite likely that this text is rather long and may bore you halfway through, but meh at that.

I've done a quick market research – the best tool for that being Google – and the competition is mainly from 'classic' news sites, where editors cough up articles on a daily basis. Most of the 'big players' only go for mainstream music, and the not-too-mainstream music usually has a site of its own. They both generally follow the same pattern though – articles posted in a blog-like fashion, some videos here and there, a flashy layout, and user interaction limited to people being able to post a comment on articles. Perhaps remarkably, this option is hardly ever used – in my five-minute market research run, I found only two articles with comments, limited to just one or two. For sites that appear high up in Google search results for queries like 'music news' and, based on that alone, should be seeing thousands, if not tens of thousands of users on a daily basis worldwide, that figure is ridiculously low.

I'm not an expert in this, but I'd blame it on the image the websites give. They all provide good and well-written news articles, but that seems to create a sense of detachment from the reader – the reader does not feel involved in the website, and the website does not make the user enthousiastic enough to reply to the article. It's like "I am The Website, I have no flaws, and if I do have flaws, I have a main editor that corrects it within 0.5 seconds. My word is your will, and my articles do not leave room for discussion or interpretation."

Next to that, there's also the 'one sheep' factor to keep in mind – nobody posts comments, so nobody's inclined to participate in the discussion, if any.

So, if nobody posts on the news websites, where do they vent their opinions?

The logical assumption would be 'Social Networks'. I'm quite convinced that nowadays (and for the past five years at least), a band's profile on networks like Myspace and Facebook is more frequently visited – and, more importantly, interacted with – than their own website or, indeed, news posted about them on some other website. I looked up the first band some news site (Blabbermouth.net, 'the CNN of heavy metal', yeah right) - which turns out to be Alice in Chains – on Facebook and Myspace.

offtopic:
(How come I only see Alice in Chains come by whenever there's heavy metal and such news on the internets? WTF, is it such a good band or something? Or does it just have good marketing behind it?)


On Facebook, I selected their wall. I'm not active on social networks at all (in fact, they creep me out), so all of this is new to me – bear with me if I make retarded remarks about it. On this wall, the band (or their spokesperson, more like) posts info about ticket sales, tour posters (?), and other small, seemingly insignificant tidbits.

However, each of these 'seemingly insignificant tidbits' do make the internet populace at large interact with it. In this particular example, each 'article' gets around 250 'likes' from various Facebook members, and (usually) between 70 and 200 comments. Quite different from the zero the big news sites get, and it's much more cost effective too – using Facebook is free, and writing up two sentences is cheap, especially if a band member does it in his free time. Based on the amount of user feedback, I'd say Facebook is much, much more effective than the random music news sites.

Of course, user feedback says nothing about actual figures or effectiveness, so I'm leaving that aside for now. However, I do like to assume that the amount of effective views and the 'information registration rate' (a scientific-sounding figure indicating which percentage of viewers actually read and remember the news) is much, much higher on Facebook than it is on the music news sites or even their own website (which, by the way, does not have any user interaction options or even references to the same news on Facebook – although it does have the mandatory 'social bookmark' links).

Now, to complete this mini-survey, let's look at Myspace, which I've long believed to be the most popular social network for bands.
I'd rate that page's effectiveness about zero. It doesn't work for me at the moment, =D. I'll re-check later.

To wrap things up, I'll make some conclusions about both the competition for the news site idea, as well as internet marketing and internet news in general.

The main competition for this website is social networks like Facebook and Myspace. Effectively, you can state that the website itself will grow into being a social network itself, with one of its main goals being to involve the visitors into the site itself – user supplied content, if you will, and to a degree user generated content as well. However, will it be able to differentiate itself enough from the established networks? If it is to have any chance at greatness, it will have to offer unique features or advantages over the networks.

It has a bonus in that it will be aimed at music and bands primarily – making it more concentrated than the established social networks. However, even if it is better (if that goal is ever reached, which is very debatable at this stage), it would still need to gain momentum, get people to actively post news on it, and – in the long run – get bands to transfer over to it, either partially or in full. Larger bands – like the example Alice in Chains I've used in this post – are quite likely to include it into their marketing machine if the site picks up. However, I'd personally be more pleased if smaller, more 'close to the populace' bands use the site as their main 'home'. Call it 'exclusive content', if you will.

Classic news sites, the ones that have a set of editors that spew out news (or copypaste it from somewhere else), do not seem to be very effective. I'm sure they get thousands of visitors every day, but what is the effective value of those visitors if they only skim their site and move on to the next thing (say, Facebook)? I'd say it's pretty low. A goal should be that a user spends a lot of time on a website. Facebook itself has reached for this goal, and has succeeded in it quite well – I've even read somewhere that Facebook is effectively a 'mini-internet', where its visitors find so much stuff to do that they spend many hours a week on it.

A news site that actively encourages its users to interact with it – and thus makes them 'think' about the news itself (or the band) when they write up their responses about it – will almost automatically make it more effective. Compare it with a laundry detergent brand. You all have seen (and secretly love) the TV commercials, but I'm sure that most of you have grown deaf and blind to such ads. If, however, there was a textbox underneath the ad, and a keyboard in your hand, and there was an element in the ad that triggered your 'YOU SHALLT RESPOND!'-reflex… Well, you'd most likely spew out the worst profanities, under the guise of anonymity. However, even when being negative about the ads, its creators, the French woman presenting the laundry detergent as heroin to your laundry, you actively think about the product, and it gets imprinted into your mind. Even years later, you will suddenly remember the event where you combined existing ones into all new and excellent profanities.

That is effective. I should totally go into advertising instead of webdevelopment.

==========================================

WAIT! This already happens. A friend I sent a draft of this post to reminded me that good, catchy TV ads (not the bland ones) already get uploaded to Youtube - more recently by the advertising agency themselves, or the company they represent. If done right, these ads create their own cult following, and/or become a meme on the internet itself. And once your ad reaches memehood, it will forever be imprinted into the minds of hundreds of thousands of internet denizens - whether positively or negatively. A prime example would be the Old Spice ad campaign(s). I saw these amusing-if-you-can-stand-them ads on Dumpert, then googled a bit and found they were re-posted on very popular sites like Flabber, Collegehumor, wimp.com, Today's Big Thing, and even big news sites like CBS report on it, not particularly on the ad itself, but about its popularity on the internet.

You know you are ultimate win if your ad becomes more than an ad, when it becomes a viral, when there's ten million views on just one of your ads, when it becomes newsworthy material. And the crown of it all, when your ad is copied. Imitation is the sincerest form of flattery.

Imagine dishing out a million or two on such a campaign or however expensive it was, and watch it become a viral. Your video becomes shown all over the world, by hundreds of thousands of people, and [i]it doesn't cost you zilch[/url]. Free advertising? It's possible. Free advertising right in the middle of another TV program that gets a multitude of active viewers that watched the 30 seconds advertising time you dished out two million for? Yes. The internet has become the most (cost-)effective advertising medium.

==========================================

[offtopic]the above was injected into the post randomly, so it may have broken the train of thought here. The below may make no sense now.[/url]

But the same thing (promotion, popularity, user involvement) applies to news. It too needs exposure. A band is a brand, its music is its products, its revenue is its sales combined with the cultural and musical value. I'm not a big fan of the financial aspect of music, so I'd rather focus on the latter. Good music deserves to be promoted, especially if not backed by big record companies and their social networks spamming marketing machines. One way to promote a band is to seriously invest in user / fan involvement. A band's music is only so much responsible for its popularity - its image is another, and I personally believe that its fans' involvement is just as important.

Case in point. A few days ago, Slipknot's bassist died. You can effectively put the responses to this into two camps: One side says "Who?", "Meh", or "w/e", the other says "OMG NOES!". The former category has a slight chance of going out to buy or listen to Slipknot. The latter most likely already did, and if they didn't, they will be more likely to do so now.

But the value of fans to a band has probably been described elsewhere, and much more scientifically than I am trying to do right here.

To add an end to this overly long post I (as it turns out) have been writing all evening now, news should be social. The website I'm planning should be social, and have good content. To be social, it should be inviting. To be inviting, the user should be involved with it. To be involved with it, the boundary between the article or the band it's about should be thin and wobbly, accessible. The article should also be inviting to comment on (this entails writing style and editorial additions), and the community should be inviting to interact with itself (be it a happy, child-friendly and strictly moderated or a 4chan), to invoke more user contributions in the form of comments and resulting blog posts.