IRC log of #zope3-dev for Monday, 2005-08-01

*** tav_ has joined #zope3-dev00:02
*** __gotcha has joined #zope3-dev00:08
*** __gotcha is now known as __gotchaway00:11
*** tav has quit IRC00:18
*** yota has quit IRC00:18
*** tvon has quit IRC00:50
*** tvon has joined #zope3-dev00:56
*** Jim7J1AJH has joined #zope3-dev00:58
*** MrTopf has quit IRC00:58
*** bska|mobile has joined #zope3-dev00:58
*** bskahan has quit IRC00:59
*** bskahan_ has joined #zope3-dev01:02
*** bska|mobile has quit IRC01:10
*** bskahan_ has quit IRC01:14
*** tvon has quit IRC01:33
*** tav has joined #zope3-dev02:12
*** tav_ has quit IRC02:24
*** tav has quit IRC02:31
*** andrew_m has quit IRC02:58
*** d2m has quit IRC03:05
*** anguenot has quit IRC03:23
*** __gotcha has joined #zope3-dev03:23
*** __gotchaway has quit IRC03:38
*** xtrmntr has joined #zope3-dev03:51
*** tvon has joined #zope3-dev03:52
*** xtrmntr has quit IRC04:23
*** xtrmntr has joined #zope3-dev05:42
*** xtrmntr has quit IRC05:44
*** lilgrow has joined #zope3-dev06:40
*** lilgrow has quit IRC07:14
*** zagy has quit IRC08:20
*** zagy has joined #zope3-dev08:30
*** vitaly has joined #zope3-dev08:37
*** hdima has joined #zope3-dev09:06
mpwhen I add PAU with session credentials I can login into site through login form (session credentials) and become one of the principal folder's principals... how do I make it possible to login with html login form as a principal defined in principals zcml?09:08
*** yota has joined #zope3-dev09:31
*** MrTopf has joined #zope3-dev09:34
*** sashav_ has joined #zope3-dev10:38
*** tav has joined #zope3-dev10:41
*** sashav_ has quit IRC10:46
*** tav has quit IRC11:10
tvonany suggestions on how to get ahold of the principal in a tales path expression?11:15
tvonI'm trying to do something like tal:if="context/has_permission:some.Permission"11:15
*** faassen has joined #zope3-dev11:16
philiKONtvon, there's
* tvon looks11:17
philiKONbut if you feel you need to call this in zpt, you might consider a different approach11:17
philiKONat least call this from pythonc ode11:17
tvonI have to check fairly often.. I was going through views and adding util methods but I figured an expr would be nicer11:17
tvonphiliKON: thanks11:17
*** tav has joined #zope3-dev11:25
*** philiKON has quit IRC11:37
*** MrTopf has quit IRC11:57
*** anguenot has joined #zope3-dev12:38
*** d2m has joined #zope3-dev12:40
*** MrTopf has joined #zope3-dev12:44
*** vitalyo has joined #zope3-dev13:07
*** vitaly has quit IRC13:15
*** Aiste has joined #zope3-dev13:17
*** vlado has joined #zope3-dev13:19
*** __gotcha has quit IRC13:21
*** __gotcha has joined #zope3-dev13:21
*** tarek has joined #zope3-dev13:30
*** tav has quit IRC13:55
*** tav has joined #zope3-dev14:03
*** tvon has quit IRC14:20
*** efge has joined #zope3-dev14:22
*** __gotcha is now known as __gotchaway14:24
*** BjornT has joined #zope3-dev14:34
*** J1m has joined #zope3-dev14:39
*** tvon has joined #zope3-dev14:41
*** SteveA has joined #zope3-dev15:03
*** stub has joined #zope3-dev15:04
*** benji_york has joined #zope3-dev15:20
*** ignas has joined #zope3-dev15:25
*** J1m has quit IRC15:47
*** bradb has joined #zope3-dev15:47
*** tav has quit IRC15:59
*** andrew_m has joined #zope3-dev16:04
*** alga has joined #zope3-dev16:05
*** tav has joined #zope3-dev16:10
*** bskahan has joined #zope3-dev16:17
*** gintas has joined #zope3-dev16:21
*** bska|mobile has joined #zope3-dev16:48
*** bskahan has quit IRC16:50
srichterbenji_york: do you want to write the testbrowser proposal?16:56
*** genconc has joined #zope3-dev16:56
benji_yorksrichter, sure.  I was just reading your 2.4 proposal.  Is that the recommended format and location?16:57
srichterthere is a ProposalTemplate wiki page16:59
benji_yorkyep, I found that.  I should have it written and up in a little while17:00
srichterat the end of the Proposals page17:00
srichterbenji_york: btw, is Jim on vacation this week?17:04
benji_yorkthis week and two more after that, he's going to be relatively connected though, so email should provide good communication17:05
*** hdima has quit IRC17:13
*** __gotchaway is now known as __gotcha17:15
*** SureshZ has joined #zope3-dev17:37
benji_yorksrichter, the testbrowser proposal is up at, let me know if you have any feedback17:38
srichterbenji_york: yep, I get Wiki changes mails :-)17:39
srichterbenji_york: please also send a message to the list17:39
srichterbenji_york: on a technical note, do you think we could record browser sessions somehow?17:39
srichterCould we reuse the existing recording code to generate testbrowser test sessions?17:40
srichterMaybe we could hook into the publisher somehow?17:40
benji_yorkI'll email the list17:41
benji_yorkabout recording...17:41
benji_yorkwe've thrown around the idea of tcpwatch-style recording, and it doesn't work very well...17:42
srichterthat's why I think it would be better to hook into the publisher17:43
benji_york...but Brian has been working on in-browser recording of events with some encouraging first steps.17:43
srichterat the point it already parsed the form data17:43
srichterthat would be another choice17:43
srichterbut the problem with that is that it is browser-specific17:43
*** vlado has quit IRC17:43
srichterI guess it would be okay, if it is a firefox plugin17:44
srichtersince it runs everywhere17:44
benji_yorkBrian's recorder works in IE and Firefox17:44
benji_york(no plugins, it's all Javascript)17:44
srichterahh, now that is cool17:44
benji_yorkyep, but, like I said, the development is quite early, but we'll see if it works out.17:45
benji_york(the prototype is impressive though)  :)17:46
srichterI would like to see that17:46
srichtermaybe when I come to F12g17:47
benji_yorkthat should be easy to arrange, plus it'll probably be closer to usable by then17:47
*** tav_ has joined #zope3-dev17:48
srichterbenji_york: so since Jim wants to really fight the requirement of Py 2.4, I think we are better off backporting testbrowser to 2.317:51
srichterthough the dependency issue still remains17:51
benji_yorkI don't mind backporting, I just want to wait until we settle the 2.3/2.4 issue.17:52
srichterhave you seen Fred's comment to your proposal?17:52
benji_yorknope, on the wiki or list?17:53
SteveAdo you know why jim wants to keep zope3 on python 2.3 ?17:53
benji_yorkoh, wiki17:53
benji_yorkI think his main reason is that Z2 can't use 2.4 without a lot of work.  He really wants the Zope 3 in Zope 2 to be in sync with the latest Z3 release17:54
SteveAi'm surprised that zope2 can't move to python 2.417:55
srichterbenji_york: yeah, the wiki17:56
SteveAand anyway, if this is a testing infrastructure issue, then17:56
benji_yorkI don't thin it's that z2 *cant*, it's more that it'll take quite a bit of work (as I understand it, not being a big z2 guy)17:56
SteveAwhy not move the zope3 testing infrastructure to python 2.417:56
SteveAbut keep zope3 runtime as 2.317:56
*** MrTopf has quit IRC17:56
benji_yorkhmm, I think we want to encourage users of z3 to run the tests and add tests of their own, so having different requirements would make that harder for some people17:57
SteveA2.4 has been out for ages17:59
srichteryep, but Z2 development is too slow17:59
benji_yorkoh, don't get me wrong, I'm all for requiring 2.4 for 3.2.  It just gets more complicated when we have to consider z217:59
srichterI am kind of annoyed about the sacrifice18:00
srichterI think faassen had valid points about having Z2 trail one Z3 version18:00
benji_yorknot being a user of z2, I'm not worried about them, but I try to be a nice person, so I'll pretend that I care :)18:00
*** bska|mobile has quit IRC18:00
benji_yorksrichter, maybe, but that just delays the pain for 6 months (which might be enough to get it done, I don't know)18:01
srichterbut often some time is what volunteers need18:02
benji_yorklike I said, I'm all for 2.4, someone just has to convince Jim18:03
*** tav has quit IRC18:04
srichterbenji_york: I wonder whether we need mechanize at all for testbrowser (I think that was Fred's point)18:04
benji_yorksrichter, oh yes, we need mechanize!  :)18:04
benji_yorkit does a great deal of the heavy lifting, I'm loath to re-implement all that it does18:05
benji_yorkplus it has a (small, but) fairly active community that has been responsive to me thus far.  We're getting a lot of value from reusing their hard work.18:06
srichtermaybe we can convince them to package mechanize and its dependencies in one package18:06
benji_yorkhow would that help?18:07
srichtermaybe this is already possible anyways, since mechanize does direct imports18:07
srichterwe do not have the stuff lying around everywhere18:07
srichteralso, did you get anywhere witht he license thing?18:07
benji_yorkyep, there was a new release of pullparser Friday with a BSD license (so they're all BSD now)18:08
benji_yorkI don't want to stur the waters too much, but perhaps we should start thinking about an automated dependency downloader for z3.18:09
srichtermmh, that would be worth a try18:12
wiggybenji_york: we intend to build something like that for the debian zope3 packages18:13
wiggywe already have the packaging system in place to do that18:13
srichterwiggy: but how Debian-independent is it?18:13
benji_yorkyep, I read about that and am interested, have you considered Eggs (easy_install) support?18:13
srichterit would really need to be a package that works on all platforms18:13
wiggysrichter: we can make most of it independent if that's going to be a design goal18:14
benji_yorkI really think now is the time to start thinking about this.  We have Eggs, wiggy's debian work, Zpackage, and ZC has some internal stuff that might help18:14
*** roym has joined #zope3-dev18:14
wiggyyou want deployement tools in general probably18:15
wiggyincluding stuff that does content loading18:15
srichterwiggy: benji_york: so we really should write a proposal18:15
wiggysrichter: I'm still getting up to speed with zope3 atm18:15
srichterwiggy: the advantage of writing a proposal and get all this stuff included in the trunk is that you will get help from other developers18:15
wiggybusy reading philiKONs book in the evenings :)18:15
wiggyat work we already have it done for zope2 stuff18:16
srichterwiggy: but this tool could be pretty much Zope 3 independent18:16
wiggyI'm not completely sure about that18:17
wiggyI think it needs to be done in a way to leverage existing things if they are there18:17
wiggyie using either a OS-provided packaging system if possible18:17
wiggyor doing the downloads yourself if not18:17
wiggythe bit where you deploy to (ie zope 3 or an instance) needs some abstraction as well18:18
wiggyI can write down some ideas for it tonight I think18:18
srichterplease do18:19
benji_yorkI would recommend keeping it as simple as possible, little to no metadata to maintain, use "standard" packages (tars from the original author, etc)18:20
benji_yorkwe (ZC) have had resonable succes automating the download/install process for developer buildouts18:21
benji_yorkre: proposal, sounds good to me (I do worry about it being too soon, but that can be determined during the proposal process)18:22
srichteryeas, proposals are for figuring this sort of thing out18:24
bob21.2 is from like 10518:32
bob2oops, -ewrongwindow18:32
*** FarcePest has joined #zope3-dev18:40
*** zagy_ has joined #zope3-dev18:50
*** zagy has quit IRC18:56
*** __gotcha has quit IRC19:03
*** gintas has quit IRC19:04
*** douglasc has joined #zope3-dev19:05
*** douglasc has quit IRC19:08
*** tvon has quit IRC19:16
*** niemeyer has joined #zope3-dev19:18
*** tvon has joined #zope3-dev19:31
*** bskahan has joined #zope3-dev19:45
*** philiKON has joined #zope3-dev19:55's caching sucks20:15
*** guido_g has joined #zope3-dev20:17
*** GvaderTH has joined #zope3-dev20:17
philiKONSteveA, srichter and I were talking about translations for zope 3.1 the other day20:20
philiKONSteveA, it'd be cool to have 3.1 translated into more languages than just .de and .ru20:20
philiKONSteveA, would it be possible to use the rosetta system to get zope-friendly translators an easy start for translating z3?20:21
philiKON(IOW, no contributor agreement, easy UI, get started right away, etc.)20:21
algaphiliKON: good idea!20:33
*** tav has joined #zope3-dev20:34
philiKONalga, what are the necessary steps to get this setup?20:34
philiKON(besides J1m agreeing that we can integrate such contributions)20:34
*** deo has quit IRC20:36
algaI think you can sign up to rosetta and add Zope 3 yourself, and be the admin of the project20:36
srichterwe have not found the link though; both philiKON and I signed up20:37
SteveAphiliKON: Of course!20:37
philiKONalga, zope3 is already a launchpad project20:37
philiKONi just haven't got a clue where i can upload the POT files20:38
SteveAphiliKON: most of the launchpad team is in brazil right now, planning our next 3-6 months of work.20:38
SteveAphiliKON: i'll ask carlos (one of the rosetta developers) to chat to you when we have a break from meetings.20:39
philiKONSteveA, ok, great20:39
*** tav has quit IRC20:41
srichterphiliKON: the Zope 2.9 and 3.2 release will be concurrent20:41
srichterthis is an edict from the pope20:41
philiKONi didn't realize that it was an edict20:43
philiKONi preferred if at least some discussion predeeced edicts20:43
srichtermore or less; he did not declare it one but asserted it on everyone :-)20:43
philiKONwell, i want it declared officially20:43
srichterjust bring it up on the mailing list20:43
roymI am trying to render a container and its contents in ZPT. My20:43
roymcontained items have a default view (index.html).  If I use20:43
roym  <div tal:content="value"/>20:43
roymit indicates that the contained object from container/values is a proxy:20:43
roym  <security proxied anoobe.qtmodule.QDatum instance at 0x41b560ec>20:43
roymWhat syntax should I use here to force the content to render?20:43
srichteryou should use the view to do that20:44
*** tav has joined #zope3-dev20:45
algaso <div tal:content="structure value/@@viewname"/> should work?20:46
roymWhat path expression (zpt) will give me access to the index.html view?20:47
roym<div tal:content="value/@@index.html"/> fails..20:47
*** tav_ has quit IRC20:48
srichterroym: alga is right and your code should pass as long as you have a view called index.html20:48
roymsorry - my bad - it does work!20:48
roymI love Zope3 more and more, as I learn about it...20:50
* srichter just noticed that keeping truw BBB with Zope X3 3.0 is almost impossible :-(20:52
benji_yorkin what sense?20:52
philiKONsrichter, where is not possible?20:53
srichterfor example, in Zope 3.0 attribute y of class X did not have a protection in a general ZCML file20:53
srichterso custom projects would define their own declarations for class X attr y20:54
srichterfor Zope 3.1 we noticed this problem and fixed it in the generic ZCML file20:54
srichterbut now the startup of the custom project will fail due to duplicate security declarations20:54
philiKONso, like what?20:54
srichterif I see it right in my code here, the vocabulary stuff is one candidate, though I have to investigate further first20:55
* srichter tries to make sure his book sources work20:55
*** RaFromBRC has joined #zope3-dev20:58
srichterok, so here is my use case21:00
srichterin Zope X3.0, IVocabularyTokenized did not extend IVocabulary21:00
srichterso making separate security declarations for both interfaces were necessary21:01
srichterin Zope 3,1, ITokenizedVocabulary extends IVocabulary, and only one security declaration for ITokenizedVocabulary is needed21:01
srichterI have no clue how this can be addressed in a sane way21:02
benji_yorkcould conditional ZCML be used?  Add a "resource" or whatever they're called for each Zope version?21:02
srichterresource -> feature21:03
benji_yorkright, feature :)21:03
srichterbut that would still require me to change the third party code21:03
srichterthe point is not to make a piece of code work on both versions, but not to alter 3rd party code21:04
benji_yorkis the third-party code maintained by someone who'll want to support 3.2, it seems to me that they should accept your contribution of the conditional ZCML to put in their next release  <shrug>21:04
srichterit's about my book21:05
srichterit should work for Zope 3.1 as well21:05
benji_yorkoh! OK21:05
srichteroh, the fun is even getting better :-( I should have checked those sources a long time ago21:07
*** faassen has quit IRC21:11
srichteryipee, now it starts at least!... with about a million deprecation warnings; though the issue above is still not solved.21:12
srichterIn order to fix the interface problem, we would have to mess with the Interface implementation.21:13
srichterI guess the easiest would be to give the new interface a different name21:14
srichternow I understand why Jim was so firm about the fact that public interface should never change21:14
benji_yorkI'm +1 on new interface name (unfortunate as it is)21:17
*** bskahan has quit IRC21:18
srichteror we just leave the 3.0 way and do not create a new interface21:18
srichtersince we are slowly switching to sources anyways21:18
*** anguenot has quit IRC21:26
wiggy08:12PM <srichter> yipee, now it starts at least!... with about a million21:27
wiggy          deprecation warnings; though the issue above is still not solved.21:27
wiggy08:13PM <srichter> In order to fix the interface problem, we would have to21:27
wiggy          mess with the Interface implementation.21:27
wiggypaste mistake21:28
wiggyor rather, accidental paste21:28
*** carlos has joined #zope3-dev21:29
SteveAhi philiKON21:29
SteveAthis is carlos, one of the rosetta developers21:29
srichtercarlos: how can we setup Zope 3 as a rosetta project?21:30
carlosFirst thing to do is to create it as a product in launchpad21:30
* carlos checks if it's already done21:30
srichterthere is a Zope 3 project in LP21:31
srichterright, so what's next?21:32
carlosok, next step is that you send me a link to all current .pot and .po files that you have for Zope321:32
carlosand I will create those resources21:32
srichtercan we update them ourselves, once they are created?21:33
carloslater updates will be done by the person or team you decide to own those .pot files in launchpad21:33
srichterok, cool21:33
carlossrichter, you are so fast :-), you don't give me time to explain it :-D21:33
srichtercan you make the differences between branches?21:34
srichterfor the trunk:
carlossrichter, yeah, the .pot files are attached to branches21:35
srichtercan you merge between the two21:35
carlosso if you have HEAD and 3.0 branches, both can have different .pot files21:35
srichterfor example, translators should now work on 3.1 translations21:36
srichterbut those need to be merged to the trunk later on21:36
carlossrichter, not yet, the translations will appear as suggestions to the other branch21:36
srichterok, good enough21:36
carlossrichter, the merge functionality will be added soon, still planning the schedule21:36
srichter3.1 branch:
srichterbtw, how do you store the message strings?21:37
carlossrichter, in a database21:37
carloswe parse the .pot and .po files and map it into a db model21:37
srichterdo you store them on a project basis?21:37
carlossrichter, is the zope.pot file up to date?21:38
srichteror do you store all message strings in one location and then annotate the translations for each project?21:38
carlossrichter, we have a common table for all translations21:38
*** __gotcha has joined #zope3-dev21:39
*** zagy_ has quit IRC21:39
carloswith links to pofiles, potemplates and products21:39
carlossrichter, do you need anything else?21:41
srichternope that will be it for now21:41
srichterplease make philiKON and me the admins of the translations21:41
srichterlater we will have to add hdima, but he has to create a user account first.21:41
carlosok, I will try to import the .pot and .po files later today, but I think they will take a day or two to appear as we have our system a little busy with Ubuntu Breezy imports21:42
carlossrichter, If you want to be more than one person, I need that you create a team21:42
carlossrichter, so perhaps you could create a zope-admins team21:42
carlosor something like that21:42
*** amep has joined #zope3-dev21:43
*** zagy_ has joined #zope3-dev21:43
carlossrichter, please, feel free to ping me if you have any other question.21:44
carlosalso, send me the team account name to when you have it21:44
carlosso I can set it as the owner when I import the .pot file21:44
srichterok, cool21:45
SteveAsrichter: launchpad developers hang out in #launchpad21:45
SteveAso, that's a good place to go to ask about any problems and so on21:45
srichtergood to know ;-)21:46
amepI have a ZODB related question: Does anyone know if it is possible to have weak references or something that acts like them in a ZODB database? I don't care if it is a true weakref.ref object; I just need it to provide that functionality. I heard that Zope used something like this somewhere.21:49
srichteramep: did you try storing a weakref.ref object already?21:50
benji_yorkwhat part of "weak references" do you want?  The part about not keeping the object alive if there are no non-weak references to it, or something else?21:50
amepbenji_york: The "not keeping the object alive" part. It's for a GUID to object map and a notification system. I want the object to die and the ref to be marked invalid.21:52
benji_yorkamep, in that case I'd try the direct route first (storing a weakref object)21:54
*** ignas has quit IRC21:54
amepOK, I'll give it a shot. weakrefs are non-picklable so I didn't think that would play nice with the DB.21:54
benji_yorkit would also be possible to use integer IDs and have a deletion subscriber that would take the (presumably last) reference out of the int ID utility21:55
benji_yorkof course removing the object from the int ID utility would mean that its int ID would be available for a different object, so any old references to that ID would now refer to the new object21:56
benji_yorkas a data point, we've reached the point with our projects that we almost never remove data from the database, for our use cases it makes more sence to keep things around forever21:57
amepOIDs are recycled? I had no idea.21:57
benji_yorknot OIDs, integer IDs.  different things21:58
amepOK, I'm lost. Are there docs on this? I'm currious, now. I didn't know there was any ID other than the OID.22:00
efgeamep: that's part of zope 3's framework, not pure ZODB22:01
amepOK, then I'm going to try to avoid it. I'm writing a ZODB only application and fewer deps is better.22:03
philiKONsrichter, sorry, i was out for dinner22:03
srichterno problem, carlos setup rosetta for us22:04
srichterwe still have to setup a group and email it to him22:05
srichterwanna do that?22:05
*** GvaderTH has left #zope3-dev22:05
philiKONsrichter, sure. do you know how?22:05
srichternope ;-)22:06
*** deo has joined #zope3-dev22:06
srichtercarlos hangs out at #launchpad22:06
philiKONi'm already there :)22:06
srichteroh man, I am not sure whether it is worth ensuring the book works with 3.122:07
srichterit is a lot of work22:07
SteveAis the "usage" stuff still in zope3?22:23
SteveAthere's still a decoy22:24
philiKONi think i remember at some point i saw a zombie of it laying around somewhere22:24
philiKONi forgot where22:24
SteveAin zope/app/pagetemplate22:24
SteveA /tests22:24
philiKONgrep sez it's not being used22:25
philiKONgo ahead and svn rm it :)22:25
*** MJ has joined #zope3-dev22:36
*** alga has quit IRC22:37
MJAny guidelines on implementation specific interfaces?22:41
MJI have a pair of objects that in this implementation will use containment22:43
MJbut I don't want to burden their interfaces with containment22:43
MJSo the containment is implementation specific22:44
MJBut the ZMI is easier when IContainment is implemented and constraints are set22:44
*** SureshZ has quit IRC22:49
*** SureshZ has joined #zope3-dev22:50
benji_yorkMJ, how about setting the interfaces and containment constraints in an implementation-dependent place, and leaving the "library" code clean22:52
* genconc is away: gone home22:53
SteveAMJ: the zmi is kinda bogus, imo.  why use it?23:01
*** hazmat has quit IRC23:04
*** efge has quit IRC23:16
MJSteveA: Just trying to avoid doing extra work that the ZMI already takes care of23:19
MJSteveA: These objects are site-specific configuration23:19
MJbenji_york: That's what I am leaning te23:19
*** amep has left #zope3-dev23:20
MJIs it best practice to keep those interfaces close to the implementation instead of in a interfaces module in this case?23:20
MJThe implementation goes in a sub-package23:21
philiKONyou can do so23:21
MJSo I can do either23:21
philiKONespecially if you have a set of interfaces/implementations23:21
*** suresh has joined #zope3-dev23:22
MJThanks guys23:23
MJSaves me a bit of moving things about when I feel supported in putting those into the implementation23:23
*** FarcePest has quit IRC23:26
MJFor the curious: this is for a new OSS project of mine called Chronolog23:27
MJSee http://chronolog.zopatista.com23:28
srichterMJ: cool23:29
srichterMJ: at least you got the logo down already ;-)23:30
MJInkscape rocks!23:30
*** SureshZ has quit IRC23:30
srichteryipee, it seems as if I fixed 90% of my book issues23:36
*** hazmat has joined #zope3-dev23:43
MJphiliKON: I have an error in your book not yet reported on the errata page23:45
MJI'll email you the page and problem when I actually have it handy23:46
* MJ is going to turn in23:46
MJNight all23:46
*** MJ has quit IRC23:46
*** suresh has left #zope3-dev23:51
*** SureshZ has joined #zope3-dev23:51

Generated by 2.15.1 by Marius Gedminas - find it at!