IRC log of #zope3-dev for Monday, 2007-09-17

*** ktwilight has joined #zope3-dev00:07
*** ignas has joined #zope3-dev00:09
*** Ariel_Calzada has joined #zope3-dev00:16
*** jsadjohnson_ has quit IRC00:17
*** jodok has quit IRC00:48
*** MrTopf has quit IRC00:59
*** ktwilight has quit IRC00:59
*** tarek has quit IRC01:06
*** dunny has joined #zope3-dev01:25
*** Ariel_Calzada has quit IRC01:50
*** ignas has quit IRC02:15
*** pbugni has joined #zope3-dev02:30
*** jfroche__ has joined #zope3-dev02:40
*** Ariel_Calzada has joined #zope3-dev02:43
*** Ariel_Calzada has left #zope3-dev02:44
*** jfroche_ has quit IRC02:56
*** rocky has quit IRC03:02
*** ousado has joined #zope3-dev03:21
*** ousado_ has quit IRC03:35
*** b52GM has quit IRC04:06
*** b52laptop has quit IRC04:06
*** b52GM has joined #zope3-dev04:06
*** b52laptop has joined #zope3-dev04:06
*** huajie has joined #zope3-dev04:14
*** malthe has quit IRC04:17
*** stub has joined #zope3-dev04:30
*** b52laptop has quit IRC04:44
*** b52GM has quit IRC04:45
*** malthe has joined #zope3-dev04:47
*** ousado_ has joined #zope3-dev05:20
*** stub has quit IRC05:22
*** malthe has quit IRC05:31
*** ousado has quit IRC05:37
*** edgordon has quit IRC05:39
*** malthe has joined #zope3-dev05:39
*** jsadjohnson has quit IRC05:52
*** jsadjohnson has joined #zope3-dev06:01
*** febb has joined #zope3-dev06:11
*** febb has quit IRC06:23
*** jsadjohnson has quit IRC06:26
*** tarek has joined #zope3-dev06:32
*** malthe has quit IRC06:36
*** whit has joined #zope3-dev06:46
*** jsadjohnson has joined #zope3-dev06:49
*** jsadjohnson has quit IRC06:57
*** philiKON_ has joined #zope3-dev07:13
*** philiKON has quit IRC07:28
*** pbugni has quit IRC07:32
*** chacha_chaudhry has joined #zope3-dev07:55
*** huajie has quit IRC07:56
*** whit has quit IRC08:00
*** markusleist has quit IRC08:48
*** zagy has joined #zope3-dev08:48
*** zagy_ has joined #zope3-dev08:58
*** zagy has quit IRC08:58
*** afd__ has joined #zope3-dev08:59
*** jukart has joined #zope3-dev09:03
*** dunny has quit IRC09:10
*** yvl has joined #zope3-dev09:13
*** ghendi has joined #zope3-dev09:18
*** naro has joined #zope3-dev09:18
*** tarek has joined #zope3-dev09:29
*** ghendi has quit IRC09:29
*** hdima has joined #zope3-dev09:31
*** romanofski has joined #zope3-dev09:33
romanofskimoin :)09:35
*** tarek has quit IRC09:40
*** jodok has joined #zope3-dev09:54
*** bigkevmcd has joined #zope3-dev10:07
*** ghendi has joined #zope3-dev10:10
*** markusleist has joined #zope3-dev10:18
*** tarek has joined #zope3-dev10:23
*** dobee has joined #zope3-dev10:32
*** greenman has quit IRC10:32
*** greenman has joined #zope3-dev10:34
*** hazmat has quit IRC10:37
*** jodok has quit IRC11:01
*** jodok has joined #zope3-dev11:03
*** greenman has quit IRC11:06
*** greenman_ has joined #zope3-dev11:06
*** Aiste has joined #zope3-dev11:16
*** ktwilight has joined #zope3-dev11:17
*** aross has joined #zope3-dev11:34
*** regebro has joined #zope3-dev11:44
*** mgedmin has joined #zope3-dev11:47
*** greenman_ is now known as greenman11:51
*** aross has quit IRC12:13
*** MJ has joined #zope3-dev12:17
*** salfield has quit IRC12:22
*** MrTopf has joined #zope3-dev12:26
*** afd__ has quit IRC12:27
*** MrTopf has quit IRC12:27
*** MrTopf has joined #zope3-dev12:27
* Theuni kicks setuptools in the groin12:37
TheuniI'm experiencing that problem where setuptools won't extract data files that it included in an sdist. anybody got any pointers?12:37
*** greenman_ has joined #zope3-dev12:40
*** greenman has quit IRC12:40
*** dunny has joined #zope3-dev12:41
*** twcook has joined #zope3-dev12:51
*** chacha_chaudhry has quit IRC12:56
*** mkerrin has joined #zope3-dev13:06
*** ignas has joined #zope3-dev13:06
*** jodok has quit IRC13:07
*** jodok has joined #zope3-dev13:08
*** salfield has joined #zope3-dev13:10
*** alga has joined #zope3-dev13:21
*** aclark|away is now known as aclark13:26
*** jodok has quit IRC13:26
*** rocky has joined #zope3-dev13:39
*** J1m has joined #zope3-dev13:42
*** pyqwer has joined #zope3-dev13:44
*** ghendi has quit IRC13:50
*** ghendi has joined #zope3-dev13:51
*** benji has quit IRC14:00
*** chacha_chaudhry has joined #zope3-dev14:07
*** J1m has quit IRC14:15
*** gstratton has joined #zope3-dev14:23
*** b52laptop has joined #zope3-dev14:25
*** dunny has quit IRC14:43
*** jukart has quit IRC14:50
dobeeTheuni: data files are only included when you have an svn checkout afaik14:52
dobeeotherwise you have to tell explicitly which data files14:53
*** jukart has joined #zope3-dev14:54
Theuniyeah, i know.14:55
Theuniit's something more subtle14:55
Theunii gave up on it for now14:55
*** ThomasKarlRichte has joined #zope3-dev14:55
*** baijum has joined #zope3-dev14:58
*** Ariel_Calzada has joined #zope3-dev15:07
*** xbeanx has quit IRC15:13
*** xbeanx has joined #zope3-dev15:15
*** srichter has joined #zope3-dev15:17
*** ChanServ sets mode: +o srichter15:17
* baijum tried out zopeproject 0.4 :
*** niemeyer has joined #zope3-dev15:21
*** benji has joined #zope3-dev15:22
*** Ariel_Calzada has quit IRC15:23
*** MJ is now known as MJ|lunch15:23
*** jodok has joined #zope3-dev15:23
*** greenman_ has quit IRC15:31
*** chacha_chaudhry has quit IRC15:41
benjisrichter: I've done some reworking of the "real" testbrowser branch that I should explain if you intend on doing some work on it; if so, just let me know15:45
*** markusleist has quit IRC15:47
*** twcook has quit IRC15:50
*** ThomasKarlRichte has quit IRC15:53
*** MJ|lunch is now known as MJ15:53
srichterbenji: ok, I will not to get to it this week, but I am planning to work on it during the sprint15:55
*** ktwilight has quit IRC15:56
benjithat's fine; we'll see how far I get before then15:56
CrippsFXhey srichter15:56
CrippsFXit appears that I won't be able to make it to the sprint regardless of means for transportation :(15:57
CrippsFX... the assignments are coming in a bit heavier than I'd expected.15:58
CrippsFXalthough, having something like Ekiga and VNC set up *shouldn't* be a problem for me if someone on that end is willing to deal with it.15:59
jpfariashey guys16:10
jpfariasa zope3 sprint coming?16:10
jpfariasI would like to participate in some way16:10
jpfariasdunno how though16:10
jpfariasI never participated on a sprint before16:10
*** WebMaven has joined #zope3-dev16:14
*** stub has joined #zope3-dev16:16
CrippsFXjpfarias: simply put, showing up is the *best* way ;)16:16
gstrattonIs it possible to ask the component architecture for classes providing an interface?16:16
jpfariasCrippsFX: is it gonna be an online or in person sprint?16:17
*** netshade has joined #zope3-dev16:17
*** netshade has left #zope3-dev16:18
CrippsFXjpfarias: it's in person ... the sprint is going to be held just outside of Boston. If you want I'll get you the URL for the page with all the details.16:21
gstrattonJust Google for foliage sprint16:22
*** stub has quit IRC16:22
jpfariasI'm a few thousand miles away :-(16:22
jpfariasI'm in Brazil16:22
CrippsFXjpfarias: oh, well then ... that might not work out so well ;)16:23
*** rcrafton has joined #zope3-dev16:24
*** Ariel_Calzada has joined #zope3-dev16:28
*** regebro has quit IRC16:32
*** regebro has joined #zope3-dev16:34
*** Ariel_Calzada has quit IRC16:34
*** WebMaven has quit IRC16:35
*** WebMaven has joined #zope3-dev16:38
*** jsadjohnson has joined #zope3-dev16:40
*** ghendi has quit IRC16:42
*** ghendi has joined #zope3-dev16:49
*** baijum has quit IRC16:53
*** J1m has joined #zope3-dev16:56
CrippsFXokay, in my Zope root I have mysite->mysiteManager->myPau->LDAPAuthenticatorPlugin ... LDAPAuthenticatorPlugin is registered as a utility as so: <utility factory="mysite.ldap.plugin.LDAPAuthenticatorPlugin" name="LDAPAuth" /> in mysite/ldap/configure.zcml ... now, when I'm running localhost:8080/mysite/++etc++site/mypau/@@configure.html all works well, but when I select the "LDAPAuthenticatorPlugin" and make that the default authenticator plu16:59
CrippsFXgin and hit the "change" button, I get an internal server error, a traversal error, to be specific ... the error itself is: TraversalError: (< object at 0xb445ba8c>, 'zmi_actions')  and a full traceback is available upon request. Can somebody help me figure out what is wrong with my mypau configuration and/or my LDAPAuthenticatorPlugin ?16:59
CrippsFXwow ... that was a long description.17:00
mgedmindo you have a second traceback in your system log?17:05
CrippsFXI have the traceback in the Zope instance's error log, if that's what you're asking.17:06
CrippsFXa second traceback ... I can get it to make a second, or third , or fourth traceback ;)17:07
CrippsFXbut the only difference between tracebacks, really, is the address of the MenuAccessView object.17:08
mgedminno, I guess that TraversalError hides the real exception17:08
CrippsFXoh. No, there's only the TraversalError traceback ... but it hiding the *real* problem somehow doesn't surprise me.17:09
mgedminthere should be some reason why MenuAccessView['zmi_action'] is not accessible17:09
mgedminerr, 'zmi_actions'17:09
CrippsFXas I mentioned on friday, though, I have no experience using pdb, so Imma need a bit of help or time if it comes to that.17:10
CrippsFXyeah. That makes sense.17:10
CrippsFXwould you like me to lisppaste6 the full traceback ?17:10
mgedminyou might as well17:11
CrippsFXto me it looks like something isn't playing nicely with TAL expressions ... but again, that *should* be something else.17:11
mgedminI suspect some menu item's property is raising some unexpected exception17:12
mgedminor maybe it barfs when trying to check permissions because LDAPAuthenticatorPlugin is broken in some way17:12
lisppaste6CrippsFX pasted "Unknown Traversal error" at
CrippsFXmgedmin: I'm prone to thinking that it's the LDAPAuthenticatorPLugin being broken somehow, but I'm not sure how.17:13
*** WebMaven has quit IRC17:13
mgedmintry to insert 'import pdb; pdb.set_trace()' in MenuAccessView.__getitem__17:14
*** WebMaven has joined #zope3-dev17:15
mgedminor maybe 'if menuId = "zmi_actions": import pdb; pdb.set_trace()17:15
mgedmin(with a newline after the :)17:15
CrippsFXokay, I've got that set ... so now, I take it, I'm supposed to restart my zope server and then try running the trouble code again?17:18
*** WebMaven has quit IRC17:20
*** fcorrea has joined #zope3-dev17:23
mgedminand when you get the (pdb) prompt in the console, look around with 'l' and step with 's'17:27
mgedminI suspect you'll step right into getMenuItems()17:27
*** malthe has joined #zope3-dev17:29
*** aclark is now known as aclark|fww17:30
CrippsFXmy first step was>getMenu()17:31
CrippsFXfrom which I stepped into -> queryUtility() ... looks like it might be awhile before I reach the interesting stuff ;)17:32
*** nathany has joined #zope3-dev17:34
*** ktwilight has joined #zope3-dev17:35
mgedminouch, yes, skip that17:37
mgedmin'r' will run the method until it returns, then let you continue stepping17:37
mgedmin'n' will step over a statement without going inside the called functions17:37
*** projekt01 has joined #zope3-dev17:38
*** ghendi has quit IRC17:44
CrippsFXahh. I'll start making use of those now ;)17:46
CrippsFXso, "getMenuItems()" is the one I want to be looking at, you say?17:48
*** hdima has quit IRC17:49
mgedminthe interesting question #1 is: does it get as far as to the inside BrowserMenu.getMenuItems()17:49
mgedminthe interesting question #2 is: does it make it through the first for loop in that method17:50
CrippsFXanswer to #1: yes, it makes it to zope/app/publisher/browser/  .. and I'm about to find out the answer to question #217:51
CrippsFXwait ... don't have answer #1 yet ... soon (I hope)17:54
*** whit has joined #zope3-dev17:55
*** malthe has quit IRC17:56
CrippsFXokay, now the answer to #1 is: yes.17:57
*** ruda_porto has joined #zope3-dev17:59
*** jodok has quit IRC18:00
lisppaste6CrippsFX annotated #47844 with "pdb -> BrowserMenu.getMenuItems()" at
CrippsFXmgedmin: check that out.18:04
*** malthe has joined #zope3-dev18:05
*** jukart has quit IRC18:07
*** faassen has joined #zope3-dev18:13
*** faassen has joined #zope3-dev18:14
*** ruda_porto has quit IRC18:19
*** theskrill has joined #zope3-dev18:19
mgedminitem.available() raises the error18:25
mgedminthe very first one18:26
mgedminI think item.available is the one that performs security checks18:26
CrippsFXso that tells you that ... I have a bad permission option somewhere?18:29
japwhoops, more fat fingers18:30
* CrippsFX blinks at jap18:30
*** hazmat has joined #zope3-dev18:31
*** ChanServ sets mode: +o hazmat18:31
CrippsFXyou mean:  (9'-')9    ?18:31
CrippsFX(it's kirby sticking up his dukes)18:31
* benji crosses his eyes and sees Kirby in 3D.18:32
CrippsFXlol @ benji18:32
*** wreutz has joined #zope3-dev18:36
*** zagy_ has quit IRC18:40
*** pbugni has joined #zope3-dev18:41
*** theskrill has left #zope3-dev18:42
*** hazmat has left #zope3-dev18:45
gstrattonHi all, I want to validate that an object meets a zope schema18:48
gstrattonIt looks a bit tricky; does anyone know of example code?18:48
narogstratton: you can easily validate an object meets an interface. Look to zope.interface.verify18:52
* CrippsFX can't think straight right now.18:58
*** tarek has quit IRC18:58
*** nathany has quit IRC19:11
*** run|home has joined #zope3-dev19:13
*** faassen has quit IRC19:16
*** projekt01 has quit IRC19:17
*** MrTopf has quit IRC19:18
*** nathany has joined #zope3-dev19:20
*** whit has quit IRC19:24
*** whit has joined #zope3-dev19:25
*** Ariel_Calzada has joined #zope3-dev19:26
*** MrTopf has joined #zope3-dev19:32
*** Ariel_Calzada has quit IRC19:33
*** run|home has quit IRC19:33
*** MJ has quit IRC19:37
xbeanxHow can I search a catalog across multiple indices for a keyword?  Using ICatalog.searchResults(Index1='keyword', Index2='keyword') it seems to perform an ANDed search..19:41
xbeanxDo I just have to call searchResults() for each index?19:41
xbeanxIf so, then the results I get back from each call to searchResults() may overlap, and I will get duplicate hits.19:42
*** mark___ has quit IRC19:43
*** jukart has joined #zope3-dev19:48
*** MrTopf has quit IRC19:48
*** RaFromBRC has joined #zope3-dev19:50
philiKON_xbeanx: in short, you'll have to do intersections or unions of the results19:53
philiKON_but not of searchResults19:53
philiKON_searchResults already resolves the intids to objects19:53
philiKON_it's much more efficient to work just with integers for the union or intersection19:53
philiKON_i suggest taking a look at hurry.query19:53
philiKON_it allows you to phrase searches like that quite easily19:54
*** tarek has joined #zope3-dev19:57
xbeanxthanks philiKON_ .. I was looking at SchoolTool and noticed they used hurry.query..  I'll look further in that direction.19:57
*** tarek has quit IRC20:00
*** dobee has quit IRC20:01
*** jsadjohnson has quit IRC20:06
*** tarek has joined #zope3-dev20:07
*** yvl has quit IRC20:08
*** jodok has joined #zope3-dev20:09
*** tarek has quit IRC20:10
*** zagy has joined #zope3-dev20:14
*** jukart has quit IRC20:20
*** edgordon has joined #zope3-dev20:24
*** jsadjohnson has joined #zope3-dev20:25
*** yvl has joined #zope3-dev20:25
*** afd_ has quit IRC20:26
*** afd_ has joined #zope3-dev20:26
gstrattonNaro: doesn't zope.interface.verify just check that the object claims to implement the interface20:31
*** malthe_ has joined #zope3-dev20:31
gstrattonIt doesn't check it against the schema20:31
*** malthe has quit IRC20:32
gstrattonRight. I want to check that it actually meets the schema.20:32
gstrattonSurely that's been done before?20:33
* mgedmin shrugs20:33
* CrippsFX punches every bee in the face20:34
naroschema is defined in interface, isn't it ?20:34
mgedmingstratton: do you mean you want to check schema field constraints, or just the presence of attributes?20:34
gstrattonThe constraints20:34
mgedminyou could check how forms do it, I guess20:34
CrippsFXgstratton: that being the case, there are examples in Phil's books of how to do validation within the interface file.20:35
CrippsFX*in Phil's book20:35
CrippsFXchapter 4, sections 4 and 5 for the second edition20:36
gstrattonYup, just found it. Thanks!20:36
CrippsFXyou're welcome :)20:36
CrippsFXmgedmin: I'm sorry if this sounds like I'm lazy, but the result I (*we*) found earlier for the cause of the traversal error is an indication that either 1)I'm supposed to remove a security proxy, or 2)I have incorrectly defined a permission somewhere, correct?20:38
*** agroszer has joined #zope3-dev20:38
CrippsFX*defined == defined || assigned20:39
CrippsFXer ... ** defined == (defined || assigned)20:39
CrippsFXheh ...20:39
*** alecm has joined #zope3-dev20:40
mgedminCrippsFX: dunno, but I suspec the problem is that the LDAP whatever plugin is broken20:45
mgedminhave you figured out what the KeyError is?20:45
mgedminpdb, sadly, doesn't display full error information when you get an exception during interactive debugging20:45
*** pelle_ has joined #zope3-dev20:45
mgedmina traceback would be very valuable20:45
mgedminI suppose you could temporarily remove the try:/except KeyError: from that traversal adapter20:46
CrippsFXyeah. I do believe the key error is that it's doing the "getMenuItems()" and receiving None, then trying to access one of them.20:46
mgedminthen you'd see the cause of the problem instead of that TraversalError20:46
CrippsFXthis is true ...20:46
mgedminno, definitely not20:46
mgedmingetting None would not cause a KeyError20:47
mgedminitem.available() throws the KeyError20:47
mgedminbut the reason was not apparent from your paste20:47
mgedmin(because pdb is brain-dead)20:47
CrippsFXalright ... where is the traversal adapter located?20:47
CrippsFXhahaha. Yeah ... brain dead, but useful for getting *closer* to the problem.20:47
mgedminyou can find it in your original traceback20:47
mgedmin.../zope/traversal/ line 52, iirc20:47
CrippsFXI'll remove the set_trace(), run it again, and go through the traceback to find it.20:49
CrippsFXzope.traversing.adapters line 52 ... so yep ... kk, I'll check that out.20:50
CrippsFXmgedmin: well, that's interesting: KeyError: 'login'20:53
mgedminthe ldap thingy probably returns principals without a login attribute20:53
mgedminor something like that20:53
mgedminI really don't remember much about zope 3 auth right now20:54
CrippsFXyeah, well, I've found the spot in my ldap plugin: Module ship.ldap.plugin, line 65, in principalInfo <newline> if login == self.creds['login']:20:54
CrippsFXso, that is more than likely.20:55
*** dobee has joined #zope3-dev20:55
CrippsFXwait ...20:55
CrippsFXahhhhh ... that was a subtle mistake ...20:56
CrippsFXheh ...  it's because I created a method called _ldapconnection(self, credentials) ... and promptly forgot to pass it the "credentials" argument :P20:57
CrippsFXat least I hope that's it.20:58
CrippsFXno, I guess that's not it either.20:59
*** malthe_ has quit IRC20:59
*** mkerrin has quit IRC21:00
*** pelle_ has quit IRC21:01
*** dobee has quit IRC21:02
CrippsFXwell, mgedmin : thanks for the help. It got me this far, now I know roughly what the problem is, so now I can go about trying to fix it. That's further than I had come/would have come on my own.21:03
CrippsFX... and now I know how to use pdb, which will come in handy.21:03
* benji casts +3 pdb on CrippsFX.21:05
*** nathany has quit IRC21:06
benjiNow you can venture into the Forest of Tracebacks and come back alive.21:06
* CrippsFX saves and only takes 10 damage21:06
*** ignas has quit IRC21:06
*** pelle_ has joined #zope3-dev21:08
CrippsFXw0000!  ... no more system error!21:09
*** agroszer has quit IRC21:09
*** netshade has joined #zope3-dev21:13
*** dunny has joined #zope3-dev21:19
CrippsFXmgedmin: thanks to you, and helping me to debug, my LDAPAuthenticatorPlugin works, now all I have to do is apply groups from the ldap server to Zope principals, but ... that's a job for another day.21:21
CrippsFXcheers for now.21:21
* mgedmin waves21:22
*** srichter has quit IRC21:26
*** srichter has joined #zope3-dev21:26
*** Ariel_Calzada has joined #zope3-dev21:26
*** ChanServ sets mode: +o srichter21:26
*** mgedmin has quit IRC21:27
*** edgordon has quit IRC21:27
*** Jell-O-Fishi has joined #zope3-dev21:27
*** jodok_ has joined #zope3-dev21:30
*** jodok has quit IRC21:48
*** dobee has joined #zope3-dev21:55
*** ktwilight has quit IRC22:02
*** zagy has quit IRC22:03
*** xbeanx has quit IRC22:03
*** edgordon has joined #zope3-dev22:05
*** pbugni has quit IRC22:05
*** wreutz has quit IRC22:06
*** xbeanx has joined #zope3-dev22:08
*** alga has quit IRC22:10
*** naro has quit IRC22:20
*** dobee has quit IRC22:22
*** jukart has joined #zope3-dev22:22
*** jukart_ has joined #zope3-dev22:26
*** jukart has quit IRC22:26
*** jukart has joined #zope3-dev22:27
*** jukart_ has quit IRC22:27
*** netshade has left #zope3-dev22:29
*** edgordon_ has joined #zope3-dev22:30
*** edgordon has quit IRC22:31
*** ktwilight has joined #zope3-dev22:35
*** jukart_ has joined #zope3-dev22:39
*** jukart has quit IRC22:39
*** xbeanx has quit IRC22:42
*** nathany has joined #zope3-dev22:43
*** MrTopf has joined #zope3-dev22:45
*** markusleist has joined #zope3-dev22:46
*** greenman has joined #zope3-dev22:48
*** greenman has quit IRC22:48
*** dobee has joined #zope3-dev22:50
*** RaFromBRC is now known as RaFromBRC|lunch23:00
*** pbugni has joined #zope3-dev23:07
*** ignas has joined #zope3-dev23:08
*** salfield has quit IRC23:15
*** jukart_ has quit IRC23:19
*** dobee has quit IRC23:27
*** rocky is now known as rocky|away23:33
*** rcrafton has quit IRC23:36
gstrattonjsadjohnson: where do I get the customer name from for the billing?23:37
gstrattonIt doesn't seem right to have to look at the customer's name in the CRM container23:38
*** WebMaven has joined #zope3-dev23:40
gstrattonSorry, wrong room!23:42
*** greenman has joined #zope3-dev23:42
* benji is glad he's not the only private-but-meaningless-without-context-channel-spammer.23:43
*** alga has joined #zope3-dev23:45
* WebMaven is very glad of that too.23:49
*** RaFromBRC|lunch is now known as RaFromBRC23:50
benjiWe should start a support group.  But the channel will only ever get accidental messages.23:50
*** Ariel_Calzada has quit IRC23:53
*** rcrafton has joined #zope3-dev23:56
*** Ariel_Calzada has joined #zope3-dev23:58

Generated by 2.15.1 by Marius Gedminas - find it at!