code logs -> 2010 -> Fri, 23 Apr 2010< code.20100422.log - code.20100424.log >
--- Log opened Fri Apr 23 00:00:55 2010
00:02
<@Derakon>
Seeya, TW.
00:03 You're now known as TheWatcher[zZzZ]
00:04 Derakon [Derakon@Nightstar-1ffd02e6.ucsf.edu] has quit [[NS] Quit: Leaving]
00:44 * Orth appears, having slept in. Oops.
00:56 * Orth hunts Derakon or Vornicus, for he is attempting to make sense of Map.
00:56
< Orth>
Or TreeMap, specifically, because that one apparently autosorts.
01:19
<@McMartin>
It does indeed
01:19
<@McMartin>
What about it?
01:25
< Orth>
Trying to figure how to retool my program to go from ArrayLists to TreeMaps without destroying my brain in the process.
01:25
<@McMartin>
What's inside the ArrayList?
01:25
< Orth>
A set of objects that are more or less tuples of (reliability,cost)
01:26
< Orth>
I wish to use reliability as the key for the TreeMap.
01:27
<@McMartin>
Right, so that's a TreeMap<ReliabilityType, CostType>. ReliabilityType needs to implement Comparable. If it's, say, Integer, or String, you're covered
01:27
< Orth>
So in this specific case, it would be TreeMap<Double, Device>?
01:27
<@McMartin>
Right.
01:28
< Orth>
Aha
01:28
<@McMartin>
And instead of list.add(tuple) you do map.put(reliability, dev)
01:28
<@McMartin>
And to look up by reliability, that's map.get(reliability)
01:28
< Orth>
Aaaah
01:28
< Orth>
um, hm
01:28
< Orth>
Is there a way to iterate through the map?
01:28
<@McMartin>
The assumption here, though, is that there is exactly one device with any given reliability
01:29
<@McMartin>
map.entrySet() is an iterator over (key, value) tuples
01:29
< Orth>
Yeah, that -may- be a problem. I hope not, but I cannot gurantee it will not be the case.
01:29
< Orth>
This a showstopper?
01:29
<@McMartin>
Then you may need to use maps as the basis for multimaps.
01:29
<@McMartin>
Well, map.put() will replace the earlier device if so.
01:29
< Orth>
Uhoh.
01:30
<@McMartin>
This brings us to our next question
01:30
<@McMartin>
Why do you want to use a map here?
01:30 * Orth pauses. Decides to explain the issue in full rather than the specific reason he came up with for this solution.
01:31
< Orth>
OK, I have a list of values of (Reliability, cost). I want to be able to go through the list, and eliminate all those for whom there is a better reliability at lower or equal cost.
01:32
<@McMartin>
OK. Multimaps won't be necessary
01:32
<@McMartin>
But you'll have to be clever about constructing the map.
01:33
<@McMartin>
Basically, you'll want to only replace if the cost is lower, so at any given reliability there's a "best cost for this exact reliability".
01:33
< Orth>
If the list is sorted by reliability, this is wonderfully easy. If it is not, it is an n^2 operation to sort... which feels sort of wrong, if only the list could be sorted as I made it, y'know?
01:33
< Orth>
... that would work pretty good, actually!
01:33
<@McMartin>
In this case, the map will live alongside the list.
01:33
< Orth>
hm, howso?
01:34
<@McMartin>
The map won't have all the options the list has...
01:34
<@McMartin>
... but then, you're removing from the list anything that won't be in the map, so.
01:34
< Orth>
yeah, that was why I was wondering
01:34
<@McMartin>
So yeah, a map, but conditional replace
01:34
<@McMartin>
That said
01:34
< Orth>
This is a Dynamic Programming solution; I'm trying to cache the good results and scrap the crap ones anyway.
01:34
<@McMartin>
Even if it's sorted, you still have to check an average of n/2 elements to make sure
01:35
<@McMartin>
Otherwise you'll need some cache of "lowest cost of *anything* above X", and with doubles, that's hard to partition
01:35
< Orth>
Better than n^2~
01:35
<@McMartin>
Still n^2. Constant factor improvement.
01:35
<@McMartin>
Deciding "do I add this?" is still an O(n) operation either way
01:36
< Orth>
hm, ok
01:36
< Orth>
So, then, uh
01:36
<@McMartin>
Do you have a known range on reliabilities?
01:37
< Namegduf>
Earlier today, I saw a comment in a Python program.
01:37
< Orth>
Probably, but beyond 0.0-1.0 it'd take math to figure out.
01:37
< Namegduf>
/* O(n^2) */
01:37
< Namegduf>
Above a loop, with another loop inside.
01:37
< Namegduf>
Accurate, yes.
01:37
< Namegduf>
But the highest n was 6.
01:38
< Orth>
Hey, it's a fair point! Someone might want to increase it to 60 one day. :p
01:38
< Namegduf>
In its original context, dear god, I hope not
01:38
<@McMartin>
If that's a concern, the best way to comment it is: # TODO: replace with scalable algorithm if we need to scale
01:38
< Namegduf>
Oh, right, it was in JavaScript
01:38
< Namegduf>
But right.
01:39
< Namegduf>
Except it wasn't a concern and never would be.
01:39
<@McMartin>
Orth: I ask because if there's a sharply finite range like 0.0-1.0, you could split it up into, say, 10 buckets and keep a local best in each bucket
01:39
<@McMartin>
That would let you check at a glance if you even needed to iterate through the list
01:40
< Orth>
hm. Tempting, but I'll leave that as "An optimisation" for now
01:40
< Orth>
I will try to get the Map working at all, first.
01:40
< Orth>
So, uh, how does one iterate through the TreeMap with, eg, a for loop?
01:40
<@McMartin>
If the expectation is that most elements will not be filtered by this, you gain very little
01:40
<@McMartin>
You loop through its entrySet().
01:40
<@McMartin>
Which operates very much like a list, except you can't index it.
01:41
<@McMartin>
And it gives you Map.Entry<K, V> objects.
01:41
<@McMartin>
The thing is, I don't think you can start the iteration at arbitrary points
01:41
< Orth>
I used to use (int i = 0; i < foo.length(); i++) { foo.get(i); bar; }
01:41
<@McMartin>
So I don't think this buys you anything.
01:42
< Orth>
hm
01:42
<@McMartin>
Oh. You should have been using for (DeviceTuple dt : foo) { ... }
01:42
< Orth>
I tried that and it was giving me a buttload of errors
01:42
< Orth>
So I gave up on it entirely in the sake of Getting It Done.
01:42
<@McMartin>
What does javac --version say?
01:44
< Orth>
Windows cannot find javac (Presuming that was meant to go in Run or cmd)
01:44
<@McMartin>
OK, how are you compiling your programs in the first place
01:44
< Orth>
Eclipse~
01:44
<@McMartin>
OK, there should be some about window somewhere that says what version of Java you are using
01:46
<@McMartin>
In particular, if you are using Java 6, TreeMap has a method "tailMap" that actually does let you do the necessary iterations.
01:47
< Orth>
hrm
01:47
< Orth>
jre6
01:47
<@McMartin>
Right then
01:48
< Orth>
http://pastebin.starforge.co.uk/264 - the core code. The supporting classes: Device: http://pastebin.starforge.co.uk/265 Stack: http://pastebin.starforge.co.uk/266
01:48
<@McMartin>
You'll want to iterate over the values of the tailMap(keyToInsert), and only do the insert if there is some value in it (the values() method returns a Collection<V> you can iterate over) and its minimum is greater than your value to insert.
01:48
< Orth>
Also, my mistake: I will be storing <Reliability, Stack>, rather than Device
01:49
< Orth>
(Stacks are a class that stores the total results for a bunch of Devices piled in together.)
01:49
<@McMartin>
OK
01:49
<@McMartin>
Does Stack implement Comparable?
01:50
< Orth>
No, but it probably should.
01:50
< Orth>
Stack.price() returns an integer, if that helps.
01:51
<@McMartin>
It should implement Comparable<? extends Stack>, and then it should define
01:52
<@McMartin>
public int compareTo(Stack o) { return price() - o.price(); }
01:52
<@McMartin>
I think.
01:52
< Orth>
Returns 0 if identical?
01:53
<@McMartin>
x.compareTo(y) is less than zero if x < y, greater than zero if x > y, and 0 if identical.
01:53
< Orth>
Huh. Cool.
01:53
<@McMartin>
That's the contract for compareTo; the "<? extends Stack>" is so that if you subclass Stack, it's still meaningful to compare those subclasses to ordinary Stacks.
01:54
<@McMartin>
(It's also possible to write Comparator<T> classes for special-case comparisons like "case-insensitive string" or whatnot)
01:55
< Orth>
Odd. public class Stack extends Comparable <? extends Stack> gives me "The type Stack cannot extend or implement Comparable<? extends Stack>. A supertype may not specify any wildcard"
01:56 Derakon[AFK] is now known as Derakon
02:00 GeekSoldier_ [Rob@Nightstar-e86e3e0d.ip.cablemo.net] has quit [Ping timeout: 121 seconds]
02:01 GeekSoldier_ [Rob@Nightstar-e86e3e0d.ip.cablemo.net] has joined #code
02:01
<@Derakon>
Behold! GIANT SPACE COLLAGE (10%-normal-size version)! http://derakon.dyndns.org/~chriswei/temp/spacecollage2.png
02:05
<@McMartin>
Orth: in that case, it extends Comparable <Stack>
02:05
< Orth>
OK, just checking
02:11
< Orth>
gnnh
02:11
< Orth>
It demands I implement CompareTo(Object foo) instead of CompareTo(Stack foo)
02:12
< Orth>
But of course you can't call .cost() on a generic object, only a stack.
02:14
<@McMartin>
Well, you can downcast
02:14
<@McMartin>
However, Comparable<T> is supposed to let it be <T>
02:14
<@McMartin>
Are you sure you aren't in some sort of weird 1.4 compatibility mode or something?
02:15
< Orth>
I don't think so
02:15 * McMartin is looking at http://java.sun.com/javase/6/docs/api/java/lang/Comparable.html here.
02:15
< Orth>
oh wate nevermind~
02:15
< Orth>
Got it.
02:16
< Orth>
Stack is not stack you dumbass >.<
02:16
< Orth>
Funky error to throw for it, though.
02:16
<@Derakon>
Hee.
02:16
< Orth>
(Actually, even better: Stack is not sTack~)
02:16
<@Derakon>
I've given up on expecting compilers and interpreters to reliably give accurate error messages.
02:16
<@Derakon>
Generally, I just check the code around the location of the failure and look for things that look wrong.
02:16
< Orth>
OK so
02:17
< Orth>
Now that I have a comparable Stack
02:17
< Orth>
I get to refactor this code from ArrayList<Stack> to TreeMap<Double, Stack> correct?
02:17
<@McMartin>
Hmm. I guess?
02:17
<@McMartin>
Where's that Double coming from, again?
02:18
< Orth>
Reliability is a Double
02:29 * Orth does battle with errors, errors everywhere.
02:30
< Orth>
(Funny how radically changing types will do that~)
02:36
< Orth>
OK, going to duck out to grab a sandwich. BRB.
02:50 * Derakon eyes Preview, which is crashing reliably if I replace the image it's viewing while its back is turned.
02:50
<@Derakon>
I have to completely re-generate the image to fix the crash; otherwise it just keeps crashing on startup. Weird.
02:50
< Rhamphoryncus>
Derakon: have you seen some of the errors clang puts out?
02:50
<@Derakon>
What's clang?
02:50
< Rhamphoryncus>
llvm's C frontend
02:51
<@Derakon>
No, I haven't.
02:51
< Rhamphoryncus>
http://blog.llvm.org/2010/04/amazing-feats-of-clang-error-recovery.html
02:51 * Derakon looks up llvm.
02:54
<@Derakon>
Interesting, and a distinct improvement.
02:57 * Vornicus returns.
03:02
<@Derakon>
"C++ is a power tool that gives you plenty of rope to shoot yourself in the foot as well as mix your multi-paradigmed metaphors."
03:04 GeekSoldier_ is now known as GeekSoldier
03:05
< Orth>
That took longer than planned. *nroms*
03:14 Orth [orthianz@Nightstar-8865e808.xnet.co.nz] has quit [Client closed the connection]
03:16 * Derakon mutters at ImageMagick, which isn't floodfilling his borders for him.
03:16
<@Derakon>
convert -draw 'color 1,1 floodfill' -fill "#000000" 30dor_hst_big.jpg tmp.jpg
03:16
<@Derakon>
I can see it make a black pixel in the upper-left corner, but the white pixels around it remain stubbornly unchanged.
03:18 * Vornicus returns.
03:18
<@Derakon>
You just did that 21 minutes ago...
03:19 Orthia [orthianz@Nightstar-8865e808.xnet.co.nz] has joined #code
03:20
< Orthia>
Hm, so when adding stacks to the new set, I want... hm
03:34
< Orthia>
HA if(currentStackSet.get(newStack.reliability()) != null){}
03:44
<@Vornicus>
so I did.
03:51
< Orthia>
hum
03:52
< Orthia>
What do I do if I have two sets with the same reliability and same value?
03:53
< Orthia>
Does it matter which I keep?
03:53
<@Vornicus>
Keep the one with the fewest of the most recent set; I'm reasonably certain that's the only situation where it would matter.
03:53
<@Vornicus>
(because the one with fewer has more opportunities for improvement.
03:55
< Orthia>
whyso?
03:55
< Orthia>
It will not be touched again until we have another entirely different set.
03:56
< Orthia>
A3B2 vs A1B3, assuming they both had reliability .5 and cost 10, will both not be looked at again until I'm adding C.
04:09
<@Vornicus>
oh. well, in that case, then no, no need to distinguish.
04:10
< Orthia>
OK, just checking
04:11
< Orthia>
So how do I use this tailMap to iterate?
04:15
<@Vornicus>
I don't know, what's a tailMap?
04:18
< Orthia>
er.
04:18
< Orthia>
McMartin~
04:18
< Orthia>
http://java.sun.com/j2se/1.5.0/docs/api/java/util/TreeMap.html - I'm using this anyway
04:18
< Orthia>
I need to get it so I can iterate over the blasted thing now.
04:22
<@Vornicus>
my_map.keySet().iterator() gives you an iterator over the keys of the map.
04:29
< Orthia>
so... for(Stack foo : my_map.keySet().iterator()) { foo.dostuff } will do the trick?
04:32
<@Vornicus>
I don't remember if foreach requires an iterator or an iterable; if the latter, remove the .iterator() and you'll be good.
04:33
< Orthia>
OK
04:34
<@McMartin>
Iterable, I believe.
04:34
<@McMartin>
You can also use EntrySet() if you want just the entries, and values() for a Collection of the values.
04:34
< Orthia>
McM: OK, how do you use EntrySet?
04:35
<@McMartin>
EntrySet can be iterated like any other collection, and it returns a bunch of Map.Entry objects, which you should find described under java.util
04:35
<@McMartin>
Basically, pre-made pairs
04:36
<@McMartin>
Now, as I understand it, you really are carrying the key inside the values themselves, right?
04:36
<@McMartin>
So you could just iterate over values() instead.
04:36
< Orthia>
right
04:36
<@McMartin>
I think you'll still get them in order of key
04:36 celticminstrel [celticminstre@Nightstar-f8b608eb.cable.rogers.com] has left #code []
04:36
< Orthia>
That would be ideal yeah
04:36
<@McMartin>
Also, if you want to make sure that you're only looking at keys greater than or equal to X, you can instead iterate over foo.tailMap(X).values()
04:37
< Orthia>
Oh, is /that/ what you meant by that, ok
04:37
< Orthia>
Sorry, I'd misunderstood the usage there
04:37
<@McMartin>
Hm.
04:38
<@McMartin>
I guess the fact that you can do a short-circuit if you find a disqualifier means you shouldn't instead compute Collections.min(foo.tailMap(X).values())
04:38
<@McMartin>
And then see if the minimum's price (since price is the natural ordering on Stack now) is in fact less than or equal to the proposed Stack's price.
04:39
<@McMartin>
(Incidentally, notice how I'm building up all these operations on collections and nesting them ever deeper? That's how you can tell I think more in terms of functional programming)
04:42 Thaqui [Thaqui@27B34E.D54D49.F53FA1.6A113C] has quit [Connection reset by peer]
04:57 * Orthia likes functional programming, but avoids it in Java because Java is awful enough to begin with~
04:57
< Orthia>
McM: That function looks fascinating, but trying to implement it in my code is causing a headache.
04:57
< Orthia>
Maybe I should be sticking with the Simple If Stupid approach >_>
05:03
<@McMartin>
I assume the "that function" there is tailMap
05:03
<@McMartin>
min is pretty simple, it takes a collection and gives you the smallest element~
05:05 Thaqui [Thaqui@27B34E.D54D49.F53FA1.6A113C] has joined #code
05:06 * Orthia tries to think, mumbles
05:20 Alek [omegaboot@Nightstar-7ff8f4eb.il.comcast.net] has quit [[NS] Quit: ]
05:22 Alek [omegaboot@Nightstar-7ff8f4eb.il.comcast.net] has joined #code
05:36
< Orthia>
blarg
05:36
< Orthia>
for(Stack currentStack : oldStackSet.entrySet()) {
05:36
< Orthia>
Type mismatch: cannot convert from element type Map.Entry<Double,Stack> to Stack
05:36
< Orthia>
I have done something wrong, I presume. What I'm not sure of is how I did it wrong.
05:36
<@McMartin>
Yeah, if you want just the values, use values() instead of entrySet()
05:36
< Orthia>
aaah
05:37
<@McMartin>
If you want both but need the Stack right now, you need to call .getValue() on the Map.Entry (which has a similar getKey().)
05:37
< Orthia>
whoa, ConcurrentModificationException
05:37
<@McMartin>
You're not allowed to change a map while you're iterating through it.
05:38
< Orthia>
Oh. Er. That could be a problem then.
05:40
< Orthia>
http://pastebin.starforge.co.uk/267
05:41
<@McMartin>
Build up a separate list of Changes You're Going To Make on your way through.
05:42
< Orthia>
The problem is, I thought I /was/ doing that
05:42
< Orthia>
I had an oldStackSet (The old one I'm looking through) and a currentStackSet (The new one I'm building up)
05:42
< Orthia>
(The names could probably do with work but hey)
05:43
< Orthia>
I appear to have done something wrong somewhere?
05:43
<@McMartin>
If those are both based on entrySet or whatever they're actually secretly the same object
05:44
< Orthia>
... I hope not
05:44
< Orthia>
Oh. Eh. Hm.
05:44
<@McMartin>
tailMap, entrySet, values(), and keySet() all are "views" - they're backed by the same underlying map, so changes to one will affect all of them.
05:50
< Orthia>
wate, hm
05:50
< Orthia>
It's getting most of the way through the loop
05:50
< Orthia>
So whatever it is doing is not inherently bad.
05:51
<@McMartin>
My guess is that you're calling add at some point when a condition is true?
05:51
<@McMartin>
Or recycling iterators, that'd do it too
05:53
< Orthia>
Now hang on a second, um, hm.
05:53
< Orthia>
Early on: oldStackSet = currentStackSet;
05:54
< Orthia>
I don't think I am managing to clear currentStackSet to a totally new Map anywhere.
05:54
< Orthia>
So that'd mean it's erroring when I try to add to the new currentStackSet, but that's actually just a pointer to the same object as the oldStackSet I am iterating through?
05:56
< Orthia>
HA NO MORE ERROR
05:56
< Orthia>
OK, now for the cleaning function, and where the hell I put it, hooray~
05:56
< Orthia>
Prrrretty sure I want to clean up the currentStackSet before I pass it off to oldStackSet, yes?
05:57
< Orthia>
But after I've added everything to the list - and I can't do it before then because I won't yet know what the next value is.
06:07
< Orthia>
doh, this is not so good
06:07
< Orthia>
I iterate over oldStackSet to create currentStackSet; I then iterate over currentStackSet. Er. So I need to copy stuff that's valid over to newStackSet, yes?
06:09
<@McMartin>
Or remove invalid stuff with iterator.remove()
06:10
< Orthia>
Doesn't that break the Concurrent thingy?
06:11
<@McMartin>
Iterator.remove() is the only thing that doesn't.
06:12
< Orthia>
huh. Cool. OK.
06:12 AnnoDomini [annodomini@Nightstar-2e5d6563.adsl.tpnet.pl] has joined #code
06:12 mode/#code [+o AnnoDomini] by Reiver
06:14
< Orthia>
So. After the main construction loop, I have a for(Stack foo : tailMap(currentStackSet).values()) { } loop. How would I craft the .tailMap(foo).values() so I check foo vs foo.next(), and in a way where it won't break on the last item?
06:16
<@McMartin>
currentStackSet.tailMap(foo).values() is a collection; you want to iterate through that to see if there's anything in it that's cheaper than you. If there is, you can stop iterating and you know that foo can go away. If foo is *in* currentStackSet, you should probably make sure that it isn't foo
06:17
< Orthia>
Hm
06:18
< Orthia>
So I have a for loop within my for loop? I had hoped that if everything was sorted by reliability, you could just check if(foo cheaper than the next most reliable) keep foo; else remove foo; continue iterating.
06:19
< Orthia>
This may have been a logic flaw in my program, however?
06:19
< Orthia>
'cuz if everything is sorted by reliability, your goal is to end with everything being sorted by price, too.
06:25
< Orthia>
Is this flawed? Is this /possible/? It requires me to ask just for The Next Item In The List, rather than iterating through the whole thing.
06:27
<@McMartin>
Hmm
06:27
<@McMartin>
Are you starting with an empty list?
06:27
< Orthia>
No, but I could
06:27
< Orthia>
I have currentStackSet, which is the current set of Stacks. They are theoretically going to be iterated through in order of lowest reliability to highest.
06:28
<@McMartin>
Because if you're filling it up, then filtering it, you have no guarantee that the guy next to you isn't going to be eliminated even though there's one better five elements down.
06:28
< Orthia>
Well, I'm doing all this /after/ the list has been populated
06:30
< Orthia>
I'm taking the list and (hopefully) doing a quick houseclean on currentStackSet before passing it to oldStackSet, and resetting currentStackSet to be repopulated with the next set of items
06:30 * Orthia shall post it up so you can see where he's poking
06:42
< Orthia>
... Is http://pastebin.starforge.co.uk/268 visible?
06:43 Derakon is now known as Derakon[AFK]
06:48 Orthia [orthianz@Nightstar-8865e808.xnet.co.nz] has quit [[NS] Quit: BRB, resetting router]
06:49 Orthia [orthianz@Nightstar-5ba4dbb1.xnet.co.nz] has joined #code
06:54
< Orthia>
McMartin: http://pastebin.starforge.co.uk/268
06:57
< Orthia>
If it is going to do what I hope it does, all I need is a .nextInList() command and I'll be laughing.
06:57
< Orthia>
If it is not going to do that I am in trouble.
07:00 * Orthia also pokes Vornicus, is kind of worried about something in his code output, needs someone with Math to ensure his code is doing what he thinks it is.
07:03
<@Vornicus>
?
07:07
<@Vornicus>
What're you worried about?
07:08
<@McMartin>
I'm not fully sure what I'm looking at here, I'm afraid.
07:09
< Orthia>
oh, sorry
07:09
< Orthia>
McM: The highlighted line; is there any way to get a .nextItem() for the iterator?
07:09
< Orthia>
The equivalent of comparing the current item of Set[i] to Set[i+1]
07:10
< Orthia>
Vornicus: http://pastebin.starforge.co.uk/269
07:11
< Orthia>
Line 34 is supposed to be calculating the reliability for adding N items of reliability Y to a stack of items with reliability (already calculated) X.
07:13
<@Vornicus>
Orthia: the usual way to do this with an iterator is to store the /previous/ as you're walking through the iterator.
07:14
< Orthia>
... that could work. Ha!
07:15
< Orthia>
Also solves the "What about the last item" issue. Hmm.
07:15 * Orthia tries to figure out how you prime it.
07:17 Serah [Z@3A600C.A966FF.5BF32D.8E7ABA] has quit [Ping timeout: 121 seconds]
07:18
<@McMartin>
Orthia: I think you may be better off caching the previous item, tbh
07:18
<@McMartin>
With "null" for previous meaning "this was the start"
07:21
< Orthia>
And just an if statement to skip over that iteration?
07:23
< Orthia>
arg, concurrentModificationException
07:23
< Orthia>
Maybe it does not like me using remove() on an item I have already moved past?
07:25
< Orthia>
Stack prevStack = null;
07:25
< Orthia>
for(Stack stack : currentStackSet.values()) { if(prevStack != null) { //Checking for 'is this the start'
07:25
< Orthia>
if(prevStack.compareTo(stack) >= 0) { currentStackSet.remove(prevStack.key()); }
07:25
< Orthia>
} prevStack = stack; } }
07:25
< Orthia>
er
07:25
<@McMartin>
Oh, that's not how you remove
07:26
<@McMartin>
You have to remove from the iterator itself, probably with an exposed one
07:26
<@McMartin>
it takes no arguments; it means "me, the dude you just got from next()? Gone."
07:26
< Orthia>
Aaaah. OK. Er. So once I've found the one I want to remove...
07:29
< Orthia>
Does this still work if I swap the operators around?
07:29
< Orthia>
"If this thing is worse than the previous" instead of "If this thing is worse than the next one"?
07:54 * Orthia hates to be a nag, but sorta worried this is due in five hours >_>
08:01
< Orthia>
(I've been doing fairly well, then getting stuck on annoying logic errors~)
08:03
< Orthia>
Erk. "If the current one has a higher reliability" is not valid
08:04
< Orthia>
If I want to delete the current one, I need the key to be based on cost.
08:04
< Orthia>
So then I can go "If the cheaper one is more reliable..."
08:04
< Orthia>
damn, damn.
08:05
< Orthia>
wait, what's this CeilingEntry?
08:05
< Orthia>
Returns the key of the next item that's better?
08:06 Thaqui [Thaqui@27B34E.D54D49.F53FA1.6A113C] has quit [Connection closed]
08:24
< Orthia>
Good news: It mostly worked.
08:24
< Orthia>
Bad news: It revealed that I have some impressive bugs.
08:24
< Orthia>
For one, I'm taking 4 devices, and ending up with a list of /six/
08:24
< Orthia>
Which means it's doing something wrong somewhere, which is frankly baffling.
08:29
< Orthia>
AHA
08:29 * Orthia should have checked that ages ago. >_>
08:29
< Orthia>
No wonder the math is wrong, the loop isn't behaving as it's intended. It's adding one of each device to each stack then moving onto the next.
08:53
< Orthia>
aha
08:53
< Orthia>
McMartin, Vorn: If I am going Stack newStack = currentStack;
08:53
< Orthia>
And then I do things to newStack
08:53
< Orthia>
Is it going to be altering the values of currentStack at the same time?
08:54
< Orthia>
Or is it making a new copy of the item?
08:58
<@McMartin>
Pointer copy
08:58
<@McMartin>
After the = both variables refer to exactly the same object until currentStack is itself reassigned.
08:59
< Orthia>
OKay, that'd do it.
08:59
< Orthia>
Um.
08:59
< Orthia>
How do I fix this?
09:00
< Orthia>
I want a copy of currentStacks data in newStack, preferably without having to screw around with yet /more/ constructors everywhere
09:00
<@McMartin>
You really don't want to be making copies of your whole data set all the time if you can help it
09:00
<@McMartin>
Ideally you have some way of mutating it along the way
09:00
< Orthia>
Hrm
09:01
< Orthia>
But I want to hold currentStack as the current baseline Stack
09:01
< Orthia>
And then have newStack populating my one-dimensional array with Stacks with the extra item added.
09:02
< Orthia>
The idea being that I have two one dimensional arrays - the previous collection of valid component combinations for N items, and the new one, which is filling up with the valid combinations of N+1 items.
09:02
<@McMartin>
Mmm
09:03
<@McMartin>
That sounds to me like you're allocating one map for each i (so there are two live at this point)...
09:03
< Orthia>
correct.
09:03
< Orthia>
Well, sorta.
09:03
< Orthia>
I'm supposedly allocating one map for the latest two i
09:04
<@McMartin>
... but while that's going on the N+1 one should be set up so that it's adding things one at a time. For each candidate, you decide "do I add this?" and if no, then you continue
09:04
<@McMartin>
And if yes, you add it and possibly also have to annihilate anything both weaker and more expensive than it
09:04
<@McMartin>
Which could be a lot
09:04
< Orthia>
Yeah, so I do that later, once it's all populated.
09:05
< Orthia>
Thus giving me a collection of the 'best' options for N+1 items, which I then store and use as the baseline for coming up with the combinations of all the N+2 items.
09:05
<@McMartin>
Mmm
09:05
< Orthia>
This is what is /supposed/ to be happening, anyway.
09:05
<@McMartin>
I'm not off the top of my head convinced that a post-filter is wise
09:06
< Orthia>
A during-filter involved searching through the thing every time you added one
09:06
< Orthia>
I figured one pass at the end is a hell of a lot more efficient.
09:06
< Orthia>
(Also it was the way I was doing it by hand: "Figure out the combinations, cross off the ones that are no good, use the remaining as the baseline for the next row")
09:07
< Orthia>
So. Even if it's not technically ideal, is there a Stack newStack = copyOf(currentStack) command somewhere?
09:07
< Orthia>
Because newStack promptly gets altered, stored into a map, and then ignored until later.
09:08
<@McMartin>
Yes
09:08
<@McMartin>
You can say new TreeMap(anyOtherMap) and it does a copy
09:08
<@McMartin>
Or you can do it on the fly with, I believe, putAll(otherMap).
09:08
< Orthia>
Hrm
09:08
< Orthia>
But if I want to do that for Stack, I need to handcraft a constructor?
09:09
< Orthia>
(I'm copying constructors, not Maps at this point.)
09:09
< Orthia>
(The map interaction, AFAICT, is acting as intended. I'll find out soon~)
09:17 You're now known as TheWatcher
09:19
< Orthia>
... haha, java is unable to do it
09:19
< Orthia>
I shall have to handcraft a clone command for Stack. O.o
09:21 Thaqui [Thaqui@27B34E.D54D49.F53FA1.6A113C] has joined #code
09:22
< Orthia>
Haha
09:22
< Orthia>
fixed that, got an infinite loop~
09:25 AnnoDomini [annodomini@Nightstar-2e5d6563.adsl.tpnet.pl] has quit [Ping timeout: 121 seconds]
09:27 AnnoDomini [annodomini@Nightstar-8fe0558b.adsl.tpnet.pl] has joined #code
09:27 mode/#code [+o AnnoDomini] by Reiver
09:28 * Orthia sets it on fire.
09:29
< Orthia>
Why are you going Device 1: 1; Device 2: 2; Device 3: 3; instead of going Device 1: 1; Device 1: 2; etc?
09:44
< Orthia>
fffffffffffff
09:46
< Orthia>
My clone function did not work. Why the heck not?
09:47
< Orthia>
currentStack is still getting crap added to it!
09:48
<@Vornicus>
Sounds like you might have made a shallow copy.
09:48
< Orthia>
butbutbut
09:49
< Orthia>
but /how/
09:49
< Orthia>
OK, stabbity.
09:50
< Orthia>
http://pastebin.starforge.co.uk/271 is where I am trying to remove the chance of a shallow copy
09:51
< Orthia>
http://pastebin.starforge.co.uk/272 - and how I'm trying to create a deep copy. When you pass it a Stack as the constructor, it /manually copies over the variables/. Why is this not working?
09:53
< Orthia>
... wait, WAIT
09:53
< Orthia>
OK
09:53
< Orthia>
I am using Integer, Double, etc
09:54
< Orthia>
Don't tell me that Integer foo = bar; is coping the pointers for the integers as well
09:54
< Orthia>
Is there /any/ way to just get the raw number out? ;_;
09:57
<@TheWatcher>
My brain is far from actually awake yet, but tried using s.cost().clone() ?
09:57
<@TheWatcher>
etc
09:58
< Orthia>
Doesn't appear to exist.
09:58
< Orthia>
This is hilarious.
09:59
< Orthia>
In a 'shoot me now' kind of way, anyway...
10:00
<@TheWatcher>
Buh, Integet inherits clone() from Object though, what
10:00 * TheWatcher decides tea is needed
10:06 Alek [omegaboot@Nightstar-7ff8f4eb.il.comcast.net] has quit [Ping timeout: 121 seconds]
10:08
< Orthia>
Yeah, this is pretty crazeh
10:10 Alek [omegaboot@Nightstar-7ff8f4eb.il.comcast.net] has joined #code
10:12 Rhamphoryncus [rhamph@Nightstar-8931f88f.abhsia.telus.net] has quit [Client exited]
10:39
< Orthia>
Awesome, fencepost error
10:39
< Orthia>
This is a /good sign/
10:41
<@Vornicus>
Better than most
10:41 Vornicus is now known as Vornicus-Latens
10:51 Orthia [orthianz@Nightstar-5ba4dbb1.xnet.co.nz] has quit [Client closed the connection]
10:57 Orthia [orthianz@Nightstar-5ba4dbb1.xnet.co.nz] has joined #code
10:59
< Orthia>
Damnit.
10:59
< Orthia>
Now all I need is a for loop that acts as a do_while ;_;
10:59
< Orthia>
I cannot seed it. I cannot initialize it to 0 or null or anything. Failing to add anything at /all/ is just about as bad. Hmm...
11:00
< Orthia>
I just need something in the list for the first for loop to start populating everything /with/.
11:00
<@TheWatcher>
Java has do { .... } while(condition);
11:00
<@TheWatcher>
Or ar you meaning something else
11:02
< Orthia>
http://pastebin.starforge.co.uk/273 - yellow line down for a bit, till you see the second for loop.
11:04
<@TheWatcher>
line 54?
11:04
< Orthia>
right
11:07
< Orthia>
It's going down the rabbithole until the last loop, where it adds the first Device. Trouble is, this means it's adding Device 0. But the Stack tracks Devices by list position too - and they track each new one by going "Oh, new device? DeviceCount.add(n)"
11:07
< Orthia>
But the stack had already been given a Device 0, so everything gets thrown off by one, because the first thing it sees was a dummy.
11:09 * TheWatcher eyes, apologises but is unable to allocate the time to decypher just what that's doing, as he needs to finish off this entrant certificate generator code
11:09
< Orthia>
No problem.
11:10
< Orthia>
Mostly I just need my for loop to behave differently on the first, and only the first, iteration. This is Fun.
11:12
<@TheWatcher>
if(i == 0) in a few places? ¬¬
11:12
< Orthia>
... heh, um, hm
11:12
< Orthia>
... gods, that's an ugly, /ugly/ hack, but it would /work/
11:14
<@TheWatcher>
Make it work first, then make it work fast/clean/whatever.
11:28 * TheWatcher pulls his hair out at this
11:45
<@TheWatcher>
Why is GD::Image -> stringFT() dying with no error message, damnit?!
11:46
< Orthia>
nope, that didn't work.
11:46
< Orthia>
This is excitingly baffling.
11:47
< Orthia>
I mean, I'm /that close/
11:47
< Orthia>
I just need it to not count the first item added. Ha.
11:47
< Orthia>
And I can't even shift things to /do/ that.
11:47
< Orthia>
Which is the maddening bit.
12:06
< Orthia>
Wonderful.
12:06
< Orthia>
An hour before deadline, I have gone from "Fencepost error" to "Program will not run".
12:08 cpux is now known as shade_of_cpux
13:22 Thaqui [Thaqui@27B34E.D54D49.F53FA1.6A113C] has quit [Client closed the connection]
14:07 Orth [orthianz@Nightstar-2833f659.xnet.co.nz] has joined #code
14:08
<@ToxicFrog>
Orthia: that's what version control is for. (Please tell me you had it versioned so that didn't kill your project?)
14:10 Orthia [orthianz@Nightstar-5ba4dbb1.xnet.co.nz] has quit [Operation timed out]
14:37 Serah [Z@3A600C.A966FF.5BF32D.8E7ABA] has joined #code
14:44 celticminstrel [celticminstre@Nightstar-f8b608eb.cable.rogers.com] has joined #code
--- Log closed Fri Apr 23 15:10:04 2010
--- Log opened Fri Apr 23 15:17:29 2010
15:17 TheWatcher [chris@Nightstar-b4529b0c.zen.co.uk] has joined #code
15:17 Irssi: #code: Total of 22 nicks [7 ops, 0 halfops, 0 voices, 15 normal]
15:17 mode/#code [+o TheWatcher] by Reiver
15:18 Irssi: Join to #code was synced in 56 secs
15:32 RichardBarrell [mycatverbs@Nightstar-3b2c2db2.bethere.co.uk] has joined #code
15:38 Serah [Z@3A600C.A966FF.5BF32D.8E7ABA] has quit [Ping timeout: 121 seconds]
17:07 Orth [orthianz@Nightstar-2833f659.xnet.co.nz] has quit [Connection reset by peer]
17:21 Orthia [orthianz@Nightstar-2833f659.xnet.co.nz] has joined #code
17:28 Orthia [orthianz@Nightstar-2833f659.xnet.co.nz] has quit [Connection reset by peer]
17:34 Orthia [orthianz@Nightstar-2833f659.xnet.co.nz] has joined #code
17:40 Orthia [orthianz@Nightstar-2833f659.xnet.co.nz] has quit [Client closed the connection]
17:46 Orthia [orthianz@Nightstar-2833f659.xnet.co.nz] has joined #code
18:21 Orthia [orthianz@Nightstar-2833f659.xnet.co.nz] has quit [Client closed the connection]
18:27 Orthia [orthianz@Nightstar-2833f659.xnet.co.nz] has joined #code
18:31 Vornicus-Latens is now known as Vornicus
18:34 RichardB_ [mycatverbs@Nightstar-3b2c2db2.bethere.co.uk] has joined #code
18:35 RichardBarrell [mycatverbs@Nightstar-3b2c2db2.bethere.co.uk] has quit [Connection closed]
18:40 RichardB_ [mycatverbs@Nightstar-3b2c2db2.bethere.co.uk] has quit [Ping timeout: 121 seconds]
18:40 Orthia [orthianz@Nightstar-2833f659.xnet.co.nz] has quit [Client closed the connection]
18:47 Orthia [orthianz@Nightstar-2833f659.xnet.co.nz] has joined #code
19:12 Orthia [orthianz@Nightstar-2833f659.xnet.co.nz] has quit [Client closed the connection]
19:20 Orthia [orthianz@Nightstar-2833f659.xnet.co.nz] has joined #code
19:21 Rhamphoryncus [rhamph@Nightstar-8931f88f.abhsia.telus.net] has joined #code
19:31
<@jerith>
Aarghdammit!
19:31 * jerith stabbystabs Java in the Interfaces.
19:33
<@jerith>
I have a ResourceRepository interface.
19:34
< PinkFreud>
woah! watch whose interface you're aiming at, there.
19:34
<@jerith>
Some ResourcesRepositories are read-write and others are write-only. It's theoretically possible to have read-only repos as well.
19:35
<@jerith>
So I want three interfaces. One for the base common stuff, one for the read stuff and one for the write stuff.
19:36
<@jerith>
Except that makes it really hard to construct stuff and pass it around.
19:50
< celticminstrel>
Have the read and write inherit from the base one?
19:51
< celticminstrel>
Then read-writable ones would inherit both from the read interface and from the write interface.
19:51
< celticminstrel>
...well, implement not inherit from.
19:51
<@jerith>
Yeah.
19:51
<@jerith>
Except I have to pass them around by interface.
19:52
<@jerith>
And I construct them by reflection.
19:53
<@jerith>
So I'll have to cast them all over the place.
19:53
<@jerith>
And then deal with the cast exceptions.
19:54
<@jerith>
Because I'm pretty sure I can't see what interfaces something implements at runtim.
19:54
< celticminstrel>
Can't you?
19:54
< celticminstrel>
I would think you'd be able to.
19:56
<@jerith>
Ah, I can.
20:00
<@jerith>
I don't think that helps me at all, though.
20:02
<@jerith>
Hrm. Apparently interfaces can do multiple inheritance.
20:02
<@jerith>
At least, Eclipse isn't complaining when I do it.
20:02
< celticminstrel>
Yes, they can.
20:03
< celticminstrel>
I'm pretty sure.
20:03
< celticminstrel>
Since, after all, interfaces are Java's nerfed form of multiple inheritance, right?
20:03
<@jerith>
Maybe I should just add a ReadWrite interface that pulls in both.
20:03
< celticminstrel>
You could do that.
20:04
<@Vornicus>
Interfaces, because all they give is function signatures, can do MI - what it's trying to prevent here is conflicting implementations.
20:04 * jerith nods.
20:20
<@McMartin>
You can in fact do that
20:21
<@McMartin>
And instead of checking for cast exceptions, you can always use instanceof.
20:21
<@McMartin>
That said, you should be casting these things exactly once during main program setup and exposing a factory that generates the interface type thereafter
20:24
<@jerith>
McMartin: I'm not quite sure how to structure this.
20:25
<@jerith>
The config can /theoretically/ change at runtime, so I read it and construct the objects whenever they're required.
20:26
<@McMartin>
That sounds incredibly alarming from a state consistency standpoint
20:26
<@McMartin>
But maybe I'm missing the larger structure
20:26
<@jerith>
They don't keep state.
20:27
<@jerith>
The application is a file-store-in-the-sky.
20:27
<@McMartin>
You should always strive to keep the reflection-based code walled off into its own little corner of the app, of coure
20:27
<@jerith>
You can get, put and existance-check files in it.
20:28
<@jerith>
There are multiple backends for storage. Local filsystem, various cloud storage providers, etc.
20:28 Serah [Z@26ECB6.A4B64C.298B52.D80DA0] has joined #code
20:29
<@jerith>
The actual file storage backends are read/write.
20:29
<@jerith>
There are also a couple of "queue for processing later" backends, which are write-only.
20:29
<@McMartin>
Yeah, I would not want to rebuild the backend on every operation.
20:30
<@jerith>
Oh, wait. It isn't done on each operation.
20:31
<@jerith>
Only when I ask for a repository that it has not yet loaded.
20:32 * jerith hasn't looked at this code in several months.
20:47
< Alek>
"The next superhero movie should be called 'Root Man'. I even know the slogan - 'only root can do it'."
21:10 * jerith decides this isn't worth the pain, and doesn't make it less messy anyhow.
21:10 Zed [Zed@Nightstar-d7ade99d.or.comcast.net] has quit [Connection reset by peer]
21:10 Zed [Zed@Nightstar-d7ade99d.or.comcast.net] has joined #code
21:11
<@jerith>
It just moves the messiness around.
21:12 Serah [Z@26ECB6.A4B64C.298B52.D80DA0] has quit [Ping timeout: 121 seconds]
21:45 celticminstrel [celticminstre@Nightstar-f8b608eb.cable.rogers.com] has quit [[NS] Quit: *whistles* Did you hear something?]
21:46 celticminstrel [celticminstre@Nightstar-f8b608eb.cable.rogers.com] has joined #code
21:46 Zed_ [Zed@Nightstar-d7ade99d.or.comcast.net] has joined #code
21:47 Zed_ [Zed@Nightstar-d7ade99d.or.comcast.net] has quit [Client closed the connection]
21:47 Zed_ [Zed@Nightstar-d7ade99d.or.comcast.net] has joined #code
21:48 Zed [Zed@Nightstar-d7ade99d.or.comcast.net] has quit [Ping timeout: 121 seconds]
21:52 Serah [Z@2C3C9C.B2A300.F245DE.859909] has joined #code
22:07
< PinkFreud>
argh. openoffice is pissing me off.
22:08
< PinkFreud>
one would think that changing the format of cells would be easier than this. one would also be wrong, if one were to use openoffice.
22:09
< Namegduf>
One would think that... easier... openoffice.
22:09
< Namegduf>
I would not.
22:17
< PinkFreud>
heh
22:17
< Namegduf>
Seriously, I would pay for and run MS's stuff in a VM first.
22:17 * Vornicus agrees with namegduf.
22:17 * Vornicus eyes namegduf's name.
22:18
< PinkFreud>
I open a spreadsheet containing timestamps of the format MM/DD/YYYY HH:MM:SS
22:18
<@Vornicus>
Is it actually /intended/ to spell "fudgeman" backwards?
22:18
< Namegduf>
Yeah, I named myself after a food I like.
22:18
< Namegduf>
It was supposed to look like a valid name forwards, too.
22:18
<@Vornicus>
asweome
22:18
< PinkFreud>
oo tells me they're of standard text format. fair enough.
22:19
< PinkFreud>
I change the formatting of the cells to a timestamp format. oo says 'sure, but I'll insert a "'" in each cell to force them to text format first!'
22:19
< Namegduf>
Ah.
22:20
< PinkFreud>
If I delete the ' by hand, oo *finally* recognizes the cell as containing a valid timestamp.
22:20
< PinkFreud>
the problem is, I'm not going to do that for 500+ cells.
22:21
<@Vornicus>
uh...huh.
22:21
< PinkFreud>
yeah
22:21
< Namegduf>
Even for handling an MS spreadsheet, that's bad.
22:21
<@McMartin>
Re: Fudgeman: I completely failed to notice that ever. Well played.
22:21
< PinkFreud>
this should be a simple format change. nothing more.
22:22
<@Vornicus>
McM: I just noticed it right now.
22:22
< PinkFreud>
instead, I've been banging my head against this brick wall for three fucking hours.
22:22
< Namegduf>
Haha. Thanks. :P
22:23
< Namegduf>
PinkFreud: Can you export to CSV from the original format, and import?
22:23
< PinkFreud>
the original format *is* csv
22:23
< Namegduf>
Ah.
22:25
< PinkFreud>
now you see why this is so maddening
22:25
< Namegduf>
Yeah...
22:26
<@jerith>
PinkFreud: Copy the timestamps, clear the cells, change the format, paste them back?
22:27
< PinkFreud>
jerith: '
22:27
<@jerith>
So much for guile and cunning. :-/
22:27
< PinkFreud>
I have plenty of that.
22:27
< PinkFreud>
unfortunately, oo was apparently written by complete idiots.
22:28
< PinkFreud>
idiocy ALWAYS outdoes guile and cunning.
22:28
<@jerith>
No, you're confusing it with lame.
22:28
< PinkFreud>
I have that, too
22:28
< Namegduf>
OO was written by mad programmers
22:28
< Namegduf>
THat's my theory.
22:28
< Namegduf>
Who else would WANT to touch its codebase?
22:32
< PinkFreud>
heh
22:32
<@jerith>
So, you're all smart people.
22:33
<@jerith>
Can anyone tell me what I'm doign at the office at nearly midnight on a Friday?
22:33
< Namegduf>
"Your office has awesome flexible hours." and "You're an incredible geek."
22:34
<@jerith>
Except I stopped working about a page and a half up the scrollback.
22:34
< Namegduf>
I mean, I'm on IRC, but that's only because there's someone I want to talk with. Also, I'm not going away from this last enchilada until I'm hungry enough to eat it again. *delicious*
22:34
< Namegduf>
I should be fair, I'm on IRC other Friday's, too. :P
22:34
<@jerith>
I'll need to find a purveyor of supper on the way home.
22:35
<@jerith>
A vendor of fine (or maybe coarse) foodstuffs.
22:35
< PinkFreud>
jerith: it's 5:30 pm here, and I'm still at the office banging my head against a brick wall named openoffice.
22:36 Orthia [orthianz@Nightstar-2833f659.xnet.co.nz] has quit [Ping timeout: 121 seconds]
22:36
<@jerith>
PinkFreud: I stopped banging my head against Java a little after 10pm. :-)
22:37
< Namegduf>
I've concluded that all the Java I've written this year requires refactoring again to be maintainable due to each bit of work adding major new architectural requirements on the earlier, and is actually quite ugly as a consequence.
22:38
<@jerith>
Namegduf: That's what I'm running into here.
22:38
<@jerith>
The cleanest solution would be to treat my two different kinds of repos as two different kinds of repos completely and configure them separately.
22:39
< Namegduf>
I'm relatively lucky, I've got a solution you don't.
22:39
<@jerith>
I /could/ fake this to some extent.
22:39
< Namegduf>
"Sure, it's ugly, but it *looks good* enough to pass a brief marking, so I don't care any more, this is the last piece of work with it."
22:40
<@jerith>
This has been running in production with no major issues for nearly a year.
22:40
<@jerith>
There isn't a category for it in the bug tracker, because nobody's ever filed a bug for it.
22:40
<@jerith>
I count this as a major success.
22:40
< Namegduf>
That's nice.
22:40
< PinkFreud>
and now my boss has left for the weekend. considering he has a piece of data I needed this spreadsheet for...
22:41
< PinkFreud>
Thank you, openoffice, for being such a brain-dead piece of shit.
22:41 * jerith finds his shoes and prepares to pack up.
22:41 * jerith hugs PinkFreud, offers him VisiCalc.
22:41
< Namegduf>
See you.
22:43
< PinkFreud>
ok, since I've wasted this much time, now I just *have* to see if Office 2007 is just as brain dead.
22:46
< PinkFreud>
nope. it handles the cell conversion just fucking fine.
22:51 GeekSoldier_ [Rob@Nightstar-e86e3e0d.ip.cablemo.net] has joined #code
22:51 GeekSoldier [Rob@Nightstar-e86e3e0d.ip.cablemo.net] has quit [Client closed the connection]
23:17 EvilDarkLord [jjlehto3@Nightstar-f1ccbb45.hut.fi] has joined #code
23:37 shade_of_cpux is now known as cpux
23:39 Alek [omegaboot@Nightstar-7ff8f4eb.il.comcast.net] has quit [[NS] Quit: ]
23:41 Alek [omegaboot@Nightstar-7ff8f4eb.il.comcast.net] has joined #code
23:48 AnnoDomini [annodomini@Nightstar-8fe0558b.adsl.tpnet.pl] has quit [[NS] Quit: Enough.]
23:51 Derakon[AFK] is now known as Derakon
--- Log closed Sat Apr 24 00:00:17 2010
code logs -> 2010 -> Fri, 23 Apr 2010< code.20100422.log - code.20100424.log >