*** __mac__ has quit IRC | 00:04 | |
*** tarek has quit IRC | 00:07 | |
*** tarek has joined #zope3-dev | 00:20 | |
*** benji has quit IRC | 00:25 | |
*** redir has joined #zope3-dev | 00:43 | |
*** srichter has quit IRC | 00:45 | |
*** romanofski has joined #zope3-dev | 00:49 | |
*** r0ver has joined #zope3-dev | 00:54 | |
*** tarek has quit IRC | 00:55 | |
*** gary_poster has quit IRC | 00:55 | |
*** ignas has quit IRC | 00:56 | |
*** jhauser has quit IRC | 01:09 | |
*** tarek has joined #zope3-dev | 01:10 | |
*** tarek has quit IRC | 01:12 | |
*** r0ver has quit IRC | 01:15 | |
*** ccomb has joined #zope3-dev | 01:46 | |
*** tarek has joined #zope3-dev | 01:52 | |
*** ccomb has quit IRC | 01:58 | |
*** J1m has quit IRC | 02:05 | |
*** yota has joined #zope3-dev | 02:16 | |
*** ccomb has joined #zope3-dev | 02:26 | |
*** fcorrea has joined #zope3-dev | 02:27 | |
*** alga has quit IRC | 02:29 | |
*** ccomb has quit IRC | 02:31 | |
*** dunny has joined #zope3-dev | 02:31 | |
*** fcorrea has quit IRC | 02:33 | |
*** nathany has quit IRC | 02:33 | |
*** fcorrea has joined #zope3-dev | 02:33 | |
*** alecm has quit IRC | 02:39 | |
*** tarek has quit IRC | 02:40 | |
*** dunny has quit IRC | 02:40 | |
*** tarek has joined #zope3-dev | 02:41 | |
*** ccomb has joined #zope3-dev | 02:46 | |
*** yota has quit IRC | 02:46 | |
*** matthal has joined #zope3-dev | 02:49 | |
*** ccomb has quit IRC | 03:03 | |
*** ccomb has joined #zope3-dev | 03:03 | |
*** alecm has joined #zope3-dev | 03:07 | |
*** fcorrea has joined #zope3-dev | 03:12 | |
*** ccomb has quit IRC | 03:25 | |
*** pcardune has quit IRC | 03:32 | |
*** jukart has joined #zope3-dev | 03:40 | |
*** ccomb has joined #zope3-dev | 03:46 | |
*** ccomb has quit IRC | 03:52 | |
*** davisagli has left #zope3-dev | 03:56 | |
*** jukart has quit IRC | 04:00 | |
*** tarek has quit IRC | 04:12 | |
*** tarek has joined #zope3-dev | 04:13 | |
*** kaeru has quit IRC | 04:14 | |
*** tarek has quit IRC | 04:18 | |
*** kaeru has joined #zope3-dev | 04:20 | |
*** stub has joined #zope3-dev | 04:31 | |
*** alecm has quit IRC | 04:35 | |
*** davisagli has joined #zope3-dev | 04:44 | |
*** alecm has joined #zope3-dev | 05:04 | |
*** alecm has joined #zope3-dev | 05:04 | |
*** stub has quit IRC | 05:16 | |
*** alecm has quit IRC | 05:18 | |
*** alecm has joined #zope3-dev | 05:19 | |
*** jfkw has quit IRC | 05:31 | |
*** aaronv has quit IRC | 05:35 | |
*** fcorrea has quit IRC | 06:09 | |
*** alecm has quit IRC | 06:21 | |
*** baijum has joined #zope3-dev | 06:49 | |
*** alecm has joined #zope3-dev | 07:22 | |
*** alecm has quit IRC | 07:22 | |
*** allisterb_ has joined #zope3-dev | 07:45 | |
*** romanofski has quit IRC | 07:45 | |
*** allisterb has quit IRC | 07:46 | |
*** timte has joined #zope3-dev | 07:46 | |
*** febb has joined #zope3-dev | 07:57 | |
*** kaeru has quit IRC | 08:10 | |
*** kaeru has joined #zope3-dev | 08:12 | |
*** baijum has quit IRC | 08:13 | |
*** sweh has quit IRC | 08:19 | |
*** romanofski has joined #zope3-dev | 08:24 | |
*** sweh has joined #zope3-dev | 08:25 | |
*** kaeru has quit IRC | 08:29 | |
*** baijum has joined #zope3-dev | 08:37 | |
*** jukart has joined #zope3-dev | 08:51 | |
*** timte has quit IRC | 08:53 | |
*** JaRoel|4D has quit IRC | 08:54 | |
*** allisterb has joined #zope3-dev | 09:07 | |
*** jhauser has joined #zope3-dev | 09:09 | |
*** allisterb_ has quit IRC | 09:10 | |
*** romanofski has quit IRC | 09:12 | |
*** baijum has quit IRC | 09:15 | |
*** runyaga has quit IRC | 09:20 | |
*** markusleist has quit IRC | 09:21 | |
*** runyaga_ has joined #zope3-dev | 09:23 | |
*** baijum has joined #zope3-dev | 09:25 | |
*** stub has joined #zope3-dev | 09:30 | |
*** stub has joined #zope3-dev | 09:30 | |
*** baijum has quit IRC | 09:35 | |
*** JaRoel|4D has joined #zope3-dev | 09:56 | |
*** kaeru has joined #zope3-dev | 09:56 | |
*** timte has joined #zope3-dev | 09:59 | |
*** matthal has quit IRC | 10:01 | |
*** agroszer_ has joined #zope3-dev | 10:07 | |
*** alga has joined #zope3-dev | 10:08 | |
*** baijum has joined #zope3-dev | 10:12 | |
*** afd_ has joined #zope3-dev | 10:23 | |
*** matthal has joined #zope3-dev | 10:26 | |
*** markusleist has joined #zope3-dev | 10:34 | |
*** davisagli has quit IRC | 10:41 | |
*** redir has quit IRC | 10:47 | |
*** lamike has joined #zope3-dev | 10:53 | |
*** lamike has left #zope3-dev | 10:56 | |
*** JaRoel|4D has quit IRC | 10:57 | |
*** JaRoel|4D has joined #zope3-dev | 10:58 | |
*** JaRoel|4D has quit IRC | 11:08 | |
*** JaRoel|4D has joined #zope3-dev | 11:08 | |
*** agroszer_ has quit IRC | 11:28 | |
*** tarek has joined #zope3-dev | 11:29 | |
*** agroszer has joined #zope3-dev | 11:32 | |
*** tarek has quit IRC | 11:35 | |
*** Theuni1 has quit IRC | 11:36 | |
*** Theuni1 has joined #zope3-dev | 11:37 | |
*** JaRoel|4D has quit IRC | 11:38 | |
*** JaRoel|4D has joined #zope3-dev | 11:39 | |
*** tarek has joined #zope3-dev | 11:40 | |
*** ccomb has joined #zope3-dev | 11:43 | |
*** yotaff has joined #zope3-dev | 11:48 | |
*** stub has quit IRC | 11:50 | |
*** mcdonc has quit IRC | 11:59 | |
*** tarek has quit IRC | 12:01 | |
*** stub has joined #zope3-dev | 12:03 | |
*** stub has joined #zope3-dev | 12:03 | |
*** ignas has joined #zope3-dev | 12:05 | |
*** agroszer has quit IRC | 12:05 | |
*** goschtl has joined #zope3-dev | 12:18 | |
*** avn has quit IRC | 12:23 | |
*** avn has joined #zope3-dev | 12:24 | |
*** tarek has joined #zope3-dev | 12:30 | |
*** mgedmin has joined #zope3-dev | 12:31 | |
*** romanofski has joined #zope3-dev | 12:32 | |
*** sunew has joined #zope3-dev | 12:34 | |
*** romanofski has quit IRC | 12:38 | |
*** matthal has quit IRC | 12:42 | |
*** tarek has quit IRC | 12:52 | |
*** tarek has joined #zope3-dev | 12:54 | |
*** ignas has quit IRC | 12:57 | |
*** agroszer has joined #zope3-dev | 13:18 | |
*** fcorrea has joined #zope3-dev | 13:27 | |
*** kaeru has quit IRC | 13:49 | |
*** __mac__ has joined #zope3-dev | 13:50 | |
*** kaeru has joined #zope3-dev | 13:50 | |
*** __mac__ has quit IRC | 14:08 | |
*** aaronv has joined #zope3-dev | 14:22 | |
*** avn has quit IRC | 14:23 | |
*** avn has joined #zope3-dev | 14:24 | |
*** tarek has quit IRC | 14:30 | |
*** fcorrea has quit IRC | 14:31 | |
*** avn has quit IRC | 14:42 | |
*** markusleist has quit IRC | 14:42 | |
*** alga has quit IRC | 14:42 | |
*** allisterb has quit IRC | 14:42 | |
*** andres has quit IRC | 14:42 | |
*** mcdonc has joined #zope3-dev | 14:45 | |
*** chaoflow_ has joined #zope3-dev | 14:45 | |
*** markusleist has joined #zope3-dev | 14:47 | |
*** avn has joined #zope3-dev | 14:47 | |
*** alga has joined #zope3-dev | 14:47 | |
*** allisterb has joined #zope3-dev | 14:47 | |
*** andres has joined #zope3-dev | 14:47 | |
*** aaronv has quit IRC | 14:50 | |
*** hexsprite has quit IRC | 14:50 | |
*** chaoflow has quit IRC | 14:50 | |
*** ignas has joined #zope3-dev | 14:52 | |
*** aaronv has joined #zope3-dev | 14:54 | |
*** tarek has joined #zope3-dev | 14:56 | |
*** hexsprite has joined #zope3-dev | 14:57 | |
*** thetet has joined #zope3-dev | 15:04 | |
*** srichter has joined #zope3-dev | 15:06 | |
*** ChanServ sets mode: +o srichter | 15:06 | |
*** benji has joined #zope3-dev | 15:07 | |
*** projekt01 has joined #zope3-dev | 15:16 | |
*** mcdonc has quit IRC | 15:19 | |
*** tarek has quit IRC | 15:23 | |
*** runyaga has joined #zope3-dev | 15:23 | |
*** runyaga has quit IRC | 15:27 | |
*** runyaga_ has quit IRC | 15:27 | |
*** mcdonc has joined #zope3-dev | 15:29 | |
*** allisterb has quit IRC | 15:38 | |
*** allisterb has joined #zope3-dev | 15:41 | |
*** stub has quit IRC | 15:48 | |
*** jfkw has joined #zope3-dev | 15:51 | |
*** tarek has joined #zope3-dev | 15:52 | |
* mgedmin needs some kind of in-memory cache for Plain python objects (strings) that has bounded growth | 15:53 | |
Theuni1 | bounded by what measure? | 15:56 |
---|---|---|
Theuni1 | s/bounded/bound/ | 15:56 |
Vq | size? | 15:57 |
Theuni1 | ah | 15:59 |
Theuni1 | i didn't see the "strings" part | 15:59 |
Theuni1 | mgedmin: i think writing a custom dict for that isn't too hard | 15:59 |
mgedmin | yes, but I dislike reinventing wheels | 15:59 |
Vq | some kind of global patricia trie for storing "small" strings would be neat | 15:59 |
Theuni1 | mgedmin: ah :) | 16:00 |
Theuni1 | Vq: i think thats what interning is for | 16:00 |
mgedmin | just something to speed up rendering of restructured text snipplets | 16:00 |
mgedmin | I don't want to eat it all the RAM, since the snipplets can in theory change at runtime | 16:00 |
Vq | Theuni1: does that exist in Python? | 16:00 |
Theuni1 | Vq: i'm not sure how it's implemented | 16:00 |
Theuni1 | by interned strings will always be the same object | 16:01 |
mgedmin | I think a LRU of some kind with an upper bound on the number of objects should be sufficient | 16:01 |
Vq | Theuni1: yeah, i recognise the concept from Java-land | 16:01 |
Theuni1 | by default "short" strings without spaces are interned IIRC | 16:01 |
Theuni1 | but you can also ask the interpreter to intern specific strings | 16:01 |
* Vq <- not a Java programmer | 16:01 | |
* Vq looks embarassed | 16:01 | |
Theuni1 | right. don't try to disguise ;) | 16:01 |
* Theuni1 puts a mustache on Vq | 16:02 | |
mgedmin | short string literals, I assume | 16:02 |
mgedmin | I doubt Python interns strings created at run time | 16:02 |
Theuni1 | mgedmin: ah, good point. no idea. :) | 16:02 |
* Theuni1 wants multi-frame generators | 16:04 | |
*** J1m has joined #zope3-dev | 16:05 | |
Vq | maybe there is a function to explicitly intern them at run-time? | 16:05 |
Vq | like, ehm, "intern()" | 16:07 |
*** fcorrea has joined #zope3-dev | 16:08 | |
Theuni1 | well, that I knew about | 16:08 |
Theuni1 | mgedmin just questioned whether the automatic internalization happens only for literals or for strings that are computed or come from IO, too. | 16:09 |
*** gary_poster has joined #zope3-dev | 16:11 | |
Vq | ok, i didn't realise he asked for implicit interning | 16:11 |
Theuni1 | no, i was talking about it | 16:12 |
Theuni1 | and he just pointed out the reality might be slightly different than i thought ;) | 16:12 |
Vq | it's an interesting problem though | 16:17 |
Vq | saving on RAM when dealing with immutable datatypes | 16:17 |
mgedmin | actually, you've just given me an idea | 16:18 |
* Vq <- Haskell programmer (not Java dammit) | 16:18 | |
mgedmin | atexit hook that prints the size of the cache at the end of the functional test run | 16:18 |
Theuni1 | me? how that? | 16:20 |
* Theuni1 wonders whether docs.zope.org only updates once a day | 16:20 | |
* mgedmin has a buildbot job watch svn for commits to txt files in the right place and rebuild docs | 16:22 | |
Theuni1 | yeah, well. poke dataflake. :) | 16:23 |
Theuni1 | hudson could also do the build and upload via sftp | 16:23 |
Theuni1 | that way the target machine doesn't have to run the build at all | 16:23 |
Theuni1 | and doesn't need the infrastructure installed | 16:24 |
* Theuni1 keeps plugging hudson | 16:24 | |
mgedmin | hudson is friendly | 16:24 |
Theuni1 | yup | 16:24 |
mgedmin | not too friendly, sadly | 16:25 |
Theuni1 | hu? | 16:25 |
mgedmin | a bit friendlier than buildbot | 16:25 |
Theuni1 | i find it quite a bit friendlier : | 16:25 |
Theuni1 | :) | 16:25 |
mgedmin | you didn't hear my cursing when hudson refused to do what it claimed it was able to do | 16:25 |
Theuni1 | what was that? | 16:25 |
mgedmin | e.g. check out from file:// | 16:25 |
Theuni1 | woah? | 16:25 |
mgedmin | some bug in some java subversion library that hudson bundles in its war | 16:25 |
mgedmin | checksum errors of some kind | 16:25 |
Theuni1 | ouch | 16:26 |
mgedmin | found a bug report in hudson's tracker; nothing is apparently happening anyway | 16:26 |
mgedmin | even though the fix is to upgrade to the later lib than hudson now bundles | 16:26 |
mgedmin | also, I set up ssh host keys for the hudson unix user so it could access the repo over svn+ssh | 16:27 |
mgedmin | but hudson's web UI *insisted* on me either giving it a username and a password pair, *or* uploading the ssh secret key over a web file upload form | 16:27 |
* mgedmin hates software that thinks it's smarter than he is, especially when said software is wrong | 16:28 | |
Theuni1 | Checking out a fresh workspace because the workspace is not file:///home/ctheune/tmp/asdf | 16:28 |
Theuni1 | Checking out file:///home/ctheune/tmp/asdf | 16:28 |
Theuni1 | At revision 0 | 16:28 |
Theuni1 | no revision recorded for file:///home/ctheune/tmp/asdf in the previous build | 16:28 |
Theuni1 | [workspace] $ /bin/sh -xe /tmp/hudson8468700479923771996.sh | 16:28 |
Theuni1 | that worked for me ... | 16:28 |
mgedmin | http://issues.hudson-ci.org/browse/HUDSON-4727 | 16:29 |
Theuni1 | why did you say nothing is happening apparently? | 16:31 |
Theuni1 | the last guy said yesterday he fixed it in the plugin but needs some testing | 16:31 |
Theuni1 | well, the day before yesterday | 16:31 |
*** jukart has quit IRC | 16:32 | |
mgedmin | because "bug has been fixed in the svnkit on 15-Sep-2009 version 1.3.1" and when I was setting up hudson a month ago, it still shipped with svnkit 1.3.0 | 16:34 |
mgedmin | that last comment is interesting | 16:34 |
mgedmin | but it sounds as if the guy is working around the svnkit bug in the plugin (if exception, nuke working tree and re-checkout) | 16:34 |
mgedmin | and I doubt it will help me (IIRC I had that exception during the initial checkout) | 16:35 |
mgedmin | also, why not just update svnkit? | 16:35 |
mgedmin | am I misunderstanding something? | 16:35 |
mgedmin | incidentally, svn over file:// is tremendously faster than svn over svn+ssh://localhost/ | 16:36 |
mgedmin | the initial ssh negotiation seems to increase latency a lot, even with a reasonably fast CPU | 16:36 |
* mgedmin jumps up in the air excitedly | 16:37 | |
mgedmin | twice! | 16:37 |
mgedmin | caching rendered restructured text snippets shrinks functional test runtime from 12m 56s to 6m 45s | 16:37 |
* mgedmin should've profiled sooner | 16:38 | |
Theuni1 | cool | 16:39 |
mgedmin | RunSnakeRun is nice, but I don't trust it | 16:41 |
mgedmin | or the cProfile data that it shows | 16:41 |
mgedmin | e.g. visually checkPermission seems to be taking ~50% of the time, but the cum_time column shows just 18% | 16:41 |
mgedmin | previously there was a function that took 86 of cumtime, and one of its callers was a function that had 6ms of cumtime | 16:42 |
mgedmin | the other caller had 0.1s | 16:42 |
mgedmin | s/6ms/6s/ | 16:42 |
mgedmin | s/86/86s/ | 16:42 |
*** __mac__ has joined #zope3-dev | 16:42 | |
*** tarek has quit IRC | 16:43 | |
mgedmin | incidentally, a trick for profiling in buildoutified projects | 16:43 |
mgedmin | if you have interpreter=py | 16:43 |
mgedmin | use bin/py -m cProfile -- -o prof.data bin/script args ... | 16:43 |
*** chaoflow_ is now known as chaoflow | 16:56 | |
*** sweh has quit IRC | 17:00 | |
*** tarek has joined #zope3-dev | 17:00 | |
*** gary_poster has quit IRC | 17:02 | |
*** projekt01 has quit IRC | 17:02 | |
*** ignas has quit IRC | 17:02 | |
*** avn has quit IRC | 17:02 | |
*** alga has quit IRC | 17:02 | |
*** andres has quit IRC | 17:02 | |
*** __mac__ has quit IRC | 17:05 | |
*** gary_poster has joined #zope3-dev | 17:07 | |
*** projekt01 has joined #zope3-dev | 17:07 | |
*** ignas has joined #zope3-dev | 17:07 | |
*** avn has joined #zope3-dev | 17:07 | |
*** alga has joined #zope3-dev | 17:07 | |
*** andres has joined #zope3-dev | 17:07 | |
*** tarek has quit IRC | 17:18 | |
*** tarek has joined #zope3-dev | 17:20 | |
*** yotaff has quit IRC | 17:21 | |
*** Theuni1 has quit IRC | 17:24 | |
*** agroszer has quit IRC | 17:28 | |
*** mgedmin900 has joined #zope3-dev | 17:29 | |
*** thetet has quit IRC | 17:30 | |
*** yotaff has joined #zope3-dev | 17:35 | |
*** projekt01_ has joined #zope3-dev | 17:36 | |
*** projekt01 has quit IRC | 17:36 | |
*** projekt01_ is now known as projekt01 | 17:38 | |
*** yotaff has quit IRC | 17:43 | |
*** redir has joined #zope3-dev | 17:47 | |
*** tarek has quit IRC | 17:50 | |
*** afd_ has quit IRC | 17:50 | |
*** grahal has quit IRC | 17:51 | |
*** alga has quit IRC | 17:58 | |
*** zagy has quit IRC | 18:03 | |
*** sawdog has quit IRC | 18:03 | |
*** timte has quit IRC | 18:03 | |
*** projekt01 has quit IRC | 18:21 | |
*** afd_ has joined #zope3-dev | 18:24 | |
*** alga has joined #zope3-dev | 18:25 | |
*** jukart has joined #zope3-dev | 18:25 | |
*** JaRoel|4_ has joined #zope3-dev | 18:30 | |
*** JaRoel|4D has quit IRC | 18:30 | |
*** mgedmin900 has quit IRC | 18:30 | |
*** sunew has quit IRC | 18:31 | |
*** avn has quit IRC | 18:32 | |
*** kaeru has quit IRC | 18:33 | |
*** avn has joined #zope3-dev | 18:33 | |
*** lamike has joined #zope3-dev | 18:36 | |
*** lamike has left #zope3-dev | 18:36 | |
*** kaeru has joined #zope3-dev | 18:37 | |
*** davisagli has joined #zope3-dev | 18:37 | |
*** tarek has joined #zope3-dev | 18:45 | |
*** jukart has quit IRC | 18:53 | |
*** ccomb has quit IRC | 18:55 | |
*** aaronv has quit IRC | 19:02 | |
*** pcardune has joined #zope3-dev | 19:05 | |
*** chaoflow has quit IRC | 19:08 | |
*** ignas has quit IRC | 19:16 | |
*** r0ver has joined #zope3-dev | 19:17 | |
*** grahal has joined #zope3-dev | 19:29 | |
*** markusleist has quit IRC | 19:34 | |
*** baijum has quit IRC | 19:34 | |
*** redir has quit IRC | 19:37 | |
*** jhauser has quit IRC | 19:41 | |
*** goschtl has quit IRC | 19:53 | |
*** sunew has joined #zope3-dev | 19:56 | |
*** sunew has quit IRC | 19:56 | |
*** jpcw has quit IRC | 20:23 | |
*** tarek has quit IRC | 20:24 | |
*** mgedmin has quit IRC | 20:31 | |
*** r0ver has left #zope3-dev | 20:45 | |
*** aaronv has joined #zope3-dev | 20:45 | |
*** andres has quit IRC | 20:55 | |
*** andres has joined #zope3-dev | 20:56 | |
*** tarek has joined #zope3-dev | 20:59 | |
*** harobed has joined #zope3-dev | 21:01 | |
*** tarek has quit IRC | 21:06 | |
*** mgedmin has joined #zope3-dev | 21:06 | |
*** tarek has joined #zope3-dev | 21:07 | |
*** redir has joined #zope3-dev | 21:09 | |
*** agroszer has joined #zope3-dev | 21:10 | |
*** gary_poster is now known as gary-lunch | 21:14 | |
*** tarek has quit IRC | 21:16 | |
*** redir has quit IRC | 21:16 | |
*** srichter has quit IRC | 21:20 | |
*** redir has joined #zope3-dev | 21:27 | |
*** tarek has joined #zope3-dev | 21:33 | |
*** tarek has quit IRC | 21:38 | |
*** agroszer has quit IRC | 21:40 | |
*** harobed has quit IRC | 21:40 | |
*** __mac__ has joined #zope3-dev | 21:48 | |
*** markusleist has joined #zope3-dev | 21:48 | |
*** __mac__ has quit IRC | 22:01 | |
*** alecm has joined #zope3-dev | 22:12 | |
*** alecm has joined #zope3-dev | 22:12 | |
*** matthal has joined #zope3-dev | 22:25 | |
*** runyaga has joined #zope3-dev | 22:30 | |
*** matthal is now known as greenman | 22:34 | |
*** runyaga is now known as run|away | 22:35 | |
*** avn has quit IRC | 22:38 | |
*** avn has joined #zope3-dev | 22:39 | |
*** davisagli is now known as davi|lunch | 22:43 | |
*** gary-lunch is now known as gary_poster | 22:46 | |
*** ccomb has joined #zope3-dev | 22:54 | |
*** srichter has joined #zope3-dev | 23:05 | |
*** ChanServ sets mode: +o srichter | 23:05 | |
*** nathany has joined #zope3-dev | 23:11 | |
*** fcorrea has quit IRC | 23:17 | |
*** redir has quit IRC | 23:33 | |
*** nathany has quit IRC | 23:34 | |
*** davi|lunch is now known as davisagli | 23:36 | |
*** afd_ has quit IRC | 23:43 | |
run|away | J1m, ? | 23:50 |
J1m | run|away, ? | 23:59 |
*** gary_poster has quit IRC | 23:59 | |
run|away | in cPickleCache.c, cc_update_object_size_estimation | 23:59 |
run|away | - setting new_size to int; appears to fix the byte-size gc issue | 23:59 |
Generated by irclog2html.py 2.15.1 by Marius Gedminas - find it at mg.pov.lt!