Hey you!

Postcards are cool! Go send some ->

postme.me

I kicked myself in the balls

Dec 05 2011

Nice sunny Sunday here in Ljubljana yesterday. Around noon something particularly odd happened though. The week was over. I had finished everything I absolutely had to do, there was no more coursework, no more tasks for this week in pivotaltracker … nothing.

The tweet that sealed my fate

The tweet that sealed my fate

14 hours of pure unadulterated freedom.

I felt drunk. I didn’t know how to handle myself. Can’t even remember the last time I had free time and didn’t have to worry about everything lurking on the other end.

A couple of lessons

  1. Your code is broken, you just don’t know it yet
  2. Rejoice about free time and you will jinx it
  3. Take advantage of free time immediately
  4. Internet Explorer has almost matured into a browser

But everybody already learned those lessons long ago right?

Having unscheduled time plomped into your lap like this is strange. There are a bunch of things you’ve been putting off for months that you could do, there’s that book or three that have been waiting for attention since two summers ago, books you bought a month ago but only read 100 pages of, hell, it’s sort of sunny outside and maybe you should venture out on that new longboard despite somewhat wet conditions?

The abundance of choice is truly paralyzing … until somebody helps out.

I did end up going for that longboard ride and started working on fixing up some outstanding bugs on my blog, there’s that mobile mode people have been crying about for months, the footer was broken and I even flirted with a small hack project that’s been rolling around my head for weeks.

Not two hours after I set out on the epic fixing of everything that the US woke up and somebody decided to test my code before pushing to production.

It broke. Three small issues. Just an hour or two to fix surely. Small bug on IE, but I’m sure I can find a windows box in the apartment somewhere to figure it out …

Seven hours, two very deep bugs of which the reported bugs were just symptoms, one very strange django QuerySet behavior and two cups of tea later … it worked. Everything worked. We pushed to production and I collapsed into bed.

So much for my free Sunday.

Enhanced by Zemanta

4 responses so far

Simple trick for testing forms full of checkboxes with django

Dec 02 2011

In late 2011 I hope we can all agree that unit testing is pretty important when creating websites or almost anything. Doesn’t really matter whether you prefer a blackbox integration testing approach or a strict unit testing style. What matters is that you have tests.

English: A series of build lights.

Image via Wikipedia

But what do you do when you want to test a form with a bunch of checkboxes?

You want to make sure all combinations of on/off tests are working. But with even just 6 checkboxes that’s 2^6=64 test and … well nobody in their right mind is going to write that many tests are they?

Last weekend I came up with a simple solution to this problem, dare I say elegant.

The approach is to make a list of checkboxes, then generate binary numbers from 0 to 2^(length of list). Then simply iterate over the generated binary numbers, pick all the checkboxes with a corresponding true bit in the number and run its test – the tests are lambda functions in a dictionary.

My code was complicated slightly because I had two distinct sets of checkboxes that had to be tested separately-ish, but here’s what this basically looks like in code.

    _columns = ['job_code', 'location_in', 'location_out', 'shift_report']
 
    def checkboxes(self):
        checks = []
 
        for i in range(2**len(self._columns):
            column_switch = bin(j)[2:].rjust(4, '0')
 
            checks.append([name for (yes, name) in
                           zip(column_switch, self._columns) if int(yes)])
 
        return checks

You also need to define the actual tests for all the checkboxes, deciding how thorough to be is a matter of personal taste, I like to test for the smallest possible symptom.

_column_checks = {
            'job_code': {True: lambda r:
                             self.assert_('<th>Job Code</th>' in r.content,
                                          "no code column"),
                         False: lambda r:
                             self.assert_('<th>Job Code</th>' not in r.content,
                                          "is code column")},
# and so on (this example has been violently snipped, likely missing a } or two

‘ in r.content, “no code column”), False: lambda r: self.assert_(‘Job Code

‘ not in r.content, “is code column”)}, # and so on

And finally the whole thing becomes a simple loop

     for checkboxes in self.checkboxes():
          # do a bunch of posts to django to set everything up
 
          for check in _column_checks.keys():
                _column_checks[check][check in checkboxes['columns']](response)

And that’s it. Simple easily modifiable code to test every possible combination of all checkboxes in a form.

Enhanced by Zemanta

Comments Off

I wish my doctor was a vet

