Friday, 2013-10-04

*** jdaggett has joined #openstack-marconi00:36
*** jdaggett has quit IRC00:40
*** nosnos has joined #openstack-marconi00:45
*** kgriffs_afk is now known as kgriffs01:00
*** kgriffs is now known as kgriffs_afk01:31
*** kgriffs_afk is now known as kgriffs01:32
*** jdaggett has joined #openstack-marconi01:36
*** kgriffs is now known as kgriffs_afk01:38
*** kgriffs_afk is now known as kgriffs01:39
*** jdaggett has quit IRC01:41
*** kgriffs is now known as kgriffs_afk01:56
*** kgriffs_afk is now known as kgriffs02:07
*** kgriffs is now known as kgriffs_afk02:41
*** tvb has joined #openstack-marconi05:53
*** nosnos has quit IRC06:08
*** nosnos has joined #openstack-marconi06:54
*** flaper87|afk is now known as flaper8707:58
*** yassine has joined #openstack-marconi08:15
openstackgerritFlavio Percoco proposed a change to openstack/python-marconiclient: Move api.py under v1/ since  https://review.openstack.org/4969808:38
*** flaper87 is now known as flaper87|afk09:00
*** flaper87|afk is now known as flaper8709:05
*** ykaplan has joined #openstack-marconi09:14
*** tvb has quit IRC09:52
*** tvb has joined #openstack-marconi09:53
*** malini has joined #openstack-marconi10:30
*** malini has left #openstack-marconi10:31
*** malini has joined #openstack-marconi11:06
*** flaper87 is now known as flaper87|afk11:15
*** tedross has joined #openstack-marconi11:26
*** nosnos has quit IRC11:32
*** flaper87|afk is now known as flaper8711:51
*** vkmc has joined #openstack-marconi11:59
*** vkmc has quit IRC11:59
*** vkmc has joined #openstack-marconi11:59
*** alcabrera has joined #openstack-marconi12:31
alcabreraMorning. :)12:31
flaper87alcabrera: goood morning12:31
flaper87:)12:32
alcabreraflaper87: :D12:35
*** mpanetta has joined #openstack-marconi12:41
alcabreraoooohh, I saw this in my email just now.12:41
alcabrera"Feature freeze is over"12:41
mpanettaalcabrera: o/12:42
mpanettaMornin :)12:42
alcabrerampanetta: o/12:42
mpanettaHow goes?12:42
openstackgerritFlavio Percoco proposed a change to openstack/python-marconiclient: Move api.py under v1/ since  https://review.openstack.org/4969812:45
alcabreraPretty well. I'm possibly not getting enough sleep this week, but alright otherwise. :)12:47
alcabrerampanetta: you?12:47
*** kgriffs_afk is now known as kgriffs12:47
mpanettaPretty much the same here :)12:48
mpanettaI'm about ready to try and tackle the pypy issue12:48
alcabrerasweet12:48
mpanettaBTW, I did an install using the native package for pypy, not a source install.12:48
*** kgriffs is now known as kgriffs_afk12:48
*** malini is now known as malini_afk12:48
mpanettakgriffs_afk: Did we scare you away? :P12:48
alcabrerampanetta: I never do a source install for pypy. It's too long of a process, based on what I've read. I always download the precompiled binary from pypy.org12:49
*** mpanetta has quit IRC12:49
*** mpanetta has joined #openstack-marconi12:49
flaper87alcabrera: now you scared him12:49
alcabreralol12:49
flaper87:D12:49
flaper87alcabrera: it is indeed LOOONG12:49
flaper87the compilation takes like, FOREVER12:50
flaper87:D12:50
alcabrera2+ hours - maybe longer than building the Linux kernel12:50
alcabrera:P12:50
* flaper87 used to have 1 working copy per branch with a pre-compiled pypy12:50
*** mpanetta_ has joined #openstack-marconi12:54
*** mpanetta has quit IRC12:54
*** mpanetta has joined #openstack-marconi12:57
*** mpanetta_ has quit IRC12:57
mpanettaSorry12:57
mpanettaHaving network issues12:58
mpanettaTrying to get them resolved.12:58
*** flaper87 is now known as flaper87|afk12:58
mpanettaWhat did I miss about compiing pypy?12:58
alcabrerampanetta: I'm not sure. I'm tinkering with running a trivial wsgi app using uwsgi + pypy and I'm encountering the same issue. (libpypy-c.so missing)13:01
mpanettaalcabrera: That is very odd.13:01
mpanettaI wonder what the all mighty google has to say...  Let me look :)13:02
mpanettaFound in uwsgi docs: "As of August 2013 all of the required patches to PyPy have been merged, so you can get an official source tarball release. Unfortunately you still need to build/translate libpypy-c by yourself, or download one of the following files (they require libssl 1.0):"13:03
mpanettahttp://uwsgi-docs.readthedocs.org/en/latest/PyPy.html13:04
mpanettaafk13:04
alcabrerampanetta: :/13:09
alcabreraThat seems like quite the hassle.13:09
*** jcru has joined #openstack-marconi13:17
mpanettaYeah13:18
mpanettaBah, I don't get this.  Why don't they build and install the library by default?13:23
*** flaper87|afk is now known as flaper8713:24
flaper87fucking network13:24
alcabrerampanetta: That's a great question. My best guess is that since uwsgi is written almost exclusively in C, it has some special entry points that depend on libpypy-c.so being present to use.13:25
*** malini_afk is now known as malini13:28
*** amitgandhi has joined #openstack-marconi13:28
*** kgriffs_afk is now known as kgriffs13:39
alcabreraflaper87: Could I get two reviews from you this morning/afternoon? :D13:43
alcabrera1. Proxy logging: https://review.openstack.org/#/c/49585/13:43
flaper87alcabrera: Absolutely13:43
alcabrera2. [bug] Proxy dups queues: https://review.openstack.org/#/c/49599/13:43
alcabreraflaper87: awesome! :)13:43
* flaper87 has been heads down on the client13:43
flaper87we're almost there guys, almost there13:44
alcabreraflaper87: I'll review the client code, meanwhile.13:44
flaper87I now need to figure out how the heck I'm going to split all this in several patches13:44
alcabreraOoohh, the patch-splitting problem, haha. I've run into that several times now. :P13:44
mpanettathey use scripts to do that for the linux source.13:45
flaper87mpanetta: you need black magic to do that in Python, too many corner cases13:46
zyuanalcabrera: i tried a unittest with listing queues, and i got 200. does that mean the bug we met yesterday is fixed?13:47
flaper87In the kernel they get a MiddleFingerException from the compiler if something is wrong13:47
alcabrerazyuan: hmmm... it shouldn't be fixed yet.13:47
alcabreraflaper87: lol!13:47
flaper87:D13:47
zyuanalcabrera: where i got the result. i can't tell the boundary of mocking13:48
alcabrerabrb13:48
mpanettaflaper87: ah13:48
mpanettalol on the exception :P13:49
alcabreraback13:49
mpanettawb13:52
kgriffsflaper87: i think this one is all set - https://review.openstack.org/#/c/49451/13:55
flaper87kgriffs: +2'd13:56
alcabrerakgriffs: that one is blocked by jenkins.13:57
flaper87kgriffs: FYI, you're allowed to kick jenkins ass, no one will be mad at you for that!13:59
*** russellb is now known as rustlebee14:11
*** jcru has quit IRC14:17
*** jcru has joined #openstack-marconi14:18
*** flaper87 is now known as flaper87|afk14:30
fvollero:) howdy14:31
fvolleroalcabrera: I got to deal with other stuff, but i tried to look at proxy app with gunicorn, it miserably fail to start :(14:33
fvolleroalcabrera: http://ur1.ca/fu1cc14:35
*** flaper87|afk is now known as flaper8714:36
alcabrerafvollero: Hey! :D14:38
fvolleroflaper87: meh14:38
fvolleroi have a question, there's a pluggable way to use different storage components, correct?14:40
flaper87fvollero: right14:43
fvolleroflaper87: so I can wake up a morning and add the elasticsearch storage component14:43
flaper87fvollero: right, if you do let me know because I was planning to do so14:43
flaper87:P14:44
fvolleroflaper87: well well well :) great minds thing alike14:44
fvolleros/thing/think/14:44
flaper87fvollero: feel free to take over and implement it!14:44
fvolleroflaper87: uhm, you already scratched something ?14:44
flaper87fvollero: alcabrera has a great example of how an external storage plugin repo should look like14:44
flaper87fvollero: alcabrera was working on the redis one in an external repo14:45
fvolleroflaper87: ok, so i'll take inspiration from the redis one?14:45
flaper87fvollero: nope, just the idea but it should be very similar to Mongodb's14:45
alcabreraflaper87, fvollero: That repo needs some clean-up for sure. :P14:45
alcabreraThe redis one.14:45
alcabreraTwo hackdays of fighting with stevedore before I knew how to drive stevedore, haha.14:46
flaper87fvollero: take the structure from the redis one and the inspiration from your inner self14:46
flaper87fvollero: ah, and if you want, take a look at Mongodb's backend, that should give you some ideas14:46
flaper87:P14:46
* flaper87 enjoys trolling fvollero14:46
alcabrerafvollero: the mongodb advice is solid. It's how I got a start with redis backend.14:46
flaper87alcabrera: I'll review your patches in a bit.14:50
alcabrerafvollero: I just took a look at that error!14:51
alcabrera(http://paste.fedoraproject.org/44328/97310138/)14:51
alcabreraYou need to update your six module.14:51
fvolleroalcabrera: yep :) i sorted out few secs ago :D14:52
fvolleroflaper87: yeah yeah yeah... /me remind to smash the cocosette left for flavio14:53
* fvollero hugs flaper87 14:53
fvolleroalcabrera: thanks :) i'm gonna take a look at both in a sec14:54
flaper87fvollero: wait wait wait wait, lets not get to aggressive! Leave that poor cocosette in its box right next to the others you'll send me14:54
flaper87and yeah, notice the PLURAL!!!!!!14:54
flaper87:D14:54
fvolleroflaper87: hahahahahhahaha14:54
fvolleroflaper87: i don't know how much i can make them last :) (Also the Toronto chocolates)14:55
*** tvb has quit IRC14:55
flaper87fvollero: http://s.f87.me/176jyTv14:57
fvolleroflaper87: hahaahhahaah14:58
fvolleroalcabrera: redis support is...in ?14:58
*** amitgandhi has quit IRC14:59
*** amitgandhi has joined #openstack-marconi14:59
alcabrerafvollero: redis support is stuck. I haven'y had time to work on it. :P15:01
* alcabrera eats the cocosette15:01
*** alcabrera is now known as alcabrera|afk15:03
*** alcabrera|afk is now known as alcabrera15:05
*** kgriffs is now known as kgriffs_afk15:11
*** kgriffs_afk is now known as kgriffs15:15
*** kgriffs is now known as kgriffs_afk15:16
fvolleroalcabrera: ahhahahahaha15:19
*** ayoung_ has joined #openstack-marconi15:27
*** ayoung_ is now known as ayoung15:28
*** flaper87 is now known as flaper87|afk15:39
*** yassine has quit IRC15:41
openstackgerritZhihao Yuan proposed a change to openstack/marconi: feat(proxy): listing opts returns lists  https://review.openstack.org/4959515:42
*** whenry has quit IRC15:47
*** whenry has joined #openstack-marconi16:00
alcabrerazyuan: +2 ^^16:05
openstackgerritZhihao Yuan proposed a change to openstack/marconi: fix: listing queue fails when detailed=True  https://review.openstack.org/4978316:11
*** amitgandhi is now known as amitgandhi_afk16:11
openstackgerritAlejandro Cabrera proposed a change to openstack/marconi: fix: do not duplicate queues across partitions  https://review.openstack.org/4959916:14
alcabreraflaper87|afk: Could you add a default implementation of __contains__() to oslo.cache.backends so that 'key in cache' works? :D16:16
alcabreraI noticed this feature while handling some code review a moment ago.16:17
*** mpanetta has quit IRC16:23
*** mpanetta has joined #openstack-marconi16:23
*** alcabrera is now known as alcabrera|afk16:34
*** tvb has joined #openstack-marconi16:35
*** flaper87|afk is now known as flaper8716:37
flaper87alcabrera|afk: I wanted to avoid having magic methods there, TBH,16:38
flaper87alcabrera|afk: that will lead to having __getitem__ __setitem__ and whatnot16:38
flaper87which I'm not fully opposed to but it's definitely something to consider16:38
*** alcabrera|afk is now known as alcabrera16:38
alcabreraflaper87: ah, cool. Thanks for the rationale!16:39
alcabreraI can understand that.16:39
flaper87FIRE IN THE HOLE!!!!!16:39
openstackgerritFlavio Percoco proposed a change to openstack/python-marconiclient: Split get_transport into 2 different functions  https://review.openstack.org/4978616:39
openstackgerritFlavio Percoco proposed a change to openstack/python-marconiclient: Make the request object API aware  https://review.openstack.org/4978716:39
openstackgerritFlavio Percoco proposed a change to openstack/python-marconiclient: Implement HTTP Transport  https://review.openstack.org/4978816:39
openstackgerritFlavio Percoco proposed a change to openstack/python-marconiclient: Complete refactor of api.py  https://review.openstack.org/4969816:39
alcabreraflaper87: silly fact, though - even hacking.py thinks that 'key in cache' is the preferred method, hahaha.16:39
alcabreraI had to add # noqa to the line 'cache.has_key'. :P16:39
alcabreraflaper87: wooooot - client patches! awesome!16:40
flaper87alcabrera: ahhhhhhh right, mmh, I think I changed that in the implementation16:40
flaper87weird16:40
flaper87It should be exists16:40
flaper87instead of has_key16:40
flaper87alcabrera: https://review.openstack.org/#/c/32544/15/openstack/common/cache/backends.py16:40
flaper87line 7916:40
flaper87looks like we've an old version16:41
flaper87alcabrera: lets see how it goes with the split thing, hopefully the dependancy chain is right16:41
alcabreraflaper87: we have an old version. :P16:41
alcabreraI verified it just now.16:41
flaper87alcabrera: mind updating it ?16:42
flaper87alcabrera: sorry for not having reviewed your patches yet16:42
alcabreraflaper87: no worries, and thanks for commiting to it! :)16:42
flaper87I'll do it today before you leave, that's for sure!16:42
alcabreraAwesome!16:42
flaper87alcabrera: I had all those client things in my head and I was afraid to forget something16:43
alcabreraThe two are small patches, and will help greatly while debugging the proxy in our test environments. :)16:43
alcabreraesp. the logging16:43
alcabreraflaper87: I understand entirely. I'll probably be heads down on some proxy features very soon.16:44
flaper87alcabrera: Should this be error? LOG.warning('GET v1 - no partitions registered')16:46
flaper87Since an error is raised right after that log line16:46
alcabreraflaper87: yup, that's a good call. The system fails hard if no partitions are registered.16:46
alcabreraI'll update that.16:46
flaper87alcabrera: there are 2 cases like that16:46
flaper87alcabrera: reviewed the first16:47
flaper87brb16:47
alcabrerak16:48
openstackgerritAlejandro Cabrera proposed a change to openstack/marconi: feat: add logging to proxy  https://review.openstack.org/4958516:48
alcabreraflaper87: I'm going to hold off on porting over the oslo.cache changes until the critical proxy [bug] is merged. Once that is merged, I'll update the code to use cache.exists rather than cache.has_key and update the marconi instance of oslo.cache.16:54
*** fvollero is now known as fvollero|gone16:57
*** jdaggett has joined #openstack-marconi17:14
*** jdaggett has quit IRC17:16
*** amitgandhi_afk is now known as amitgandhi17:24
openstackgerritAlejandro Cabrera proposed a change to openstack/marconi: fix: do not duplicate queues across partitions  https://review.openstack.org/4959917:31
*** flaper87 is now known as flaper87|afk17:40
openstackgerritZhihao Yuan proposed a change to openstack/marconi: fix: listing queue fails when detailed=True  https://review.openstack.org/4978317:45
*** jdaggett has joined #openstack-marconi17:46
alcabrerazyuan: +217:48
zyuanthanks17:51
*** jdaggett has quit IRC17:51
zyuanalcabrera: i tried to send mock DELETE, but it has no visible effect. cache problem again?17:54
*** jdaggett has joined #openstack-marconi17:58
*** kgriffs_afk is now known as kgriffs18:05
alcabrerazyuan: shouldn't be - cache is invalidated from the patch you depend on if DELETE queue => HTTP 2xx18:07
alcabrerakgriffs: o/18:07
kgriffsyo18:08
zyuanalcabrera: i guess i know what's wrong (my problem, probably)18:13
zyuanyou know waht, we should use contextmgrs...18:15
zyuanit's not too late. let me draft one.18:15
alcabrerazyuan: cmgrs +118:16
kgriffszyuan: https://review.openstack.org/#/c/49783/2/tests/unit/proxy/test_queues.py18:31
kgriffsL11418:31
kgriffswon't those queues get removed when their partitions are deleted @ L52?18:32
zyuankgriffs: it seems that the data is still there18:33
kgriffshmm18:33
alcabrerakgriffs: they won't get removed - partition delete does not trigger queue deletion (yet)18:33
amitgandhikgriffs: meeting18:33
zyuani guess the partition is gone, but since the marconi servers are mocked...18:33
zyuanyea.  i think18:33
zyuanwith self.templqueue(...):18:34
zyuanlooks better18:34
zyuantemp_queue('q1', 'q2', ...)18:34
*** jdaggett has quit IRC18:46
*** jergerber has quit IRC19:02
openstackgerritKurt Griffiths proposed a change to openstack/marconi: chore: Rename MONGODB_TEST_LIVE to MARCONI_TEST_MONGODB  https://review.openstack.org/4945119:03
*** alcabrera is now known as alcabrera|afk19:04
*** amitgandhi has quit IRC19:07
*** amitgandhi has joined #openstack-marconi19:09
*** jdaggett has joined #openstack-marconi19:09
openstackgerritA change was merged to openstack/marconi: chore: Rename MONGODB_TEST_LIVE to MARCONI_TEST_MONGODB  https://review.openstack.org/4945119:20
openstackgerritKurt Griffiths proposed a change to openstack/marconi: chore: Designate semi-private "friend" helper methods as such  https://review.openstack.org/4981219:28
*** malini is now known as malini_afk19:44
*** oz_akan_ has joined #openstack-marconi19:52
oz_akan_kgriffs: around?19:53
kgriffsyeah19:55
*** jdaggett has quit IRC20:06
*** alcabrera|afk is now known as alcabrera20:15
*** amitgandhi has quit IRC20:17
*** amitgandhi has joined #openstack-marconi20:18
*** ykaplan has quit IRC20:20
alcabrerakgriffs: ping20:26
alcabreraJust made it out of a lengthy meeting. :P20:26
alcabreraI'm up for discussion on <name change> lookup.py20:26
*** jdaggett has joined #openstack-marconi20:28
*** tvb has quit IRC20:29
alcabrerakgriffs: I'm about to head out, but I've responded with comments inline. Let me know your thoughts, and if you agree, I'll file a bug report when I get a chance (probably Monday morning).20:35
kgriffsoh, ok20:35
kgriffswe uh, sorta need this ASAP. :p20:35
openstackgerritAlejandro Cabrera proposed a change to openstack/marconi: fix: do not duplicate queues across partitions  https://review.openstack.org/4959920:36
alcabrerakgriffs: I did fix up the 'q:' 'p:' stuff already. :D20:37
kgriffsalcabrera: yeah, I'm fine with doing the refactoring in a followup patch20:37
alcabreraThe only thing I'm not addressing atm is refactoring lookup.py20:37
alcabreracool20:37
alcabreraand test_queues.py does depend on that L94 that executes the create queue logic.20:38
kgriffsquick clarification before you go on that20:38
kgriffsyou are creating a queue that already exists, so you get 20420:39
kgriffsbut20:39
kgriffswouldn't there be an entry in the catalogue from the previous operation to create the queue?20:39
kgriffsor are you mocking me?!20:39
kgriffs;)20:40
kgriffsi mean, how did the queue get "created" in the first place without being also put into the catalogue?20:40
alcabreralol20:40
* kgriffs thinks everyone is secretly mocking him20:41
openstackgerritZhihao Yuan proposed a change to openstack/marconi: feat(test): queue context for proxy  https://review.openstack.org/4983020:41
openstackgerritZhihao Yuan proposed a change to openstack/marconi: fix: listing queue fails when detailed=True  https://review.openstack.org/4978320:41
mpanettaI'm feeling mocked :P  The latest code does not work. :P20:42
alcabreraThat test needs to include a note that it's to account for a situation where the catalogue and queues have already grown inconsistent, so if the queues-storage returns a 204, the catalogue store does not get updated.20:42
kgriffsah20:46
kgriffsyes20:46
kgriffsplease add teh notez20:46
alcabrerakgriffs: will do, then I'm out. :)20:47
zyuankgriffs: i just noticed that HTTPBadRequestBody are overused by me20:47
openstackgerritAlejandro Cabrera proposed a change to openstack/marconi: fix: do not duplicate queues across partitions  https://review.openstack.org/4959920:51
alcabrerakgriffs: comments addressed. :D20:51
alcabreraI wrote an epic note there while I worked out how this scenario could ever come to be.20:51
alcabrera(short of mocking kgriffs. :P )20:51
*** malini_afk is now known as malini20:51
zyuankgriffs: ping20:54
kgriffshey20:55
zyuanbut my patch which uses BadRequestBody again is reasonable20:55
zyuanwait...20:55
zyuanheader is not a part of body...20:56
zyuanok...20:56
zyuanand about the error message20:56
zyuanpython gives20:56
zyuan"badly formed hexadecimal UUID string"20:56
zyuani think that's enough...20:56
zyuanre BadRequestBody, we need a distinct BadRequest for input validation20:58
*** tvb has joined #openstack-marconi21:01
openstackgerritZhihao Yuan proposed a change to openstack/marconi: feat(api): give validation resp a different title  https://review.openstack.org/4983721:11
*** mpanetta has quit IRC21:12
kgriffszyuan: "badly formed hexadecimal UUID string"21:13
zyuan?21:13
kgriffsit is ok, except who knows what it might change to in a future version of python? Also, it sounds awkward and I think we can make it more human-friendly.21:13
kgriffsalso, we can't do translations on result from str(ex)21:14
kgriffsi.e., _(str(ex)) doesn't work21:14
kgriffs(or, at least, hacking/pyflakes complains if you try it)21:15
zyuancan i duplicate error messages (smile)21:16
zyuanlet me seee... only 2 places in total21:16
zyuanah, try except around. it seems that it worth a function21:17
alcabreraHave a great weekend, guys. :)21:23
*** ykaplan has joined #openstack-marconi21:23
*** alcabrera has quit IRC21:24
openstackgerritZhihao Yuan proposed a change to openstack/marconi: feat(api): give validation resp a different title  https://review.openstack.org/4983721:25
*** vkmc has quit IRC21:28
*** tedross has quit IRC21:32
openstackgerritZhihao Yuan proposed a change to openstack/marconi: feat(api): Client-ID is now a real UUID  https://review.openstack.org/4937821:32
openstackgerritZhihao Yuan proposed a change to openstack/marconi: feat(api): Client-ID is now a real UUID  https://review.openstack.org/4937821:37
openstackgerritKurt Griffiths proposed a change to openstack/marconi: Log names of drivers being loaded.  https://review.openstack.org/4984321:37
openstackgerritA change was merged to openstack/marconi: fix: do not duplicate queues across partitions  https://review.openstack.org/4959921:42
openstackgerritZhihao Yuan proposed a change to openstack/marconi: feat(test): queue context for proxy  https://review.openstack.org/4983021:45
openstackgerritZhihao Yuan proposed a change to openstack/marconi: fix: listing queue fails when detailed=True  https://review.openstack.org/4978321:45
*** jcru has quit IRC21:46
openstackgerritA change was merged to openstack/marconi: feat(proxy): listing opts returns lists  https://review.openstack.org/4959521:46
*** malini is now known as malini_afk21:48
zyuankgriffs: don't forget https://review.openstack.org/#/c/49783/ (not sure whether you can merge it, but it's a ... bug)21:49
kgriffsdone21:50
kgriffs:D21:50
kgriffsthanks!21:50
zyuankgriffs: thank you. have a good weekend!21:50
kgriffslikewise, man. take care.21:51
openstackgerritA change was merged to openstack/marconi: fix: listing queue fails when detailed=True  https://review.openstack.org/4978321:52
*** oz_akan_ has quit IRC22:06
*** amitgandhi has quit IRC22:16
openstackgerritKurt Griffiths proposed a change to openstack/marconi: feat: add logging to proxy  https://review.openstack.org/4958522:28
*** kgriffs is now known as kgriffs_afk22:31
*** ametts has quit IRC23:03
*** oz_akan_ has joined #openstack-marconi23:18
*** oz_akan_ has quit IRC23:22

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