jbailey | Anyone know if there | 01:14 |
---|---|---|
jbailey | 's a sane way to get the driver information for the SCSI or IDE layer from sysfs? I seem to get as far as finding out that the [sh] da wasn't ide-disk or sd, and not any further. | 01:15 |
jbailey | Oh, and joy. It calls it 'sd' instead of 'sd_mod' | 01:15 |
zul | /sys/block | 01:26 |
jbailey | zul: /sys/block/sda/device/driver just points to sd. | 01:27 |
zul | is this that scsi card bug that i cced you about? | 01:28 |
jbailey | Nope. Did you cc: me on something? | 01:28 |
=== jbailey looks. | ||
jbailey | It's initramfs autodetection without using /proc/scsi | 01:28 |
jbailey | I don't see an email from you... | 01:29 |
zul | i cced you from bugzilla | 01:29 |
jbailey | Ah, lemme check that folder. | 01:30 |
zul | there is a program called lsscsi which works with sysfs | 01:30 |
zul | http://sg.torque.net/scsi/lsscsi.html | 01:30 |
jbailey | Oo, appears to be in breezy. | 01:30 |
zul | have you tried /sys/host/channel/id/lun or something like that | 01:32 |
jbailey | I haven't gone that need. I got caught up trying to figure out how to work find. =) | 01:35 |
jbailey | Nice, lsscsi will give me the info. | 01:40 |
jbailey | So maybe I can use sysfsutils to figure it out rather than diving through symlinks. | 01:41 |
zul | there is a library sysfs as well | 01:49 |
=== doko [~doko___@dsl-082-082-189-098.arcor-ip.net] has joined #ubuntu-kernel | ||
=== svenl_ [~luther@AStrasbourg-251-1-63-82.w82-126.abo.wanadoo.fr] has joined #ubuntu-kernel | ||
jbailey | zul: Yeah, I might have to resort to that, but Id' rather not. It's all done in shell so far. | 02:03 |
jbailey | zul: The idea is that I want to use hotplug-ng in the initramfs, but it would be nice to continue to support some sort of hard autodetection. | 02:03 |
jbailey | It think I've figured it out for scsi, but it looks like the IDE layer might suck too much. | 02:04 |
=== mark_ [~markalit@82-32-64-135.cable.ubr01.bath.blueyonder.co.uk] has joined #ubuntu-kernel | ||
mark_ | hi, is this a good place to ask how i can gather more data to add to a bug i submitted a while ago | 03:45 |
mark_ | things like crash reports etc. its a problem with a sound module. | 03:46 |
=== mark_al [~markalit@82-32-64-135.cable.ubr01.bath.blueyonder.co.uk] has joined #ubuntu-kernel | ||
zul | heh...someone is "forking" the kernel lol good luck | 05:04 |
=== zul [~chuck@CPE0006258ec6c2-CM000a73655d0e.cpe.net.cable.rogers.com] has joined #ubuntu-kernel | ||
fabbione | morning | 06:21 |
dilinger | ugh, yes it is :/ | 06:33 |
TheMuso | .cl | 07:48 |
TheMuso | argh | 07:48 |
=== svenl [~luther@AStrasbourg-251-1-63-82.w82-126.abo.wanadoo.fr] has joined #ubuntu-kernel | ||
=== JaneW [~JaneW@wbs-146-163-161.telkomadsl.co.za] has joined #ubuntu-kernel | ||
=== infinity [~adconrad@loki.0c3.net] has joined #ubuntu-kernel | ||
=== doko [~doko___@dsl-082-082-198-172.arcor-ip.net] has joined #ubuntu-kernel | ||
=== Seveas [~seveas@dhg-tradeict.ne.qinip.net] has joined #ubuntu-kernel | ||
=== chmj [~d3vic3@dumbledore.hbd.com] has joined #ubuntu-kernel | ||
=== JaneW [~JaneW@wbs-146-163-161.telkomadsl.co.za] has left #ubuntu-kernel ["Leaving"] | ||
=== Seveas [~seveas@217.17.141.68] has joined #ubuntu-kernel | ||
zul | hey | 01:29 |
fabbione | hey zul | 01:33 |
zul | hey fabbione | 01:35 |
zul | what time is the meeting today? | 01:47 |
chmj | 16:00, I think | 01:48 |
fabbione | 16:00 UTC | 01:48 |
zul | coolio | 01:50 |
=== TheMuso [~luke@dsl-202-173-132-131.nsw.westnet.com.au] has joined #ubuntu-kernel | ||
infinity | There's a kernel meeting today? | 02:52 |
jbailey | infinity: Are you in the same timezone as Sydney? | 02:53 |
jbailey | infinity: 'cause we know you love 2am meetings. =) | 02:53 |
fabbione | infinity: yes at 16:00 UTC | 02:53 |
infinity | Yeah, I'm in the same TZ as Sydney. | 02:54 |
infinity | You're all cocks. | 02:54 |
infinity | The end. | 02:54 |
infinity | (I was going to stay up anyway, to attent the backports meeting) | 02:54 |
infinity | s/attent/attend/ | 02:54 |
jbailey | infinity: We need to get grrlz on the Kernel Team just so you can't say that anymore. =) | 02:55 |
infinity | Because it's politically incorrect, or factually so? | 02:55 |
fabbione | ahaha | 02:55 |
infinity | I'm pretty sure that when used as a derogatory term, "cock" can apply to just about anyone, regardless of their genital trappings. | 02:55 |
fabbione | at what time is the backports meeting? | 02:56 |
lamont | kernel meeting? | 02:57 |
lamont | ouch | 02:57 |
lamont | 1600 UTC --> I will attend in spirit only, I fear. | 02:57 |
fabbione | lamont: i guess you will be at the office... | 02:58 |
lamont | and dealing with administrivia, I fully expect. | 02:58 |
fabbione | have fun :) | 02:58 |
lamont | I'm hoping to really be online sometime after lunch | 02:58 |
lamont | yeah | 02:58 |
=== lamont flees for real | ||
infinity | fabbione : Backports is 1700 UTC. | 03:00 |
fabbione | infinity: good.. because the kernel team will not last longer than one hour.. i hope | 03:01 |
infinity | Looks like I won't be getting any sleep tonight. Oh well. | 03:03 |
infinity | Gives me time to rebuilt firefox over and over and over again until I finally have something to upload. | 03:03 |
fabbione | infinity: you need no sleep :) | 03:15 |
infinity | That's what I keep saying, right before I pass out. | 03:27 |
=== dilinger smirks. genital trappings? | ||
chmj | hmmm | 03:33 |
chmj | if i don't have transport, I'm not gonna make it to the meeting also | 03:34 |
fabbione | chmj: uh? | 03:42 |
fabbione | chmj: well if you could have told a bit in advance we could have changed the time | 03:43 |
chmj | fabbione: I arranged transport with someone, now the guy seems unsure, how dissappointing | 03:44 |
fabbione | chmj: try to convince him again ;) | 03:45 |
chmj | I'm trying | 03:45 |
zul | heh they are trying to backport the kernel | 03:48 |
chmj | who is 'they' ? | 03:49 |
zul | backport people | 03:49 |
fabbione | eh? | 03:52 |
fabbione | where? | 03:52 |
fabbione | lart them! | 03:52 |
fabbione | kill them! | 03:52 |
zul | gimme a sec...ill dig it up | 03:52 |
fabbione | they must not backport the kernel | 03:52 |
fabbione | ehhe | 03:52 |
zul | http://www.ubuntuforums.org/showthread.php?t=15913 | 03:52 |
chmj | shoot them ! | 03:53 |
fabbione | oh god | 03:54 |
zul | *shudder* | 03:54 |
zul | so who is suppose to be coming to the backport meeting ;) | 03:54 |
fabbione | i am going :) | 03:54 |
zul | so am i | 03:55 |
fabbione | i need to see what they have in mind | 03:55 |
fabbione | and kindly ask not to backport the kernel :) | 03:55 |
fabbione | because they do not know what they are doing | 03:55 |
zul | ya think? | 03:55 |
fabbione | no.. i am sure | 03:59 |
zul | ok good...just making sure :) | 03:59 |
chmj | lol | 04:01 |
chmj | let them do it, its gonna be fun to watch | 04:05 |
chmj | unless you worried about them pinging you aboutit | 04:06 |
infinity | I'd be worried about bug reports relating to it. | 04:06 |
fabbione | at the first pint i will make the kernel unportable | 04:06 |
infinity | I already have some bug reports with text like "I haven't changed anything except to upgrade to some random backported packages..." | 04:06 |
zul | see thats why users are bad | 04:07 |
chmj | aren't customers always right ? | 04:07 |
chmj | :-P | 04:07 |
zul | no i learned that the hard way when i was doing a customer service test for an interview | 04:08 |
infinity | I just love how people will add any random repository to their sources.list until stuff appears to finally work. | 04:09 |
zul | its the only way :) | 04:09 |
infinity | "Yeah, just add potato, woody, sarge, warty, hoary, and these 5 sources from apt-get.org, and you'll get most of the packages you need... Oh, and download this .deb and install it by hand" | 04:10 |
infinity | Someone hold me. | 04:10 |
chmj | hahaha | 04:10 |
zul | im not a touchy feely person infinity | 04:10 |
fabbione | infinity: ahhahahahahhaa | 04:14 |
fabbione | bug number? | 04:14 |
infinity | Oh, no, that was me paraphrasing the forums. :) | 04:14 |
fabbione | ahah | 04:15 |
infinity | Why find bugs in your backported packages when you can just tell people to install other packages to satisfy your bogus dependencies? Yay! | 04:15 |
infinity | I have a feeling this backports meeting will be frustrating. | 04:15 |
infinity | I'll have to hold my tongue. A lot. | 04:15 |
fabbione | do will i | 04:16 |
chmj | sound too good to miss | 04:16 |
infinity | Backporting kernel packages is just plain retarded, though. If users really need new kernels, kernel-package is there for a reason, compile your own and have some control over what you break. Don't let someone else break it all for you. | 04:17 |
infinity | In that thread up there <points>, I love the one user's laundry list of stuff that stopped working after the upgrade. | 04:17 |
infinity | (last page of the thread) | 04:17 |
jbailey | My favourite is the people who loaded a new glibc and then their system stopped working after the next kernel upgrade. | 04:17 |
jbailey | They give me WARM and FUZZIES. | 04:17 |
infinity | A new... glibc? | 04:18 |
infinity | Doesn't that defeat the purpose of backporting? | 04:18 |
jbailey | infinity: Pulled it from breezy by the looks of it, because backports didn't have what they wanted. =( | 04:18 |
infinity | Once you backport glibc, you may as well, y'know.. UPGRADE. | 04:18 |
fabbione | infinity: you kidding right? | 04:18 |
infinity | jbailey : Oh. I see. :) | 04:18 |
infinity | jbailey : Even funnier. :) | 04:18 |
fabbione | it's soooooo 31337 to run the latest glibc | 04:18 |
jbailey | Erp, apt-get install 'git' isn't quite what I'd hoped it was. | 04:18 |
fabbione | _____ _ _______________ | 04:18 |
fabbione | |___ // |___ /___ /___ | | 04:18 |
fabbione | |_ \| | |_ \ |_ \ / / | 04:18 |
fabbione | ___) | |___) |__) |/ / | 04:18 |
fabbione | |____/|_|____/____//_/ | 04:18 |
fabbione | 04:18 | |
fabbione | jbailey: pkg is cogito | 04:19 |
jbailey | fabbione: Thanks. | 04:19 |
infinity | Although git is fun too. | 04:19 |
=== jbailey used to work for cogitoinc.com and wonders when the trademark lawsuits will start *sigh* | ||
fabbione | who needs a wake up text message via irc? | 04:19 |
infinity | I'll need a /msg, I'm sure. | 04:19 |
=== fabbione [~fabbione@port49.ds1-van.adsl.cybercity.dk] has joined #ubuntu-kernel | ||
=== infinity claps. | ||
fabbione | damn FEENODE | 04:21 |
fabbione | no wake up message | 04:21 |
fabbione | damn FEENODE | 04:21 |
fabbione | no wake up message | 04:21 |
fabbione | anyway | 04:21 |
fabbione | i am off for a little while before the meeting | 04:21 |
chmj | hehe | 04:22 |
chmj | jbailey, never tried git ? | 04:22 |
jbailey | chmj: Nope. I'm trying to get a changelog for klibc, so figured I'd try the other git. =) | 04:22 |
=== jbailey backs away slowly. | ||
dilinger | i need those kick-ass new glibc features, though! | 04:23 |
fabbione | dilinger: ehehhe | 04:24 |
jbailey | Reminds me that I need to do a glibc upload to fix gdb on ppc. | 04:24 |
fabbione | mu4 syst3m runs s0 much f4st3r w1th th15 31337 gl1bc | 04:25 |
jbailey | I figured I'd give it some time so that Fabio's machine could catch up with the rest of the archive for a bit. =) | 04:25 |
fabbione | jbailey: oh ehehhe | 04:25 |
fabbione | sparc is looking good at the moment | 04:25 |
fabbione | there are really few pkgs left that still needs manual love | 04:26 |
jbailey | fabbione: Cool. I'll do the gdb fix, the ia64 binutils 2.16 fix, and drop pre-v9 support on sparc in one pass, then. | 04:26 |
fabbione | jbailey: works for me | 04:26 |
fabbione | jbailey: plus most of the stuff is ccache right now | 04:29 |
fabbione | so it will be pretty fast to do that | 04:30 |
jbailey | Do far my experiments with ccache don't seem to get a high hit rate on glibc. | 04:30 |
fabbione | no, but i get high rates on all the other pkgs :) | 04:30 |
fabbione | given that doko doesn't upload gcc :) | 04:30 |
jbailey | Right. =) | 04:30 |
fabbione | speaking of which.. i will need to increase the cache size | 04:31 |
jbailey | Yeah, and gcc's never ccachable. | 04:31 |
fabbione | we could make it ccachable ;) | 04:33 |
jbailey | Not trivially. | 04:33 |
jbailey | You'd have to override each stage so that it used ccache instead of xgcc. | 04:33 |
fabbione | actually.. the only reason why gcc needs bootstrapping is because we don't know if the external compiler can build gcc | 04:33 |
jbailey | Which would sort of defeat the purpose of the multistage bootstrap. =) | 04:34 |
fabbione | right? | 04:34 |
jbailey | Well, you also build the compiler with itself, the new version. | 04:34 |
jbailey | That way you get any new optimisations and bug fixes, but also a compiler built with itself, and a compiler built from that one should be identical. | 04:34 |
jbailey | So you know you're not gradually losing by doing a relatively simply comparison. | 04:34 |
fabbione | well perhaps that can be switched to be build option | 04:35 |
fabbione | if you know that the changes are at packaging level only | 04:35 |
fabbione | you can disable all the bootstrapping torture | 04:35 |
fabbione | and use ccache | 04:35 |
fabbione | if you change code in the compiler | 04:36 |
fabbione | than you do the bootstrapping dance | 04:36 |
jbailey | Maybe. You'd have to make a few promises about assembler version and stuff, too. | 04:36 |
fabbione | let's see: | 04:36 |
jbailey | But aside from that, yes, just a simple build / no testsuite / etc might be safe. I'd want to think on that for a month before doing it. =) | 04:36 |
chmj | ok, got a cab for later, now I can stay | 04:37 |
fabbione | ehheh | 04:37 |
=== chmj ponders making something to eat | ||
jbailey | chmj: Where are you going? | 04:37 |
fabbione | you upload -1 with the full bootstrap build | 04:37 |
chmj | from hbd offices to home, late | 04:37 |
jbailey | chmj: Right, I keep forgetting that you have offices there. | 04:37 |
fabbione | you realize that file foo should have been in another directory due to errors in debian/whatever.install | 04:37 |
fabbione | so you need to upload -2 | 04:38 |
jbailey | fabbione: doko applies patches on a per-arch basis. | 04:38 |
fabbione | but what's the point in enabling the overall if -2 is exactly the same as -1 | 04:38 |
jbailey | fabbione: So it could even be a per-upload "Screw: " list of arch's. | 04:38 |
fabbione | oh crap | 04:38 |
fabbione | well i am off to spend a bit of time with my wife | 04:39 |
fabbione | later | 04:39 |
jbailey | Enjoy. =) | 04:39 |
chmj | Enjoy ! | 04:40 |
=== Mithrandir [~tfheen@vawad.err.no] has joined #ubuntu-kernel | ||
jbailey | Heya Tollef | 04:45 |
Mithrandir | hiya Jeff | 04:45 |
Mithrandir | today's thing which makes me angry: Hardware. Apart from that: EVMS needs to shrink my 1.8TB volume to fit a measly 256KB (or thereabouts) of metadata at the end. | 04:46 |
fabbione | kernel-team meeting will start in 9 minutes in #ubuntu-meeting | 05:51 |
=== lamont__ [~lamont@15.238.5.165] has joined #ubuntu-kernel | ||
=== lamont__ [~lamont@15.238.5.165] has joined #ubuntu-kernel | ||
zul | lol..https://bugzilla.ubuntu.com/show_bug.cgi?id=10499 | 07:22 |
=== Seveas [~seveas@seveas.demon.nl] has joined #ubuntu-kernel | ||
=== zul [~chuck@CPE0006258ec6c2-CM000a73655d0e.cpe.net.cable.rogers.com] has joined #ubuntu-kernel | ||
zul | gday | 08:29 |
=== jbailey [~jbailey@CPE000ded9d787c-CM014260028338.cpe.net.cable.rogers.com] has joined #ubuntu-kernel | ||
zul | kablooie | 09:20 |
=== svenl [~luther@AStrasbourg-251-1-63-82.w82-126.abo.wanadoo.fr] has joined #ubuntu-kernel | ||
=== dilinger [dilinger@mouth.voxel.net] has joined #ubuntu-kernel | ||
zul | fabbione: you coming to the meeting? | 09:25 |
fabbione | yup :) | 09:25 |
fabbione | i am not gonna miss this one :) | 09:25 |
fabbione | jbailey: i just hooked up benc on irc :) | 09:27 |
fabbione | and bitching him about silo/grub2 ;) | 09:27 |
Mithrandir | fabbione: what did he say? | 09:28 |
fabbione | Mithrandir: didn't answer back yet :) | 09:28 |
fabbione | oh crap | 09:31 |
fabbione | he had a huge mail loss.. | 09:31 |
Mithrandir | ew :( | 09:31 |
jbailey | fabbione: *lol* | 09:44 |
zul | *sigh* | 09:51 |
fabbione | ohhh | 09:53 |
fabbione | of course! | 09:53 |
fabbione | new glibc will stage for a week or two! | 09:54 |
fabbione | *shrug* | 09:54 |
zul | hehe | 09:54 |
zul | hey fabbione i was thinking after debian and ubuntu systems merged how about one big assed meeting between debian and kernel to get to know each other | 10:00 |
fabbione | zul: we should probably do that during the merge :) | 10:03 |
zul | yeah because i hardly know anyone in the debian side | 10:03 |
fabbione | sure | 10:03 |
fabbione | they are all pretty nice.. some of them upstream | 10:03 |
zul | can they be trusted ;) | 10:04 |
fabbione | yes | 10:05 |
=== Seveaz [~seveas@seveas.demon.nl] has joined #ubuntu-kernel | ||
zul | fuck fuck fuck.. | 10:14 |
zul | fuckity fuck | 10:14 |
jbailey | fabbione: Do you follow lkml? | 10:15 |
fabbione | sometimes | 10:16 |
jbailey | I'm looking at this for initramfs integration and simplified coldplugging: http://lkml.org/lkml/2005/5/12/188 | 10:16 |
jbailey | Can you offer an opinion on whether this is likely to wind its way into a mainstream kernel? | 10:16 |
fabbione | zul: mind to tell mdz wth you saw that kernel? | 10:18 |
fabbione | i think it already is.... | 10:18 |
fabbione | jbailey: let me check | 10:19 |
fabbione | jbailey: the patch is alredy in Linus tree | 10:23 |
=== jbailey blinks. | ||
jbailey | Right. | 10:25 |
fabbione | it will be either in rc6 or final.. whatever will come first :) | 10:27 |
jbailey | I wonder what it will choose the preferred driver when more than one is possible for a device. | 10:30 |
jbailey | greg kh's response seems to be to just not building the conflicting driver. | 10:30 |
fabbione | what case is that? | 10:31 |
jbailey | Like eepro vs. e100, or oss vs. alsa. | 10:32 |
dilinger | http://lkml.org/lkml/2005/6/1/109 | 10:32 |
fabbione | jbailey: hmm right | 10:35 |
fabbione | dilinger: NEAT | 10:35 |
jbailey | fabbione: Anyhow, not hard to do an alias map or something like that. | 10:37 |
fabbione | i was thinking that we sould actually use 2 criterias | 10:38 |
fabbione | one would be to have a module priority | 10:38 |
fabbione | and one to use module masks | 10:38 |
fabbione | the first would solve the e100/eepro100 problem | 10:38 |
fabbione | we prefer e100 (for ex) and we assign priority 1 | 10:38 |
fabbione | excluding automatically all lower priorities | 10:39 |
fabbione | if e100 is banned, than we look for a lower priority | 10:39 |
fabbione | the module masks are included in the PCIid table already | 10:39 |
fabbione | if we have a perfect match between a module and a device than we load it | 10:39 |
fabbione | in there are 2 perfect matches we use the priority | 10:40 |
fabbione | if there is a perfect match but it's banned than we look for a larger mask | 10:40 |
fabbione | this latter would solve the case for modular IDE | 10:40 |
fabbione | where the perfect match is done by the specific driver | 10:40 |
fabbione | and the larger match by the generic IDE driver | 10:41 |
fabbione | we can use both criterias at the same time | 10:41 |
fabbione | because we might want to override the mask with a priority... | 10:41 |
fabbione | SCARY | 10:41 |
fabbione | I GAVE BIRTH TO A ENDLESS PROBLEM | 10:41 |
jbailey | In this case, I don't know how much of that intformation I'll actually have available to me for the decision. | 10:41 |
jbailey | It looks like modalias might just contain a single name. | 10:41 |
fabbione | jbailey: that needs to be done before the event is sent to userland | 10:42 |
fabbione | basically in kernel hotplug it self | 10:42 |
jbailey | Ah, okay. | 10:43 |
jbailey | Oh, hmm. Or am I confused? I had assumed that this would contain a module name to feed to modprobe. Does it just hand in a device id instead? | 10:43 |
=== jbailey actually reads the sprintfs | ||
jbailey | Are you going to promote the current kernel to main or wait until the next one? | 11:05 |
jbailey | fabbione: (re: silo) Greeat, sounds like fun. Are you willing to do half of the cleanrooming with me? I have a u5 here now, I just need to plug it in. (Not for a couple weeks at least) | 11:07 |
jbailey | That way I don't have to look at the silo code, I can just ask you questions. | 11:07 |
fabbione | jbailey: next one | 11:07 |
fabbione | jbailey: if i can understand what you ask and what to look for.. yes | 11:07 |
jbailey | Lovely. I'll try and get my machine plugged in, otherwise it'll be when I'm back from Debconf. | 11:09 |
dilinger | wait, benc's online? | 11:18 |
fabbione | not here.. not anymore... | 11:18 |
dilinger | damn | 11:19 |
fabbione | dilinger: mail him :) | 11:19 |
fabbione | he did lost a big bunch of emails not too long ago | 11:20 |
dilinger | are you kidding? in the past 2 years, he's emailed me back exactly twice | 11:20 |
jbailey | cisco just manages to make their site worse everytime they touch it. | 11:20 |
dilinger | and i've sent him and cc'd him on numerous mails | 11:20 |
fabbione | that's because you need to know what to tell him and how :) | 11:20 |
fabbione | jbailey: they had this look for a while now.. but it sucks | 11:21 |
dilinger | jbailey: i'd offer to help you cleanroom silo, as i've been playing around w/ the code and reading up on ieee1275, but i'd rather take care of higher priority stuff.. | 11:21 |
jbailey | fabbione: Yeah, a year and abit, I think. | 11:22 |
fabbione | yeah | 11:22 |
fabbione | it still sucks :) | 11:22 |
fabbione | dilinger: ok.. i will give you a hint on how to grab benc attention | 11:22 |
jbailey | dilinger: The ieee1275 works well enough atm to boot a mac, so I suspect there will just be little quirky things to ask. | 11:22 |
fabbione | first line of the mail has to start like this: | 11:22 |
fabbione | Hey GoogGuy, | 11:22 |
fabbione | in 99% of the cases you will get an email back | 11:23 |
fabbione | meh | 11:23 |
fabbione | GoodGuy i mean | 11:23 |
fabbione | well it's time to go and crash i can barely type | 11:23 |
jbailey | g'n fabio | 11:23 |
fabbione | night ladies and gentlemen | 11:24 |
jbailey | dilinger: When it comes time, I'll ping you to see if you're still busy ;P | 11:24 |
Generated by irclog2html.py 2.7 by Marius Gedminas - find it at mg.pov.lt!