Dec 01 2011

Over the weekend my cat got seriously ill. She hasn’t been eating well for a while, but you know how cats are, they always pull through and with a very hairy kitty you don’t even notice there’s any weight loss.

My cat

My cat

I mean, I’ve seen her avoid eating for several days simply to extort getting tastier food.

This time though it was serious – we took her to a vet. Turns out she nearly died and even now we won’t know if she’s going to pull through until Friday (tomorrow).

But that’s not what I want to talk about. I want to compare what it’s like visiting a veterinary with a sick pet and what it’s like for a sick human to visit a regular doctor.

A tale of two doctors

The vet was very busy. They had an emergency surgery going on, there was a dog that needed a long procedure done and we ended up waiting for half an hour before the vet could give the kitty a proper examination.

When we got in, through profuse apologies over our half an hour wait, he immediately started explaining possible reasons for the cat’s weight loss and explained in detail which tests will be performed. The cat was then sedated, blood was taken and he immediately took it to another room to perform bloodwork.

Something about checking kidney, liver and pancreas function. While we were waiting he took on some other pets, but kept coming to check back on us every five minutes or so while the bloodwork was being done – presumably by a machine.

The whole thing took about twenty minutes and showed a pretty grim picture. There was a fair chance Kitty had aids because her white cell count was practically zero and it looked like her liver might be completely fried. We were shown graphs and carefully explained what they meant.

After the aids test came back negative an assistant shaved the cat’s tummy and the vet performed ultrasound. I got to see my cat’s innards and even though I couldn’t really tell what was going on the vet explained it pretty well – not only giving me an aloof explanation and symptoms, but carefully explained the reasoning behind everything he said.

Save for picking apart words, I couldn’t really understand what he was saying, but the fact he explained everything was very reassuring. Made it look like he wasn’t just pulling things out of his arse.

Cat has some sort of bacterial infection of the liver and now we have to take her back every day for shots, feed her a carefully selected diet and tomorrow we’ll know if she’s making a recovery and will be able to eat her meds as pills.

Looks good so far, she’s started eating pretty well. That’s a good sign I think.

Oh and the special diet, the medicine we have to give her – all provided by the vet, he even lent us a kitty box so we can transport her to and fro easier since we’ve lent ours to my gran. The whole visit was over with in about two hours.

And the vet spent another five minutes at the end to profusely apologize about the half an hour wait.

Compare that to my last brush with healthcare.

A few years ago I got really sick. The kind of sick where a proud doctor-disliking 20-something crawls out of his bedroom one day and asks his mother to take him to the doctor.

Geeky cat

Geeky cat

When we got there it wasn’t particularly busy, but we were first reprimanded that we dared come when my personal doctor wasn’t working and are forcing somebody else to work. Imagine that! And we didn’t even have an appointment or anything, how dare we!?

I had such a high fever I wasn’t really processing everything, but the doctor said it looks like I might have something weird so I should probably get some bloodwork done.

They sent me to a whole other part of the building, where I had to wait in another waiting room until somebody could draw my blood. While waiting I got really lightheaded and nearly collapsed into the blood letting chair. I think a couple of nurses actually jumped up and caught me so I didn’t fall to the ground.

Eventually I made my way back down to the original doctor and waited in the waiting room.

When it was finally my turn again i was told that I have some sort of viral angina, which is odd since angina’s are usually bacterial infections. But whatever.

I was told not to leave home for at least a month since one of the symptoms is swelling of internal organs and any physical exertion could rupture my spleen … I think with a ruptured spleen you bleed out in a couple of minutes?

Nevertheless, I was given antibiotics, because maybe, just maybe, it wasn’t a viral angina after all, or it might be both types of angina at once.

What?

This meant a trip to the pharmacy before going home as well …

The whole thing lasted something like four hours, I visited several different doctors – luckily in the same general building – and was eventually told that the simple act of walking around could kill me.

Public vs. private?

But that’s public medicine for you.

This probably isn’t really a comparison between vets and human doctors, but a comparison between private and public medicine, which really makes me wish I could afford private medicine and that if I do in fact start affording private medicine, that doesn’t mean I have to keep giving god knows how much money to public medicine.

Enhanced by Zemanta

One response so far

Shuush – perfect tool for all my twitter followers

Nov 30 2011

Shuush turned on

