14 comments

[ 0.22 ms ] story [ 42.5 ms ] thread
> 502 Bad Gateway

I believe your go process crashed. Consider using something like runit or supervisord.

A Go webserver shouldn't need supervisord. If the program is crashing then that's a sign of a more serious exception which needs to be fixed (eg unsafe global variables) as most other exceptions will just force a stack dump but keep the parent process running.
Whilst they are nonetheless interesting and worth seeing, there really does seem to be an abundance of really small (30-200 SLoC) projects being posted and reaching the front page recently. I'm just curious because I'd usually consider these sorts of things ~20 minutes' work (plus potentially a more meaningful amount of time writing the documentation). They stand out to me in this sense amongst all the blog posts and stories which almost invariably will have taken a great deal more time and effort to produce. [1]

Any thoughts? Indeed any prior discussion?

[1]: Not to say that this isn't a nice idea. :)

Yep, I've noticed that sorry to propagate a trend that isn't the best. I think it's because you can do quite a lot in an afternoon with Go especially if your learning, like me.
Oh yes, absolutely. I just wonder when I see these posts if I should post similar small apps that I built along the way to learning some new technology or language and then, so far, decide that it's probably not the most useful.

On the other hand, given that I myself often end up using those small learning apps for a few years after I built them (even tiny apps can be useful day-to-day), perhaps that's not a fair assessment.

Very cool. If you have a recent enough version of Redis, you may want to move away from doing the lookup using KEYS and move to SCAN (http://redis.io/commands/scan). KEYS will work for a while, but with a large enough DB it can become a very slow operation so it's not typically recommended for a production system.

Also, just curious, I see that the original url is encoded in the key, so the key is "<short>||<original>". Since the key is already a hash, it seems that you could eliminate having to scan over every key in Redis by making each key be only "<short>" and having an additional field in the hash for "original". Then a lookup becomes simply an HGETALL (if you need to get the "count" field, otherwise just an HGET for the "original" field). I might be missing something though! </armchair programming>

By encoding the original URL in the key you can look up to see if a URL has been shortened already, and serve that.

Thanks for the info re scan I'll have a look and check my version of redis.

(comment deleted)
Good point, I'll make a ticket on the git hub so I don't forget.

    import (
    	"./utils"
This is what's known as a relative import, and it's very bad. You want "github.com/johnnye/short/utils", or (better yet) put your base62 stuff in package main, since it's just one function.
Cheers, I knew it wasn't very "go like" at the time. Will go and tidy it up at the weekend.
go discourages relative imports? interesting. why? Are these files not packaged together?