code logs -> 2006 -> Sun, 24 Sep 2006< code.20060923.log - code.20060925.log >
--- Log opened Sun Sep 24 00:00:03 2006
00:10 * Chalain ponders inventing a language, or modifying and existing one, that lets you discard the notion of public/package/protected/private, and instead specify arbitrary access through custom interfaces.
00:11 * Chalain knows how he would want it to work; now he ponders how he would make it *look*.
00:11
<@Chalain>
Perhaps something like C#'s [directive] syntax.
00:12
<@Vornicus>
...in other words you want to give each calling class a different interface?
00:12
<@Chalain>
Um, sort of.
00:12
<@Chalain>
What I want is to specify different interfaces, and then declare which classes could access them.
00:12
<@Vornicus>
ah
00:13
<@Chalain>
I guess the notion of "public/protected/etc" would still probably be necessary, because you'd want to easily designate some interfaces to be accessible through existing, well-understood OO relationships (like parent-child)
00:13
<@Chalain>
class Cow
00:13
<@Chalain>
interfaces Cow, Calf, Bull, Farmer
00:13
<@Chalain>
[Farmer, Calf] def giveMilk() return myMilk end
00:13
<@Chalain>
[Bull] def makeCalf() return new Calf end
00:13
<@Chalain>
[Farmer] def makeCalf() throw IllegalInSeventeenStatesException unless Montana || NorthDakota end
00:14
<@Vornicus>
I think you'll find that in the end you'll end up with ... ... ...
00:14
<@Vornicus>
You make /everything/ daveland, don't you.
00:14
<@Chalain>
HEEEE
00:14
<@Chalain>
I broke you midsentence!
00:14
<@Vornicus>
Anyway what I was saying.
00:14 * Chalain draws another OMG on the side of his monitor.
00:15
<@Chalain>
Essentially what I'm aiming for here is a (hopefully convenient) way of specifying an ACL for an object.
00:15
<@Vornicus>
You'll probably end up in a lot of situations where you have to change what things your interface can talk to because you're adding a new class or using a different pattern.
00:15 * Chalain nods.
00:17
<@Vornicus>
So if I add MilkMaid or PumpingMachine or FrozenBullSperm, I have to change Cow, where in other languages I wouldn't have to.
00:17
<@Chalain>
Right now what I really wish I had was the standard OO ACL's, with the addition of a UnitTest level (automatically treats everything as public), and something similar to C++'s "friend" declaration (e.g. Bookkeeper and Accountant are both in com.resmarksystems.accounting, and they should share a lot of data with one another, but only with one another. AccountEntry is in the same package and should NOT share their degree of access.)
00:17
<@Chalain>
Oh
00:18
<@Chalain>
clarification.
00:18
<@Chalain>
well, maybe not.
00:18
<@Chalain>
Hmm
00:18
<@Chalain>
Okay, you've got me thinking. Drat.
00:18
<@Mahal>
hinking is always a problem.
00:18
<@Mahal>
*thinking
00:18
<@Chalain>
I was thinking that Cow, Calf, Bull and Farmer are interfaces, not objects.
00:18
<@Chalain>
hinking is a problem, too, especially if you're a deer.
00:19
<@Chalain>
("hinky" is a word I have only ever heard in the context of "be careful driving home, the mule deer are really hinky this week". It's equivalent to "crazy" and/or "skittish", but it specifically implies "likelihood of jumping out in front of your truck".)
00:20 * Chalain ponders a bit.
00:20
<@Chalain>
You know, I want Bookkeeper and Accountant to share a private interface between them because they're doing something special together.
00:20
<@Chalain>
I've been thinking I can't just make a public interface, because then somebody else might use it.
00:20
<@Chalain>
But I wonder now if I am in a state of sin for thinking this.
00:21
<@Vornicus>
Except that /you/ control the source code.
00:21
<@Chalain>
I should make the interface public, and document very clearly who's allowed to use it and why, then simply trust in those who come after me to not be bloodyminded fools.
00:21
<@Chalain>
Today, I do.
00:21
<@Chalain>
Tomorrow? Who knows.
00:21 * Vornicus points to the usual arguments about how trusting source-code object access controls are useless.
00:23
<@Chalain>
Here's an unusual Daveism for you, by the way: I consider me-tomorrow to be a different person than me-today. Michelle once commented on how I write "extremely readable" code, and I shrugged and said, "the poor sod who one day will have to figure out what we were doing today might end up being me."
00:23
<@Chalain>
I've been having epiphanies left and right lately. I really should blog about them.
00:23
<@Vornicus>
Yes, you should.
00:23
<@Vornicus>
And then the rest of us poor sods can beat you up for them.
00:24
<@Chalain>
heh.
00:24
<@Chalain>
The response to "use your head and stop using your head" post has been very helpful.
00:24
<@Chalain>
I realize know what it is that I like about Extreme Programming.
00:24
<@Vornicus>
I think part of the problem here is that you've /got/ both bookkeeper and accountant. Why /do/ you have both a bookkeeper and an accountant? If you're having to do special things, then maybe you should rethink your design.
00:25
<@Vornicus>
Extreme Programming is mainly a crapton of instruments.
00:25
<@Chalain>
It essentially says, "programming is wayyyy too hard for humans. Here's a box of crutches, use as many as you can. NOW GET UP ON YOUR CRUTCHES AND RUN."
00:25
<@Chalain>
Yes.
00:26
<@Vornicus>
anyway.
00:26
<@Chalain>
It's box half full of instruments, and half full of stupidly brilliant tricks.
00:26
<@Chalain>
More importantly, and here's another epiphany, it's full of a set of tricks and instruments that really work for ME at my level of proficiency.
00:26
<@Vornicus>
Perhaps you're better off hiding Accountant and Bookkeeper behind something else - a package wall, for instance, with a proxy - if you're afraid people will use it.
00:27
<@Chalain>
I've been pushing practices on Jeremy, for example, that he's just not ready for. I'm also asking him to take one of his strongest skills (thinking while coding) and stop using it. So I think I understand why he's been so resistant.
00:28
<@Chalain>
I need to boil this thinking down to a set of practices that I can insist upon "because it will be good for you one day" and another set of practices that I quit pushing people towards until they're ready to function at that level.
00:28
<@Chalain>
Acc & Bk are inside accounting, but yeah, I've considered that as well.
00:28
<@Vornicus>
Jeremy seems to work best in an environment where he's not beholden to anyone else - where his abilities are not being hampered by "best practices" that help the rest of the team but slow him to a crawl.
00:29 * Chalain nods.
00:29
<@Vornicus>
I can say this because I know him and - for a long time - I was like that too.
00:29
<@Chalain>
...and if him going fast actually produced working code, I'd get off his ass. *grumble* :-)
00:29
<@Vornicus>
This is true too.
00:29
<@Chalain>
But yeah.
00:30
<@Chalain>
I've been pushing him to work at a low-level while watching the end goal, and it's not working for him. I need to find ways to get out of his way and let him go full-out, but still keep him pointed in the right direction.
00:31
<@Chalain>
I haven't quite located the fundamental disconnect, but I have identified a great symptom of it: I think Crud is a long way from being done, and he thinks it's already finished except for a few little things.
00:32
<@Vornicus>
On the other hand, once I started thinking in terms of the big three of real programming - unit tests, refactoring, documentation - I started writing smaller things that did less but were actually useful to problems other than the one I was immediately working on.
00:32 * Chalain nods.
00:34
<@Vornicus>
And no, in a lot of situations I don't do tests/docs first - but that's partly because I'm doing math - I know the formula, I don't know places where a slightly different formula would fail.
00:34
<@Chalain>
When you learn to drive a race car, they teach you how to stay alive when the car goes out of control. You have to steer into the skid, *even if that means steering into the wall*. It's a reflex to be overcome. When I first teach people to unit test, I tell them, "your reflex will be to think you've cut your code up far too small to be useful. Trust me, and keep at it." ...and within a day or two I inevitably hear that feedback. "Holy crap!
00:34
<@Chalain>
Reuse!"
00:34 * Chalain nods.
00:34
<@Chalain>
Tell the truth, I still haven't gotten truly into the habit of TDD.
00:34
<@Chalain>
I *want* to.
00:34
<@Chalain>
My head understands how useful it would be.
00:35
<@Vornicus>
I think a lot of people who swear by it don't do it that way either.
00:36
<@Chalain>
But my gut and my hands also know that it's a megapain in the ass getting that first test to run, let alone pass, and that really hurts me. I haven't learned to take an idea and then just sit there with it for half an hour when I could have an initial bit of working code in 2 minutes.
00:36
<@Vornicus>
And there's other stuff too - remember that example about multiplication and unit tests?
00:36
<@Chalain>
...no?
00:36
<@Vornicus>
where you write a test that says 6 * 7 should be 42?
00:37
<@Vornicus>
--and then you go and you write def *; 42; end;?
00:37
<@Chalain>
Ahhh, okay, yeah. That's TDD step 2: "Get to green with as little work as possible".
00:38
<@Vornicus>
I think I'd hit your hand if you started writing that - I'm not done writing tests, because I know /exactly/ what TSTTCPW is, and I know that I've got more tests lined up /right now/ that that would fail.
00:38
<@Vornicus>
it's just that I haven't finished typing them yet. :)
00:38
<@Chalain>
That's a step most people skip after they've learned it, btw. TDD describes this as "you can gear TDD down to as small a step and you need to once you learn how. We're gearing down well below the stupidity level for now." Once you know you can gear down, you are allowed to gear up and go as fast as you can
00:39
<@Chalain>
However, I have actually done that in a real-world coding session.
00:39
<@Vornicus>
...shit, my pseudocode language has changed.
00:39
<@Chalain>
Heh.
00:39
<@Vornicus>
It was python, and now it's ruby.
00:39
<@Chalain>
It was about 2:30am and I was reciting the TDD steps like a mantra, because my brain was completely fried.
00:40
<@Chalain>
I will say this for that level of stupidity: you can just about code while dead.
00:40
<@Vornicus>
heh
00:41
<@Vornicus>
oh, by the way, if you've missed it, I made progress on euclid.rb - by starting to think in C.
00:42
<@Chalain>
Cool
00:42
<@Chalain>
Oh, hey, quick question for you.
00:42
<@Chalain>
When you multiply two matrices, M x N.
00:42
<@Chalain>
Which one is rows and which one is columns?
00:42
<@Chalain>
Is it = x || or || x = ?
00:43
<@Chalain>
Oh, in other news, the Ruby Cookbook was released 2 months ago, and I managed to completely not know this until today. Amazon is shipping me a copy now (and mailing Howard $1.66 in royalties).
00:44
<@Vornicus>
I could use a Ruby Cookbook.
00:44
<@Chalain>
Oh, in other, OTHER news, I installed apt on plain. (We really ought to set a real hostname for that box.)
00:45
<@Chalain>
I'd have gone on from there but I couldn't remember what package it was you needed to install. :-)
00:45
<@Vornicus>
heh
00:45
<@Vornicus>
I needed ldap auth.
00:45
<@Vornicus>
I had trouble installing apt some months ago - but now that I remember this was before I knew about up2date.
00:46
<@Chalain>
[root@plain ~]# apt-cache search ldap | wc -l
00:46
<@Chalain>
10
00:46
<@Vornicus>
ldap auth for apache
00:46
<@Chalain>
Mmm, it doesn't seem to have that. Bleh.
00:46
<@Chalain>
However, if you configure its package sources you can probably find it.
00:47
<@Chalain>
Failing all that, you could install the devtools on plain and build it.
00:47
<@Vornicus>
But the problem was that the RPM I had for apt required a newer version of openssl, and to install that I needed to update everything that depended on the newer openssl, and one of those required a new kernel.
00:47 * Chalain nods.
00:47 * Chalain advises against upgrading the kernel if at all possible.
00:47
<@Vornicus>
Which was /way/ farther out than I was willing to go without physical access to the machine in case I blew that.
00:47
<@Chalain>
(...unless you know exactly what you're doing. I certainly don't.)
00:48
<@Vornicus>
(I'd let apt or yum do it, but I ain't doing it by hand)
00:48
<@Chalain>
(...and I've watched Bookworm turn a perfectly good laptop into a fucking coaster by dicking around with my goddamn kernel settings.)
00:49
<@Chalain>
ANYWAY. I'm burning daylight that I should be spending migrating Brandon's data. (I'm at the office. Bleh.)
00:49
<@Vornicus>
http://unspeakablevorn.livejournal.com/6220.html
00:49
<@Vornicus>
first is i rows and k columns, second is k rows and j columns.
00:50 * Vornicus knew he did it once.
00:51
<@Chalain>
Okay, so it's rows x cols.
00:51
<@Chalain>
Cool. I can resume working on my 3D thingy for plua. :-)
00:51
<@Vornicus>
Which you can use to prove that Ruby's matrix implementation is done wrong.
00:51
<@Chalain>
AFTER the accounting work. Grr.
00:51
<@Chalain>
Heh
00:51
<@Chalain>
Oh, do they do cols x rows?
00:52
<@Vornicus>
(it does Vector * Matrix instead of Matrix * Vector)
00:52
<@Chalain>
Ah.
00:54
<@Chalain>
I'm a very visual thinker. Matrix math was a bitch for me until I could make word pictures out of it. For me, the word picture is "matrix multiplication: to find each element in the new array, take the dot product of M's row vector and N's column vector."
00:54 * Chalain ponders stealing Nick's Bawls.
00:55
<@Chalain>
/insert obligatory comment about making the obligatory comment about "Bawls" sounding dirty.
00:55
<@Vornicus>
heh
00:55
<@Chalain>
Anyway. Accounting for me. Talkatcha later.
00:56
<@Vornicus>
have fun.
01:25 ReivSLEP is now known as Reiver
02:14 * Chalain pokes Vornicus.
02:15
<@Chalain>
what's ruby for "if __FILE__==$0" ? ...or is that Ruby?
02:15
<@Chalain>
Heh. NM. Yes, it is ruby.
02:20
<@Vornicus>
It is Ruby.
02:20
<@Vornicus>
You've been writing it longer than I have, why are you looking at me?
02:25 Mahal is now known as MahalBook
02:47 Reiver is now known as ReivOut
02:49 Chalcy [~Chalceon@Nightstar-869.bitstream.orcon.net.nz] has joined #code
02:49 mode/#code [+o Chalcy] by ChanServ
02:50 Chalcedon [~Chalceon@Nightstar-869.bitstream.orcon.net.nz] has quit [Killed (NickServ (GHOST command used by Chalcy))]
02:50 Chalcy is now known as Chalcedon
03:02
<@Vornicus>
return nil if 0 == denominator <--- have I mentioned that I love if/unless expressions?
03:36 Chalcedon [~Chalceon@Nightstar-869.bitstream.orcon.net.nz] has quit [Ping Timeout]
03:45
<@Chalain>
heh
03:45 * Chalain pokes Vornicus.
03:46
<@Chalain>
So, I just checked the shinybit wiki, and it's getting raped by spambots. I need to know how to a) require an account to edit, and b) break the login page, like you did on the opra wiki.
03:48
<@Chalain>
...aaaand I just realized, I'm too tired to do it tonight. Would you remind me about this on Monday when you get in? Thanks.
03:58 Chalcedon [~Chalceon@Nightstar-869.bitstream.orcon.net.nz] has joined #code
03:58 mode/#code [+o Chalcedon] by ChanServ
04:01
<@Vornicus>
Yes I know how to do that.
04:01
<@Vornicus>
It's two lines in settings.php
04:01
<@Vornicus>
er
04:01
<@Vornicus>
LocalSettings.php
04:54 MahalBook is now known as Mahal
05:08 Mahal is now known as MahalOut
05:43 MahalOut is now known as Mahal
06:06 ReivOut is now known as Reiver
06:30 Reiver is now known as ReivNap
06:44
<@Vornicus>
yey, I finally got enough data to actually unit test the line intersection code properly.
06:51 ReivNap is now known as ReivOut
07:35 Chalcedon [~Chalceon@Nightstar-869.bitstream.orcon.net.nz] has quit [Ping Timeout]
08:54 Thaqui [~Thaqui@222.154.244.ns-3634] has joined #code
08:55
< Thaqui>
Hullo.
08:55
<@Vornicus>
yoh
08:55
< Thaqui>
Vorn!
08:55 * Thaqui lick.
08:56
<@Mahal>
Vornicus!
08:57
<@Vornicus>
Mahal!
08:58 * Vornicus applies stoatburgers to thaq.
08:58
< Thaqui>
o.o
08:58 * Thaqui unsqueaks Vorn.
09:06 * Mahal eyes
09:07 * Vornicus is Vorn the Unsqueakable.
09:13
< Thaqui>
So feel free to unsqueak him any time.
09:13 * Mahal will remember this...
09:32 Vornicus is now known as Vornicus-Latens
09:36 Chalcedon [~Chalceon@Nightstar-869.bitstream.orcon.net.nz] has joined #code
09:37 mode/#code [+o Chalcedon] by ChanServ
10:00 ReivOut is now known as Reiver
10:26 Chalcedon is now known as ChalcyTV
10:50 mode/#code [+vvv EvilDarkLord Syloq Thaqui] by Reiver
11:22 You're now known as TheWatcher
11:23 Ev3 [~Shemhazai@Nightstar-8502.ds1-ba.adsl.cybercity.dk] has joined #Code
11:26 ChalcyTV is now known as ChalcyZzz
11:27 Mahal is now known as MahalSleep
13:08 Shemhazai [~Shemhazai@Nightstar-8502.ds1-ba.adsl.cybercity.dk] has joined #Code
13:08 Ev3 [~Shemhazai@Nightstar-8502.ds1-ba.adsl.cybercity.dk] has quit [Connection reset by peer]
13:09 Shemhazai is now known as Ev3
14:09 Reiver is now known as ReivZzz
14:48 Chalcy [~Chalceon@Nightstar-869.bitstream.orcon.net.nz] has joined #code
14:48 mode/#code [+o Chalcy] by ChanServ
14:49 ChalcyZzz [~Chalceon@Nightstar-869.bitstream.orcon.net.nz] has quit [Ping Timeout]
14:49 Thaqui is now known as ThaquiSleep
14:57 ReivZzz is now known as ReivSlep
15:12 EvilDarkLord [althalas@Nightstar-17046.a80-186-184-83.elisa-laajakaista.fi] has quit [Ping Timeout]
15:23 EvilDarkLord [althalas@Nightstar-17046.a80-186-184-83.elisa-laajakaista.fi] has joined #code
15:57 Syloq [Syloq@NetAdmin.Nightstar.Net] has quit [Ping Timeout]
17:17 EvilDarkLord [althalas@Nightstar-17046.a80-186-184-83.elisa-laajakaista.fi] has quit [Ping Timeout]
17:25 You're now known as TheWatcher[afk]
17:28 EvilDarkLord [althalas@Nightstar-17046.a80-186-184-83.elisa-laajakaista.fi] has joined #code
18:23 ToxicFrog [~ToxicFrog@Admin.Nightstar.Net] has joined #code
18:23 mode/#code [+o ToxicFrog] by ChanServ
18:23 EvilDarkLord [althalas@Nightstar-17046.a80-186-184-83.elisa-laajakaista.fi] has quit [Ping Timeout]
18:33 EvilDarkLord [althalas@Nightstar-17046.a80-186-184-83.elisa-laajakaista.fi] has joined #code
18:44 You're now known as TheWatcher
19:39 Chalcy is now known as Chalcedon
20:38 MahalSleep is now known as Mahal
21:25 Syloq [Syloq@NetAdmin.Nightstar.Net] has joined #code
21:26 Syloq [Syloq@NetAdmin.Nightstar.Net] has quit [Quit: ]
22:03 Chalcedon is now known as ChalcyPhone
22:06 ChalcyPhone is now known as Chalcedon
22:15 Chalcedon is now known as ChalcyWorking
22:22 ThaquiSleep is now known as Thaqui
22:36 Syloq [Syloq@NetAdmin.Nightstar.Net] has joined #code
23:00 ChalcyWorking is now known as ChalcyUni
23:17 You're now known as TheWatcher[T-2]
23:20 You're now known as TheWatcher[zZzZ]
23:30 EvilDarkLord [althalas@Nightstar-17046.a80-186-184-83.elisa-laajakaista.fi] has quit [Ping Timeout]
23:42 Syloq is now known as Syloqs-AFH
23:43 EvilDarkLord [althalas@Nightstar-17046.a80-186-184-83.elisa-laajakaista.fi] has joined #code
23:49 ChalcyUni [~Chalceon@Nightstar-869.bitstream.orcon.net.nz] has quit [Ping Timeout]
23:51 Chalcedon [~Chalceon@Nightstar-869.bitstream.orcon.net.nz] has joined #code
23:51 mode/#code [+o Chalcedon] by ChanServ
--- Log closed Mon Sep 25 00:00:03 2006
code logs -> 2006 -> Sun, 24 Sep 2006< code.20060923.log - code.20060925.log >