Shuush turned on

Ever since I started using twitter people have been accusing me that I talk too much. In the early days pretty much everyone told me this whenever we would meet in person, as more and more slovenians poured onto twitter and the whole thing has become a bit more mainstream it’s not that big a problem anymore.

But, still, if you follow less than about 200 people … let’s just say I have been known to fill an entire screen for such people when I really start talking. You will also notice that I tweet most of my blogposts three times.

To be fair it’s not actually that bad, you’re just not following enough people. On my twitter I only come up every fifty tweets or even less frequently. Most of my followers wouldn’t even notice a single of my blogpost tweets!

Fear not! Dear twitter people of the world, if you find me annoying and because there are some even more annoying people – there is now a new experimental twitter client that you can use!

Enter Shuush, stage left.

The idea is very simple, assign a spaminess score to people and display tweets so that font size is inversely proportional to the spaminess score. Brilliant. Elegant. Genius.

Here are some screenshots, but you should really try it out yourself.

Shuush turned off

Shuush turned off

Shuush turned on

Shuush turned on

Mousing over a tweet shows the user's score

Mousing over a tweet shows the user's score

Enhanced by Zemanta

One response so far

Music and The Zone

Nov 29 2011

A lot has been said about The Zone – that magical place where doing something you love becomes instantly self-rewarding and you pull yourself along until you emerge on the other end. Slightly confused, a bit shaggy and you wonder why on earth are you hungry.

Deutsch: Portrait Beethovens mit der Partitur ...

Image via Wikipedia

In fact, a couple of hours passed since you started working. You didn’t notice. The code is beyond any level you think yourself capable of achieving and when you try to understand how it works … it doesn’t really  make sense. But it works, passes all the tests, is beautiful and elegant. Feeding yourself might be a good idea as well.

The Zone happened to me a lot more when I was younger. There’s something about being 12 years old and creating what you believe to be an operating system that destroys any and all distractions. They simply don’t exist. In those days a comet could have landed on my head and although dead, I wouldn’t have been distracted.

Now I have the internet, a bunch of stuff on my mind and nobody to remind me I should eat and sleep – getting in The Zone is harder. And when I was little I thought two weeks of coding was a sprint, now anything more than a single night feels like a marathon … because I get more done, I think.

For the past couple of months I’ve done a lot to figure out how I can get in The Zone better and I think music is a big part of it. Choosing just the perfect music for the perfect time is hard, but doable.

Another important bit is that when I find it very very difficult to focus, I must go somewhere where there are a lot of distractions. Counter-intuitive, I know, but it works. I either blast three songs at once, or go to a coffee shop.

Coffee shops are awesome. Something about everyone walking around, having conversations, music blasting out of the speakers and a nice cup of tea combined with a comfy chair really works wonders for my concentration. Maybe because my brain is so taxed that it simply has to focus just to function?

The interesting bit is that my taste of music when coding changes a lot more than normally. It’s also very different from the music I usually listen to in that same day.

Lately my favourite has been Mozart and, of all things, Tchaikovsky … how the Nutcracker makes for good coding music is incomprehensible, but there you go, it does. Beethoven is also a good choice, especially the more dramatic pumping symphonies.

At other times I prefer something witha  bit more bass. Skrillex has worked particularly well for a while, then there’s a Tetris remix playlist I made on Spotify that does wonders for my productivity. About a hundred versions of the same freaking song and it’s just awesome.

All things considered, the only thing that really matters for getting in the zone is that my environment not be silent and distraction free. My brain simply can’t handle that …

What kind of music do you listen to when working? Spotify gives me this unlimited jukebox, but I need to know what to look for.

 

Enhanced by Zemanta

One response so far

A turing machine in 133 bytes of javascript

Nov 28 2011

Multiply turing machine

Multiply turing machine

The fact it took me 20 lines of javascript to implement a nondeterministic turing machine simulatorlast week kept me up at night. All weekend. Too much code for something so simple and I kept having this gut feeling implementing a basic version shouldn’t take more than 140 bytes.

Sunday afternoon I sat down for about an hour, collected my thoughts, and started pumping out code with cryptic variable names. It was beautiful, first version was around 250 bytes, then 170, then 156, then bam! 133. Oh yeah baby!

