code logs -> 2009 -> Tue, 08 Dec 2009< code.20091207.log - code.20091209.log >
--- Log opened Tue Dec 08 00:00:19 2009
00:18 Derakon[work] [Derakon@Nightstar-d44d635e.ucsf.edu] has quit [[NS] Quit: Leaving]
00:38
< SmithKurosaki>
Abstract classes?
00:44
<@McMartin>
Abstract classes have some methods with no implementation.
00:44
<@McMartin>
They *must* be subclassed to work.
00:44
<@McMartin>
(And the subclasses need to either provide implementations for those methods, or be abstract themselves.)
00:44
< SmithKurosaki>
hrm
00:45
< SmithKurosaki>
Would it be say that they are placeholders?
00:46
< SmithKurosaki>
(I am studying for my exam now ;.;)
00:48 Derakon[AFK] is now known as Derakon
00:50
< gnolam>
Not really.
00:51
< SmithKurosaki>
gnar
00:52
<@Vornicus>
They are partial placeholders.
00:54
<@McMartin>
It's not uncommon for them to implement everything but one crucial method - then all the other operations are in terms of that.
00:54
<@McMartin>
So, you have a Stream class, which has dozens of methods, but the one that matters is "read a character", which is abstract.
00:54
<@McMartin>
Subclass twice; one that reads from a file, one that reads from a string, say; and all the other dozens of methods all work as-is.
00:55
< SmithKurosaki>
cool
01:01
< gnolam>
Just don't confuse them with Interfaces.
01:04 Thaqui [Thaqui@27B34E.D54D49.F53FA1.6A113C] has joined #code
01:06
< SmithKurosaki>
yea
01:07 Attilla [The.Attilla@FBC920.642D35.9A3E39.B3DA70] has quit [Connection reset by peer]
01:22
< gnolam>
(And how I wish C++ supported proper interfaces...)
01:25
<@McMartin>
Although it's not as bad, other programmers get mad at you when you use them as a pervasive replacement for lambdas.
01:25
<@McMartin>
-_-
01:39
<@Vornicus>
...garden noam chomsky.
01:40
<@Vornicus>
http://www.boingboing.net/2009/12/07/garden-noam-chomsky.html
02:17
< ToxicFrog>
McMartin: what, as in new Runnable() { ... }?
02:24 Finale [c0cb88fe@Nightstar-14e5d099.mibbit.com] has quit [[NS] Quit: http://www.mibbit.com ajax IRC Client]
02:42
<@McMartin>
TF: More severe overuse of the "Strategy" and "Template Method" patterns.
02:55
< gnolam>
Vornicus: Haha
03:16
< simon`>
SmithKurosaki, is your java adventure not done?
03:21
< SmithKurosaki>
Not really until thurs, no
03:33 Tarinaky [Tarinaky@Nightstar-af6393e8.adsl.virginmedia.net] has joined #code
03:37
< Rhamphoryncus>
Strategy pattern looks pretty silly in Python..
03:37
< Rhamphoryncus>
It's not Runnable. It's YetAnotherRunnable.
03:41
< Rhamphoryncus>
and Template Method pattern looks like a mixin
03:41 * Tarinaky grumbles for MSN is not working for some bizarre reason :/
03:41 * simon` 's impression is that the MSN IM network is breaking down.
03:54 gnolam [lenin@Nightstar-38637aa0.priv.bahnhof.se] has quit [[NS] Quit: Z?]
04:08
<@McMartin>
Rhamphoryncus: I seem to have learned architecture from LISP, despite having no real reason to have done so, since I learned LISP and friends pretty late on
04:08
<@McMartin>
But I'm big on passing in functions for parts of broader algorithms &c
04:08
< Rhamphoryncus>
Oh sure. That's just a callback function. The strategy pattern is a heap of boilerplate to emulate first-class functions
04:10
< simon`>
hadn't thought of it that way.
04:11
<@Vornicus>
<3 throwing functions around
04:11
< Rhamphoryncus>
'swhy python's threading.Thread is so ugly. Heaps of boilerplate when 95% of the time you just want to pass in a function that gets called from another thread
04:11
<@McMartin>
I've also been known to abuse closures, which Python goes out of its way to block.
04:11
< Rhamphoryncus>
throwing functions is good, except when a genexp is better ;)
04:21
< simon`>
McMartin, howso?
04:21
<@McMartin>
You can't assign to your upvalues the way you can in LISP or Scheme.
04:21
< simon`>
what can't python lambdas do that you'd expect?
04:29 Thaqui [Thaqui@27B34E.D54D49.F53FA1.6A113C] has quit [[NS] Quit: This computer has gone to sleep]
04:30
< Rhamphoryncus>
python3 has a nonlocal statement btw
04:31 Thaqui [Thaqui@27B34E.D54D49.F53FA1.6A113C] has joined #code
04:57 Syloqs-AFH [Syloq@NetworkAdministrator.Nightstar.Net] has quit [Ping timeout: 121 seconds]
04:59
<@McMartin>
Oh, state.
04:59
<@McMartin>
My Haskell implementation of this had run for over 1000 minutes, and then my C version of it ran in 0.3s.
04:59
<@Vornicus>
McM: what'cha doing?
05:00
<@McMartin>
That was Euler #135.
05:00
<@McMartin>
I'd done some Algebra to help myself along.
05:00
<@McMartin>
I might actually be able to turn the C back into Haskell again and be more efficient, maybe.
05:01
<@McMartin>
But yeah, this is one of those "have an array that you update randomly with cumulative results" things that makes Haskell cry.
05:02
<@Vornicus>
Ah so.
05:07
<@McMartin>
Looking at the forum for #135 and #136, I see a lot of people marked Haskell who started with "needed to switch to C for this one", so~
05:11<~Reiver> What was Haskell failing to do?
05:12
<@McMartin>
Have mutable arrays, basically~
05:13
<@McMartin>
The ability to have mutable arrays speeds the problem up by over 200,000x.
05:13
<@McMartin>
(as opposed to stateless functional maps)
05:13
<@McMartin>
(memory usage was fine!)
05:16<~Reiver> hm
05:17<~Reiver> Is mutable arrays a design flaw, or deliberate?
05:17<~Reiver> Other way of asking: Would this be a common drawback in a language?
05:17
<@Vornicus>
In a functional language it is practically necessary
05:19
< ToxicFrog>
Er
05:19
< ToxicFrog>
If it has mutable arrays, it's not functional
05:19
< ToxicFrog>
Or at least, not pure-functional
05:20
<@McMartin>
The problem in question required a specific solution technique that does not lend itself well to stateless implementation
05:20
<@McMartin>
Since it boiled down to "make a scatterplot, then read it".
05:21
<@McMartin>
That said, taking the C code and turning it back into Haskell gave me a result in 83 seconds.
05:21
<@McMartin>
That's quite a bit better than the 1000+ I had before, so some of those optimizations clearly counted.
05:22
<@McMartin>
It's still a far cry from the 300ms the C solution took, though.
05:24
<@McMartin>
(There are other problems Haskell is completely fantastic for, though, generally involving complicated recurrences)
05:24
<@McMartin>
(Being able to define a problem as two infinite lists that are defined in terms of one another and just read the answer off it is five kinds of awesome.)
05:29
< simon`>
hehe
06:05
<@McMartin>
Weasel decaffeination: SUCCESS
06:05
<@McMartin>
This does not have anything to do with kopi luwak.
06:06
<@Vornicus>
whut
06:06
<@McMartin>
One of the sections of my IF WIP is labeled "Decaffeinating the Weasels" and it involves some fairly tricky timing.
06:08
<@Vornicus>
You're working on FotH again? YAY
06:54 Syloqs-AFH [Syloq@NetworkAdministrator.Nightstar.Net] has joined #code
06:54 mode/#code [+o Syloqs-AFH] by Reiver
06:57 Derakon is now known as Derakon[AFK]
07:14 You're now known as TheWatcher
07:16
< Rhamphoryncus>
Reiver: the inability to efficiently handle certain algorithms without mutable state is a design feature of functional programming ;)
07:18
< Rhamphoryncus>
Similarly, languages without side-effect-free subsets are unable to handle certain other algorithms. However, those tend to be rarer
07:18
< Rhamphoryncus>
Or might rely on language extensions
07:21
<@Vornicus>
You can prove stuff about funcitonal code.
07:21
< Rhamphoryncus>
yeah, there's one
07:22
< Rhamphoryncus>
Not really an algorithm, but meh
07:22
< Rhamphoryncus>
And technically it's just easier with functional code
07:28 AnnoDomini [annodomini@Nightstar-360d7405.adsl.tpnet.pl] has joined #code
07:28 mode/#code [+o AnnoDomini] by Reiver
07:37 Namegduf [namegduf@Nightstar-7ec84b32.bath.ac.uk] has quit [Ping timeout: 121 seconds]
07:39 Namegduf [namegduf@Nightstar-7ec84b32.bath.ac.uk] has joined #code
08:15 You're now known as TheWatcher[afk]
08:57 Rhamphoryncus [rhamph@Nightstar-a62bd960.abhsia.telus.net] has quit [Client exited]
09:18 Tarinaky [Tarinaky@Nightstar-af6393e8.adsl.virginmedia.net] has quit [Ping timeout: 121 seconds]
09:25 Vornicus is now known as Vornicus-Latens
09:31 Tarinaky [Tarinaky@Nightstar-2873845d.adsl.virginmedia.net] has joined #code
09:50 Attilla [The.Attilla@FBC920.642D35.9A3E39.B3DA70] has joined #code
09:50 mode/#code [+o Attilla] by Reiver
09:54 Thaqui [Thaqui@27B34E.D54D49.F53FA1.6A113C] has quit [Client closed the connection]
09:56 You're now known as TheWatcher
10:41 Tarinaky [Tarinaky@Nightstar-2873845d.adsl.virginmedia.net] has quit [Ping timeout: 121 seconds]
10:55 Tarinaky [Tarinaky@Nightstar-70a43806.adsl.virginmedia.net] has joined #code
11:32 MyCatSchemes [mycatverbs@Nightstar-3b2c2db2.bethere.co.uk] has joined #code
12:20 Tarinaky [Tarinaky@Nightstar-70a43806.adsl.virginmedia.net] has quit [Operation timed out]
12:34 Tarinaky [Tarinaky@Nightstar-c9e76b68.adsl.virginmedia.net] has joined #code
13:14 gnolam [lenin@Nightstar-38637aa0.priv.bahnhof.se] has joined #code
13:59 Tarinaky [Tarinaky@Nightstar-c9e76b68.adsl.virginmedia.net] has quit [Client closed the connection]
14:15 Tarinaky [Tarinaky@Nightstar-97c81995.adsl.virginmedia.net] has joined #code
15:01 Tarinaky [Tarinaky@Nightstar-97c81995.adsl.virginmedia.net] has quit [Ping timeout: 121 seconds]
15:02 You're now known as TheWatcher[afk]
15:08 * gnolam stabs OpenOffice repeatedly.
15:08 * AnnoDomini has become gnolam's nakama due shared hatred!
15:16 Tarinaky [Tarinaky@Nightstar-e1ec7ec7.adsl.virginmedia.net] has joined #code
15:24 Tarinaky [Tarinaky@Nightstar-e1ec7ec7.adsl.virginmedia.net] has quit [Ping timeout: 121 seconds]
15:32 AbuDhabi [annodomini@Nightstar-6ea44333.adsl.tpnet.pl] has joined #code
15:34 AnnoDomini [annodomini@Nightstar-360d7405.adsl.tpnet.pl] has quit [Ping timeout: 121 seconds]
15:39 Tarinaky [Tarinaky@Nightstar-93d5ab1f.adsl.virginmedia.net] has joined #code
15:50 Tarinaky [Tarinaky@Nightstar-93d5ab1f.adsl.virginmedia.net] has quit [Ping timeout: 121 seconds]
16:04 Tarinaky [Tarinaky@Nightstar-9d2caf93.adsl.virginmedia.net] has joined #code
17:00 Rhamphoryncus [rhamph@Nightstar-a62bd960.abhsia.telus.net] has joined #code
17:13 Tarinaky [Tarinaky@Nightstar-9d2caf93.adsl.virginmedia.net] has quit [Ping timeout: 121 seconds]
17:27 Tarinaky [Tarinaky@Nightstar-e3228473.adsl.virginmedia.net] has joined #code
17:40 * ToxicFrog dips gnolam in LaTeX
17:42 Derakon[work] [Derakon@Nightstar-d44d635e.ucsf.edu] has joined #code
17:43 * Derakon[work] gets Python to crash with a bus error in two easy lines:
17:43
< Derakon[work]>
import OpenGL.GL as GL
17:43
< Derakon[work]>
GL.glGenTextures(1)
18:00
< Derakon[work]>
Hmm...in fact, every GL call I've tried causes a bus error.
18:06
< Derakon[work]>
imgType = img.dtype.type
18:06
< Derakon[work]>
if img.dtype.type in (N.float64, N.int32, N.uint32):
18:06
< Derakon[work]>
imgType = N.float32
18:06
< Derakon[work]>
elif img.dtype.type in (N.complex64, N.complex128): imgType = N.float32
18:06
< Derakon[work]>
Ladies and Gentlemen, I give you: Sebastian!
18:06
< Derakon[work]>
(Please, take him)
18:09
< ToxicFrog>
18:11
< AbuDhabi>
What am I looking at?
18:11
< Derakon[work]>
A redundant if statement.
18:11
< Derakon[work]>
It's followed by 12 lines of if/elsifs on img.dtype.type (that's right, imgType isn't used), where each conditional varies only in a single flag in a lengthy function invocation.
18:12
< Derakon[work]>
I replaced the conditionals with a map of image type to flag. Much simpler.
18:33 You're now known as TheWatcher
19:05 MyCatSchemes [mycatverbs@Nightstar-3b2c2db2.bethere.co.uk] has quit [[NS] Quit: B'bye.]
19:42 * Derakon[work] discovers, much to his relief, that the variable declared in this line is not used and thus he need not figure out what it does:
19:42
< Derakon[work]>
d = tuple(self.imageSizesList[i] / N.array((self.imagesList[i].shape))[::1]) + (1,)
19:47
<@TheWatcher>
... '::1'?
19:50
< Derakon[work]>
I think, but am not certain, that that's a null-op.
19:50
< Derakon[work]>
[::-1] is a quick way of saying "reverse the list".
19:51 * TheWatcher blinks
19:51
< Derakon[work]>
(The arguments are first, last, and step, with default values of 0, -1 (i.e. end of the list), and 1, respectively)
19:51
< Derakon[work]>
(So foo[2:7:2] == [foo[2], foo[4], foo[6]])
19:55
<@TheWatcher>
I see. Can't remember ever running into that operator before, but then... me and python...
19:55 * Derakon[work] eyes the function signature for load(), eyes the use cases in the codebase for load(), eliminates three arguments from it.
20:03 * ToxicFrog gets
20:03 * ToxicFrog gets LuaPilot interactive mode working!
20:05
< Derakon[work]>
Yay!
20:06
<@TheWatcher>
Woot
20:06
< ToxicFrog>
This is what I do instead of writing test suites, which is what I do instead of studying~
20:07
< Derakon[work]>
...argh, when drawing things, you do not name your rotation variable "alpha"!
20:07
< ToxicFrog>
But yes, you run it and main drops into interactive mode, with the other nodes running processes that read functions from the communications channel and call them as they come in.
20:07
< AbuDhabi>
Derakon[work]: Why not?
20:07
< ToxicFrog>
Because in graphics, "alpha" is transparency.
20:07
< AbuDhabi>
Because it's non-descriptive?
20:07
< AbuDhabi>
Oh.
20:08
< Derakon[work]>
You use "theta" or "phi".
20:09
< AbuDhabi>
Or, well "rotAngle"?
20:11
<@TheWatcher>
you're lucky he didn't just use 'a'
20:11
<@TheWatcher>
or 'aa'
20:12
< AbuDhabi>
Don't you just love global variables named x, xx and xxx?
20:13
<@TheWatcher>
Yes, they make me want to show my boundless love for the person who created them via abstract art created from their own still-living entrails
20:13
< Tarinaky>
For the Lab exercise we were doing pretty much everyone was doing just that.
20:14
< Derakon[work]>
TW: sadly, those were already in use.
20:14
< Tarinaky>
As far as I know I'm the only person who -didn't- and mine didn't work :/
20:14
<@TheWatcher>
;.;
20:14
< Derakon[work]>
Also "n" and "nn".
20:14
< Tarinaky>
aa for 'alpha a' :/
20:14
<@McMartin>
Honorable exceptions are permissible for loop variables.
20:14
< Derakon[work]>
McM: even then, I'd rather use "index".
20:14
<@McMartin>
But for proper old-school they should be FORTRAN 77 compliant.
20:14
< Derakon[work]>
Since "i" is not greppable.
20:14
< Namegduf>
That tends to result in really long lines.
20:14
< Derakon[work]>
Horrors.
20:14
<@McMartin>
for\s*( is, though.
20:15
< Derakon[work]>
Honestly, long lines are the least of my problems. I'd much rather have verbose code than cryptic code.
20:15 * McMartin likes to have the variable declaration and the variable name fit on the same line, which can be a problem in STL-based C++
20:15
< Derakon[work]>
And seeing as code tends towards the cryptic, I don't mind overcorrecting.
20:15
< Namegduf>
"i" is quite clear
20:16
<@McMartin>
"for (std::vector<std::string>::const_iterator i = detected_disks.begin(); ..."
20:16 * Namegduf is long sometimes, but goes for the short and clear when possible; and "i" is practically a standard.
20:16
< Derakon[work]>
I'm not nearly as militant about i as I am about n, I'll admit.
20:17
<@TheWatcher>
McM: that's why I'd use typedefs for that
20:17
< Derakon[work]>
It's not like I never use i. I just prefer an extra four characters when possible.
20:17
<@McMartin>
TheWatcher: I've had my own formative (read: scarring) experiences with STL and typedefs~
20:19
<@McMartin>
(using namespace std is probably the best way to clean that up. Hooray for requiring, but not then exploiting, namespaces.)
21:15
< Derakon[work]>
Question from a friend's flocked LJ post: is it possible to make shell/Perl scripts executable but not readable by the executor?
21:17
<@McMartin>
That sounds like a really simple "try it and see" kind of thing.
21:18
< Derakon[work]>
Yeah, he tried the obvious and it doesn't work.
21:18
<@McMartin>
My intuition is "probably not unless it's also setuid"
21:18
<@McMartin>
Or setgid.
21:19
<@McMartin>
I'm not sure what heppens if you drop privileges and Perl decides it needs to parse something else.
21:19
<@McMartin>
I imagine it does load the whole file into memory and just keep it there, though.
21:20
<@McMartin>
Which means you could have a sub main that starts with the privilege drop, and then call main last.
21:20
< Derakon[work]>
So a wrapper program that does setuid to a user that has read access to the scripts in question and executes them?
21:20
< Derakon[work]>
And the user has access to the wrapper program but not to the scripts.
21:20
< Derakon[work]>
(That is, the real user)
21:21
<@McMartin>
Well, I was thinking having the script itself have its setuid bit set and having it drop privileges as its first thing.
21:21
< Derakon[work]>
The problem is apparently contractors reading the script source and appropriating it for their own work.
21:21
< Derakon[work]>
So the goal isn't to restrict the scripts, but to restrict the users.
21:22
< Derakon[work]>
(Why they don't just fire the contractors and/or file copyright suits, I don't know...)
21:22
<@McMartin>
He shouldn't be writing in a scripting language, then.
21:22
<@McMartin>
Alternately, he could produce Obfuscated Perl.
21:22
< Namegduf>
Otherwise known as Perl.
21:22
<@McMartin>
No, Obfuscated Perl is much worse.
21:23
<@McMartin>
When *I* was a contractor, I had to sign confidentiality agreements.
21:23
< Derakon[work]>
Perl in its default state is readable but in an unstable equilibrium, ready to be tipped into unreadability. Obfuscated Perl in its default state takes unreadability to an art form.
21:24
<@McMartin>
And includes things like zipping the source, uuencoding it, and having the script itself be "eval(decode("binary blob"))."
21:24
<@McMartin>
Basically, I wouldn't trust file permissions for this.
21:25
<@McMartin>
Especially if it's doing text processing, because they could then pass it itself and perl would have access to the running script's source code regardless.
21:25
<@McMartin>
*Something* has to be able to read it, and if you can convince that thing to print it too, you fail.
21:26
<@McMartin>
He should compile and statically link it.
21:26
< Derakon[work]>
I'd guess that making it nontrivial to look at the source will be enough to deter casual "Oh, that looks useful; *yoink*" pirating, though.
21:26
<@McMartin>
Unless it's a trade secret, that's not anti-piracy, it's just being an asshole~
21:27
<@McMartin>
It also tells the contractor that you don't trust or respect them and they shouldn't respect you either.
21:27
<@McMartin>
If it *is* a trade secret, why the fuck are you outsourcing it
21:27
< Derakon[work]>
I rather suspect that interpersonal relations at that job are shot anyway.
21:28
<@McMartin>
And if it's *unrelated*, keeping people from learning good coding techniques is bad industry practice :colbert:
21:29
<@McMartin>
Alternately, he's actually doing something horrible like putting a private key or password into the script, in which case maybe he should use something with a proper key safe?
21:29
< Derakon[work]>
I have no idea what the scripts are or why they warrant protection.
21:29
<@McMartin>
Yeah
21:29
<@McMartin>
I'm saying that the fact that this problem exists in the first place is a sign of some other, more serious problem.
21:30
< Derakon[work]>
"we have a monitoring tool that runs a bunch of perl and shell scripts every so often. these run as a generic user that everyone and their dog can sudo into. the company keeps outsourcing work to contractors who lately have started taking code and SQL from these scripts and used them for their own work. my manager is angry that other people are getting paid for our work and has requested that i prevent the scripts from being readable"
21:30
< Derakon[work]>
"there are multiple ways to interpret that so let me be mroe precise. he doesn't want them obfuscated; he wants them to be literally unreadable."
21:31
<@McMartin>
Yeah, so, depending on size of code "stolen" either they should have a breach of confidentiality action against them or they aren't actually supposed to block it.
21:32
<@McMartin>
"Hey, using a merge sort in these circumstances is like a dozen times faster than qsort" is not theft.
21:32
<@McMartin>
Swiping internal code wholesale and selling it to other customers should obviously get you fired.
21:32
< Namegduf>
Perhaps they think a legal case is a lot harder, messier, and makes it harder to get contractors than technical restrictions.
21:33
<@McMartin>
Technical restrictions aren't enforcable by law, employment contracts are.
21:33
< Derakon[work]>
You don't really need a legal case here. Just the threat of legal action should suffice.
21:33
< Namegduf>
Technical restrictions *are* enforcement.
21:34 * Derakon[work] eyes this code, determines that the ability to rotate images is in fact never used as the rotation factor is always zero. Yay!
21:34
<@McMartin>
When they're broken, you then have no recourse.
21:34
<@McMartin>
And if they're half-assed, they will be broken.
21:34
<@McMartin>
That said, the obvious solution here is to not let everyone and their dog sudo into the script account, and have some kind of client-server app where the client sends structured requests and the server turns them into actual scripts.
21:34
< Namegduf>
This is true, unless you had recourse anyway, you were just preferring not to use it.
21:35
< Derakon[work]>
Namegduf: for example, suing people for pirating your game doesn't prevent you from coding registration schemes into it.
21:35
<@McMartin>
Now, if the manager is angry that his luscious pre-designed ticket report system is being used elsewhere because the contractors liked the information they picked out, my general reaction is that he can go hang anyway~
21:35
< Namegduf>
Derakon[work]: Right. And registration systems are a hell of a lot easier than trying to sue literally everyone.
21:36
<@McMartin>
"They're using SELECT name, date FROM tickets! That's totally ripping us off omg")
21:37
< Namegduf>
Yay, the Go coders fixed my bug.
21:37
< Namegduf>
Even though it's still marked WONTFIX.
21:37
< Namegduf>
RAM usage of Hello World now 1.2MB instead of 6MB.
21:37
<@McMartin>
The short form is, if you don't trust the contractors to honor their contact, don't hire them - if you must anyway, assume that anything they have access to will be appropriated and code/set permissions accordingly.
21:38
<@McMartin>
This probably means doing all communication with the script runner via a pipe of some kind.
21:39
<@McMartin>
And one that doesn't permit the evaluation of arbitrary shell or SQL.
21:39
< Namegduf>
Oooh.
21:39
< Namegduf>
Have you considered restricted sudo?
22:49
< gnolam>
Hee
22:49
< gnolam>
I read
22:49
< gnolam>
<McMartin> This probably means doing all communication with the script runner via a pipe of some kind.
22:49
< gnolam>
And immediately thought http://upload.wikimedia.org/wikipedia/en/f/f7/Office_speaking_tubes_1903.jpg
22:50
< gnolam>
"I say, old bean. Would you care to run the script through the difference engine?"
22:50
<@McMartin>
Hee
22:51
<@McMartin>
And if you hang a shingle from it, it becomes a named pipe!
22:51 * gnolam giggles.
23:35 You're now known as TheWatcher[T-2]
23:42 You're now known as TheWatcher[zZzZ]
23:43 Attilla [The.Attilla@FBC920.642D35.9A3E39.B3DA70] has quit [Client closed the connection]
--- Log closed Wed Dec 09 00:00:20 2009
code logs -> 2009 -> Tue, 08 Dec 2009< code.20091207.log - code.20091209.log >