*** kebray has quit IRC | 00:11 | |
*** kebray has joined #openstack-barbican | 00:12 | |
*** lisaclark has joined #openstack-barbican | 00:31 | |
*** lisaclark has quit IRC | 00:35 | |
*** chlong has joined #openstack-barbican | 00:48 | |
*** dave-mccowan has joined #openstack-barbican | 01:07 | |
*** mixos has joined #openstack-barbican | 01:28 | |
*** zz_dimtruck is now known as dimtruck | 02:49 | |
*** kebray has quit IRC | 02:54 | |
*** dimtruck is now known as zz_dimtruck | 03:00 | |
*** kebray has joined #openstack-barbican | 03:08 | |
*** kebray has quit IRC | 03:10 | |
*** kebray has joined #openstack-barbican | 03:11 | |
*** NazcaLines has joined #openstack-barbican | 03:22 | |
*** zz_dimtruck is now known as dimtruck | 03:35 | |
*** dave-mccowan has quit IRC | 03:57 | |
*** NazcaLines has quit IRC | 04:06 | |
*** kebray has quit IRC | 04:18 | |
*** NazcaLines has joined #openstack-barbican | 04:19 | |
*** kebray has joined #openstack-barbican | 04:21 | |
*** NazcaLines has quit IRC | 04:25 | |
*** NazcaLines has joined #openstack-barbican | 04:39 | |
*** ig0r_ has quit IRC | 04:50 | |
*** ig0r_ has joined #openstack-barbican | 04:55 | |
*** darrenmoffat has quit IRC | 05:12 | |
*** darrenmoffat has joined #openstack-barbican | 05:13 | |
*** NazcaLines has quit IRC | 05:49 | |
*** dimtruck is now known as zz_dimtruck | 05:55 | |
*** mixos has quit IRC | 05:56 | |
*** Nirupama has joined #openstack-barbican | 05:58 | |
*** NazcaLines has joined #openstack-barbican | 06:07 | |
*** yuanying has joined #openstack-barbican | 06:11 | |
*** ig0r_ has quit IRC | 06:12 | |
*** NazcaLines has quit IRC | 06:26 | |
*** alee has quit IRC | 06:35 | |
*** NazcaLines has joined #openstack-barbican | 06:43 | |
*** NazcaLines has quit IRC | 07:02 | |
*** NazcaLines has joined #openstack-barbican | 07:02 | |
*** openstackstatus has joined #openstack-barbican | 07:05 | |
*** ChanServ sets mode: +v openstackstatus | 07:05 | |
*** openstackgerrit has joined #openstack-barbican | 07:10 | |
*** jamielennox is now known as jamielennox|away | 07:12 | |
*** kebray has quit IRC | 07:35 | |
openstackgerrit | sonu proposed openstack/python-barbicanclient: Pass environment variables of proxy to tox https://review.openstack.org/257188 | 07:45 |
---|---|---|
*** chlong has quit IRC | 07:46 | |
openstackgerrit | sonu proposed openstack/python-barbicanclient: Removes MANIFEST.in as it is not needed explicitely by PBR https://review.openstack.org/257193 | 07:49 |
*** jkf has quit IRC | 08:00 | |
*** jkf has joined #openstack-barbican | 08:19 | |
*** NazcaLines has quit IRC | 09:00 | |
*** NazcaLines has joined #openstack-barbican | 09:11 | |
*** rm_you has joined #openstack-barbican | 09:17 | |
*** darrenmoffat has left #openstack-barbican | 09:21 | |
*** ig0r_ has joined #openstack-barbican | 09:40 | |
*** chlong has joined #openstack-barbican | 11:39 | |
openstackgerrit | ting wang proposed openstack/barbican: the argument's type was wrong. The type should be list not string. https://review.openstack.org/257318 | 12:33 |
openstackgerrit | ting wang proposed openstack/barbican: Fix parameter's type error in test case https://review.openstack.org/257318 | 12:39 |
*** dave-mccowan has joined #openstack-barbican | 12:54 | |
*** NazcaLines has quit IRC | 13:03 | |
*** Nirupama has quit IRC | 13:27 | |
*** elmiko_ is now known as elmiko | 13:39 | |
*** jhfeng has joined #openstack-barbican | 13:45 | |
*** jaosorior has joined #openstack-barbican | 13:47 | |
*** rellerreller has joined #openstack-barbican | 14:04 | |
*** NazcaLines has joined #openstack-barbican | 14:05 | |
*** alee has joined #openstack-barbican | 14:10 | |
*** gariveradlt has joined #openstack-barbican | 14:36 | |
*** everjeje has joined #openstack-barbican | 15:03 | |
*** ig0r_ has quit IRC | 15:04 | |
*** gariveradlt has quit IRC | 15:09 | |
*** zz_dimtruck is now known as dimtruck | 15:13 | |
*** kfarr has joined #openstack-barbican | 15:29 | |
*** NazcaLines has quit IRC | 15:32 | |
*** jorge_munoz has quit IRC | 15:43 | |
*** silos has joined #openstack-barbican | 15:44 | |
*** silos has left #openstack-barbican | 15:47 | |
*** silos has joined #openstack-barbican | 15:47 | |
*** jmckind has joined #openstack-barbican | 15:48 | |
*** dave-mccowan has quit IRC | 15:48 | |
*** jorge_munoz has joined #openstack-barbican | 15:56 | |
*** dave-mccowan has joined #openstack-barbican | 15:59 | |
*** dave-mcc_ has joined #openstack-barbican | 16:02 | |
*** dave-mccowan has quit IRC | 16:06 | |
*** jmckind has quit IRC | 16:09 | |
*** kebray has joined #openstack-barbican | 16:20 | |
*** kebray has quit IRC | 16:20 | |
*** kebray has joined #openstack-barbican | 16:20 | |
*** jmckind has joined #openstack-barbican | 16:23 | |
*** ccneill has joined #openstack-barbican | 16:35 | |
*** kebray has quit IRC | 16:37 | |
*** silos has quit IRC | 16:38 | |
*** silos has joined #openstack-barbican | 16:39 | |
*** gyee has joined #openstack-barbican | 16:53 | |
*** kebray has joined #openstack-barbican | 16:54 | |
*** jhfeng has quit IRC | 16:56 | |
*** diazjf has joined #openstack-barbican | 16:59 | |
*** jmckind_ has joined #openstack-barbican | 17:04 | |
*** jmckind has quit IRC | 17:05 | |
*** jmckind has joined #openstack-barbican | 17:05 | |
*** jmckind_ has quit IRC | 17:06 | |
*** stanzi_ has joined #openstack-barbican | 17:07 | |
*** Stanzi has joined #openstack-barbican | 17:08 | |
*** Stanzi has quit IRC | 17:08 | |
*** stanzi_ has quit IRC | 17:08 | |
*** stanzi has joined #openstack-barbican | 17:09 | |
*** Stanzi_ has joined #openstack-barbican | 17:09 | |
*** openstackstatus has quit IRC | 17:20 | |
*** openstackstatus has joined #openstack-barbican | 17:21 | |
*** ChanServ sets mode: +v openstackstatus | 17:21 | |
openstackgerrit | Christopher Solis proposed openstack/castellan: Update docs with parsing config files https://review.openstack.org/257499 | 17:27 |
*** jmckind has quit IRC | 17:31 | |
*** silos has quit IRC | 17:38 | |
*** silos has joined #openstack-barbican | 17:42 | |
*** everjeje has quit IRC | 17:52 | |
*** silos has quit IRC | 17:53 | |
*** pdesai has joined #openstack-barbican | 17:58 | |
*** stanzi has quit IRC | 18:05 | |
*** Stanzi_ has quit IRC | 18:05 | |
*** stanzi_ has joined #openstack-barbican | 18:06 | |
*** Stanzi has joined #openstack-barbican | 18:06 | |
openstackgerrit | Fernando Diaz proposed openstack/barbican-specs: Blueprint defining user defined metadata for Barbican Secrets https://review.openstack.org/229995 | 18:07 |
*** dave-mcc_ has quit IRC | 18:23 | |
*** dave-mccowan has joined #openstack-barbican | 18:36 | |
*** kfarr has quit IRC | 18:38 | |
*** ig0r_ has joined #openstack-barbican | 18:40 | |
*** david-lyle_ has joined #openstack-barbican | 18:42 | |
*** david-lyle has quit IRC | 18:45 | |
*** silos has joined #openstack-barbican | 19:04 | |
*** diazjf has quit IRC | 19:15 | |
*** diazjf has joined #openstack-barbican | 19:23 | |
*** woodster_ has joined #openstack-barbican | 19:26 | |
*** ccneill_ has joined #openstack-barbican | 19:30 | |
*** ccneill has quit IRC | 19:32 | |
*** ccneill_ is now known as ccneill | 19:32 | |
*** jmckind has joined #openstack-barbican | 19:45 | |
*** maxabidi has joined #openstack-barbican | 19:50 | |
*** jhfeng has joined #openstack-barbican | 19:54 | |
jaosorior | diazjf ping | 19:54 |
diazjf | jaosorior pong | 19:55 |
jaosorior | diazjf: about this https://review.openstack.org/#/c/243753/ | 19:55 |
diazjf | jaosorior, what's up | 19:55 |
jaosorior | I'm honestly not very keen on any validation being done in the client that is not done on the server | 19:55 |
jaosorior | while doing it in the client might help detect issues faster without the need to do calls to the server. That would lead either to code duplication, or for the need of having a common validation code-base | 19:56 |
jaosorior | you mentioned also that you can pass additional fields to the server and it won't complaign, how is that a problem? (honest question, I thought about it a bit and couldn't figure out what would be an issue) | 19:57 |
*** NazcaLines has joined #openstack-barbican | 19:58 | |
diazjf | jaosorior, I have no problem with that. We can just validate if the json file is properly formatted before passing it. Passing additional fields just wont have any effect and they user may think they do. | 19:58 |
jaosorior | diazjf: I see | 19:59 |
jaosorior | diazjf: I think disabling the passing of extra fields can be enabled through jsonschema | 19:59 |
diazjf | jaosorior, thats what I was planning to do. | 20:00 |
*** kebray has quit IRC | 20:01 | |
diazjf | jaosorior, we can talk after the meeting. Thanks for the quick reply on this. | 20:01 |
*** kfarr has joined #openstack-barbican | 20:02 | |
*** kebray has joined #openstack-barbican | 20:04 | |
*** whydidyoustealmy has quit IRC | 20:07 | |
*** shakamunyi has quit IRC | 20:07 | |
*** david-lyle_ has quit IRC | 20:10 | |
*** david-lyle has joined #openstack-barbican | 20:12 | |
openstackgerrit | Christopher Solis proposed openstack/castellan: Update docs with parsing config files https://review.openstack.org/257499 | 20:13 |
*** jmckind_ has joined #openstack-barbican | 20:18 | |
*** jmckind has quit IRC | 20:21 | |
*** dimtruck is now known as zz_dimtruck | 20:23 | |
*** jmckind has joined #openstack-barbican | 20:27 | |
*** kebray has quit IRC | 20:28 | |
*** zz_dimtruck is now known as dimtruck | 20:28 | |
*** jmckind_ has quit IRC | 20:30 | |
*** jmckind has quit IRC | 20:31 | |
openstackgerrit | Christopher Solis proposed openstack/barbican-specs: Add a KMIP key manager interface in Castellan https://review.openstack.org/246546 | 20:32 |
*** gariveradlt_ has joined #openstack-barbican | 20:34 | |
*** jmckind has joined #openstack-barbican | 20:35 | |
*** kebray has joined #openstack-barbican | 20:37 | |
*** Stanzi has quit IRC | 20:43 | |
*** stanzi_ has quit IRC | 20:43 | |
*** jmckind_ has joined #openstack-barbican | 20:48 | |
*** Stanzi has joined #openstack-barbican | 20:49 | |
*** stanzi_ has joined #openstack-barbican | 20:49 | |
*** jmckind_ has quit IRC | 20:50 | |
*** jmckind has quit IRC | 20:51 | |
*** jmckind has joined #openstack-barbican | 20:53 | |
*** kebray has quit IRC | 20:55 | |
*** kebray has joined #openstack-barbican | 20:56 | |
diazjf | jaosorior, we can continue our little validation talk if you would like | 21:00 |
jaosorior | diazjf: sure | 21:01 |
alee | redrobot, you ended the meeting so quickly! | 21:01 |
*** rellerreller has quit IRC | 21:01 | |
*** david-lyle has quit IRC | 21:01 | |
alee | diazjf, redrobot - I've started working on a puppet-module for installing barbican .. | 21:02 |
alee | https://github.com/vakwetu/puppet-barbican | 21:02 |
alee | some basic code is there - but it would useful for folks to take a look at it and try it out .. | 21:02 |
alee | especially folks who know more about puppet than me .. | 21:03 |
diazjf | jaosorior, so for https://review.openstack.org/#/c/243753/, In terms of validation, I would have to 1.) Just check if its a properly structured json file. On the Barbican Server I can strengthen the validation as a separate patch. | 21:03 |
jaosorior | alee: how much is that differing from the openstack/puppet-barbican | 21:03 |
diazjf | alee, that sounds great | 21:03 |
jaosorior | ? | 21:03 |
alee | jaosorior, its a fork off of it | 21:03 |
alee | jaosorior, I plan to submit upstream to that - but I want to do some functional tests first | 21:04 |
alee | jaosorior, the openstack/puppet-barbican doesn't actually do anything | 21:04 |
jaosorior | alee: Makes sense, is there a topic branch or something that I can start reviewing from your github? | 21:04 |
alee | jaosorior, just master | 21:04 |
jaosorior | alee: I know, but there are some basics implemented there, and they even have code for review in gerrit | 21:05 |
jaosorior | diazjf: Well, 1 makes sense. 2 I would like to see more specific stuff, but I guess we can see that in a patch | 21:05 |
alee | jaosorior, you mean in the openstack/puppet-barbican? | 21:05 |
diazjf | jaosorior, sounds great | 21:06 |
jaosorior | alee: https://review.openstack.org/#/q/status:merged+puppet-barbican,n,z | 21:06 |
*** ccneill has quit IRC | 21:06 | |
alee | jaosorior, yes - like I said -- I plan to do a pull request up there as soon as I can get a functional test in .. | 21:06 |
jaosorior | alee: I didn't know they took pull requests, thought it was all from gerrit. Fair enough. | 21:07 |
*** david-lyle has joined #openstack-barbican | 21:07 | |
jaosorior | alee: Let me know if you need help/reviews | 21:07 |
diazjf | alee, same here | 21:07 |
alee | jaosorior, yeah - not sure how it works -- maybe I'll add to gerrit | 21:08 |
alee | jaosorior, either way - I plan to submit upstream | 21:08 |
alee | jaosorior, diazjf -- well take a look at what I have | 21:08 |
alee | jaosorior, as I mentioned - its a fork of what they have | 21:08 |
jaosorior | alee: Yeah, checking it out. That's a pretty big commit you have there | 21:08 |
alee | jaosorior, yeah - I suppose I can break it up into smaller commits when I submit upstream | 21:09 |
*** NazcaLines has quit IRC | 21:10 | |
*** silos has quit IRC | 21:10 | |
jaosorior | alee: That would help a bit the review, but if it's too much of a hassle, I'll just review it like that | 21:10 |
alee | jaosorior, yes please :) | 21:11 |
alee | at least for now | 21:11 |
alee | diazjf, jaosorior if anything , you guys can tell me how to do some of the things I commented out | 21:11 |
jaosorior | alee: I'll review in github meanwhlie | 21:11 |
alee | cool | 21:11 |
diazjf | alee, I'll try it out this week and let you know | 21:11 |
alee | diazjf, thanks --- I believe the debian install will not work at alll most likely as I have no idea what the package names are etc. | 21:12 |
*** david-lyle has quit IRC | 21:12 | |
alee | diazjf, so if you are using that - your feedback will definitely help | 21:13 |
jaosorior | alee: But rpm works? | 21:15 |
alee | jaosorior, well -- I'm in the process of testing all that :) | 21:15 |
alee | jaosorior, the package names should be correct for rpm | 21:16 |
*** jamielennox|away is now known as jamielennox | 21:17 | |
diazjf | Thanks alee, I'll try to figure it out. I'll ask for some setup notes if you have ;) | 21:17 |
alee | diazjf, the only thing I'm doing so far is this .. | 21:18 |
alee | https://wiki.openstack.org/wiki/Puppet/Unit_testing and https://wiki.openstack.org/wiki/Puppet/Functional_testing | 21:19 |
alee | well startign to work on the functional tests | 21:19 |
*** jmckind has quit IRC | 21:21 | |
diazjf | alee, alright, I'll just figure out setting it up with vagrant | 21:23 |
*** jhfeng has quit IRC | 21:23 | |
alee | diazjf, cool - sorry, I'm starting to figure all this stuff up myself. | 21:23 |
diazjf | alee, no worries, my first time using puppet as well :p | 21:24 |
jaosorior | alee: commented | 21:25 |
*** silos has joined #openstack-barbican | 21:25 | |
alee | jaosorior, that was fast | 21:25 |
jaosorior | alee: to battle my jetlag I'm consuming an obscene amount of coffee | 21:25 |
jaosorior | alee: On the other hand, it wasn't an exhaustive parse | 21:26 |
*** jmckind has joined #openstack-barbican | 21:26 | |
jaosorior | greetings from Mexico, by the way | 21:26 |
elmiko | hola jaosorior ! | 21:27 |
jaosorior | elmiko: Yo duuuude :D | 21:27 |
woodster_ | jaosorior: Welcome back to to the americas! | 21:27 |
jaosorior | woodster_: Thanks dude :D I'll be around here until the 26th | 21:28 |
diazjf | jaosorior you coming back for the mid-cycle? | 21:28 |
jaosorior | diazjf: nope :/ won't be able to make it | 21:29 |
alee | jaosorior, cool was wondering about that :) | 21:29 |
woodster_ | jaosorior: nice long visit...I'm thinking tequilla shortage | 21:29 |
diazjf | awww :(, well hope your having a good time in Mexico. | 21:29 |
jaosorior | haha I am, pretty cool to come to visit | 21:30 |
alee | jaosorior, woodster_ breaking news .. mexican authorities searching for mysterious source of licorice flavored deadly ooze, appears to be replacing tequila as national drink .. | 21:31 |
jaosorior | woodster_ well, more of a taco shortage. I have a very decent selection of tequilas in Finland :P (I usually bring back several bottles) | 21:31 |
*** Stanzi has quit IRC | 21:31 | |
*** stanzi_ has quit IRC | 21:31 | |
woodster_ | jaosorior: ha! | 21:32 |
diazjf | jaosorior, open up a taco food truck in Finland | 21:32 |
diazjf | maybe fusion with whatever Finish food is lol | 21:32 |
woodster_ | alee: ugh, that's worse than Mezcal! | 21:33 |
jaosorior | diazjf: I have thought about it... hahaha | 21:33 |
*** kfarr has quit IRC | 21:33 | |
jaosorior | alee: salty hangovers ensue | 21:33 |
jaosorior | alee: Don't worry, you'll get your fix of salmiakki in DevConf | 21:34 |
diazjf | redrobot(robo-rojo), wanna setup some time this week to chat on whats to be done in Barbican for Swift? | 21:38 |
redrobot | diazjf sure thing, when are you available? I'm pretty much free on Wednesday. | 21:39 |
diazjf | redrobot, works for me! Lets say after lunch so 2 or 3 PM? | 21:39 |
diazjf | redrobot, I can start a hangout around that time and post it here in case anyone else wants to join in. | 21:40 |
alee | jaosorior, outstanding! | 21:40 |
redrobot | diazjf sounds good | 21:40 |
diazjf | redrobot, awesome | 21:41 |
*** ccneill has joined #openstack-barbican | 21:42 | |
*** pdesai has quit IRC | 21:45 | |
*** pdesai has joined #openstack-barbican | 21:46 | |
jaosorior | alee: If you address the comment specifically in this line https://github.com/vakwetu/puppet-barbican/commit/888f61b7cb0de0040c22c1a3c2148945888c9f53#diff-e5968f40345cf5d3be0539fbba87f787R156 let me know | 21:50 |
*** chlong has quit IRC | 21:51 | |
alee | jaosorior, ok - so I should do what rich suggests? | 21:53 |
alee | in the lauchpad bug? | 21:54 |
jaosorior | alee: Do you have means to test that? | 21:54 |
alee | jaosorior, not really no | 21:54 |
alee | jaosorior, but I know you do :) | 21:54 |
jaosorior | alee: Alright, well, leave it like that meanwhile. Hopefully we can get the keystone solution tested soon, and when that's done I'll submit a fix for the barbican puppet module | 21:55 |
alee | cool | 21:55 |
*** kebray has quit IRC | 21:56 | |
*** kebray has joined #openstack-barbican | 22:01 | |
*** gariveradlt_ has quit IRC | 22:11 | |
*** silos has left #openstack-barbican | 22:21 | |
*** david-lyle has joined #openstack-barbican | 22:39 | |
rm_work | so, how does python-barbicanclient decide what keystone endpoint to hit? | 22:41 |
rm_work | is it read from a config somewhere or something? | 22:41 |
rm_work | we're using it in our service and even though our service is configured to use one endpoint, when we make calls that use python-barbicanclient, it pulls some other endpoint out of thin air for keystone | 22:42 |
jamielennox | rm_work: if there's a session object that's handling it for you | 22:43 |
redrobot | rm_work it's the session object http://docs.openstack.org/developer/python-barbicanclient/authentication.html#keystone-authentication | 22:43 |
*** jmckind has quit IRC | 22:43 | |
jamielennox | rm_work: you'll do like get('/path/to/api', endpoint_filter={'service_type': 'keys', 'interface': 'public'}) and it'll work | 22:43 |
jamielennox | filling endpoint_filter is generally just done once when you create a client object | 22:44 |
rm_work | hmmm k looking to figure out what's going on | 22:44 |
rm_work | well | 22:45 |
rm_work | so we do this: | 22:45 |
rm_work | https://gist.github.com/rm-you/1e431fb0ccf160f0994f | 22:47 |
rm_work | where auth_url = "http://1.2.3.4:35357/v2.0" | 22:48 |
rm_work | and then when we do an operation on python-barbicanclient, it pulls "http://127.0.0.1:5000/v2.0" out of thin air | 22:48 |
rm_work | and tries to hit that instead | 22:48 |
*** pdesai has quit IRC | 22:49 | |
rm_work | can't figure out where that's coming from | 22:49 |
rm_work | I passed in a session that was created with the right URL, and it is using ... not that somehow | 22:50 |
redrobot | probably pulling the "public" interface, as opposed to the admin one. | 22:50 |
rm_work | where did it get that?! service-catalog? | 22:51 |
*** diazjf has quit IRC | 22:51 | |
redrobot | rm_work probably? | 22:51 |
rm_work | ugh | 22:51 |
elmiko | if you pass in auth_url directly though, you'd expect it to use that one. weird... | 22:52 |
elmiko | at least, i'd expect that behavior | 22:52 |
rm_work | yes :/ | 22:52 |
*** pdesai has joined #openstack-barbican | 22:54 | |
rm_work | hmm, i may have a lead | 22:57 |
rm_work | i'll let you know | 22:57 |
elmiko | please do, i'd be curious to hear how it turns out. gl | 22:59 |
*** jamielennox is now known as jamielennox|away | 23:01 | |
*** jamielennox|away is now known as jamielennox | 23:01 | |
*** jhfeng has joined #openstack-barbican | 23:03 | |
rm_work | yeah, ok | 23:05 |
rm_work | so it's a bug on our side | 23:05 |
rm_work | our service has two config files | 23:05 |
*** chlong has joined #openstack-barbican | 23:05 | |
rm_work | and is completely ignoring one of them | 23:05 |
rm_work | so the assumption "this is actually set properly" was incorrect | 23:05 |
rm_work | took debugging through it with pdb to see that the cfg value was not loading correctly | 23:06 |
*** jhfeng has quit IRC | 23:07 | |
elmiko | rm_work: nice =) | 23:18 |
rm_work | yeah, time to file a bug against our devstack plugin... | 23:18 |
*** dave-mccowan has quit IRC | 23:20 | |
jaosorior | rm_work: What's the issue? | 23:23 |
rm_work | jaosorior: neutron-lbaas issue, as it turns out | 23:25 |
rm_work | our service used to automatically load its config file, which our devstack plugin assumes (so doesn't load it explicitly) and now it doesn't load it automatically anymore | 23:25 |
rm_work | so it just ... doesn't read config values, and no matter what is set, it uses the defaults :P | 23:26 |
rm_work | so everyone but me didn't notice because I'm apparently the only one using a password that isn't "password" in my devstack >_> | 23:26 |
jaosorior | lol | 23:28 |
jaosorior | funky | 23:29 |
*** maxabidi has quit IRC | 23:44 | |
*** jaosorior has quit IRC | 23:57 |
Generated by irclog2html.py 2.14.0 by Marius Gedminas - find it at mg.pov.lt!