function tm(I,t,e,s,i,c,k) {i=0;while(s!=e){c=t[i];k=(c)?I[s][c]:I[s].B;if(!k)return false;t.splice(i,1,k.w);i+=k.m;s=k.n;}return t;}

I was left with a horribly looking yet simple function. All it needs are some instructions, the initial state of the tape as a list, an end state and a start state. It will return either the final tape state or false if the end state is never reached. ‘B’ is considered a blank state and the tape behaves as infinite in both directions.

If you want a file ready-made to run in node, go to my github.

Here’s a far less interesting but readable version of the same code (324 bytes):

function tm(I,tape,end,state,i,cell,current) {
    i = 0;
    while(state != end) {
        cell = tape[i];
        current = (cell) ? I[state][cell] : I[state].B;
        if(!current)
            return false;
        tape.splice(i, 1, current.w);
        i += current.m;
        state = current.n;
    }
    return tape;
}

For testing I used a simple multiply program that basically turns 111 into 1110111. For any length string of one’s. I decided to be pretty strict about inputs this time because I didn’t have the room to transform anything, so this is what the algorithm’s implementation ends up looking like

{"q0": {"1": {"w": "B", "m": 1, "n": "q1"}},
 "q1": {"1": {"w": "1", "m": 1, "n": "q1"},
        "0": {"w": "0", "m": 1, "n": "q2"},
        "B": {"w": "0", "m": 1, "n": "q2"}},
 "q2": {"1": {"w": "1", "m": 1, "n": "q2"},
        "B": {"w": "1", "m": -1, "n": "q3"}},
 "q3": {"1": {"w": "1", "m": -1, "n": "q3"},
        "0": {"w": "0", "m": -1, "n": "q3"},
        "B": {"w": "1", "m": 1, "n": "q4"}},
 "q4": {"1": {"w": "B", "m": 1, "n": "q1"},
        "0": {"w": "0", "m": 1, "n": "q5"}}}

Solving this little puzzle was heaps of fun and the result is code that I would never ever want to see in production (if you code like that there is a special circle of hell for you) … now I’m just left wondering if there’s a smaller solution in a less verbose language. Can it be made so small I could tweet “Turing Machine: <code>”?

Food for thought.

PS: the shortest solution by subzey in 79 bytes

function(a,b,c,d,e){for(e=0;d<c;)with(a[d][b[e]||"B"])b[e]=w,e+=m,d=n;return b}
Enhanced by Zemanta

27 responses so far

On writing every day

Nov 24 2011

Stephen King

Stephen King (Image via RottenTomatoes.com)

Yesterday someone mentioned on twitter that it’s amazing how I write a blogpost every day, especially considering the quality of my posts. Leaving aside for a moment considerations that this might have been an epic case of sarcasm … writing a post every day isn’t that difficult anyway.

When you think about it, everyone probably writes a blogpost’s worth of words every day.

  1. Many people tweet about 20 times a day – that’s roughly 140 words right there. Enough for a daily tumblr blogpost thing
  2. Those using facebook probably write about  5 status updates a day – 50 words right there?
  3. And you probably write email as well. This gives you at least 300 words a day.
  4. Hang out on skype or IRC? Doubtlessly at least 200 words a day right there as well.

Considering those numbers, it’s safe to say the average internet citizen writes 500 to 1000 or even 1500 words every single day. In my experience the sweet spot for blogs is ~600 words.

This means that each and every one of you writes a blog post or two every day. Why aren’t you publishing this anywhere?

Statistics aside, writing is mostly about practice. I would love nothing more than claim writing is an inherent talent and make myself feel super special – but I can’t. It’s just practice, practice and when you think you’re just about done, some more practice.

The part that isn’t practice is the discipline to plomp your arse down and write be it rain or snow, sunshine or a cat begging to be fed. Staring at a blank page is always a little daunting, but once you actually get going your mind will usually take care of the rest and keep you going.

It helps if you can type too … knowledge of at least one human language doesn’t hurt either.

Doing the daily 750 words has helped me immensely with the part of plomping my arse down and writing. My problem has always been that I’m sort of good with keeping a train of thought going – much to the surprise of anyone who’s ever talked to me in person – and delivering in a digestible sometimes even entertaining form. I’m lucky that my writing rarely makes people vomit.

