/srv/irclogs.ubuntu.com/2011/08/18/#ubuntu-us-mi.txt

rick_h_brousch: Have him search Monster for "Network Administration Brighton". All of the info is there from what I've been told. Thanks for passing it along.00:18
snap-lGood morning11:42
rick_h_sucky morning11:43
rick_h_:)11:43
snap-lBlergh. Have to take the trash out in this weather.11:44
snap-lOn the plus side, there is a bunny outside11:44
rick_h_crabby, stupid client morons11:46
rick_h_"how could we make this comlpetely worse and ask them to revert back to at least 3 things they originally had but we said we didn't like?"11:46
snap-lrick_h_: I take it they're being quite creative. ;)11:46
brouschmanning deal of the day: half off http://www.manning.com/ceder/11:46
snap-lbrousch: It's not that good11:47
rick_h_snap-l: yea, they're trying very hard to piss me off. We had 6 "mockups" colored "make this crap"11:47
rick_h_so I did, not 4th set of a dozen or more changes since then11:47
rick_h_some backtracking on earlier items, every one of them making it more of an ass project than before11:47
snap-lI picked it up. Unless you really don't know Python, it's not going to get you too far.11:47
brouschok11:47
rick_h_I was more interestinged in oreilly's deal11:48
brouschi haven't gotten that far11:48
rick_h_but realized I want it on my web kindle reader and nothing I buy out of the kindle store can show up :(11:48
snap-lbrousch: Have you installed Python?11:48
rick_h_which is another @#$@#% point of the day11:48
brouschindeed i have11:48
rick_h_brousch: tons of better books11:48
brouschthough i have not compiled it11:48
snap-lThat's part 111:48
rick_h_oh, and NC dude strikes again11:49
rick_h_with a freaking book in IM this morning yay11:49
snap-lrick_h_: "Why testing is hard, so I've decided to go shopping instead", by NC dude.11:50
rick_h_"Designing code is hard so I'd rather just rewrite every app over and over vs put forth the effort to the fruitless task of making a decently flexible system"11:51
rick_h_or there abouts11:51
snap-lRewriting vs. Repeating Code - Why I Repeat Myself Repeatedly Repeating My Repeating Code Repeatedly"11:52
rick_h_only he took 358 words to get to it11:52
snap-lrick_h_: Oh that's awesome.11:52
rick_h_according to wc :)11:52
snap-lMaybe he could beat his computer into a typewriter and take up freelance?11:53
nullspacerick_h_: I feel like I'm out of the loop, who is NC dude?11:53
rick_h_nullspace: you won't understand, you've missed half the effect by having the history11:53
snap-lnullspace: NC dude is Rick's Lex Luthor programming co-worker11:53
brouschno, lex luthor is a genius11:54
brouschit's his solomon grundy11:54
nullspacerick_h_: have you tried running an exploit against his box, get reverse shell and then rm -rf /usr ?11:54
brouschdoes he run linux?11:54
snap-lwhere rick_h_ stands for consistency, repeatable results, testing, and optimization, NC dude stands for lazy development, repeating code, and 2 hour non-productive bug fixing sessions that could have been handled via build servers.11:54
brouschi thought NC guy was the windows user11:55
rick_h_he's sinced gone dual boot11:55
nullspacerepeating code? as in he copy pastes the same thing11:56
snap-lHonestly, if I was doing Linux / Windows, I'd use a VM at this point11:56
snap-lDual Boot = wasted time being in the wrong system.11:56
rick_h_it is NC dude11:57
snap-lrick_h_: Ah, now I understand.11:57
snap-l"Yeah, I know that vim is awesome, but I don't have vim in Windows, so I'll have to boot into Linux when I get done with my Daily Show viewing in Windows"11:58
snap-lBah, Borders is now 40-60% off.12:00
nullspacesnap-l: what the company, a branch or are we talking books12:02
snap-lnullspace: Welcome to 2011. :)12:03
snap-lBorders Books is closing all of their stores.12:03
snap-lso everything is being liquidated. They're now at 40-60% off of everything in the store12:03
nullspaceso amazon prices?12:07
snap-lnullspace: Yes, but shipped directly to the store for easy pickup.12:07
snap-lAnd if you can find a book / CD that's 40% off of retail on Amazon, please feel free. :)12:08
snap-lmostly they're 33%12:08
Wolfgersnap-l: http://goo.gl/M7Ntt12:10
Wolfgerby my math, that's 45% off12:10
snap-lAnd if you're not a prime member, you get to factor in shipping. ;)12:11
nullspaceand now I''m distracted by Bosch's l-boxx modular storage systems12:11
Wolfgersuper saver free shipping, for the patient12:11
Wolfgerand no sales tax12:11
WolfgerAmazon Prime is a tax on the impatient.12:12
snap-lWolfger: Yes. :)12:12
snap-lnullspace: stackable toolboxes aren't that distracting. :)12:13
nullspacesnap-l: I disagree12:14
snap-lJust be done with it and get a rolling toolchest. ;)12:15
snap-lhttp://www.craftsman.com/shc/s/p_10155_12602_00981337000P?vName=Storage+%26+Garage&cName=Tool+Storage&sName=Chests&prdNo=1&blockNo=1&blockType=L112:17
snap-lAlso, craftsman's site sucks12:18
nullspacesnap-l: most corporate sites suck, welcome to 2011 :)12:19
Wolfgertouche12:24
Wolfgeron the other hand, that's hardly new to 2011...12:31
nullspacewell it seems that it has become common place in 2011, either that or I'm just now seeing all the horror12:33
snap-lI think you're just more sensitive to it, having not been aware of it most of 2011. ;)12:34
snap-lWelcome to 2011. ;)12:34
nullspacewell I have been spending a lot of time working on the house and avoiding popular culture12:37
Wolfgerzomg, you've been avoiding pop culture? How can you live without (uh, somebody help me out here, who's a current pop icon?)12:48
snap-lMenudo12:48
brouschjustin beeper?12:48
Wolfgerrofl @snap-l12:48
snap-lShawn Cassidy12:48
brouschmenudo is back?12:48
brouschawesome12:48
snap-lbrousch: Yeah, along with Dynamite Magazine12:48
Wolfgerdyn-o-mite!12:50
Wolfgerthat's it... snap-l's new nick is Rerun.12:50
Wolfger:-D12:50
snap-lNah, I'm Roj12:51
snap-lWolfger: You can be Rerun, and nullspace can be Duane12:51
snap-lnow we need Shirley, Ma, and the kid sister.12:52
snap-lhttp://pygame.org/docs/ref/examples.html#pygame.examples.midi.main12:53
snap-lMmm... maybe I can write my Glassblower application after all12:53
snap-l(Glassblower being my interpretation of Philip Glass as done by computer)12:54
Wolfgersnap-l: sorry... Rerun is the only name I could remember off the top of my head :-)12:55
nullspaceWolfger: who is Duane?12:55
snap-lhttp://en.wikipedia.org/wiki/What's_Happening!!#Principal_cast12:55
snap-lDwayne, sorry.12:55
Wolfgernullspace: Damned kid... get off our lawns.12:55
nullspaceWolfger: you realize I have my lawn12:56
nullspacemy own lawn, sorry it's still kinda early12:56
WolfgerI don't think you had your own lawn last time I visited you, so no. :-p13:03
nullspacepretty sure that's not how it works13:04
Wolfger?13:05
Wolfgerhow does realization work then?13:05
nullspacehmm maybe I didn't tell your13:06
nullspaceyou13:06
Wolfgerso you have your own lawn? Congrats!13:06
WolfgerWant mine too? I hate mowing it.13:06
nullspaceI should just go back to my javascript, I seem to be doing a lot better with that language than english currently13:07
nullspaceWolfger: mine is > 1/3 of an acre13:07
WolfgerThen again, my dogs would not be happy if I didn't have it...13:07
snap-lWolfger: You could teach them how to use the potty.13:07
nullspacenot much if you ask me13:07
Wolfgersnap-l: I have 3 that would be pretty easy to litter-box train, and one that could easily sit on a toilet... though I don't think I want either of those things.13:09
nullspaceI just pictured a great dane on the pot, ha13:10
nullspacehttp://img.skitch.com/20080807-8t49gh9g9pi5iymnd49piiiuw1.jpg13:18
WolfgerYeah. And unless I could teach her to flush... no thank you.13:19
nullspaceWolfger: motion sensor!13:20
Wolfgernullspace: good point13:20
DuolosAnyone here use Eclipse, by chance?13:29
brouschoccasionally13:39
Duolosbrousch: Just curious because I can't get it to display my code properly.13:40
Duolos#ubuntu kicked me out, basically, because I'm using the newest version lol13:40
brouschi've only used it for python13:41
Duolosah okay.  I'm using java13:42
DuolosJust seems like it's missing fonts.  Just displays empty boxes instead of the actual characters.  But only for parts of the code.  Very strange.13:42
DuolosAnd, according to Google, no one else has ever had this issue.13:42
brouschyou have sun java installed, or the default opencrap java?13:43
DuolosNo, Sun Java.  Not going to use OpenJDK for Android development :)13:43
snap-lDuolos: I've used Eclipse, but only under Maverick, and under extreme duress.13:44
snap-lDuolos: Are you perchance using Unicode in your code?13:45
Duolossnap-l: I haven't even gotten to the point of typing any code.  Just looking at the code that Eclipse generates when starting a new project.13:46
snap-lAnd is it repeatedly showing the same blocks as hidden, or different blocks?13:46
Duolossnap-l: It appears as though it's just the variables (color-coded blue).13:46
Duolosvalues, rather13:47
snap-lWould you take a screenshot of what you're seeing?13:49
Duoloshttp://s891.photobucket.com/albums/ac115/nrossin81/?action=view&current=snapshot1.png13:50
Duolos...and if you know of a better, easier place to post screenshots, PLEASE let me know lol13:51
snap-lHeh. :)13:52
WolfgerDuolos: my Google says differently? Or is you problem unlike this: http://www.eclipse.org/forums/index.php/m/520247/13:52
snap-lI use Ubuntu One, but that has varying degrees of success.13:52
snap-lWolfger: On the surface that looks similar.13:52
snap-land of course, no answers.13:53
DuolosWolfger: Fairly similar.  Except that tells about the entire interface being messed up.  My interface is fine, it's just part of the code.13:53
Wolfgerof course13:53
_stink_sure does look like a font thing.13:53
snap-lDuolos: You're not using Hebrew, are you? :)13:53
DuolosGreek and Aramaic, actually13:54
Duolos;)13:54
brouschDuolos: how did you install eclipse?13:54
snap-lhttp://www.eclipse.org/forums/index.php?t=msg&th=203659&start=0&S=46d79d739b260b4e24e4127a1039265613:54
Duolosbrousch: That's the new version, just extracted.  I'm currently downloading the older version from the repos to see if that does it too13:54
snap-lDuolos: You might have downloaded a different language version by mistake?13:54
brouschso you downloaded it, extracted it to your homedir, and are running it from there?13:55
WolfgerDuolos: http://stackoverflow.com/questions/6629225/source-code-shows-as-rectangles-instead-of-charactars13:55
snap-lThat's the only thing I can think of that might cause that13:55
Duolosbrousch: correct13:55
brouschgood. the one in the repos is worthless13:55
nullspacerick_h_: have you see this guys show? http://www.djmarks.com/woodworks.asp13:55
Duolosbrousch: #ubuntu wouldn't even discuss Eclipse unless I was using Galileo lol13:55
snap-lWolfger: Good find. That might be the cause.13:55
snap-lDuolos: http://stackoverflow.com/questions/6629225/source-code-shows-as-rectangles-instead-of-charactars/6953954#695395413:56
snap-lWorst case, you'll get a lot of fonts you don't need.13:56
snap-lBest case, it'll solve the problem.13:56
rick_h_nullspace: yea, seen them all13:56
rick_h_he's pretty famous in the woodworkers circles for sure13:56
Duolossnap-l: ahhh... looks to be it13:56
brouschmissing fonts makes sense. i mean, how thoroughly can eclipse be tested on a new kubuntu install?13:56
snap-lwtf? Why is that including postfix?13:56
snap-lDuolos: Be careful with those lines13:57
snap-lI'd start with sudo apt-get install ttf-mscorefonts-installer13:57
Duolossnap-l: Oh, I'll read them first lol13:57
DuolosAnd probably install them one at a time.13:57
snap-lYeah, there's a bunch of crap in there that doesn't make any sense.13:58
Wolfgermy Google-fu is mighty. :-)13:58
DuolosLooks like he just installed ttf*13:58
Duolos:)13:58
DuolosWolfger: I guess I used the wrong keywords lol thank you13:58
Wolfgertook me a few tries, but I arrived after your clarification at: eclipse "missing fonts" in code13:59
Duolosexcept... a lot of those are already installed13:59
DuolosGrr... trial and error time.13:59
Wolfgerwithout quotes on "missing fonts" I got too much noise13:59
DuolosThanks for the help.  Gonna go grab breakfast and give it some more time when I get back.14:01
nullspacewoo hoo 1$ JJ sandwiches today!!15:31
brouschnullspace: everywhere?15:35
_stink_brousch: i think so\15:41
_stink_maybe different times15:41
_stink_on WSU's campus it's 11-315:41
nullspace_stink_: same here15:41
_stink_o/o/15:42
_stink_gonna head there in a bit, ofc15:42
DuolosJust thought I'd report back on my Eclipse issue.  Turns out I wasn't missing any fonts, but the default font didn't support italics :) All fixed.15:44
nullspaceDuolos: nice15:44
snap-lDuolos: Ah, good to know.15:44
snap-lYou might want to post that back on the Stack Exchange thread for the next time that Wolfger does Google Fu15:45
Duolossnap-l: haha good call15:52
jrwrenhow do you get $1 JJ?16:04
jrwrenjust walk in?16:04
WolfgerDuolos had italics in his source code? WTF?16:11
snap-lrick_h_: http://www.bluemic.com/reactor/ MMmmmmmmm16:30
nullspacejrwren: walking in the doors is the hard party what with the line16:30
The_Machineanyone use clonezilla who knows how to get more entries in the mount /home/partimag ?16:30
The_Machineit shows 4 that i don't want to use at all16:31
The_Machinedoesn't show the USB drive i would like to use.  :-/16:31
snap-lThe_Machine: Does dmesg show the drive as being recognized?16:35
The_Machineactually, i just figured out that i don't think it is being recognized16:35
The_Machineas you suggest16:35
The_Machine:-/16:36
The_Machinei hate this stupid old whitebox16:36
The_Machinethanks for your response16:36
The_Machinei'm just going to go shoot random people now.16:36
snap-lI'd just recommend a trip to Microcenter and a party store.16:36
snap-lbut whatever works.16:36
The_Machineer, i meant hug.16:37
rick_h_ snap-l reminds me of the movie robots I think16:40
rick_h_one day I'll save my pennies for one of those pr-40 mics I think16:40
rick_h_I like how it kills sound once you're outside the mic16:41
snap-lYeah, I love Blue mics. :)16:45
snap-lHow dows redis compare with mongodb?16:46
snap-ln/m, key value only vs. document16:46
snap-lIN other words, another great way to lose data. ;)16:47
rick_h_hah16:47
rick_h_redis == replace memcached16:48
rick_h_makes a great cache layer, session handler, queue backend, etc16:48
* snap-l is going to write a k/v store called devnull16:49
snap-lfastest around, with all the data integrity you've come to expect from NoSQL / Memcache16:49
snap-lstore whatever you want: documents, k/v pairs, your entire msuci collection16:50
Blazeixwent to JJ for $1 sandwiches, the line was out the door, looked to be about a 30 minute wait16:51
rick_h_http://techcrunch.com/2011/08/18/google-maps-adds-a-weather-layer/ hah cool!16:52
rick_h_should have asked them to deliver :P16:52
rick_h_I want weather radar on my google map though :(16:52
The_MachineJJ for $1 sandwiches what?!16:54
snap-lrick_h_: Can do the same with Weather Underground's Wundermap, which also shows the radar16:57
rick_h_right16:57
The_MachineBlazeix, where did you hear about JJs for $1?  Can't find on website :)17:05
BlazeixThe_Machine: I heard it from nullspace at 11:31:32 :)17:07
The_Machinehehe17:07
The_Machinealrighty17:07
rick_h_lmao http://brianhaveri.github.com/Underscore.php/18:05
snap-lwtf?18:12
Wolfgersnap-l: what is with your long string of wtf's on Buzz? Man, you're killing the tattered remnants of my faith in humanity.18:23
nullspaceWolfger: foolish of you to hold on to those remains18:27
Wolfgerthey are gone after seeing nullspace buzz about the torture/murder of a Maybach18:27
snap-lWolfger: I live to sweve18:28
snap-land serve18:28
snap-lman, what a typo18:28
snap-lIf you really want to lose faith in humanity, don't fire up Miro all summer18:29
snap-lGod, my database didn't get deleted, and I have a shit-ton of stuff downloading18:29
_stink_gah, sqlalchemy question and no rick_h18:33
jrwrenis that what became of ipodder?18:34
_stink_rick_h_: i'm trying to find a way to take a sqlalchemy object that inherits Base, and get all columns names AND all relationship attributes that sqlalchemy knows about.  i can get the columns with <class_name>.__table__.c, but i can't find a way to have it tell me about relationships it knows about.  any advice?18:41
rick_h__stink_: https://groups.google.com/forum/#!topic/sqlalchemy/_wOvkh6xKss18:54
_stink_rick_h_: thanks much.18:55
rick_h_np18:56
rick_h__stink_: what are you doing that you need to pull the list?19:00
_stink_rick_h_: i was playing with a sort of /metadata rest resource... like "give me JSON with all the objects i'm allowed to see and their attributes", filtered in some appropriate way19:01
_stink_if this strikes you as "you're doing it wrong", let me nkow19:01
_stink_obviously while only having to define the objects in the normal way, map them the normal way, and only specify the stuff to block from view.19:02
rick_h_so then how are you getting all the realtion data?19:02
rick_h_and how far down to you nest through them?19:02
rick_h_so I'd rather build into base a to_json() method that could do some of what you're doing, but allow for a place to override where you need some custom/extras perhaps19:03
rick_h_but understand what you're saying, making it universal requires some internals like that19:03
_stink_well, not getting the data at all yet, ergo my question :) but i only want one level, i think19:03
_stink_yeah19:03
_stink_i made a table to hold the stuff to block, e.g., for each object19:04
rick_h_ah, I'd just do a __no_json__ = [xxx, yyy[19:04
rick_h_on each object19:04
_stink_so there's an 'object_metadata' table that says whether a client can know about it at all, and if so, what columns to blcok19:04
rick_h_so you can see when looking at the code if the property is blocked vs looking into the db in some table19:04
_stink_see, that's a good idea.19:04
_stink_yeah19:04
_stink_i like it19:04
_stink_so then i would have to have a to_json() on each that held column names and relationship attr names19:05
_stink_but i guess at least it's all in one plcae.19:05
rick_h_well you add to_json() to base and they all get it19:05
rick_h_could even create a JSONBase(Base)19:06
rick_h_and then your models that need to drop to json just User(JSONBase): __no_json__ == ['password']19:06
_stink_and each would also need to be told specifically about its relationships too, right?19:06
_stink_becusae in to_json() in Base I'd still need for blah in self.c:19:07
_stink_?19:07
_stink_for the columns19:07
rick_h_no, your code you're doing to that would be the way you're heading19:07
_stink_i'm just trying to understand how the generic to_json can know about the attributes in each subclass.19:07
rick_h_because each of those subclasses inherits from Base19:08
rick_h_so it'll know the mapper/etc in that instance19:08
rick_h_https://github.com/mitechie/Bookie/blob/feature%2Fapi/bookie/models/__init__.py#L8019:08
rick_h_that's the code I use to make all my models able to be cast to dict19:08
rick_h_User.get(13)19:08
rick_h_return dict(User)19:08
rick_h_and the json module can jsonify all dicts19:09
rick_h_but that doesn't work for relations19:09
_stink_right, so you loop through self.__table__.columns.  doesn't this leave out relationship attributes?19:09
rick_h_so I handle that manually: https://github.com/mitechie/Bookie/blob/feature%2Fapi/bookie/views/api.py#L6619:09
_stink_yewah, ok19:09
_stink_i see, yeah19:09
rick_h_I base that on extra url params19:09
rick_h_so in bookie's case, if you want the readable content, you pass with_readable=true19:09
rick_h_and it'll append it to the root object's dict19:10
_stink_sweet, i see19:10
rick_h_so yea, you're still in your boat for finding relations in an agnostic way19:10
_stink_so i could just have __no_json__ to block columns, and __add_json__ to append relationship19:10
rick_h_sure19:10
_stink_i'm not sure there's an obviously better way, so that's cool with me19:10
rick_h_just be aware that every one of those add_json is another query19:11
rick_h_so don't do that in a loop19:11
rick_h_that's why I use the with_content, it changes the query that pulls the records to do an eagerjoin on the extra realtion19:11
rick_h_https://github.com/mitechie/Bookie/blob/feature%2Fapi/bookie/models/__init__.py#L50819:12
_stink_not sure i understand.  if i just want to be able to return a JSON list of attr names when this view is hit, would that cause extra queries?19:13
rick_h_hitting a relation for data causes another query to go out to go get it19:14
rick_h_User.get(13) only queries the user table19:14
rick_h_return User.addresses will then do another query to that user's addresses19:14
rick_h_if you have phone, address, email19:14
rick_h_that's three queries extra19:14
rick_h_and if you're returning 20 users, that's 60 extra queries19:14
_stink_ok, i see.  right19:14
rick_h_so I'd not get too "automatic" building of a big object without a manual query with some eager joins19:15
_stink_i think this view avoids that, but i have to be careful about that once i start retrieving these en masse19:15
rick_h_right, start out with api calls for /user19:15
rick_h_but eventually you want /users/all19:15
_stink_ok, bookmarked those to look at when i start grabbing this19:15
_stink_sweet.19:15
_stink_this is very helpful, thanks much19:15
rick_h_np19:16
rick_h_http://thenextweb.com/insider/2011/08/18/hp-announces-it-will-discontinue-touchpad-stop-webos-device-development/19:21
rick_h_man, what a day19:21
rick_h_crushing blow after crushing blow19:21
jjessedidn't they just reelease the touchpad?19:21
brouscha few months ago19:22
jjesseand they are going to spin off the pc busines?19:22
brouschbut best buy sold so few they wanted HP to take them back19:22
jjessewierd19:22
ColonelPanic001any brave souls here know a bit of Java and mind having a look at a absurdly simple line to see why Eclipse says it's wrong?19:23
brouschwimmwishes they could do the same, but they have nothing else to sell19:23
brouschrimm19:23
brouschColonelPanic001: pastebin19:23
brouschdon't ask to ask! what's wrong with you, man?19:24
ColonelPanic001I'M SORRY OMG19:24
ColonelPanic001http://pastebin.com/bpRnYq3b19:24
brouschi'm reporting you to The Leader19:24
ColonelPanic001this seems too simple to mess up19:24
brouschi don't think jave does the ' and " like python19:25
brouschi think you have to use "19:25
ColonelPanic001s/python/every other language ever/19:25
ColonelPanic001heh19:25
ColonelPanic001okay. lame.19:25
ColonelPanic001I was hoping I wouldn't have to go through and escape all the "19:26
brouschand then escape the inner "s19:26
ColonelPanic001thanks19:26
ColonelPanic001while I'm asking - what's ' do, then?19:26
jrwrensingle char19:26
ColonelPanic001ah19:26
ColonelPanic001thanks19:26
jrwrenchar c = 'c';<-ok  string s= 'c'; <<--compile err19:26
jrwrenrick_h_: what is ClarkstonUnion?19:49
snap-lThe union in Clarkston? It's a restaurant20:07
snap-lrick_h_: I think HP wants to reconvene to see what WebOS will look like in the next few years20:09
snap-lbecause tablet / mobile is pretty much a three-horse race20:09
rick_h_jrwren: it's a great little place to eat20:10
rick_h_best mac and cheese20:10
rick_h_right in downtown20:10
snap-lqualifier: best mac and cheese if you like the crock-style baked mac and cheese.20:14
rick_h_yea, rich stuf20:15
rick_h_rich stuff20:15
rick_h_but mmmm so good20:15
snap-l(had some folks recommend a pizza place as the best pizza in Chicago, but I didn't like that style of pizza)20:15
rick_h_what?! no likey the chicago style deep dish?20:15
rick_h_ok, closing this day out...I'm toast20:15
snap-lheh20:16
snap-lrick_h_: I like Jet's style deep dish20:16
snap-land even Buddy's / Shields20:16
rick_h_you sir...need new taste20:16
snap-lbut for whatever reason, this didn't do it for me20:16
snap-lWe need to get you over here for some Perry's when you can spare some calories20:17
snap-lI won't claim they're the best, but they'll definitely make your top 1020:17
snap-ltop 5 even20:17

Generated by irclog2html.py 2.7 by Marius Gedminas - find it at mg.pov.lt!