JavaFX Taalfeatures - Kekke serietitel dag 2 nl

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

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: 5.024

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.388

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.

[FGJ] Organizing your ideas

By YopY on Thursday 27 May 2010 23:00 - Comments (6)
Category: -, Views: 3.766

First off, my WoW subscription just expired, so I should spend more time on this blog / development thing. If you've been following my series (all two episodes of it), which I'm probably going to prefix from now on to make it more recognizable from the blog (and site) index, you'll know that this series is about building an application, from the initial phases to the actual running of it.

Long sentence, excuse me.

In this post, I'll get to the first thing that you really should do before getting down to coding. I know that a lot of people - including myself - have an idea for a website or -app and just start hacking away in code, building up their program incrementally, slapping on features whenever they feel like it. I'm not saying that is a bad thing, by the way, just making note of it.

For this project, however, I'd like to work on it in a structured and organized fashion. To apply structure to a project however, one first needs to define the project, to make a list of Things It Should Do. For this particular project, it's been milling around in my head (and on various forums) for probably years now, but I never got around to putting it into words.

...Alright, I'm lying here, I did write a two-page document in half an hour or something early this year. But for the purpose of this document, let's pretend that didn't happen, alright?

In any case, back in the old days in uni (or the Dutch equivalent of that, HBO), I 'discovered' a technique called brainstorming. Or, to be more accurate, I found a piece of software written for the purpose of brainstorming. I played around with it a few times, read around the internets (or well, Wikipedia, the rest of the internets doesn't matter much about such subjects), and even applied it to a few smaller projects.

Brainstorming is, as Wikipedia puts it, "a group creativity technique designed to generate a large number of ideas for the solution of a problem." But of course, and for my own purposes, this can also be applied to just yourself.

Now, one of the key things about brainstorming - or, that thing I like to do to think about a project to be done - is that you need to be able to write your ideas down quickly, without being bothered with things like formatting or things like that.

The particular piece of software I referred to three paragraphs ago is called Freemind, an open source, visual mindmapping software kit. In itself, it's really not that great of a program - it lets you make graphs, and add pretty colors and fonts to it. See the screenshots I stole from their own site.

http://freemind.sourceforge.net/FreeMind-computer-knowledge-thumb.png http://freemind.sourceforge.net/FreeMind-my-health-thumb.png

The thing that made it work for me though is that it's easy and quick to use, with just your keyboard. You create a new (sub)node with insert, and add a node on the same level with enter - that's it. You can navigate with the arrow keys, too.

Now, with the softare installed, we go to the actual storming of ye brain. It's important that you can spend some time on it - half an hour to an hour should be enough time to get a lot of ideas out there, but try to take as long as you still get ideas. Also, if you're easily distracted, turn off all of your IM and email software (or the internet in general), put on some music (that doesn't annoy you into skipping it too often), whatever you need to be able to concentrate for a little while.

Second, one of the key rules of brainstorming is: Don't judge. Ideas only, write them all down, do not delete anything. Nothing. Thinking about an idea beyond adding some more in-depth ideas about them will destroy your creative high. Or well, can destroy it.

In any case, let's start with the actual process. Open up Freemind, and put The Word in the center. This 'root node' is the central idea, the central concept of the thing you're trying to create ideas for.

Next, enable Automatic Layout, it's under the Format menu. This'll give the nodes colors and styles automatically, so you can differentiate between deeper levels without having to manually edit the formatting - because that'll distract you, and break the flood of ideas.

Then, it's time to get busy. Write down the first things that come to mind when you look at the first word. Key words, random ideas - just spew out anything. Don't worry about it being in the wrong place - you can easily move it once your ideas crystallize.

I blurted out 'Community website' and 'Music news from various sources' (simply typing those words and pressing enter) after a few seconds. When typing down that last one, the 'sources' came bubbling up, so then I pressed Insert to add nodes to the 'sources' node. Here's an image of what it looked like after blurting out a few ideas.

http://img405.imageshack.us/img405/9904/mindmap1.png

'WTF', quoth I, 'Automated?'. Well yeah, it's not very likely you will be able to gather a team of editors that spend enough time writing up articles to fill your site with content, especially not if your site pretends to have a wide audience and coverage of most genres, does it? Or that's what the random idea was. So, the minute your original train of thought is derailed by ideas and thoughts popping up about that 'automated' thing, you insert into that node, and spew out key words - 'crawlers', 'automatically gathered, manually checked and edited', 'daily / continuously / regularly', as well as questions that suddenly arise, such as 'permissions?', about whether it'd be legal to crawl certain pages on Myspace to effectively copy content.

Oh, and don't worry about technical implications at this point - you're spewing ideas instead of being realistic. Besides, in this day and age, almost everything is possible - at least, technology isn't as much a factor anymore. I can cook up a simple crawler in a few minutes if I need to. In fact, I did a few years ago, for the heck of it and because I didn't want to shell out hundreds of dollars to get a database dump of my free-hosted forum, wrote up a multithreaded forum crawler thing in an afternoon (or two?) and had it backup the 250.000 posts gathered over the years.

But I'm distracting myself. I should get back to properly finishing that mindmap now. Be right back.

There. I probably didn't follow some of the things I said in this post, but I don't listen to myself, nor should you - do what you feel is right, there's really no rules in this thing besides being creative and listening to yourself.

I was going to format the map I cooked up in just a few minutes (ran out of ideas then), but then the program crashed (I used the most recent pre-release version). Do make sure to save regularly. I was lucky that Freemind automatically makes backups, in your user profile folder, subfolder .freemind. Better save it properly this time around.

Below is the image of the mindmap. I'm too lazy to upload the .mm file for you to play around with at the moment, so it'll have to do.

http://img28.imageshack.us/img28/3172/musicaggregationwebsite.th.png

I think that about wraps it up. The next step is to copy the ideas and put them into a proper word document, put the random ideas to writing. It's preferable you don't wait too long with this, or that you at least go over the mindmap and add enough things to it so the random words and sentences make sense, and that you go 'Oh right that's what I meant with that' when you see it again later. I'll try to do that for next time, but won't bore you with a post about that. Instead, I think I'll write up The Plan itself, or what the site should do for a first version. Based on that come requirements, and from there on I can start thinking about the technical side of things - technical requirements, to be precise. And based on that, and I know all of you are more interested in that than this overly long paragraph, I can look into programming languages, frameworks, databases, webservers, etcetera. I'll try not to be biased in that.

tl;dr, see you later. C&C is welcome, I probably should add more images and actually re-read my post before posting it, but I'm lazy.

Installeren van Trac, voor geweldige justitie nl

Door YopY op dinsdag 11 mei 2010 13:37 - Reacties (7)
Categorie: -, Views: 6.097

Hé hé, tweakblogs menu weer gevonden.

Deze post zal in het Nederlands zijn, aangezien er al een redelijk leesbare handleiding voor het onderwerp van deze post beschikbaar is op het internet. De post is een beetje uit volgorde - in mijn vorige post beloofde ik dat ik het min of meer op volgorde ga doen, maar dat is heel moeilijk (ook aangezien ik nog niet aan het officiële plan begonnen ben).

Het onderwerp van deze post is onderdeel van een halfbakken serie over het opzetten van een ontwikkelomgeving. Om dit alvast uit te doeken te doen, mijn definitie van een ontwikkelomgeving betreft:
  • Een development server (aangezien het een webapp betreft
  • Een IDE (want een editor is gewoon niet pr0 genoeg
  • Een issue management systeem
  • De Rest
Het derde punt zal de gemiddelde hobbyist misschien een beetje vreemd overkomen, maar het is, denk ik, wel iets dat kan helpen met het op een georganiseerde manier werken. Je kunt het ook zien als een soort van 'to do list', zoals ik het in de eerste fase van het project ga gebruiken, waarbij je je features (en subfeatures) één voor één kunt afvinken. Als je het systeem goed bijhoudt, kun je zeggen dat je bij de eerste release versie bent zodra je alle issues die daarbij horen af hebt.

Maar dit is allemaal natuurlijker uit te leggen als het systeem er eenmaal staat. Nog een beetje achtergrond, en dan begin ik met de echte post.

Voor m'n werk (webdeveloper voor tot noch toe een dozijn-en-nogwat websites, samen met sinds een paar maand twee andere developers, sinds vorige week een projectmanager, en hopelijk binnenkort nog een frontend developer) gebruikten we de afgelopen twee jaar (nog van voor mijn tijd) nog Mantis, het systeem dat Tweakerts.net ook gebruikt.

Echter, op den duur voldeed dat niet meer. Het is op zich geen verkeerd systeem, maar het is voor een semi-leek zoals de non-developers onder ons niet makkelijk in gebruik of overzichtelijk, het voelt en lijkt zwaar uit de tijd, en zo nog een lijstje met dingen die, volgens ons, beter konden.

Het bedrijf van wie we het content management systeem in licentie hebben voor onze websites gebruiken intern Jira, een grote, bekende maar commerciële issue tracker, maar door de stevige prijsvoering niet echt een optie voor ons. Dus ik mocht op zoek gaan naar een alternatief.

Uitendelijk waren er twee kandidaten: Redmine, een issue tracker op Ruby on Rails gebouwd en Trac, nog een issue tracker op Python gebouwd. Beide systemen zijn globaal gezien vergelijkbaar qua features - issue tracker, ingebouwde wiki, integratie met Subversion, Mantis import optie, etc - en qua licentie - beide zijn het open source projecten - maar uiteindelijk is voor Trac gekozen omdat die volwassener oogt en voelt, meer gebruikers heeft en daaropvolgend ook beter support heeft, zouden er wel problemen zijn.

Dus, ik Trac installeren, met een verouderd en niet-werkend Mantis import script worstelen, en uiteindelijk is het gelukt.

Er lopen geruchten dat Trac moeilijk is om te installeren, en dit kan inderdaad waar zijn, maar als je de makkelijke weg kiest - zoals ik - valt het genoeg mee. Ik heb het in Windows geïnstalleerd (omdat we dat van de systeembeheerders kregen, :w), maar de installatie voor Linux en Mac moet vergelijkbaar zijn.

De makkelijke manier


1. Installeer Python.

Trac ondersteunt het redelijk splinternieuwe Python 3.0 nog niet - ook omdat die opzettelijk backwards compatibility de deur uitsmeet (wat ik alleen maar kan aanprijzen, overigens, mits de oude versie nog een tijd ondersteund wordt). Python >= 2.4 en < 3.0 is dus nodig. Wij hebben de meest recente stabiele 2.x versie gebruikt, [http://www.python.org/download/releases/2.6.5/]versie 2.6.5 van Python[/url]. 2.7 zit nog in béta, dus die hebben we nog niet gebruikt (wat overigens een beetje hypocriet is, aangezien we Trac 0.12 gebruiken, die ook nog maar net in de eerste beta zit).

Python 2.6.5 komt gewoon in een installer, dus kies je smaak, en gaan met die banaan. Vervolgens wil je Python ook in je systeem z'n PATH zetten. Ik weet niet of iedereen daar bekend mee is, dus:
  1. Rechtermuisklik op Deze Computer -> Eigenschappen
  2. Geavanceerde tab (XP), of linkje Geavanceerd in Windows 7, dan tab Geavanceerd.
  3. Knopje 'Omgevingsvariabelen' indrukken
  4. Pak de variabele 'PATH' (of 'Path') in het lijstje van systeemvariabelen, en vul deze aan. De bestaande informatie niet aanpassen, overigens. Scheidt het vorige pad in deze lijst met een puntkomma, en vul in:


    code:
    1
    
    c:\Python26\;c:\Python26\Scripts



    (waar c:\Python26 je installatiedirectory is). Zo kun je op de commandline Python aanroepen, en kan de andere software Python ook vinden.
De volgende stap:

2. installeer Setuptools.

Setuptools is een setje van installatietools voor Python bibliotheken, ruwweg gezegd. Dat maakt het installeren makkelijk. Ook dit komt gewoon in een installer voor Windows, dus selecteer je platform en de versie van Python die je hebt (de 2.6 versie in dit geval) en gaan met die banaan. De installer installeert een .exe in c:\Python26\Scripts, dus die werkt gelijk vanaf de commandline na installatie.

Tot zover het moeilijke gedeelte.


3. Installeer Genshi.

Genshi is een template taal voor Python, van dezelfde makers als Trac. Is nodig. Om het leven je makkelijk te maken, open een commandline (start -> uitvoeren -> cmd) en typ:


code:
1
easy_install Genshi



Even wachten, klaar.


4. Installeer Trac

Commandline, typ


code:
1
easy_install Trac



klaar.

Ja, dat is het.


5. Trac omgeving initialiseren

Vervolgens gaan we nog even "een Trac opzetten". Ga weer naar je commandline, en typ:


code:
1
trac-admin c:\trac\mijnproject initenv



Even wachten, klaar. Lijkt wel een magnetronmaaltijd. Dit commando zal je een tweetal vragen stellen - de naam van je project, en een database connectie string. Out-of-the-box komt Trac met ondersteuning voor SQLite, dus door gewoon op enter te drukken bij de databasevraag maakt Trac automagisch een SQLite databasebestand aan. Wij gebruiken het ook, en voor het meeste werk moet het gewoon voldoen.

Tenslotte starten we de webserver even op. Ja, Trac komt ook met een ingebouwde webserver.


code:
1
tracd --port 8000 c:\trac\mijnproject



Nu kun je een browser opstarten, en naar http://localhost:8000 gaan om je splinternieuwe Trac omgeving te bekijken. Of, een lijst met projecten die je lokaal hebt te draaien - je kunt per project een nieuwe Trac omgeving opzetten, wat wel zo makkelijk is als je de zaken gescheiden wilt houden.

Dat is het. Ik zal nu een eind aan deze post breien, want volgens mij ben ik al driemaal over de aandachtsspanne heen.

De moeilijke manier van Trac installeren behelst:
  • Het installeren en draaien onder je eigen webserver (Apache)
  • Het gebruiken van iets anders dan SQLite (mag je ook de databasebindings voor je databasesoftware gaan installeren)
  • Localisatie toevoegen (nog zwaar beta)
  • Trac (+ de rest) zelf compilen vanuit de source
Ik heb geen zin om dat allemaal uit te leggen (ook omdat ik het niet gedaan heb, :+), dus doe ik goedkoop en plaats nog een linkje naar de officiële installatiehandleiding (engels).

En met dat sluit ik af. Ik kan, indien zo gewenst, nog een post wijden aan de werkwijze die ik zal aanhouden - als daar vraag naar is natuurlijk.

Verder zou ongezouten kritiek op deze post ook welkom zijn - duidelijkheid, schrijfstijl (opzettelijk informeel), leesbaarheid, nuttigheid, etcetera. Maar ik verwacht niks minder, :w.