After 750words gave me an incentive to write roughly three pages of text every day, and assured me that it really really doesn’t matter what I write – silencing my inner critic so to say – everything got much simpler. Combined with the daily blogpost my baseline for writing every day is probably around 1400 words every single day. And that’s before all the twitter and email!

Writing incentives!

Writing incentives!

Quite a bit of words

Quite a bit of words

Actually, now that I think about it … why am I writing so much and not working on the next big novel, like I’ve wanted to since I was 10? There’s a whole competition going on right now (NaNoWriMo) about getting people to write 1666 words every day to produce a novel in a month. Looks like I’m producing a novel-length wall of text every month and a half …

But anyway, if you want to start writing something every day, and I heartily suggest that you do, there are two easy steps to take: write and write. It’s that simple.

If you want also to show anyone what you’ve written, I suggest giving On Writing, by Stephen King a read. Awesome book that will fix up your style in no time. Really helped iron out all the “look at me, I’m a writer and this is significant” bullshit out of the way I write.

Enhanced by Zemanta

Comments Off

Nondeterministic turing machine simulator in 23 lines of JavaScript

Nov 23 2011

The machine I used for testing

The machine I used for testing

Felt like doing some coding last night and since my friends were just trolling me about codegolfing a turing machine simulator(they need it for a term paper), I decided to do just that.

At first I wanted to make it super simple, 10 lines of code max … and I failed.

What better way to embrace failure than to implement a simulator of nondeterministic turing machines in as little lines of code as possible?

Adding “eps” to the alphabet of course – basically a means for the machine to know when it’s gone off either end of the tape and that it can also write nothing to the tape. Both very useful features!

And here’s the code in all its glory. You can also view it on github if that’s your thing.

// transition format: {from: 'q1', to: 'q2', via: 'A', put: 'B', move: 1/-1}
// spits out whether end state was reached
// basic way to run:  node turing.js machine.json 101 q4
// node turing.js   
 
var _ = require('underscore'), states = {};
 
var delta = function (states, step, end) {
    if (_.keys(step).indexOf(end) &gt;= 0) return true;
    var _step = {}, foo = _.keys(step).map(function (k) {
        var i = step[k][0], t = step[k][1],
            cur = (i &lt; 0 || i &gt;= t.length) ? states[k]['esp'] :  states[k][t[i]];
            if (cur) cur.map(function(cur) {
                if (cur.put != "eps") t.splice(i, 1, cur.put);
                _step[cur.to] = [i+cur.move, t];
            });
    });
    return (_.size(_step)) ? delta(states, _step, end) : false;
};
 
JSON.parse(require('fs').readFileSync(process.argv[2], 'utf-8')).map(function (i) {
    states[i.from] = states[i.from] || {};
    states[i.from][i.via] = states[i.from][i.via] || [];
    states[i.from][i.via].push(i);
});
 
console.log(delta(states, {"q0": [0, process.argv[3].split("")]}, process.argv[4]));

Basically what you’re doing is performing a breadth-first-search on a graph, looking for the end state and a pinch of complications with observing contents the tape as well. You should make sure not to accidentally implement a depth-first search since some branches might never terminate.

The above implementation could probably be codegolfed some more, but I don’t like codegolfing by just compating lines beyond what is reasonable. I much prefer doing it with languages features and perhaps algorithmic improvements.

One of the biggest hindrances to making this much shorter is that a lot of operations on javascript arrays affect state, but don’t return the new object as well. Lost at least three lines because of this!

An approach worth trying would be to perform a reduce on the tree of states and if the start and end state ever overlap, you know to return a truthy value, otherwise you go with something falsy. But I wasn’t sure how to go about that.

Enhanced by Zemanta

2 responses so far

TEDxYouth Ljubljana report

Nov 22 2011

Sunday saw the eighth TEDxevent in Ljubljana and through immense luck I was able to attend despite forgetting to reserve a ticket.

Driving a car over the internets

Driving a car over the internets

Twitter is kind of cool like that, you ask if there’s any way to sneak into a sold out event happening the next day, somebody says they don’t need their ticket and then does everything needed to get the organizer to change the ticket. Thanks @freeeky for being awesome like that!

I manage to get into the event and two things happened – I couldn’t for the life of me connect to the wi-fi, and I was seated in the back back row so was mostly looking at the cameraman’s head.

Nontheless, it was a kickass event! Really happy I managed to attend.

