00:00:36 Hmm. I'm not actually measuring some things correctly. 00:00:52 That seems somewhat dependan on the math lib 00:03:20 long time: I could time it, but I'm trying to time Eep at the mo'. It's being a bit barfy 00:05:19 Heh. 00:05:50 I'd really ahve to compile that sucker by hand. I'm not sure I *want* to :) 00:06:44 heh, heh 00:17:57 * AaronSw waves 00:18:02 hey aaron. 00:18:11 Hey bijan 00:19:03 Hm, lots of new people 00:20:09 I'm in the middle of "The Star Fraction" now, so I'll catch up on stuff later. 00:20:13 oh aaron. 00:20:19 yeah? 00:20:24 Any long running n3 things not involving builtins? 00:21:13 * bijan still looking for tests. 00:21:24 None come to mind. 00:21:55 Oh well. 00:22:51 Wow, Lessig wrote me a personal thank you note! That's awesome. 00:22:59 For? 00:23:24 I guess it's sort of a secret. 00:23:39 Some RDF stuff I did for him... 00:24:31 Ooh, neat: http://apple.slashdot.org/ 00:27:23 * sbp returns 00:30:02 1.52 0.11 for that test? Hmm... something must have borked 00:31:23 1.52? 00:31:49 seconds to parse the NTriples files (800KB), seconds to perform the query 00:32:16 Which ntriples file. the geo thing? 00:32:35 yeah. I converted it to NTriples since I didn't want to crash test my N3 parser... :-) 00:32:40 Heheheh. 00:32:45 Got ya beat *there*. 00:34:42 wow! it wasn't kidding! 00:34:43 1.42999994755 00:34:43 0.160000085831 00:34:53 This is eep? 00:34:56 yep 00:35:00 Did you just smoke both me and cwm? 00:35:01 You pig. 00:35:05 bwahahahaha! 00:35:15 I think the problem with rm's test is IDLE 00:35:26 if IDLE has to print something really huge, it just stands there 00:35:37 OTOH, I might be wrong - it might be a problem with the inference module 00:35:43 but the query module is... well, rather fast 00:36:07 * sbp goes to get a drink 00:38:24 Hmm... and the output file is 0.99MB 00:38:32 Python is an awesome thing 00:38:57 Hmm. 00:39:03 Something seems up with that. 00:39:27 I can post you the data, if you like 00:39:34 sure. 00:40:11 What is your query engine doing, btw? 00:40:26 I guess if it's just a loop over the list, that could be nippy. 00:42:19 it's querying for the triples, plus matching the variables 00:42:26 [sent, BWT] 00:42:32 or BTW... 00:42:37 "querying...*plus* mathcing?" 00:42:45 yeah 00:42:57 ?x :y ?z is not the same as ?x :y ?x 00:44:24 ouch, y'know, *that's* something that bites me. 00:44:27 I think. 00:44:35 what's that? 00:44:50 oh, does it not match the variables? 00:45:04 er..hmm. 00:45:46 test case: store: :p :q :p . :p :q :r . query: { ?x :q ?x } log:implies { ?x :q ?x } . 00:45:47 in {?x :parent ?z. ?y :parent ?z} => {?x :co-parent ?y} and 00:46:06 :bob :parent :sally. :mary :parent :sally. 00:46:13 I will get that bob and mary are their own co-parents 00:47:03 Ugh 00:47:04 Oh, this isnt' the inference? This is the query? 00:47:17 yep, just the query 00:47:38 D'oh! 00:47:43 I thought this was the *inference*. 00:47:46 heh, heh 00:47:53 I'll benchmark the inference... 00:48:05 AlexMax has quit ("ButchX-p6 by conio Accept no limitations") 00:50:02 *Much* less than a second. 00:50:08 Doing query test... 00:50:08 0.160000085831 00:50:08 Doing inference test... 00:50:08 0.27999997139 00:50:12 Hmm. 00:50:33 How many hits do you get? 00:50:41 still pretty quick. that's using infer.filter, which is the main inference function 00:50:42 hits? 00:50:47 1211 00:50:54 I get 1211 00:50:58 From your query. 00:50:59 7266 1211 1211 00:51:18 7266 is the length of the input, in triples 00:51:52 0.02 for the query 00:52:00 For some varient of the query. 00:52:27 7269 for the triples 00:52:39 ooh, slight discrepancy 00:52:45 The rules. 00:53:21 Still. 00:53:37 I'm not sure what your inference thing is. 00:53:44 Are you doing the rule we used? 00:53:47 yep 00:54:00 it does { ?x :blargh ?y } => { ?x :blargh ?y } . 00:54:13 Do you optimize for that/ 00:54:13 ? 00:54:32 Where do you accumulate results? 00:54:42 * bijan suspects that writing to rdf_db is *really* killing him. 00:54:48 no - it's pretty general. But then, once you have a query engine, it's just a matter of plugging the variables back in at the other end 00:55:01 accumulate results? 00:55:17 it can print them out as a Python list, or as NTriples 00:55:25 Ok, so in a list. 00:55:33 yes, accumulating in a list is faster for me, I'll bet. 00:55:40 Writing each to the database is slow. 00:55:48 Interleaving the writes is prolly slow. 00:56:04 yeah... there are a number of reasons why it would be slower 00:56:39 I wonder why CWM is slower. 00:56:42 So much slower. 00:56:48 And I wonder if this is a corner case where you do well. 00:56:56 Or whether you do well in general. 00:56:58 the new CWM? Tim is interning formulae now 00:57:07 well in general: I doubt it :-) 00:57:18 I'm just trying to set up rm's test case right now... 00:57:32 And I have to run! Hurry up! 00:57:52 I'm trying, I'm trying! 00:59:17 it seems to just sit there 00:59:22 let's reduce the test case a bit... 01:00:18 Hmm. I bet you have to traverse the list for each additional statement? 01:00:25 You might be better off shrinkin the rules. 01:00:46 yep, I just did... still running 01:00:48 If you have big_list_of_triples (datastore) 01:01:05 Then for each antecedent statemetn: search list until get hit. 01:01:21 And having to start over if you get a miss down the line... 01:01:24 yeah, that will be slow. 01:01:48 Hmm... 01:02:18 (Assuming that I have your inference strategy correct) 01:02:25 even if that's fast for the once through case. 01:02:52 I added one triple to the ante and desc, and it added a second to the query... 01:02:57 s/query/inference/ 01:03:08 Which one? 01:03:12 music one? 01:03:14 Or the geo one? 01:03:16 yep 01:03:18 the music one 01:03:28 ah, add one more and it just sits there 01:03:32 bug? 01:03:39 it seems to be 01:03:47 * bijan is disappointed. 01:04:04 * bijan shifts to being superior because of correctness, rather than performance. 01:04:29 difficult to tell, though. The new line is a ?x ?y ?z type of thing, which might be causing it grief - but it already had one to handle 01:04:30 Is it any three triples or a specific third triple? 01:04:35 correctness: heh, heh 01:04:49 dunno, this one is still hanging. I'll cut it and try again 01:04:50 Oh, I'm *creaming* you on documentation! 01:05:05 yeah. There isn't any Eep documentation :-) 01:05:09 And Looks. I'm Much Cuter. ;) 01:05:11 Yes, I know :) 01:05:17 That's why I'm killing you :) 01:05:22 heh, heh 01:05:35 but "Cuter"? nah 01:05:42 *Definitely*. 01:05:44 No question. 01:05:48 Everyone agrees! 01:05:53 I don't 01:05:58 so it can't be everyone 01:06:02 "Everyone who counts agrees!" 01:06:12 I count! 1, 2, 3, 4, 5, 6, 7... 01:06:16 You do too, actually; you just lie about it. 01:06:28 Perhaps 01:06:29 ok I've really got to run. ta 01:06:32 c'ya! 01:06:36 bijan has quit ("Leaving") 01:09:57 ooh, it seems to be a problem in the query module, in fact 01:10:42 without this one particular line, it's really quick:- 01:10:43 Doing parse test... 01:10:43 0.0499999523163 134 01:10:43 Doing query test... 01:10:43 1.05000007153 134 01:12:33 ooh, it just did a slightly different test in about half a minute:- 01:12:33 Doing query test... 01:12:33 36.4199999571 134 01:13:52 and again, with a proper "length of results" count: 36.25 31 01:14:38 ah, I have an idea 01:17:19 * sbp tries it with a new cp function 01:17:44 Pff, slower: 37.6799999475 31 01:20:45 Hmm... it's the last bit of a particular function that's taking so long 01:21:12 argh! no wonder 01:21:12 1014513652.06 265856 01:21:32 265856 cartesian paths! not efficient going through all of them... 01:22:00 s/paths/products/ 01:25:23 so, it is the cp function doing it... ugh 01:27:54 ooh, with the new function, I get a MemoryError 01:27:56 that's a new one 01:30:20 bijan will be so happy :-) 01:34:45 heh, the test that crashes out all of the time is trying to compute 35,624,704 cartesian products 01:40:11 * sbp mails bijan the good news 01:42:29 heh, heh:- 01:42:30 File "query.py", line 61, in xtquery 01:42:30 if n > 500000: raise "You want me to find "+str(n)+" cartesian products? Pff" 01:42:30 You want me to find 35624704 cartesian products? Pff 01:46:38 http://www.python.org/doc/current/lib/profile.html 01:47:28 ooh, neat 01:47:42 * sbp says "ooh" a lot lately 01:47:57 Me too, I think. 01:48:10 'tis a good word 01:48:35 Heh, google bought the word "python" on Google. 01:48:46 -- 01:48:47 python=$10K? 01:48:47 Enter Google's programming contest 01:48:47 Win fame, fortune and a trip to CA 01:48:47 google.com/programming-contest/ 01:48:48 -- 01:48:59 heh 01:50:03 They have a lot of different versions of it, but they don't seem to have bought other languages. 01:50:26 Ah, they bought C++ 02:09:19 bijan (bparsia@login6.isis.unc.edu) has joined #swhack 02:09:35 uh oh 02:09:44 I came on to giggle! 02:09:50 damnit! 02:10:13 I am curious about the huge discrepancy in your times :) 02:10:24 me too 02:10:45 well, for smaller queries, you don't get many results, so it's stunningly fast 02:11:00 Eh, that alone isn't good reasoning. 02:11:10 but for larger ones, you get more results... for each result, your cp value goes up by the length of that result 02:11:18 it skyrockets quite quickly 02:11:33 "many results", you mean consequences per application? 02:11:35 goes up: as in *multiplied* by the length 02:11:47 no, not consequences... 02:11:51 this is in the query module 02:12:03 I don't understand. 02:12:08 The geo example had lots of results... 02:12:13 OHOHOH. 02:12:17 YOu mean anding the results/ 02:12:19 ? 02:12:34 (That's the same as what I meant by consequences0 02:12:49 Hm... yeah, I guess so 02:12:53 (A query is just an inference to the matches in the antecedent) 02:13:10 Like the sample one you gave. 02:13:30 So, filtering a list is fast. 02:13:40 (Hmm. I wonder if list comprehensions would be nippy..) 02:14:00 SOrry. 02:14:07 well, it just performs simple matching, and then ponders over the paths through each of the results 02:14:08 Say I have a query statemetn A. 02:14:13 O.K. 02:14:33 To match A against the store, I wall the list examining each statement. 02:14:42 If it matches, it goes into the results. 02:14:48 When I read the end of the list I'm done. 02:14:49 Yes? 02:15:11 yep 02:15:13 If I have two query statements, A and B 02:15:19 I wall the list gathering all the As? 02:15:25 Then walk the list gathering all the Bs? 02:15:31 [(a results), (b results)] 02:15:36 and then find the paths 02:15:58 "paths'? 02:16:13 cartesian product 02:16:28 here's how I caught it:- 02:16:28 for item in all: n *= len(item) 02:16:29 if n > 500000: raise "You want me to find "+str(n)+" cartesian products? Pff" 02:16:41 "all" is the list of results, per above 02:16:49 [n is initially 1] 02:17:12 Hmm. I'm not sure I understand. 02:17:16 Which N hurts? 02:17:25 The length of the query? (A & B &...n) 02:17:39 Or the length of the results (rA & rB &....) 02:17:45 the product of the lengths of the items in the results 02:17:55 (rA * rB *....) 02:17:59 Ah. 02:18:09 Because you cross compare all the permutaitons. 02:18:14 yep 02:18:20 *that's* dumb. 02:18:23 yep 02:18:45 rather: that's *dumb*. 02:19:24 Ouch. i"m trying to generate a simple unification algo for that. 02:19:34 For your walk the list technqiue. 02:19:36 Not trivial. 02:19:46 especially without backtracking. 02:20:03 indeed. the approach seemed very intuitive to me, but I didn't consider what'd happen when I scaled it up a little bit... :-) 02:21:56 the only way to beat it would be to totally scrap the algorithm, and start again 02:22:05 Well, yes. 02:23:06 Yay! You're again behind me in completeness too! :) 02:23:45 I'm a fair way behind in all places... except for small queries :-) 02:24:00 Well, actually, there too. 02:24:07 Sorry. 02:24:12 how's that? 02:24:38 Well, you kill me if I use an n3 rule writing to a "heavy" context. 02:24:56 But if I use a findall I'm 2 order of mags faster :) 02:25:56 * sbp ponders re-writing vs. scrapping 02:26:17 In general, SWI queries are going to be reasonable quick. 02:26:49 I mean, I don't *have* to use an N3 rule to find all the foos that match bar. 02:26:55 That's part of the reason to do in SWI :) 02:27:07 yep... I can see the logic behind using Prolog 02:27:16 SO that I can write prolog programs to manipulate the n3 store. 02:27:59 Come over to the dark side. 02:28:06 Learn prolog... 02:28:09 Work on mine... 02:28:42 by the time I would have learned Prolog to the extent that I can help you with CWMClone, you'll have finished it and gone on to better things 02:29:16 Ha! I doubt it :) 02:29:26 But I would be happy to turn it over to you ;) 02:29:37 Hey, your other choice is to rewrite query... 02:29:47 Learning prolog is looking good, eh? 02:30:20 blargh. I suppose. Any good manuals online? 02:30:26 Yes. 02:30:34 .google Prolog primer 02:30:35 Prolog primer: http://www.ibc.wustl.edu/moirai/cs_magenta/prolog.html 02:30:36 SEveral *Excellent* tutorials, actually. 02:31:33 well, that one is weak 02:31:37 I link to a few from my first article 02:31:42 .google Prolog tutorial, that bijan approves 02:31:43 no results found. 02:31:46 ah, good point 02:33:32 Hmm. WHy do you get the cartesian product? 02:34:08 so that I can match the variables against all of the paths 02:34:24 Ok, A & B 02:34:37 I'm walking for A, find a match. 02:34:42 Why not check B right then? 02:34:47 Will that help? 02:35:04 yeah, but that'd be a totally different way of querying 02:35:13 in fact, it's the original way that I wrote it, as I recall 02:35:22 Sure, it's a kind of unification. 02:35:28 Why did you abandon it? 02:35:50 the latter way seemed easier (it was much easier to program), and faster for the small tests that I ran 02:36:36 Well, what about filter on A, then walk rA to see if B matches? 02:36:49 Hmm... 02:36:49 I don't understand the "paths' :) 02:37:05 perhaps I could print out debug information for a sample query? 02:37:08 The cartesian product doesn't maek *sense* 02:37:16 Sure. 02:38:46 the query:- 02:39:50 print tquery(eep.parse("""?x <#sonOf> ?y . 02:39:50 ?y <#sonOf> ?z ."""), 02:39:50 eep.parse("""<#Bob> <#sonOf> <#Fred> . 02:39:50 <#Fred> <#sonOf> <#John> . 02:39:50 <#John> <#sonOf> <#Wayne> ."""), 1) 02:40:23 Ok, can, both match all of them. 02:40:46 You store bindings with the results? 02:41:15 i.e., {(?x, #bob) (?y, #Fred)... 02:42:01 argh, sorry, I got disconnected 02:42:03 actually, that's not a good example because the query triples are basically identical 02:42:04 Or somthing. 02:42:06 here's a better one:- 02:42:12 print tquery(eep.parse("?x <#sonOf> ?y .\n?x <#name> ?z ."), 02:42:12 eep.parse("""<#Bob> <#sonOf> <#Fred> . 02:42:12 <#Fred> <#sonOf> <#John> . 02:42:13 <#Bob> <#name> "Bob" . 02:42:15 <#Fred> <#name> "Fred" ."""), 1) 02:42:29 and the debug information:- 02:42:29 all results: [[[<#Bob>, <#sonOf>, <#Fred>], [<#Fred>, <#sonOf>, <#John>]], [[<#Bob>, <#name>, "Bob"], [<#Fred>, <#name>, "Fred"]]] 02:42:30 dict of results: {'?z': None, '?y': None, '?x': None} 02:42:46 I store the bindings only at the very end, when it does the variable matching 02:42:54 I don't understand. 02:43:12 You found all the #sonOfs 02:43:20 THen all the #names 02:43:22 and all the names 02:43:32 then, for each sonOf. 02:43:37 no 02:43:50 not for each sonOf. This when I get the cp 02:43:58 which turns out to be: [[[<#Bob>, <#sonOf>, <#Fred>], [<#Bob>, <#name>, "Bob"]], [[<#Fred>, <#sonOf>, <#John>], [<#Bob>, <#name>, "Bob"]], [[<#Bob>, <#sonOf>, <#Fred>], [<#Fred>, <#name>, "Fred"]], [[<#Fred>, <#sonOf>, <#John>], [<#Fred>, <#name>, "Fred"]]] 02:44:18 then I apply matching 02:44:30 Ergh. 02:44:32 Pretty print that? 02:44:36 sure... 02:44:47 Or pretty paste, whatever :) 02:45:02 [[<#Bob>, <#sonOf>, <#Fred>], [<#Bob>, <#name>, "Bob"]] 02:45:02 [[<#Fred>, <#sonOf>, <#John>], [<#Bob>, <#name>, "Bob"]] 02:45:03 [[<#Bob>, <#sonOf>, <#Fred>], [<#Fred>, <#name>, "Fred"]] 02:45:03 [[<#Fred>, <#sonOf>, <#John>], [<#Fred>, <#name>, "Fred"]] 02:45:39 the original query is ?x <#sonOf> ?y .\n?x <#name> ?z . 02:45:40 Then you see if ?x is the same in the first one? 02:45:48 yep 02:45:58 Ok, yes, that's insane :) 02:46:07 well, it's a bit more generic than that, because it has to work for all queries... 02:46:41 Hmm. But hte originalist is just a list of triples yes/ 02:46:42 ? 02:46:48 Are you using a >2.1 python? 02:46:49 the original list of what? 02:46:52 Python 2.2 02:46:53 triples 02:46:57 Ooo! Ok 02:47:00 yeah, that's just a list 02:47:04 Try a list comprehension on it! 02:47:15 and how would I be doing that? :-) 02:47:20 (Taking a leaf from mnesia) 02:47:26 Hit the manual. 02:47:40 * sbp prints out a copy and goes to find a hammer 02:47:57 A list comprehension is basically a query of the form "All items where item is blah blah blah 02:48:48 I don't know the python syntax for them. 02:49:29 Mnesia (the erlang distributed db) uses them for it's query language (mnesymone) 02:49:31 oh, right: [x(s) for s in list] 02:49:44 There you go. 02:50:05 I use that all over the place for stuff. What do I do with in in the query, though? 02:50:06 Ok, what would be the transform of the query... 02:50:41 Well, look at your query... 02:51:06 ?x :sonOf ?y. ?x :name ?z. 02:51:20 Hmm. 02:51:23 No. 02:51:52 Damn, I'm still binding the variables paritally :) 02:52:12 End up with your cross product again. 02:52:53 When I was writing the first query engine, I kept doing partial bindings... quite frustrating. Then I thought I had it figured out for Eep :-) 02:53:15 well, it does *work* 02:53:17 Partial bindings are the right why. 02:53:19 way 02:55:17 What's your break over point? 02:55:31 3 query statements and 100 items? 02:55:31 :) 02:55:36 *ahem* 02:55:48 Just curious ;) 02:55:56 at the moment, I raise an exception when asked to find the cp of more than 500000 paths 02:56:07 Hmm. I wonder if number of variables plays a role. 02:56:08 that'd take about 2 minutes, I guesstimate 02:56:14 Interesting. 02:56:37 50,0000 paths is... 02:56:45 Er. 02:56:50 50,000... 02:58:00 the problem is, it's dependent not just on the amount of query triples, but the amount of query answers too, for each query triple. So it's difficult to give an exact borking point 02:58:09 Yes. 02:58:17 THough query hurts you worse. 02:59:12 That you're triple bound makes high query triple numbers likely 02:59:49 triple bound? 03:00:30 Having to cast yoru statemetns as triples. 03:00:50 I.e., if you could have polyadic predicates, you could smoosh them together. 03:01:09 well, it's telling that all of the tests worked. In actual fact, I rarely run big queries 03:01:18 polyadic: quite. But this is RDF, mister! 03:02:10 That's what I said ;) 03:02:14 ah, the borking point will be dependent upon the amount of variables per query triple 03:02:26 [obviously] 03:02:27 Why? 03:02:51 Well, except in how they affect the number of results? 03:02:52 because the amount of matches you get rises from 1 to 2 to 3 univars in the query triple 03:03:21 the number of results is a big factor, since the cp is dependent upon the product of them all 03:03:52 So, not at all except in affecting the number of results ;) 03:04:05 IOW, it's teh number of results which affect the borking point ;) 03:04:20 Hmm. Some simple analysis should help, yes? 03:04:29 If you have 3 vars, kill that triple 03:04:40 SInce it matches anything, it permits anything. 03:04:53 If you have *no* vars, do that first and just check the bindings. 03:05:13 if n is 1 and res is the list of results, for i in res: n *= len(i). if n is now bigger than 500000, bork 03:05:26 yep, the simple analysis should help 03:05:48 but I tried it, using a slightly more complex simple query (I used an xrquery, in fact) 03:06:16 so it did a bit of the matching at query time. Obviously not enough, because it still borked 03:06:49 the only way to fix it would be to change the algorithm so that for each member on the first result, you pass the current bindings along, and so on until you reach the end of a path 03:07:01 it's the sane way, the normal searching algorithm 03:07:02 Yep. 03:07:03 My policy of keeping everything comes in handy. My little brother Noah is using my 8th grade homework since the teachers assigned him the same thing they assigned me. 03:07:15 lol! 03:07:30 * bijan finds that annoying, in a priggest way. 03:07:36 priggish. 03:07:40 .wn priggish 03:07:41 priggish defined as: 03:07:42 - adj : exaggeratedly proper; "my straitlaced Aunt Anna doesn't approve of my miniskirts" [syn: {prim}, {prissy}, {prudish}, {puritanical}, {square-toed}, {straitlaced}, {straightlaced}, {tight-laced}, {victorian}] 03:08:34 heh. "priggishly prissy puritanical prude". Wonderful 03:08:51 * bijan having been an instructor, forced by university rules to enforce measures against cheating, doesn't have fond memories of that. 03:09:09 I'll bet 03:10:41 but the 8th grade is hardly degree-time 03:10:56 Hmm. Eep might actaully work for the chimp, well. 03:11:00 I'm not letting him copy my writing assignments, but I figure the empirical data is ok. (I told him to try searching on Napster first.) 03:11:09 Ah! 03:11:25 Prolly, unless the task is to gather the empirical data ;) 03:11:43 Hey! He's gathering it... 03:11:53 heh, heh 03:11:54 You knew what I meant. 03:12:37 The skill of looking stuff up is important, as is the skill of getting your older brother to turn over *his* results, but they're different than runnin gan experiment. 03:13:27 The assignment was more like, go see if your family has these genetic traits... 03:18:05 Ok, ta. 03:18:06 bijan has quit ("Leaving") 03:29:46 Ugh, the monitor beeping is back 03:30:03 what's that? 03:30:29 My monitor emits the high-pitched hum when nothing changes on the screen. 03:30:49 quick fix: turn the monitor off, put a bin bag over it, and haul it out the nearest window. No more humming! 03:31:04 Unfortunately it's part of my computer: I have a laptop, remember? 03:31:13 ah... of course 03:33:31 ooh, another potenial flame war on www-html 03:33:45 "Let's make the web accessible to everybody but popular browser users!" - Robert Koberg 03:34:02 Heh! 03:34:50 Ash (~aaron@166.70.121.2) has joined #swhack 03:34:54 Ash! 03:35:02 hey there, other Aaron 03:35:06 ;-) 03:35:12 * sbp waves 03:35:15 * AaronSw dons PROTECTIVE GEAR 03:35:15 I just installed your archiver proxy 03:35:18 hey sbp 03:35:18 oooh 03:35:27 well, grabbed the code and ran it. Heh. 03:35:37 It seems your machine hasn't melted yet. This is good. :) 03:35:48 Archiver Proxy: working out of the box since the fall of 201 03:35:51 I've been wanting something that does this for a while, and it's been on my project list but I haven't gotten around to writing it. 03:35:52 good job 03:35:53 :) 03:35:53 er... that'd be 2001 03:35:58 Heh. 03:36:01 Thanks. 03:38:41 If you visit it with your web browser, you get a little web server with configuration options and access to your archived docs 03:39:40 hmm 03:39:47 'Resource temporarily unavailable' 03:39:53 the config page is cool. 03:40:01 thanks 03:40:06 where do you get the "temporarily unavailable" message? 03:40:13 When I try to go to a site 03:40:31 Odd. 03:40:36 That's odd... you're not inside a company firewall or something, are you? 03:40:44 Not this machine, no. 03:40:47 It's just nat'ed. 03:40:52 what's the full message? 03:41:09 Error connecting to slashdot.org on port 80: Resource temporarily unavailable 03:41:14 with a 404 up to 03:41:15 p 03:41:28 wacky. 03:41:39 can you `telnet slashdot.org 80`? 03:42:01 Yes indeedy. 03:42:51 Weird... 03:42:52 * Ash moves his web browser a wee bit closer to his irc window 03:43:15 4400 pixels is too far away 03:43:33 Heh. 03:44:20 That error sounds like your networking interface is messed... 03:44:25 * Ash hugs his desk full of monitors 03:44:37 Well, everything else is working fine... 03:45:08 ACK 03:45:10 Does the code print out An error occurred, details are in errors.txt? 03:45:14 the dreaded ^M!!! 03:45:18 Nope. 03:45:20 Aargh! 03:45:29 Your code has a bunch of ^M's in it. 03:45:33 ;-) 03:45:38 ^Ms? in my code? 03:45:52 The dos carriage returns. 03:45:53 Heh. 03:45:57 *me*? 03:46:07 you must be mistaken, guv'ner 03:46:09 * Ash gives AaronSw a proper editor 03:46:09 ;-) 03:46:18 Hey! I do use a proper editor these days. 03:46:25 I'm pretty sure I got rid of all the ^Ms 03:46:30 xemacs on win32 doesn't add these ^M's 03:46:49 maybe it's the HTTP server 03:47:01 ah crap, I don't have my .emacs here yet 03:47:02 grr 03:47:08 I can't M-x from-dos the file 03:47:09 heh 03:47:22 Heh. 03:47:40 Yeah, must be the HTTP server since my local copy is in UNIX. 03:48:13 And I use a Mac anyway, so it wouldn't have \n\m, which is what I'm getting from the server. 03:48:21 $ python -c "import urllib2; print urllib2.urlopen('http://logicerror.com/archiverProxy-code').read().count('\r')" 03:48:21 778 03:48:40 Probably, AaronSw :) 03:48:51 [Course that's not much consolation sine I wrote the server too...] 03:48:56 What port does this thing default too? 03:48:58 -o 03:49:08 i set it to 8080 03:49:17 It says when it starts up... 8888 I think 03:49:38 8000 03:49:41 nope, same problem 03:49:44 criminy 03:50:14 Ooh. 03:50:38 Could other users on the local machine go in and change the proxy settings, out of curiosity? 03:50:56 I'd expect so, depends what browser you're using. 03:51:03 Interesting. 03:51:42 Oh, you mean the configuration settings on the ArchiverProxy? Yeah, anyone with access to its port could. 03:51:52 That's sorta one issue with running it for lots of people. 03:52:17 Yeah, that's what I mean. 03:52:29 Ash, try setting DEBUG_LEVEL = 2 in the code 03:53:23 wmf (wesf@cs242733-11.austin.rr.com) has joined #swhack 03:53:33 hey wmf 03:53:35 (0) OOO (11, 'Resource temporarily unavailable') 03:53:35 (0) R sender_connection_error((11, 'Resource temporarily unavailable')) for slashdot.org:80 03:53:35 (0) sender closing 03:53:35 (0) sender closing 03:53:38 * Ash floods 03:53:42 howdy 03:53:43 hi, wmf. 03:53:43 Hm, that wasn't too helpful. 03:53:50 No joke. 03:53:52 wmf, been reading "The Star Fraction" today. 03:53:54 * Ash tries it on a local site 03:53:58 cool 03:54:01 It's good. 03:54:02 what do you think? 03:54:12 He had me won from the first few pages. 03:54:25 And I always laugh politely at the geek jokes. 03:54:44 there's going to be a Beep: The Definitive Guide 03:54:52 Oooh. Who's writing it? 03:54:58 .google Beep: The Definitive Guide 03:54:58 Rose, of course 03:54:58 Beep: The Definitive Guide: http://www.amazon.com/exec/obidos/search-handle-url/index=books&field-author=Rose,%20Marshall 03:55:10 * sbp waves to Wes 03:55:17 .google intro to beep 03:55:17 intro to beep: http://beepnik.wiredobjects.com 03:55:20 .google beep for dummies 03:55:21 beep for dummies: http://www.phonelosers.org/red_box.html 03:55:44 .google teach yourself to be an unleashed beep dummy in 21 days 03:55:45 teach yourself to be an unleashed beep dummy in 21 days: http://www.efeduniverse.com/uew/floods/year2000/ff08302000.html 03:55:54 lol 03:56:39 Hm, somehow a Wolf isn't what I'd associate with BEEP... 03:56:56 a clown, maybe 03:57:03 Or a road-runner. 03:57:09 yeahj 03:57:14 Stopping external proxies: 03:57:14 Could not connect to locahost 8000, oh well... 03:57:14 Starting proxy at http://127.0.0.1:8000/ 03:57:16 hmm 03:57:22 (i set debug to 3 and got this) 03:57:22 Yeah, that's normal. 03:57:25 Oh okay. 03:57:40 It tries to make sure it's not still running before starting up a new instance. 03:58:02 Hm, Amazon does't have the O'Reilly RDF book yet. I'm curious what's going to be on the cover. 03:58:14 who's writing that one? 03:58:19 BurningBird 03:58:24 or whatever her name is 03:59:01 I wonder if anyone is using BEEP yet 03:59:25 SimonStL was yelling at me for delaying the RDF book, because the WG has changed so much. I complained that if I knew we were delaying the book, we would have changed more! 03:59:44 heh 04:00:07 All the good changes are shot down by the "No Fun Thru Backwards Compatibility" squad 04:00:32 * Ash shoots down CSS 04:00:39 * Ash shoots down RSS 1.0 04:00:40 bam 04:00:45 No! 04:00:54 hehe 04:01:04 * wmf covers AaronSw's face 04:01:07 [fighter noises: neeeyowww, neh neh neh neh neh!] 04:01:22 our products don't use css so it must suck. same with rss 1.0 04:01:29 wmf, how is radio 9 coming? 04:01:47 * wmf shoots down Ash 04:02:05 hee hee 04:02:56 nope, looks like nobody is really using BEEP for anything 04:03:29 What was your scientific method of determining this? 04:03:47 I hear ACME is adopting it into their roadrunner-catching line of products. 04:03:58 looking at the "cool software that uses BEEP" section of beepcore.org 04:04:47 I guess all the real uses are uncool (squashing civil liberties, DRM, killing cartoon characters) 04:04:59 AaronSw: How does your proxy handle multiple copies of the same page? i.e. when I reload wmf.editthispage.com the next day and it's changed 04:05:15 you'll get wmf.editthispage.com/index/1 and /2 and /3, etc. 04:05:21 ah, cool 04:05:31 and you can check the datestamp on the file to see what day it was, eh? 04:05:31 the View mode will just give you the latest, though 04:05:41 Yep, or the n.headers file 04:05:47 sweet. 04:05:49 Ash: actually, the proxy has a special Illuminati feature where it doesn't archive HTP 04:05:56 Fnord! 04:06:07 so I can change it whenever I want, and no one will have record 04:06:18 Ah, so that's why he has META NOARCHIVE 04:06:27 wmf: It's okay, I have my Illuminati retina-scanner hooked up to my pc so it knows I'm allowed to have a real version 04:06:37 * AaronSw looks, he has 112 copies of wmf.editthispage.com 04:07:13 * Ash gets back to writing MASTERCONTROL.lisp 04:07:27 Hm, and 996419306 copies of scripting.com 04:07:37 heh 04:07:57 * Ash hears 996419306 copies of netscape crying out, all at the same instant 04:08:07 heh, heh 04:08:17 scripting.com screws up netscape big time 04:08:26 Netscape4 04:08:30 heh 04:08:37 Everything screws up netscape4 04:08:38 that's the only verion that works ;-) 04:08:38 * wmf shoots down Netscape 4 04:09:00 Even HTP screws up NS4, and HTP works on just about everything! 04:09:04 Mozilla is getting better, but it still crashes and goes berzerk every 2 days 04:09:13 netscape doesn't do that at least 04:09:14 heh 04:09:28 * Ash notes that novell should die 04:10:57 wmf, do you have some secret O'Reilly new books feed or something? 04:11:05 That's three O'Reilly books in two days you've called. 04:11:32 three? 04:11:45 well, counting O'Reilly Community Press as one 04:11:52 I got that from LWN 04:12:02 illuminati-list@ora.com 04:12:11 Ash: sssshhh! 04:12:15 Oh, oops 04:12:40 * Ash calls in a hit on everyone in the channel 04:12:59 * wmf is whisked away in a black helicopter 04:13:01 * Ash sends hax0rz from N.U.R.V. after AaronSw 04:13:07 lol 04:13:10 I saw a black helicopter on the way to work. 04:13:26 my legs are still sore 04:13:27 ugh 04:13:46 What? It knocked out your legs? 04:14:00 I remember when I used to have O'Reilly-Press privileges. I could get any O'Reilly book for free, and even some that weren't in print yet. They had BETA stamped across the cover in red. 04:14:13 awesome 04:17:19 On this month's developer CD: "Apple/Genentech BLAST includes the executable and source code of the Apple/Genentech enhancements to NCBI BLAST." 04:17:48 are you planning to do some genehacking? 04:18:20 It's part of my Illuminati duities... 04:19:17 @ http://www1.fatbrain.com/asp/bookinfo/bookinfo.asp?theisbn=0966741714&vm=c 04:19:23 A: Fatbrain.com - Product Info for Totally Unauthorized Microsoft Joke Book from wmf 04:20:04 YEEEEEEEEEEEE HAW 04:20:09 my server update actually workd 04:20:11 worked 04:20:12 amazing 04:20:26 * Ash caps GroupWise 04:24:11 Ooh, [deleted] might pay for me to go to Emerging Fads! 04:27:33 http://www1.fatbrain.com/asp/bookinfo/bookinfo.asp?theisbn=059600236X&vm=c 04:27:52 I'm finding all kinds of books that aren't on the O'Reilly site 04:28:30 Yeah, I huess they don't put it on the site until it ships. 04:28:47 well, O'Reilly has a page of upcoming books 04:28:53 Hm. 04:29:16 Hm, even Amazon doesn't have that: http://isbn.nu/059600236X 04:29:25 yeah, I noticed that 04:29:51 you should blog it 04:29:55 it's odd that fatbrain claims that the book is already shipping, yet nobody else has heard of it 04:30:06 Hm, they claim it's shipping? 04:30:30 That is suspicious. 04:30:38 Date Published: 02/2002 04:30:45 hmm, maybe it's not shipping yet 04:32:30 I wonder what other stealth O'Reilly books are out there 04:35:17 Fatbrian shows: Constitutional Federalism in a Nutshell 04:35:46 802.11 Wireless Networks: The Definitive Guide 04:36:01 Alternative Medicine: the Definitive Guide 04:36:22 ah, you had the same idea I did 04:39:43 Ooh! Http: The Definitive Guide 06/2002 04:40:07 Ant: The Definitive Guide 04/2002 04:40:50 Bluetooth in a Nutshell 02/2002 04:41:03 err 02/2003 04:41:08 Python in a Nutshell 02/2003 04:42:11 {ASP.NET, Java Enterprise, VB.NET Language, Windows XP, J2ME, Java, C#, Jxta} in a nutshell 04:42:47 Hm, I bet they're going to botch HTTP in a nutshell 04:43:04 who's the author? 04:43:06 Quantum String Theory in a Nutshell 03/2007 04:43:22 Linda Mui, of "termcap and terminfo", etc. 04:43:28 hmm 04:44:48 not many people understand the true nature of HTTP 04:45:12 * wmf installs a Matrix II desktop background 04:46:09 Recombinant Gene Splicing: The Definitive Guide 05/2006 04:46:34 when does Nanotech in a Nutshell come out? 04:47:01 01/2008 04:47:52 Creation of a Palestinian State in a Nutshell: 01/450003 04:48:00 ouch 04:48:45 US Emission Reduction: The Definitive Guide - no date yet announced 04:49:33 General Equality of Opportunity in a Nutshell: out of print 04:49:52 Flogging a dead-horse in a nutshell ..... 04:49:57 I'm calling it a day 04:51:00 damn overdesigned matrix web site killed my browser 04:51:32 hello everyone 04:51:41 hello j 04:51:56 wmf: is that a joke about nanotech in a nutshell? 04:52:13 jeremiah: what do you think? 04:52:17 WOO 04:52:18 @#%@#%2 04:52:22 it worked 04:52:23 it should be called nanotech in a... 04:52:23 huzzah 04:52:25 i can go home. 04:52:28 (something really damn small) 04:52:31 nanotech in a buckyball 04:52:34 (die novell die) 04:53:45 HTTP: The Definitive Guide - http://isbn.nu/1565925092 04:53:51 At least BN.com has that one. 04:57:08 hazmat (~chatzilla@adsl-66-123-57-58.dsl.lsan03.pacbell.net) has joined #swhack 04:57:20 who here is a bot? ;) 04:57:59 not bad, mostly human 04:58:02 hi folks 05:07:13 hazmat has quit (Remote closed the connection) 05:08:36 I'm mostly bot 05:09:06 heh, heh 05:10:13 GabeW (~gwachob@12-236-237-100.client.attbi.com) has joined #swhack 05:12:12 hazmat (~chatzilla@adsl-66-123-57-58.dsl.lsan03.pacbell.net) has joined #swhack 05:14:40 who's this monokrom fellow? 05:15:14 my name's brian 05:15:17 nice to meet u 05:16:14 and he's an SW hacker :-) 05:19:36 BenSw (~yoda@12-249-96-16.client.attbi.com) has joined #swhack 05:20:12 Bandersnatch Is Working!!!!!! 05:24:41 Hi Brian, nice to meet you. I'm the thing described by . 05:24:41 Cool, BenSw! 05:46:30 whoa! Rob Flickenger is in the hospital! 05:49:06 where did u read/hear that? 05:50:51 scripting.com 05:51:01 bummer :X 05:55:33 wmf has quit ("going to the store") 05:59:13 23 hours until W3C France 06:06:08 hello 06:06:34 howdy 06:06:46 I wish I could blog all my adventures 06:06:55 btw: made a test script and did some changes for the xmlrpc networking stuff 06:07:02 I think I'm moderately close to having it working 06:07:28 awesome 06:07:30 we're gonna have to do some work on ips and hosts 06:07:35 I finished up reading the chord spec 06:07:40 ah 06:07:44 and they actually talk about having an ip and a port in there 06:07:48 s/hosts/ports 06:08:03 in the node identifier that is 06:08:05 Yep. 06:08:18 I'm thinking something like 06:08:45 except I'd like to see if they are already using something now 06:09:17 what's wrong with ip:port? 06:09:46 are you saying you'd like to use the format that I said above 06:09:50 (use a capital 'N' though) 06:10:12 I mean, why the gunk? 06:10:18 how would you like to do it? 06:10:31 just ip + ':' + port 06:10:39 ok.. 06:10:42 well, sha512(ip + ':' + port) 06:10:43 and how would you handle node ids? 06:10:54 I don't think we're talking about the same thing here 06:10:57 oh, i thought we were talking about nodeids... 06:11:02 me too 06:11:22 node identifiers have to be 512 bits, right? 06:11:52 well, the network I've been building passes around type tags right now 06:11:56 i thought that is what we wanted 06:12:02 didn't know we wanted a hash of it 06:12:30 Oh, I see the confusion. 06:12:49 We're dealing with two things: 06:12:59 How we describe nodes to other nodes 06:13:25 (i.e. you can talk to him using Chord-over-HTTP 1.5 on port 8383 at IP X) 06:13:36 and the Chord ID for a node 06:13:43 ok 06:13:56 (i.e. the 512-bit number that's used for searching and stuff in the protocol like that) 06:14:05 yeah 06:14:48 well I agree that they should be separated so that if node '1' moves from one ip to another it doesn't make the whole network rearrange where it thinks data is 06:15:18 but I think passing the ip and port along with 'where' something is on the network, at least when we do communication over HTTP and over TCP/IP would make sense 06:15:30 which is why I advocate 06:16:35 well, they have to be separated because a SHA provides no information on how to talk to it 06:16:43 yeah 06:17:19 now the actual node ids 06:17:27 like the number they talk about in the cord docs 06:17:34 so 1 is the node id? 06:17:38 is that going to be a sha value? 06:17:42 yes 06:17:52 and you think that should be a sha hash of the ip and port? 06:18:07 i can't think of anything better 06:18:10 alright THAT answers a huge question I was wondering about 06:18:11 good 06:18:21 I was wondering 'where the hell are we going to come up with a central authority for these things' 06:18:28 Gotta run 06:18:29 good, now I have a better idea of how this works 06:18:30 Heh. 06:18:36 seems confusing 06:18:45 yeah 06:18:50 it's even worse if you use the actual number 06:18:55 yeah 06:19:08 sweet, so now I know what we're doing 06:19:12 (sigh... code rework) 06:19:17 not a huge one though 06:22:56 so should the xmlrpc nodes pass just the hash value or ? 06:23:11 neither of those will work 06:23:17 remember what we're using these for 06:23:18 oh yeah 06:23:24 wow my brain is fried 06:23:27 Heh. 06:23:31 how about 06:24:21 that'll work. I was (ip, port) as in an XML-RPC list... 06:24:33 oh yeah 06:24:43 alright, well, this work deserves to be done in the morning anyways 06:25:12 Heh. 06:25:17 I'm pretty tired 06:35:18 Galahad is now known as xena 06:41:10 Joe Clark: "CSS is nice. Tables are not so bad. And I am telling you right now the accessibility defects of tables are overblown or outright false." 06:41:46 in http://www.metafilter.com/mefi/15007#230973 06:43:07 On being challenged, Joe writes "I run Lynx every day of the week." 06:52:47 tansaku1a has quit (Read error: 110 (Connection timed out)) 07:03:10 .dns mysterylights.com 07:03:14 mysterylights.com - 80.94.192.48 07:12:38 * AaronSw goes to sleep 07:25:43 GabeW has quit (Read error: 104 (Connection reset by peer)) 07:25:52 GabeW (~gwachob@12-236-237-100.client.attbi.com) has joined #swhack 08:10:46 GabeW has quit ("Client Exiting") 09:09:03 monokrom has quit ("ChatZilla 0.8.4[Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)]") 09:35:12 dogcow (~amathews@166.70.45.198) has joined #swhack 09:52:50 the archiver proxy problem seems to only affect mandrake. My freebsd server here at home runs it without problems. 11:05:36 tansaku (~sam@n144-001.tokyu-net.catv.ne.jp) has joined #swhack 11:42:20 tansaku has quit (Read error: 110 (Connection timed out)) 11:42:36 tansaku (~sam@n146-077.tokyu-net.catv.ne.jp) has joined #swhack 13:34:49 tansaku has quit (Read error: 110 (Connection timed out)) 14:48:00 tansaku (~sam@n146-077.tokyu-net.catv.ne.jp) has joined #swhack 14:54:32 deltab has quit (carter.openprojects.net irc.openprojects.net) 14:54:33 * sbp kinda agrees with Joe Clark about tables 14:54:51 problems are mainly caused when they don't lineraize 14:54:58 deltab (deltab@mewtwo.espnow.com) has joined #swhack 14:55:22 but OTOH, for the sites on which they don't linearize, they often have bigger accessibility problems, like using one big GIF for the site 14:56:44 I'd love to have a million pages at WCAG-A more than I'd love to have a thousand at AAA 15:11:00 bijan (bparsia@login0.isis.unc.edu) has joined #swhack 15:34:31 Pff. FPIs are so silly 15:34:39 FPI? 15:35:14 Formal Public Identifiers 15:35:26 .google "Formal Public Identifier" 15:35:27 * bijan doesn't care and doesn't want to know. 15:35:28 "Formal Public Identifier": http://www.ucc.ie/cgi-bin/PUBLIC 15:37:04 neat: http://www.ucc.ie/cgi-bin/PUBLIC?-//IETF//DTD_HTML_3.0//EN 15:41:45 ooh, I had the same idea: http://web.archive.org/web/19990218185818/www.jtauber.com/standards/fpi-urn/delegate.html 15:42:20 FPIs are just stupid 15:43:39 [URI BNF doesn't allow slashes, so that's out] 15:47:16 cool! I can boycott FPIs! 15:47:36 the W3C validator accepts STSTEM doctype decs.:- 15:47:38 15:49:22 Hmm. Odd. 15:53:22 I'm getting superlong serach times for relatively simpel findall queries. 15:53:40 Although very fast otherones. 15:59:01 DanC: "It's not as if WGs hand design questions to the TAG, after all, is it? Our role is to measure designs against a minimally constraining architecture, I think, no?" 16:00:59 sbp, where did TBL say that he was thinking of cloning CWM to C or machine code? 16:01:35 www-archive, I think (but I'm not sbp) 16:01:46 You *aren't*? 16:01:51 * bijan revises world view. 16:02:56 Heh. 16:03:13 *Now* it all makes sense! 16:03:27 Er. actually it doesn't. 16:03:32 It makes much less sense. 16:03:45 Unifying you and sbp was a *simplifying* and *clarifying* assumption. 16:05:45 Oh, well, we're the same assuming access to a fast Internet connection. 16:06:38 Huh. 16:06:59 I seem to have added reasonable hacks for :a, <#>, etc. 16:07:35 Ooo, ok, that's a *nice* feature of rdf_db.pl 16:08:17 You can pop variables in for the prefix, localname, or both, or the qname 16:08:50 I should have realized that, but I've never used it before. 16:09:07 Hmm. requires some care, though. 16:09:50 Horks on literals. 16:10:23 Example: 16:10:26 ?- rdf(X:A,rdf:B,Z). 16:10:26 X = '' 16:10:26 A = 'http://musicbrainz.org/track/1a2764f2-3081-485f-b3d5-d1e64ca823b4' 16:10:26 B = type 16:10:27 Z = 'http://musicbrainz.org/mm/mm-2.0#Track' 16:11:23 CWM in C: http://lists.w3.org/Archives/Public/www-rdf-interest/2002Feb/0083 16:11:31 "(I need to clone it in C or machine code, but that's another matter)" 16:11:45 lol @ Unifying you and sbp was a *simplifying* and *clarifying* assumption. 16:12:18 * sbp is hacking about with XHTML Modularization again 16:12:33 it's quite easy as long as you don't bork the DTDs up 16:13:38 it's such a shame about the namespace prefix stuff 16:16:11 Hmm. I suspect I need to invalidate and rebuild the prefix cache... 16:18:35 Hmm. That note suggests that CWM internals are much cleaner now. 16:24:09 AaronSw has changed the topic to: Feel free to dial in from France! 16:24:17 AaronSw has changed the topic to: Feel free to dial in from France! 16:24:58 Off. 16:24:59 bijan has quit ("Leaving") 16:25:20 ooh: http://www.w3.org/2002/01/w3c-track.html 16:26:29 Whoa, XML Signature is a REC. I guess I should read it now... 16:26:55 Hm, I didn't know the W3C had a "Cool Web" activity. 16:27:24 w3c-track: cool 16:34:26 ooh, XHTML Basic seemed to be messed up - it keeps complaining that there's no ruby.qname 16:35:14 DanC, formalizations of the Web: Number one: The Larch. [click, click] The Larch. Number one: The Larch. 16:35:14 cf. http://www.w3.org/XML/9711theory/ 16:35:50 lol 16:36:27 Hmm... actually, it's a problem in Ruby 16:36:31 [based on [OLM] from sbp] 16:36:39 heh, heh 16:45:50 irby walks! 16:46:32 aww, we missed the "I'm a good boy" dance! 17:02:41 heh, heh: http://validator.w3.org/check?uri=http%3A%2F%2Finfomesh.net%2F2002%2Fm12n%2Ftest%2Fcomment-test.html&charset=%28detect+automatically%29&doctype=Inline 17:02:58 it took a while (nearly two years), but I have that damn comment attribute 17:03:12 which should actually be an element. Well, there you go 17:04:03 heh! 17:07:51 Ash has quit (Read error: 104 (Connection reset by peer)) 17:08:21 as an element: http://validator.w3.org/check?uri=http%3A%2F%2Finfomesh.net%2F2002%2Fm12n%2Ftest%2Fecomment-test.html&charset=%28detect+automatically%29&doctype=%28detect+automatically%29 17:08:40 once you have templates to work from, it's really quite easy 17:09:53 I wonder if I can fix XHTML to use