I mostly remember the brilliant talk by Jure Aleksejev – he was the only person there without something specific to show. He had only a message and the flawless rhetoric delivery of someone who is really really good at rhetoric. You can see about five minutes of his talk in my bootleg crappy video, but it should give you some idea of how cool he was to listen to.

The message was basically that Slovenia is a country doing stupid things. We think we’ll be able to fix our economy and become awesome by emulating the large western empires, except we forget we aren’t actually a large country and should therefore pay attention to creating wealth instead of simply shuffling it around.

Another brilliant talk was by Luka Manjolovič, if for naught else than he drove a car over the internets. That’s right ladies and gentlemen, a live demo right there on stage. Through the internets! That’s guts right there. Oh and it worked too.

All the other talks were pretty awesome as well.

Jure Brečko deserves a special shout out for being epic enough to give us a candid charming presentation full of natural charm. You can’t fake something like that. Plus he invented a cheap and effective way to do some important farm stuff I won’t even pretend to understand, a full five hours before deadline! Score!

I hate to be a sourpuss, but one presentation stuck out for being … simply bad. I don’t know if it was nerves, or she didn’t prepare well, but that was not TED-level presenting there. Not going to name names, just going to say that it made me giggle when she said with special pride that against what her childhood friend said, she did not end up a garbage collector, nope, she’s a graduate sociologist!

Yep.

On a more positive note. Burekwood was a brilliant cartoon. Kudos to all the 12 year olds for making it, charming story. The perfect way to finish off the TED talks. Can’t find the video of burekwood right now, but hopefully the official videos will be available in no time.

PS: I wish I had some good pics to show, but I don’t

Enhanced by Zemanta

8 responses so far

Best blogging week I have ever had

Nov 21 2011

Somewhere around June this year I set a challenge for myself. I wanted a sustained 20k visitors every month on swizec.com by the end of the calendar year.

It's a spike!

It's a spike!

The only real step towards this goal was to start blogging regularly. At first I would blog exactly twice a week on specific days, eventualy I started blogging daily.

Here’s the strange thing – it actually worked.

By blogging every day I have ensured not all of my posts will be super brilliant, but the sheer amount of practice I’m getting has meant that even on my worst days I can simply sit down and pump something out. Even if it’s dreck, even if I feel nobody will be interested. Such posts only end up as a reminder for people that hey, there’s this blog, you sometimes like it … it’s still alive. Just letting you know!

Last week something strange happened.

I filled my monthly “quota” in a single week … somehow my little personal blog managed to garner the attention of 32,820 visitors. What’s stranger still, 96% of these visits were from Friday to Sunday. Mostly because of two posts.

Not sure exactly what happened, but apparently people love being told that startups are awesome and why I love working for them. Another thing that really seems to pique people’s interests are strange lines of python.

A good blogging week

A good blogging week

Those two posts together have been tweeted 242 and G+’d 38 times. Strangely though, this does not beat the record holder – a post about apple’s ping being a big pile of steaming dung – which managed to get 248 tweets on its own.

But all these visits and tweets and comments (about 30 per post) don’t mean a single thing without the very important metric of how many people actually read them?

I’m happy to say that the post about startups was read to its completion by about 38% of visitors – for a 1000+ word behemot that’s a lot on the internet. The python post also did remarkably well with a 65% completion rate! Yay!

I think the python post can easily be explained by all the expert pythoners looking for the punchline since it turned out that line wasn’t so much strange as me and my friends are stupid.

Even long posts can have good completion rates

Even long posts can have good completion rates

Short confusing posts do _very_ well

Short confusing posts do _very_ well

You might think the stats for the python post are poisoned by the startup post doing so well, but according to google analytics there was so much significantly more traffic on the python post that this is practically negligible. In fact you can see this in the above cutoff, 11k people on 17th paragraph, and only 1700 on the 18th paragraph, which the python post doesn’t have.

However, I am happy to say that the post about startups has proven remarkably resiliant and it still got more than 1000 visitors even yesterday.

Wonder if I’ll ever manage to repeat something like this.

Also, mixpanel thinks I’m problematic despite my life-time AppSumo account thing.

Mixpanel crying

Mixpanel crying

Enhanced by Zemanta

2 responses so far

« Newer - Older »

« Strangest line of python you have... TEDxYouth Ljubljana report »