code logs -> 2013 -> Tue, 10 Dec 2013< code.20131209.log - code.20131211.log >
--- Log opened Tue Dec 10 00:00:44 2013
00:01
< McMartin>
If you're starting from total ground zero, I would recommend working through the "Writing With Inform" book (the "white pages" manual)
00:06
< logicmoo>
i am almost ground zero.. but I could write an inform7 interpreter quicker that probably learning it
00:06
< logicmoo>
than*
00:07
< logicmoo>
( gads that sounded too bold of me.. but I like converting Natlang to prolog ;P .. i have written a few muds that are programmed in NL)
00:08
< logicmoo>
but my current team wants to use soemting that already has wide acceptance
00:09
< logicmoo>
i7 is confusing to me still since i am still learning what is/inst a keyword
00:12
<@Tarinaky>
iirc Inform7 can have bits of Inform6 embedded in it. I forget whether this is because Inform7 is sub-turing or it's just a pain to express certain things.
00:13
< logicmoo>
ah.. oh yeah actualyl btw.. teh i6 miz-ins that is why i hadnt starting impl i7
00:14
< logicmoo>
i6 inlines is why i never started the i7 interpretor !
00:27
<@Tarinaky>
Dumb question. Is there an rc file that vim will look for that can be changed based on cwd?
00:28
<@Tarinaky>
So if I'm in a folder for a particular project it'll load an rc file with macros for running unittests or something.
00:28
<@Tarinaky>
Or failing that, based on the language of the file under edit.
00:29
< McMartin>
I7 is fully turing complete; it's just that it compiles via I6 code generation
00:29
< McMartin>
But the language itself is mostly Algol-descended with an unusual way of organizing functions.
00:30
< McMartin>
I7 has a decent set of list map/filter capabilities as of the latest release, even.
00:32
< McMartin>
A list of all the phrases it looks for is at http://inform7.com/learn/documents/I7_syntax.txt
00:33
< McMartin>
http://inform7.com/learn/learn/ also includes links to teaching resources.
00:34
< McMartin>
I don't know much about vim, I'm afraid
00:37
<@Tarinaky>
It /seems/ what I want is: autocmd filetype python map <F5> <ESC>:!python2 -m unittest discover<ENTER>
00:42 * McMartin prepares a weekly status report, opens with two links to The Codeless Code
00:46
<@Tarinaky>
Perplexing strings found in documentation: ":nunmap can also be used outside of a monastery."
00:46
<@Tarinaky>
As far as i can tell, it's a joke.
00:46
< McMartin>
Yup.
00:46
< McMartin>
n-unmap vs. nun-map.
00:48
<@Tarinaky>
There's a well-shared phrase about documentation and axe-murderers hunting its writers down.
00:48
<@Tarinaky>
I feel that this qualifies both for being a bad joke and for obsfucating the documentation :/
00:49 himi [fow035@Nightstar-q9amk4.ffp.csiro.au] has joined #code
00:49 mode/#code [+o himi] by ChanServ
00:49
<@Tarinaky>
But given the age of most POSIX utilities and their documentation it's probably someone dead I'm not allowed to bad-mouth...
00:49
<@Tarinaky>
Like Jesus...
00:51
<@Tarinaky>
At least vim is probably new-testament. If it were vi I'd be making jokes about Moses and Issac.
00:51
<@Tarinaky>
*Abraham
00:52
<@Tarinaky>
I'm thinking of Abraham... Issac was the son wasn't it...
00:52
< McMartin>
Isaac was the one as in The Binding Of, yes.
00:53
<@Tarinaky>
I meant as in the Bible.
00:54
<@Tarinaky>
You know, the best-selling fantasy novel after Harry Potter.
00:54
< McMartin>
Right
00:54
< McMartin>
The game "The Binding of Isaac" is a direct reference to the incident known as "The Binding of Isaac" in the Old Testament.
00:54
<@Tarinaky>
Ah.
00:54
<@Tarinaky>
I did not know that.
00:55
<@Tarinaky>
I have just realised that python -m unittest discover isn't... atually... discovering these unittests.
00:55
< McMartin>
http://en.wikipedia.org/wiki/Binding_of_Isaac
01:06
<&ToxicFrog>
logicmoo: welcome.
01:11
< logicmoo>
hi
01:11
< logicmoo>
(thank you)
01:18 * TheWatcher readswayup
01:26
<@TheWatcher>
I do note that there's nothing "quietly" about the crunches I've had to do. TPTB know exactly the level of work I've had to put in.
01:30 redwire [redwire@Nightstar-27dppb.nl.bellaliant.net] has quit [Connection closed]
01:32 redwire [redwire@Nightstar-27dppb.nl.bellaliant.net] has joined #code
01:40 You're now known as TheWatcher[T-2]
01:42 You're now known as TheWatcher[zZzZ]
02:24 Vorntastic [Vorn@Nightstar-f7rc29.sub-70-211-12.myvzw.com] has joined #code
03:10 Vorntastic [Vorn@Nightstar-f7rc29.sub-70-211-12.myvzw.com] has quit [Ping timeout: 121 seconds]
03:20 Vornicus [vorn@Nightstar-sn7kve.sd.cox.net] has joined #code
03:20 mode/#code [+qo Vornicus Vornicus] by ChanServ
03:24 Xon [Xon@Nightstar-q4s.ku7.252.119.IP] has quit [[NS] Quit: ]
03:29 redwire [redwire@Nightstar-27dppb.nl.bellaliant.net] has quit [[NS] Quit: Textual IRC Client: www.textualapp.com]
03:30 Xon [Xon@Nightstar-q4s.ku7.252.119.IP] has joined #code
03:36 VirusJTG [VirusJTG@Nightstar-6i5vf7.sta.comporium.net] has quit [[NS] Quit: Program Shutting down]
04:29 celticminstrel [celticminst@Nightstar-gj43l1.dsl.bell.ca] has quit [[NS] Quit: And lo! The computer falls into a deep sleep, to awake again some other day!]
04:30 * McMartin gets home from marathon debugging session
04:31
<@Azash>
What've you been debugging?
04:51 Kindamoody[zZz] is now known as Kindamoody
04:53
<&ToxicFrog>
Memo to self for tomorrow: override love.errhand() in main.lua to set a new xpcall() error handler for the mainloop. This can handle logging and then display an error screen that works better with a controller.
04:55
< Shiz>
[Memo noted.]
04:59 Harlow [Harlow@Nightstar-2dbe3d64.il.comcast.net] has joined #code
05:02 Stalker [Z@Nightstar-484uip.cust.comxnet.dk] has joined #code
05:03
< McMartin>
Azash: Trying to get a number of third-party libraries to play well together, mostly
05:03
<@Azash>
Ah, good luck
05:04 Turaiel is now known as Turaiel[Offline]
05:08 Derakon is now known as Derakon[AFK]
05:09
< Harlow>
Could someone make a recommendation of a good code theory book (pertaining to c++ practices if possible, or just mathematics and coding)
05:09
< Harlow>
>.>
05:12
<@Azash>
Uh, do you have a certain area of theory in mind?
05:12
<@Azash>
If you want to go deeper into C++, then Bruce Eckel's Thinking in C++ book
05:12
<@Azash>
For general algorithms and data structures, Cormen et al
05:22
< McMartin>
For a general tour of computation, Structure and Interpretation of Computer Programs
06:02
<@Alek>
http://www.smbc-comics.com/?id=3186#comic
06:06 ErikMesoy [Erik@Nightstar-3kot9q.80-203-17.nextgentel.com] has joined #code
06:08 Netsplit *.net <-> *.split quits: @Orthia, @Namegduf, Reiver, @himi, McMartin, ErikMesoy|sleep, logicmoo, ^Xires, jeroud, dmiles_afk, (+1 more, use /NETSPLIT to show all of them)
06:09 Netsplit over, joins: Reiver, @Orthia, McMartin, @himi, @Namegduf, AnnoDomini
06:09 McMartin [mcmartin@Nightstar-rpcdbf.sntcca.sbcglobal.net] has quit [Ping timeout: 121 seconds]
06:10 Netsplit over, joins: jeroud
06:11 dmiles_afk [dmiles@Nightstar-hdcn1r.or.comcast.net] has joined #code
06:12 ^Xires [xires@Nightstar-bir6q3.feedthetrolls.net] has joined #code
06:12
< Harlow>
Alex thanks for making me laugh, that was a good link
06:13
< Harlow>
Alek*
06:14 dmiles_akf [dmiles@Nightstar-hdcn1r.or.comcast.net] has joined #code
06:19 dmiles_afk [dmiles@Nightstar-hdcn1r.or.comcast.net] has quit [Connection closed]
06:19 dmiles_akf [dmiles@Nightstar-hdcn1r.or.comcast.net] has quit [Connection reset by peer]
06:19 McMartin [mcmartin@Nightstar-rpcdbf.sntcca.sbcglobal.net] has joined #code
06:19 mode/#code [+ao McMartin McMartin] by ChanServ
06:21 dmiles_afk [dmiles@Nightstar-hdcn1r.or.comcast.net] has joined #code
06:21 dmiles_akf [dmiles@Nightstar-hdcn1r.or.comcast.net] has joined #code
06:23 dmiles_afk [dmiles@Nightstar-hdcn1r.or.comcast.net] has quit [Connection closed]
06:23 dmiles_akf [dmiles@Nightstar-hdcn1r.or.comcast.net] has quit [Connection reset by peer]
06:24 dmiles_afk [dmiles@Nightstar-hdcn1r.or.comcast.net] has joined #code
06:25
< jeroud>
Tarinaky: py.test is <3.
06:25 dmiles_afk [dmiles@Nightstar-hdcn1r.or.comcast.net] has quit [Connection closed]
06:26
< jeroud>
Or their test finder/runner is, at least.
06:26 dmiles_afk [dmiles@Nightstar-hdcn1r.or.comcast.net] has joined #code
06:26
< jeroud>
The rest of their stuff has too much magic for my taste.
06:26 * Vornicus pokes vaguely at Twisted, trying to figure out what the hell he even wants.
06:27
< jeroud>
Vornicus: What are you trying to do?
06:28
<~Vornicus>
The goal is an IRC bot that serves a board game like Power Grid.
06:29
< jeroud>
Are you having trouble with the IRC bot bit or the game bit?
06:29
<~Vornicus>
The IRC bot bit.
06:30
<@Alek>
http://www.smbc-comics.com/comics/20130922after.gif
06:31
<&jerith>
Vornicus: https://github.com/praekelt/vumi/blob/develop/vumi/transports/irc/irc.py might be helpful to look at.
06:31
<~Vornicus>
Well, the game bit also depends a lot on how to build the beginnings of the IRC bot; I need to build it so the IRC bot knows what state the game is in and thus what, um, inputs it accepts.
06:33
<&jerith>
Vornicus: Rather build two separate things.
06:33
<~Vornicus>
Of course.
06:33
<~Vornicus>
But then -- well, for power grid -- if you try to buy a city when, for instance, it's not your turn, or it is your turn but you're in the plant bidding phase, or
06:34
<&jerith>
https://github.com/praekelt/vumi/blob/develop/vumi/demos/tictactoe.py is a tic-tac-toe game that runs over USSD.
06:35
<&jerith>
Vastly less complicated, but it's the kind of design I'd use.
06:37
<~Vornicus>
damn. my hero
06:38
<&jerith>
There might be more useful things in the demos directory there.
06:39
<&jerith>
I wrote rock-paper-scissors because the round-trip time for each player's turn in tic-tac-toe was causing too many USSD timeouts.
06:39
<&jerith>
RPS has both players take their turn simultaneously.
06:44
<@Alek>
http://www.smbc-comics.com/?id=3080#comic
06:45 RichyB [RichyB@Nightstar-c6u.vd5.170.83.IP] has quit [[NS] Quit: Gone.]
06:48 RichyB [RichyB@Nightstar-c6u.vd5.170.83.IP] has joined #code
06:54 himi [fow035@Nightstar-q9amk4.ffp.csiro.au] has quit [Ping timeout: 121 seconds]
06:57
< Syka>
jerith: ugh, USSD
06:57
< Syka>
jerith: I have no idea why smartphones don't handle USSD better
06:57
< Syka>
Android handles it with a popup box :(
06:58
< Syka>
or is that MMI
06:58
< Syka>
...regardless, it's all pretty shit
06:58
<&jerith>
Syka: USSD is kind of supposed to be a modal overlay thing.
06:59
<&jerith>
But I suspect it's because USSD isn't used very much at all in the kind of markets smartphones target.
06:59
< Syka>
yeah
06:59
< Syka>
I have to use that for recharging my phone
06:59
<&jerith>
(Which is high income groups in US and EU.)
06:59
< Syka>
"misunderstood input LOL" is common :(
07:00
< Syka>
it also is slightly too long for the keyboard
07:00
<&jerith>
I think that's the service you're hitting, though.
07:00
<&jerith>
Because I've never seen that/
07:00
< Syka>
so like, to enter text, i have to close the keyboard, click on the text input (which isnt automatically highlighted), then enter ti
07:01
< Syka>
yeah it is USSD
07:07
<@Alek>
var you = new Child({papa:papa_id, mama: mama_id});
07:15 * Alek laughs muchly.
07:17
<@Alek>
Guy at a factory. So-called "Rationalizator". Takes a puck of barium titanate ceramic, which needs to be cut. Instead, he decides to split it with a sledgehammer and chisel.
07:17
<&jerith>
We're working on a project called MAMA.
07:17
<&jerith>
http://www.askmama.co.za/
07:17 * Alek thumbs up.
07:21
< Harlow>
Nice
07:26
<@Alek>
what, nobody gets mine? >_>
08:22 Kindamoody is now known as Kindamoody|out
08:31 * Vornicus tries to figure out what the model looks like...
08:31
<@Alek>
heh.
08:31
<&McMartin>
1.6 seconds for the Scheme Klotski solver
08:32
<&McMartin>
That is now the fastest solver I have
08:32
<@Alek>
there's one webstore I occasionally "buy" something from. now, most webforms allow you to save your username and password, or just the username, or none.
08:32
<@Alek>
this one? lets you save just the password. asterisked, of course. the username you have to re-enter every time you check out.
08:33
<@Alek>
but the password is already filled out.
08:37
<~Vornicus>
weirdass
08:59 Harlow [Harlow@Nightstar-2dbe3d64.il.comcast.net] has quit [[NS] Quit: BED]
09:08 Orthia [orthianz@Nightstar-avg.1ee.224.119.IP] has quit [Ping timeout: 121 seconds]
09:11 Orthia [orthianz@Nightstar-avg.1ee.224.119.IP] has joined #code
09:12 mode/#code [+o Orthia] by ChanServ
09:27 You're now known as TheWatcher
09:39 AverageJoe [evil1@Nightstar-fb1kt4.ph.cox.net] has joined #code
09:42 himi [fow035@Nightstar-v37cpe.internode.on.net] has joined #code
09:42 mode/#code [+o himi] by ChanServ
09:57 AverageJoe [evil1@Nightstar-fb1kt4.ph.cox.net] has quit [[NS] Quit: Leaving]
11:02 * TheWatcher sighs at students
11:03
<@Tarinaky>
public static methods all over a single God class?
11:04
<@TheWatcher>
No, this is C.
11:04
<@Tarinaky>
Terribad pointer semantics?
11:04
<@Tarinaky>
Returning pointers to objects on the stack up the stack?
11:05
<@Tarinaky>
Single God procedure representing an FSM controlled by switch statement?
11:05
<@TheWatcher>
I tell them, right at the beginning, that 25% of the marks go on commenting, layout, and readability. There are documents where I cover the practices they should be following.
11:06
<@TheWatcher>
I give them warnings, I go into detail about the things they did right and wrong, I explain it over again.
11:07
<@Tarinaky>
"You can lead a horse to wisdom but you can't make it think"
11:09
<@Tarinaky>
I dunno. Maybe Python is a good choice of language for teaching code layout.
11:09
<@Tarinaky>
In the same way that Java makes it impossible to do pointers 'wrong'.
11:09
<@Tarinaky>
(*'impossible')
11:10
<@TheWatcher>
It's not just layout. It's documentation
11:10
<@Tarinaky>
Documentation is hard. Layout, at least, is inexcusable.
11:10
<@TheWatcher>
Layout is generally not to bad, aside from one of the students who takes the blunderbuss approach to indentation
11:11
<@TheWatcher>
*too
11:11
<@Tarinaky>
Heh.
11:11
<@Tarinaky>
I'm terrible about documentation :/
11:11
<@TheWatcher>
Whereas I'm psychotic~
11:11
<@Tarinaky>
Particularly when I don't have a plan/am hacking.
11:11
<@Tarinaky>
I'm better about it when I have a design.
11:12
<@TheWatcher>
Which I guess is one thing, but /clean it up and document it/ before submitting it for marking.
11:13 * TheWatcher eyes this student, gets The Globals Twitch under his left eye
11:13
<@Tarinaky>
Globals are just mis-understood.
11:14
<@TheWatcher>
In this case "Oh, these two functions use a temporary pointer with the same type? I'll just make a single global!"
11:15
<~Vornicus>
:(
11:28
<@Tarinaky>
I can honestly say that, having completed the Agile Methodologies series of lectures this semester...
11:28
<@Tarinaky>
I am not a fan of XP :/
11:33 Vornotron [vorn@Nightstar-sn7kve.sd.cox.net] has joined #code
11:34
< Syka>
what is XP again
11:34
< Syka>
pair programming and sprints and shit?
11:34
< RichyB>
Syka, the Windows edition, or "eXtreme Programming"?
11:34
< Syka>
the one that was just mentioned by Tarinaky
11:34
< RichyB>
Yeah, but XP is a specific thing. You're supposed to do sprints, pairs, TDD, ‚¶
11:34
< Syka>
I know what the Windows edition is ;D
11:34
< RichyB>
A few other things that I forget.
11:34
< Syka>
TDD isn't so bad
11:34
< Syka>
I can't do it, though
11:35
<@TheWatcher>
Whoa, deja-vu.
11:35
< Syka>
I can't write tests first, since I have no idea what my code is going to do
11:35
< Syka>
because I don't plan anything :D
11:35
< RichyB>
I write tests-first sometimes.
11:35
< Syka>
tests after writing is flawed though
11:35
< RichyB>
Given a really good brief, it's quite nice.
11:35
< Syka>
because then you're testing the behaviour of your implementation
11:36
< Syka>
not the behaviour of the abstract class which just so happens to be your implementation
11:36
< RichyB>
Eh. Tests after writing isn't inevitably doomed if you make sure that you break your implementation on purpose and verify that the tests no longer pass.
11:36
< Syka>
I just don't have any projects with clearly defined in-out
11:36
< Syka>
because I write webapps, which end up being giant classes that do shitloads of things
11:37 Vornicus [vorn@Nightstar-sn7kve.sd.cox.net] has quit [Ping timeout: 121 seconds]
11:37
<@TheWatcher>
It is possible to test them.
11:38
< Syka>
it is, but then you're not testing a class, so much as your app
11:38
< Syka>
which is sort of hard to do
11:38
<@TheWatcher>
I do note that the barrier to doing so is pretty high, as they usually require a shitton more environment than normal
11:38
< Syka>
and yes
11:38
< Syka>
I am coming into that right now
11:38
< Syka>
testing twisted.web is a fucking bitch
11:38
< Syka>
I have a half-written implementation of a mock Request :/
11:39
< Syka>
literally 200 lines of environment
11:43
< Vornotron>
pair programming is awesome.
11:44
< Vornotron>
Occasionally I'll pair program with Vash, and she knows nothing at all about code, and it is amazing how much better my code comes out when I do that.
11:46
<@TheWatcher>
https://twitter.com/mikedoel/status/271314113177735170
11:46
<@TheWatcher>
That's how to do it properly~
11:46
<@Tarinaky>
TDD and XP are two different things, surely?
11:46 * Tarinaky is distracted by lecture.
11:47
< Vornotron>
tdd is something that shows up as part of XP
11:51 * TheWatcher eyes
11:51
<@TheWatcher>
... what do some of these students have against the space bar?
11:51
<@TheWatcher>
HAs someone convinced them that touching it causes some embarrassing skin disease or something?
11:52
< Vornotron>
I occasionally find myself not spacing more tightly bound operators.
11:53
<@TheWatcher>
`if((new_element=malloc(sizeof(struct node)))==NULL){` for example
11:53
< Vornotron>
Like I'll write a + 3*b + 4*c or a**2 * b**3
11:53
< Vornotron>
ewk
11:53
< Vornotron>
though to be fair there are only, um, six places I'd typically put a space in that.
11:54
<@TheWatcher>
Rest of the code is like that, though: that was just a random line
11:54
<@TheWatcher>
I guess I should be thankful there are lines.
11:56
< Vornotron>
yeah, you can get away with surprisingly little whitespace and still have it compile.
11:56
<@Tarinaky>
Vornotron: it's not one of the enabling practices... and you can certainly do TDD without XP.
11:56
<@Tarinaky>
Anyway. TDD is fine.
11:56
<@Tarinaky>
Pair Programming... not so much.
11:59
< Vornotron>
pair programming gets me better results consistently.
11:59
<@Tarinaky>
TheWatcher: Maybe they're trying to rigidly adhear to a fixed limit on the characters per row?
11:59
<@TheWatcher>
Nope
12:00
<@TheWatcher>
Plenty of lines sticking out to the right of the above
12:02 Vornotron is now known as Vornicus
12:02 mode/#code [+qo Vornicus Vornicus] by ChanServ
12:09 Netsplit *.net <-> *.split quits: @Orthia, @Vornicus, @Namegduf, AnnoDomini, Reiver
12:10 Netsplit over, joins: Reiver, @Orthia, ~Vornicus, @Namegduf, AnnoDomini
12:16
<@Tarinaky>
Vornicus: I found the whole experience stressful and incredibly distracting.
12:16
<@Tarinaky>
I much prefer rubber-ducking :/
12:17
< Syka>
i use the state of the art TAE technique
12:17
<@Tarinaky>
TAE?
12:18
< Syka>
trial and error :D
12:18
< Syka>
mostly error
12:20 Vornicus [vorn@Nightstar-sn7kve.sd.cox.net] has quit [[NS] Quit: ]
12:20
<@TheWatcher>
That's Experiment Directed Programming~
12:21
< Syka>
heee
12:21
< Syka>
i am stealing that term
12:24 * TheWatcher finishes grading \o/
12:24 * TheWatcher has to go get back to writing documentation >.<
12:27
< RichyB>
I suggest changing it to "Experiment-Driven Development" to fit the pattern with other *DD names. :)
12:38
<@Tarinaky>
It's worth noting that unittests are one of the few things that still provide value even if they're half-assed.
12:38
<@Tarinaky>
Even if you don't test the code thoroughly/add new test-cases for new bugs... some test coverage is better than none.
12:39
<@Tarinaky>
As opposed to say documentation: out of date/misleading documentation is worse than no-documentation.
12:43
<@Azash>
RichyB: Just rebrand it as optimistic agile
12:46
<@Tarinaky>
I need redbull or something.
12:46
<@Tarinaky>
*yawn*
12:48 * Syka is now an Experiment Driven Development guru rockstar evangelist
12:48
<@Azash>
You forgot serial entrepreneur
12:49
< Syka>
actually, that would be straight lying
12:49
< Syka>
since my first business is still afloat
12:49
<@Azash>
You have to keep your eyes on the future!
12:50
< Syka>
rofl
12:52
<@Tarinaky>
CEO? Business Owner?
12:52
<@Tarinaky>
Managing Director?
12:52
< Syka>
none!
12:52
< Syka>
i am self-employed
12:52
< Syka>
but what we call a sole trader in australia
12:52
< Syka>
essentially i'm like a LLC without the limited liability :D
12:52
<@Tarinaky>
Over-here I think that's just a small business with less than 20 individuals.
12:53
< Syka>
sole traders are special
12:53
< Syka>
business and personal assets are one and the same
12:53
< Syka>
business losses can offset personal income tax
12:53
< Syka>
etc
12:53
<@Tarinaky>
And creditors can fuck you up.
12:53
< Syka>
they *can*, but I don't have any creditors
12:53
<@Tarinaky>
Yet.
12:53
< Syka>
well, none that aren't cash before delivery anyway
12:54
<@Tarinaky>
Only takes one liability lawsuit to change that :p
12:54
< Syka>
insurance! :D
12:54
< Syka>
(which I have)
12:54
< Syka>
(I have like $5M public liability insurance or something)
12:55
<@Tarinaky>
If it's anything like other kinds of insurance you'll still have plenty of time before the insurance company finished foot-dragging to go bankrupt :V
12:55
<@Tarinaky>
*finishes
12:55
<@Tarinaky>
idk, ianal.
12:55
<@Tarinaky>
Just limited liability would seem to me to be a good thing.
12:56
< Syka>
Tarinaky: yeah, it would
12:56
< Syka>
but that has its own problems
12:56
< Syka>
a) you need directors (which I don't have)
12:56
< Syka>
b) it's expeeeeensive
12:56
< Syka>
c) it's not actually limited liability
12:57
< Syka>
if you fuck up badly enough, I am fairly sure they get to pierce the corporate veil
12:59
<@Tarinaky>
I doubt your insurance covers criminal liability either.
12:59
<@Tarinaky>
There isn't really any insurance against getting 'banged up'.
12:59
< Syka>
well
12:59
< Syka>
being small time ;D
12:59 * Syka is most decidedly small time
13:00
< Syka>
my biggest contract has been ~$7K total
13:00
< Syka>
and that was moostly hardware
13:04
<@Tarinaky>
I'm sure everyone thinks I am crazy for paranoidly sniffing my jumper.
13:04
<@Tarinaky>
I think my sleeves smell funny :/
13:04 * Syka gets a blacklight
13:04
< Syka>
also, unrelatedly, this is possibly my favourite XKCD of all time http://xkcd.com/1293/
13:05
<@Tarinaky>
Syka: A blacklight doesn't actually show how dirty something is though.
13:05
<@Tarinaky>
It just looks disgusting.
13:05
<@Tarinaky>
But it doesn't actually mean there's any bacteria, philes, etc... present :/
13:05
< Syka>
(the joke was slightly dirty)
13:19
<@Tarinaky>
I worry about some of the people from the cohort when I started uni...
13:19
<@Tarinaky>
"Chris Savill A lot of people forget about the original documentation once the project is done. The thing is the documentation is useless to everyone else and yourself unless you keep it up to date with changes. It seems like a chore, but you will be thankful later on and others will be to. Take pride in your documentation, as well as your code commenting and coding standards."
13:20
<@Tarinaky>
Mostly it's the last sentence I worry about.
13:22
<@Tarinaky>
"Eventually they came to the Hall of Wasted Hours, where the abbots held their morning meetings."
13:30
<@Azash>
Tarinaky: I think the joke was that blacklights show semen stains
13:30
<@Tarinaky>
Azash: I am aware.
13:37
< Syka>
haha
13:46
< Shiz>
Syka ‚ i use the state of the art TAE technique
13:47
< Shiz>
that's what I used for figuring out which IRC extensions are relevant
13:47
< Shiz>
: D
13:47
< Syka>
heh
13:48
< Shiz>
'connect bot to irc'
13:48
< Shiz>
'does it crash'?
13:48
< Shiz>
if yes, i need to implement more
13:48
< Shiz>
if no, next server
13:48
<@Tarinaky>
I think that's Feature Driven Development.
13:55 redwire [redwire@Nightstar-27dppb.nl.bellaliant.net] has joined #code
14:18
<&ToxicFrog>
Tarinaky: why des the last sentence worry you?
14:19
<@Tarinaky>
It... It's really hard not to imagine him saying that with pointed hair.
14:29 celticminstrel [celticminst@Nightstar-gj43l1.dsl.bell.ca] has joined #code
14:29 mode/#code [+o celticminstrel] by ChanServ
14:37
<@Tarinaky>
ToxicFrog: I'm perhaps over-sensitive to these things >.<;
14:50
<&ToxicFrog>
I think he's entirely right. Good documentation is fantastic. Bad documentation is worse than useless.
14:50
<&ToxicFrog>
Writing documentation is a necessary skill to develop, and if you don't document your stuff, someone is going to hate you and want you to die.
14:50
<&ToxicFrog>
Possibly you, a year from now.
14:50
<@Tarinaky>
Oh sure.
14:50
<&ToxicFrog>
Also, heh. "It's not a memory leak. It's an unbounded cache."
14:51
<@Tarinaky>
But the 'take pride in your documentation' comes off a little...
14:51
<@Tarinaky>
Over-eager.
14:52
<@TheWatcher>
Nah, that's just 'cos you're English
14:52
< Syka>
i am literally http://xkcd.com/1296/
14:52
< Syka>
( see: https://github.com/hawkowl/haddock/commits/master )
14:52
<@Tarinaky>
TheWatcher: So's he.
14:52
<@TheWatcher>
It trips our "Importance of Not Being Earnest" alarms.
14:53
< RichyB>
Syka, that's you? :D
14:53
< Syka>
RichyB: maybe :P
14:54
< RichyB>
Cute.
14:54
< Syka>
haha
14:56
<@Tarinaky>
The problem I have with commit messages is forgetting to commit and accidentally two features in one.
14:56
<@Tarinaky>
Or forgetting to add a file.
14:56
<@Tarinaky>
Or other stuff.
14:56
< Syka>
i just give up on that until i have an actual project
14:57
< Syka>
until it's somewhere near feature complete, fuck it
14:57
<@Tarinaky>
I should add a macro to vi to remind me to commit more often :V
14:57
<@Tarinaky>
And by remind I mean, apply cluebat.
14:57
< Syka>
while true: do git add -A; git commit -m "hagauahuehhagh"; done
14:58
<@Tarinaky>
Not what I meant :/
14:58
<@TheWatcher>
And by apply cluebat you mean refuse to let you edit anything until either you've committed, or you are?
14:58
< Syka>
Tarinaky: i know, but :P
14:58
< Syka>
then you ~never need to remember to commit~
14:59
<@Tarinaky>
That's like never needing to check for a null pointer by always assigning a default object.
15:00
< Syka>
haha
15:01
<&ToxicFrog>
Tarinaky: that's what commit --amend is for!
15:01
<@Tarinaky>
ToxicFrog: Only in a timely manner though.
15:01
<&ToxicFrog>
Well
15:02
<&ToxicFrog>
If in a non-timely manner, and history cleanliness is important to you, that's why you check the relative history and rebase -i before pushing
15:07
<@Tarinaky>
I don't know what you just said.
15:09
<&ToxicFrog>
Tarinaky: so, git commit --amend lets you rewrite the last commit you made. git rebase -i lets you arbitrarily modify history.
15:09
<&ToxicFrog>
So, before you publish your changes, you look at the set of commits you're about to publish, and if they need cleaning, you rebase -i and tidy them up.
15:10
<@Tarinaky>
Oh sure.
15:10
<@Tarinaky>
I already check git status before I commit though.
15:10
<@Tarinaky>
Sometimes it doesn';t work though.
15:16
<&ToxicFrog>
TBH I highly recommend using git gui; being able to easily see the diffs and selectively stage is huge.
15:16
<&ToxicFrog>
(git add -p does the same but is a lot more cumbersome)
15:17
<@Tarinaky>
I don't really have any need to selectively stage.
15:17
<@Tarinaky>
I just want everything backed up.
15:20
<&ToxicFrog>
...but just a moment ago you were complaining about accidentally putting two features in one commit
15:21
<@Tarinaky>
Yeah, commit. I don't mind pushing them as two seperate commits at the same time.
15:21
<@Tarinaky>
I just fix bug A. Implement feature B. Fix bug C. Realise I forgot to commit between those three sentences/make seperate patches and because they probably involve editing the same file can't easily tease them out.
15:22
<@Tarinaky>
So end up making a monolithic commit.
15:22
<&ToxicFrog>
Er
15:22
<&ToxicFrog>
This is exactly what I'm talking about fixing with selective staging
15:22
<&ToxicFrog>
It is selective at line, not file, resolution
15:22
<@Tarinaky>
Oh.
15:22
<&ToxicFrog>
So you can say "this file, this file, and these lines from this file are bugfix A. Commit. This file and these other lines are feature B. Commit. Everything else is bugfix C. Commit."
15:23
<&ToxicFrog>
I do this all the time because I have a tendency to do 3-4 commits worth of stuff at once.
15:24
<@Tarinaky>
I see.
15:25
<@Tarinaky>
Truth be told though it probably isn't actually worth the effort.
15:26
<@Tarinaky>
I don't ever do any really heavy lifting with git.
15:39
<@celticminstrel>
I do the selective staging thing a lot.
15:40
<@celticminstrel>
I use a GUI program for it, usually.
15:40
<@celticminstrel>
Though git add -i is quite functional.
15:41
<@celticminstrel>
I think that's the right command.
15:41
<&ToxicFrog>
celticminstrel: -i or -p.
15:42
<&ToxicFrog>
(-p being "-i but go directly into patch mode, skipping the top level menu")
15:47
< RichyB>
IMHO super-tidy history is overrated.
15:47
< RichyB>
s/IMHO/IME/
15:48
< RichyB>
Oh, not what you're discussing.
15:48
< RichyB>
Rebasing to get rid of merge commits is, IME, a poor idea.
15:49
< RichyB>
Rebasing to get clean atomic patches is often worth it.
15:50
< simon_>
can I unproblematically resolve dangling elses through setting the precedence of 'if', 'then' and 'else' tokens, or should I always aim at using %prec or (hypothetically) rewrite the grammar?
16:04 Derakon[AFK] is now known as Derakon
16:23
<&ToxicFrog>
RichyB: yeah, it's the latter that's under discussion.
16:23
<&ToxicFrog>
If nothing else it makes bisect more useful.
16:23
< simon_>
RichyB, those two interests sound somewhat conflicting, but I could be wrong? I've never used rebase.
16:24
<&ToxicFrog>
simon_: they aren't, at all.
16:24
<&ToxicFrog>
The latter is about rewriting history so that each logical change occupies exactly one commit - you don't get commits that check in half-finished, broken features, nor commits that check in multiple features or bugfixes at once.
16:25
<&ToxicFrog>
This is mostly about squashing some runs of commits into single commits and detangling others into multiple commits.
16:25
< simon_>
ToxicFrog, ah... like "oops, forgot to add X"
16:25
<&ToxicFrog>
The former is about grafting a feature branch so that merging it into master is a fast-forward rather than a merge.
16:25
<&ToxicFrog>
Kiiind of, but that's more where amend comes in
16:26
< simon_>
right... that's where you undo one commit and then re-commit, right?
16:26
<&ToxicFrog>
This is more "oops, I want to push these changes, but it's 8 commits to implement 2 bugfixes and four of those commits don't actually build"
16:26
< simon_>
I should just RTFM and soon find use of rebase.
16:26
<&ToxicFrog>
"which means the continuous build system and future developers using bisect to find regressions will hate me"
16:26
< simon_>
ok :)
16:27
<&ToxicFrog>
So you whip out rebase -i and now you have two commits, one for each bugfix, each one complete and working.
16:27
<&ToxicFrog>
"rebase" is probably a bad choice of name here, because in general "rebase" is about moving branches around - it changes what commit a branch is "based on", hence the name.
16:28
<&ToxicFrog>
It just also happens to have a -i option that says "also, open an editor that lets me arbitrarily edit the history of this branch as it's moved"
16:28
<&ToxicFrog>
So the use cases in which you'll use "rebase" are mostly disjoint from where you'll use "rebase -i"
16:30
< RichyB>
Yeup. "git rebase -i ${COMMIT}" is more or less "interactively edit the history between now and ${COMMIT}"
16:33
< simon_>
does this cause the commits in the closed interval back to ${COMMIT} to collapse?
16:35
< simon_>
never mind.
16:35
<&ToxicFrog>
simon_: only if you want them to.
16:35
< simon_>
git's man-pages are extremely good compared to all other man-pages I've read.
16:35
< simon_>
it almost feels like... documentation!
16:35
<&ToxicFrog>
"rebase -i", as I said, opens an editor showing you the branch history. You can choose what to do on a per-commit basis. The default is "pick" i.e. apply this commit unmodified.
16:40
< RichyB>
My most common use of "rebase -i" is to take the last two commits and "squash" them into one commit.
16:46 Turaiel[Offline] is now known as Turaiel
16:56 ErikMesoy is now known as Harrower
16:57
< Syka>
i dislike squashing
16:57
< Syka>
and fast forward merging
17:25
<@Tarinaky>
RichyB: Why would you do that?
17:26
< RichyB>
If I spot a small mistake in a commit, I might commit again and then squish rather than git reset --soft HEAD^ and re-commit.
17:26
<@Tarinaky>
Ah.
17:31
<&ToxicFrog>
Easier to commit --amend than either of those, in that case.
17:34 Stalker is now known as Young_Lookshayan_woman55
17:37
< simon_>
yeah, I've used --amend in that situation.
17:38
< RichyB>
commit --amend doesn't let me add more file edits, only message changes, though?
17:39
< RichyB>
or does commit --amend add everything that's staged, too?
17:39
<&ToxicFrog>
Yes, that's kind of the point.
17:40
<&ToxicFrog>
Per the man page: "It is a rough equivalent for $ git reset --soft HEAD^ && do something to come up with the right index && git commit -c ORIG_HEAD, except that it can be used to amend a merge commit"
17:40
<&ToxicFrog>
So, stage the changes you wished were in the last commit first, then run commit --amend.
17:43
< RichyB>
Haha, I had assumed it was just for changing the value of "-m" on the last commit. :P
18:36
<@Tarinaky>
Reasons I like writing Python: self.assertTrue(len(self.room.exits) in [1,2,3])
18:38
< AnnoDomini>
I read that "assert that the room exists".
18:39
<@Tamber>
'false' ...Hm. Well, that's awkw*pop*
18:40 Turaiel is now known as Turaiel[Offline]
18:40
< Harrower>
Tamber: It has 0 or 4+ exits?
18:43
<@Tamber>
Yes.
18:54
<&ToxicFrog>
Isn't it the other way around?
18:58
< AnnoDomini>
ToxicFrog: You'd think so! But the room has 0 or 4+ exits.
19:00
<@celticminstrel>
What is this "bisect"?
19:02
<&ToxicFrog>
AnnoDomini: er. len(self.room.exits) in [1,2,3] will be true if there are 1, 2, or 3 exits.
19:03
<&ToxicFrog>
celticminstrel: 'git bisect' - binary search for the commit that introduced a behaviour.
19:03
< AnnoDomini>
ToxicFrog: But it is 'false' as Tamber stated, therefore 0 or 4+ as Harrower stated.
19:04 * Tamber idly notes that Tamber is not Tarinaky.
19:04
<@Tamber>
Because that would be confusing.
19:04
<@celticminstrel>
I don't get it...
19:04
<@celticminstrel>
The Python thing, that is.
19:06
<&ToxicFrog>
celticminstrel: in python, [v in s] is true if v is contained in the set s, or is one of the values in the list s
19:06
<&ToxicFrog>
len() is the length-of function.
19:06
<&ToxicFrog>
So that expression is true if len(self.room.exits) is any of the values 1, 2, or 3.
19:07
<@celticminstrel>
So what's Tamber and Harrower saying?
19:07
<@celticminstrel>
And AnnoDomini.
19:08
<&ToxicFrog>
Harrower thought that Tamber == Tarinaky thanks to a tab completion fail and the rest has been confusion engendered by that.
19:08
< Harrower>
No, I didn't.
19:08
<@celticminstrel>
Oh, okay.
19:08
<@celticminstrel>
That could explain why I was confused.
19:09
< Harrower>
But now the confusion is recursive so I suggest we drop the subject.
19:09 * Tamber wonders if it's tail-confuse recursion
19:10
<&McMartin>
I don't think so; trying to follow this is consuming ever more of my stack space
19:10
<@Tarinaky>
Harrower: The assertion asserts that the number of exits is 1, 2 or 3.
19:10
<@Tarinaky>
It's nice, because if I were to write this in Java I'd need an || operator.
19:11
<@celticminstrel>
I think you could use the same logic, actually.
19:11
<@celticminstrel>
Though it would look far uglier.
19:11
<&McMartin>
You could, but it would suck, because Java doesn't have a decent object literal notation.
19:12
<@celticminstrel>
Something a bit like Arrays.asList(1,2,3).contains(self.room.exits.length())
19:12
< Harrower>
IIRC Java gets it the other way around and says list.contains(doors).
19:12
<@celticminstrel>
I think length() is the wrong method name.
19:12
<@Tarinaky>
Anyway, I have just been distracted adding mappings to my vimrc.
19:12
<@Tarinaky>
Because my life doesn't have enough to bite me in the arse right now.
19:12
<@celticminstrel>
Yeah, it's list.contains(value) in Java.
19:13
<@celticminstrel>
Wasn't it Java 7 that finally introduced list/map literal notation? Or was that slated for Java 8 or something?
19:13
<@Tarinaky>
celticminstrel: I will bare that in mind next time I want to fuck with someone's head.
19:13
<@celticminstrel>
...okay?
19:13
<&McMartin>
celticminstrel: I haven't seen it in Java 7 code.
19:13
<@Tarinaky>
celticminstrel: I meant the Arrays.asList... thing.
19:13
<@Tarinaky>
By forcing them to read 'clever' code.
19:14
<@celticminstrel>
I remember at least reading a proposal for it to go into Java 7.
19:15
<&McMartin>
cm: Hmm. I thought array initializers were older than that, but that's not the same thing as being Basically JSON
19:28
<@Tarinaky>
What I really need though is a command for vim to take the token under the cursor and add an import statement for it to the top of the source file.
19:28
<@Tarinaky>
(and, obviously, return to the start point)
19:28
<@Tarinaky>
But I have no idea where to even start for that.
19:37 * ToxicFrog gives git filter-branch a cookie
19:42
<&McMartin>
The only editor I've every used that did that was Eclipse, which is even more of an anti-vim than Emacs is
19:46
<@Tarinaky>
I... actually liked using Eclipse for Python. My main complaints about it were ones of system requirements.
19:47
<@Tarinaky>
My laptop doesn't have enough RAM or Processor weight to run Eclipse and Chrome at the same time.
19:48 Kindamoody|out is now known as Kindamoody
19:49
<@Tarinaky>
I recently saw the wizard of the university cohort making lecture notes in latex using what I think was a pimped out emacs setup.
19:49
<@Tarinaky>
**magic**
19:51
<&ToxicFrog>
~* LaTeX *~
19:51
<&ToxicFrog>
I'm pretty sure you can do what you ask in vim. I have no idea how.
19:52
<@Tarinaky>
Oh I'm almost certain that someone has proven turing completeness for vim.
19:52
<&McMartin>
Well, I mean, yes
19:52
<&McMartin>
One of the things you can do is shell out, yes~
19:53
<@Tarinaky>
I meant without the shell, just manipulating vim buffers.
19:53
<@Tarinaky>
But tthinking about it, there's a perl plugin mechanism.
19:53
<@Tarinaky>
So...
19:55 Vornicus [vorn@Nightstar-sn7kve.sd.cox.net] has joined #code
19:56 mode/#code [+qo Vornicus Vornicus] by ChanServ
20:18
<@Tarinaky>
Found a script to do it!
20:18
<@Tarinaky>
http://vim.sourceforge.net/scripts/script.php?script_id=4007
20:32
< Shiz>
@Tarinaky ‚ Reasons I like writing Python: self.assertTrue(len(self.room.exits) in [1,2,3])
20:32
< Shiz>
pleb tier
20:32
< Shiz>
self.assertTrue(len(self.room.exits) in range(1, 3))
20:32
< Shiz>
:P
20:33
< Shiz>
or 1, 4 i guess
20:33
<@celticminstrel>
Yeah, (1,4)
20:33
< AnnoDomini>
FizzBuzz fail tier.
20:33
<&McMartin>
Yeah, "1, 4" is also less clear
20:33
<&McMartin>
[1, 4)
20:33
<@celticminstrel>
You see why Tarinaky's is better. :P
20:34
<&McMartin>
(Also, no, that isn't FizzBuzz fail tier; such a person clearly knows that ranges, like, exist, and tests, and elsewhere, loops)
20:34
<@celticminstrel>
I'm having difficulty parsing your parenthetical.
20:35
< AnnoDomini>
McMartin: You're a recruiter, right?
20:35
<&McMartin>
No; I get called in to do interviews past the initial two phases of screening
20:35
< AnnoDomini>
Close enough.
20:36
< Shiz>
the part where they've proven the candidate knows what a variable is?
20:36
< Shiz>
:P
20:36
<&McMartin>
Yes
20:36
<&McMartin>
That is not actually the same as "proving the candidate has memorized the same parts of the API you have"
20:36
<@celticminstrel>
People apply without knowing what a variable is?
20:36
<&McMartin>
Of course, people selling interview prep don't like to admit that, because memorizing a bunch of shit is easy to charge for teaching
20:36
<&McMartin>
Yes.
20:36
< AnnoDomini>
I'm not quite clear about what passes or fails FizzBuzz. McMartin, is it a pass/fail or is there some gradation like "no errors"/"made stupid errors in haste"/"can't program"?
20:37
<&McMartin>
It's "is this person applying to this job simply because they have to do so to maintain eligibility for unemployment insurance"
20:37
< Shiz>
pretty sure you don't have to write a fizzbuzz that can work through server reboots, no
20:37
<&McMartin>
It's to weed out "literally has never written a program in their lives"
20:37
<&McMartin>
For anything more interesting than that you need a more interesting problem.
20:38
<&McMartin>
And we all program here, right? (Right?)
20:38
< Shiz>
plot twist: nobody here actually programs
20:38
<&McMartin>
We all know that you don't dictate programs over a telephone or write them out in indelible text and have it work the first time.
20:38
< AnnoDomini>
Shiz: Lies!
20:38
<&McMartin>
This is not how the discipline of programming works, but it is kind of how interviews work.
20:38
<@celticminstrel>
Lies indeed!
20:38
< Shiz>
McMartin: aah
20:38
< Shiz>
our algorithms exams
20:39
< Shiz>
consisted of writing java implementations on physical paper
20:39
< Shiz>
good times
20:39
<@celticminstrel>
Heh.
20:39
< Shiz>
(not really, it was terrible)
20:39
<&McMartin>
Yes, but you could also cross things out~
20:39
<@celticminstrel>
I think my exams generally asked for pseudo-code rather than Python or Java.
20:39
<&McMartin>
FizzBuzz and similar questions are generally given during a phone screen, though, which means the program is being dictated
20:39
<&McMartin>
Which is even worse
20:39
<@Tarinaky>
celticminstrel: I quite like python as pseudocode.
20:39
< Shiz>
'if x module 3 is 0'
20:39
< Shiz>
it's almost python!
20:39
< Shiz>
modulo*
20:40
<@celticminstrel>
I tend to do my pseudo-code in Python style, yes. That doesn't mean it's valid Python code though.
20:40
<@celticminstrel>
.
20:41
<@Tarinaky>
Mine tends to work out as a valid fragment at least...
20:41
<&McMartin>
Anyway, people that deal with this more directyl at the low end have written better things than me
20:41
<@Tarinaky>
But then my problems tend to be trivial and uninteresting.
20:41
<&McMartin>
http://raganwald.com/2007/01/dont-overthink-fizzbuzz.html
20:41
< Shiz>
now
20:41
< Shiz>
implement red-black trees over the phone
20:41
< Shiz>
time for some fun
20:41
<&McMartin>
Of particular note here are the two links under "UPDATE" in the second paragraph
20:41
<@celticminstrel>
Hah.
20:41
<@Tarinaky>
I don't think they do red-black tress at undergrad level any more.
20:42
<@Tarinaky>
We did AVL instead... not that I can remember them...
20:42
<&McMartin>
Shiz: The correct answer to that is "This job application said we will be working in C++. That's a std::map."
20:42
<&ToxicFrog>
McMartin: re program being dictated: augh, no
20:42
<@celticminstrel>
I think I did both red-black and AVL...
20:42
<&ToxicFrog>
The correct answer is to use a googledoc, pastebin, or similar
20:42
< Shiz>
McMartin: do I get extra points if I give you my obfuscated python oneliner over the phone :P
20:42
< Shiz>
re:fizzbuzz
20:42
<&McMartin>
ToxicFrog: That's for once you give a shit at all~
20:42
<@Tarinaky>
celticminstrel: I believe the lecturer's exact words were: "It's on this hand-out you can download off blackboard but I'm not going to memorise all that just so I can set a question on it."
20:43
<&McMartin>
We did red-black in, uh, '98
20:43
< Shiz>
I never did red-black, actually
20:43
< Shiz>
... or AVL
20:43
<@celticminstrel>
I can't remember clearly since this was a first-year course, but I think we went over both of them in some detail. I think I remember a third type of balancing too, though...
20:44 Kindamoody is now known as Kindamoody[zZz]
20:44
<@Tarinaky>
Anyway. I'm supposed to be doing stuff.
20:44
<@celticminstrel>
Me too!
20:44 * Tarinaky shuts out the distraction.
20:44
<@celticminstrel>
<_<
20:44
< Shiz>
bwug
20:44
< Shiz>
'stuff' is overrated
20:44
< Shiz>
tbh
20:45
<@Tarinaky>
I can see I'm going to have to spend my 3 weeks of revision avoiding this channel :/
20:45
<@Tarinaky>
But right now I'm still working on that L-System dungeon generator that's going at a rate of mollasses.
20:46
<&ToxicFrog>
McMartin: I don't follow.
20:47
<&ToxicFrog>
If you're doing a phone screen, it's much easier for both the candidate and the interviewer to have them type up the answer to a screening question and then send it to you rather than try to read code unambiguously over the phone.
20:47
<&McMartin>
ToxicFrog: Right, and looking into this I see that some people use it to answer the question "can you operate a compiler"
20:48
<&McMartin>
In which case, yes, you do need to do something like that.
20:49
<&ToxicFrog>
I am confused.
20:49
<@Tarinaky>
If you can get the compiler to tell you you're an idiot for forgetting a semi-colon on line 8, and misspelling iostream on line 3, you can probably work a compiler.
20:50
<&McMartin>
ToxicFrog: It's possible - again, I don't operate at this level when called in, so I can't say I do this, but I know it is done - to get someone to solve a simple problem and tell you in conversation how they would solve it with sufficient lack of ambiguity to prove that they can create programs.
20:51
<&McMartin>
It's a single question with like three sentences of answer and you do that before setting up document shares because if they're floored by that it's gonna be a waste of time
20:52
<&ToxicFrog>
Aah.
20:52
<&McMartin>
(The solution to fizbuzz is one loop with a single set of if/elseif clauses in it. Even spending ten minutes on this problem is too much, IMO~)
20:54
<@Tarinaky>
McMartin: What about the smart-alec that suggests tail recursion?
20:55
< Harrower>
There is no recursion.
20:55
< Harrower>
There is a loop.
20:55
<@celticminstrel>
I'm pretty sure you can implement any loop with tail recursion...
20:55
<@Tarinaky>
celticminstrel: That's the joke.
20:56
<&McMartin>
Tarinaky: Smart-alec answers are part of the things they have to work with.
20:56
<&McMartin>
Tarinaky: That said, the Don't Overthing Fizzbuzz link I gave covers that case exactly
20:56
<&McMartin>
Answer: "The smart alec succeeds in wasting everyone's time"
20:57
<@Tarinaky>
I missed the link but I'm prepared to accept that statement without proof.
20:57
<&McMartin>
One of the answers is funny, so: http://raganwald.com/2007/01/dont-overthink-fizzbuzz.html
20:58
<&McMartin>
The correct thing for the interviewer to do is move on and ignore it
20:58
<&McMartin>
If they know what tail-recursion is, they can organize a program.
20:58
<&McMartin>
That's *all you're testing for here*
20:59
<&McMartin>
The *real* interview is where they put you in a room with the senior engineers and they challenge you to design something.
20:59
<&McMartin>
Or to begin to attack a medium-sized problem.
21:02
<@Reiv>
I have heard of fizzbuzz tests being passed when they hand you the sheet of paper in the interview with the challenge on it, give you a whiteboard pen... and the moment you start writing "public static int main([]) { int counter;" they go "Yep, that'll do, sit back down and we'll continue"
21:04
<@Reiv>
Though apparently this actually rattled the interviewee enough that the after-interview feedback was "Yeah, uh, if it's OK with you guys /let me finish the problem it bugged me all day/"
21:04
<@Tarinaky>
McMartin: I know. I'm just messing with you,
21:05
<@Tarinaky>
McMartin: I didn't know anyone needed to write /that/ blog-post.
21:19 Harrower is now known as ErikMesoy
21:20
<&McMartin>
Tarinaky: One of the Rules seems to be "it's always worse than you think, in both directions"~
21:21
< ErikMesoy>
int main? :V
21:22 * ErikMesoy is very, very used to void main.
21:24
<&McMartin>
C/C++ use int main; the return code is the exit code of the process.
21:25
<@celticminstrel>
Java needs void main, though.
21:25
<&McMartin>
yup
21:32
<@Tarinaky>
Although most C/C++ compilers will accept void.
21:33
<@Tarinaky>
So you'll see it quite a lot in other people's code - particularly older Windows code where void /used/ to be preferred.
21:34
< AnnoDomini>
Hmmm. C++. Can I do something like "function({1,2})" where the argument is a two-int struct?
21:34
<@celticminstrel>
Sometimes.
21:34
<@Tarinaky>
std::pair<int,int>
21:34
<@celticminstrel>
I think it's valid in C++11 actually.
21:34 Vornicus [vorn@Nightstar-sn7kve.sd.cox.net] has quit [[NS] Quit: Leaving]
21:34
<@celticminstrel>
Provided there's only one overload of function that takes a two-int struct as an argument.
21:35
<@celticminstrel>
Also, C/C++ doesn't consider the function return type to be part of the signature, unlike Java.
21:35
<@Tarinaky>
Or "struct TwoInts { int x,y; } a = {1,3};"
21:37
<@Tarinaky>
The 'dumb' (and therefor superior until proven otherwise) solution is to define a struct with two components and have that as the type the function expects...
21:38
<@celticminstrel>
Um, I think that was already the situation, Tarinaky...
21:39
<@celticminstrel>
But maybe I misunderstood. AnnoDomini?
21:39
<@Tarinaky>
I think Anno wants something like the python-ism 'def function((x,y)):'
21:39
< AnnoDomini>
I just wanted to know if I can shorthand the initialization of the argument.
21:40
<@celticminstrel>
My impression was that he already had a function that takes a two-int struct and he wanted to know if that syntax was a valid way to call it.
21:40
<@celticminstrel>
Which in C++11 I'm fairly sure it is.
21:40
<@Tarinaky>
You can assign the components of a struct by shorthand /provided/ the components are of the same type iirc.
21:40
<@Tarinaky>
I think that only applies to assignment. I am not sure on the C++11 situation.
21:41
<@Tarinaky>
I would suggest giving your compiler a test-case and reporting the results.
21:43
< AnnoDomini>
Later. I've gotten an idea on how to implement a really inefficient but possibly implementable way to do pathfinding.
21:44
<@Tarinaky>
Is it bogon pathfinding?
21:44
< AnnoDomini>
It will take a bajillion cycles to find an answer. But hopefully it will be capable of finding it.
21:45
< ErikMesoy>
Reverse-pathfinding from character?
21:45
<@Tarinaky>
I think you're just suggesting a random walk.
21:46
<@Reiv>
Fuck, I dunno, I haven't written Java in ~6 years
21:46
<@Tarinaky>
Which would only be guarenteed to find an answer if you had hardware entropy/true randomness.
21:46
<@Reiv>
This is part of my problem of "I no longer know how to program", so thankfully it was not me in that particular question~
21:46
<@celticminstrel>
Huh?
21:47
<@Tarinaky>
But with the obvious advantage that your pathfinding algorithm would, as a side-effect, generate Hamlet in Dutch.
21:47
<@Reiv>
celticminstrel: Everyone pounced on the fact I used int main for a purportedly java code snippet :p
21:47
<@celticminstrel>
Oh.
21:48
<@Reiv>
(I was making it up as I go along, to fill an anecdote.)
21:48
<@celticminstrel>
I had already forgotten that you were the one who said it.
21:48
<@Reiv>
Ya
21:52 VirusJTG [VirusJTG@Nightstar-6i5vf7.sta.comporium.net] has joined #code
21:53
<@Tarinaky>
... `I have just been made aware of the "ALTER X TO PROCEED TO Y" statement in old-school COBOL. Following this, any GOTO X statement will now GOTO Y instead.'
21:53
<@Tarinaky>
o.o
21:53
<@Tamber>
Fun! :D
21:54
<@Tarinaky>
I think I'd rather wrestle 12 Zombie Badgermen while on fire.
21:54
<@celticminstrel>
...
21:54
< ErikMesoy>
Tarinaky: But which do you prefer of COMEFROM and wrestling 24 Zombie Badgermen while on fire?
21:55
<@Tarinaky>
Comefrom... unfortunately...
21:55
<@celticminstrel>
What's COMEFROM do?
21:55
<@Tarinaky>
iirc the same as goto/jump.
21:55 Young_Lookshayan_woman55 is now known as Stalker
21:55
<@Tarinaky>
The difference I leave to the imagination.
21:57
< AnnoDomini>
COMEFROM is just an invisible GOTO.
21:57
< ErikMesoy>
celticminstrel: Same as GOTO, except located at the other end.
21:57
< ErikMesoy>
30 GOTO 200 is identical with 200 COMEFROM 30.
21:57
<@celticminstrel>
Why would you ever do that.
21:58
< ErikMesoy>
Good question.
21:59
<@gnolam>
https://en.wikipedia.org/wiki/COMEFROM
21:59
<@gnolam>
(Which in ALLCAPS sounds a bit like an obscure Cold War-era communist organization)
22:00
<@Tamber>
Really, the only reason to use COMEFROM would be to screw with people's heads. :p
22:00
<&McMartin>
Well
22:01
<&McMartin>
I would direct you to AspectJ or, indeed, aspect-oriented software development in general
22:02 Stalker [Z@Nightstar-484uip.cust.comxnet.dk] has quit [Ping timeout: 121 seconds]
22:02
<@Tarinaky>
Tamber: The wikipage lists debuggers as a useful implementation.
22:02
<@Tarinaky>
Specifically debugger break points.
22:03
<@Tamber>
Pah
22:05
< ErikMesoy>
Come From is a great way of screwing with people's expectations when they think the program will transition smoothly from line 30 to line 31, but somewhere far away is a "Come from 30" instruction. Never use Come From in code that anyone else will have to maintain.
22:05
< ErikMesoy>
If you do, they may just hunt you down and beat you with a stick for creating utterly unpredictable code where every single other part of the code must first be checked for Come From statements to verify that any one part of the code progresses normally.
22:06
< ErikMesoy>
Alternatively: Do use Come From in code that other people will have to maintain. It gives them job security. :D
22:07
<&McMartin>
"Around advice" (which is basically come from) is also useful for centralizing logging code.
22:07
<&McMartin>
Ladies and Gentlemen, Java: http://discuss.joelonsoftware.com/default.asp?joel.3.219431.12
22:07
<&ToxicFrog>
"around advice"?
22:08
<@Tarinaky>
Aspect-oriented-programming.
22:08 Vornicus [Vorn@Nightstar-28h42k.sd.cox.net] has joined #code
22:08 mode/#code [+qo Vornicus Vornicus] by ChanServ
22:09
< ErikMesoy>
mmm, FactoryFactory
22:09
<&McMartin>
Before, around, and after. Intercepts all method calls matching the pattern and runs this code before, instead of, or after the method itself.
22:09
< ErikMesoy>
But is it really fair to blame Java for that?
22:09
<&McMartin>
Only sort of.
22:09
<&McMartin>
Making it recursive it is OK to blame the Java community.
22:10
<&McMartin>
The problem factories solve - that is, that constructors cannot be made virtual - is basically universal in any OO language that doesn't have duck typing, and factories (possibly by a different name) are how you solve this.
22:10
<&McMartin>
The, uh, pythonic solution to this that does not involve duck typing is kind of horrible and you shouldn't do that either
22:11
<&McMartin>
(It involves reassiging the class of self in the constructor depending on its arguments)
22:13
< ErikMesoy>
>_<
22:14
< ErikMesoy>
"Well then don't do that then" ?
22:14
<@celticminstrel>
Why can't constructors be made virtual?
22:15
<@Tarinaky>
Because the concept of an Object() that can;'t be initialised is wholly alien to Python.
22:15
<@Tarinaky>
Oh wait.
22:15
<@Tarinaky>
Misread.
22:15
<&McMartin>
celticminstrel: They never are
22:15
<@Tarinaky>
Aren't all Python __init__s virtual by default?
22:15
<&McMartin>
No
22:15
<&McMartin>
When you say A(), you're getting an A back
22:16
< ErikMesoy>
I suspect there may also be some trouble where a constructor has to exist, but a virtual method doesn't have to exist "yet" before you get to some specific instance
22:16
<@celticminstrel>
I don't see how that answers the question...
22:17
<&McMartin>
celticminstrel: Basically every language that has a new operator or equivalent, if you say new Whatever(), you get exactly a Whatever.
22:17
<&McMartin>
Factories loosen that restriction to "you get something castable to a Whatever".
22:18
<@celticminstrel>
Is this restriction needed for a new operator?
22:18
< ErikMesoy>
ehh, crashing.
22:18 ErikMesoy is now known as ErikMesoy|sleep
22:19
<&McMartin>
celticminstrel: "sort of"
22:19
<&McMartin>
I literally know of no exceptions to it.
22:19
<@Namegduf>
The thing you can do with a factory is that multiple returning different things castable to Whatever, or the same thing with different initial state
22:19
<@Namegduf>
*have multiple
22:20
<@Namegduf>
And pass it into some other stuff which calls the factor to generate Whatevers on demand with it.
22:20
<@Namegduf>
It's hard to see how you could pass around "different versions" of a new operator in a more effective manner.
22:22
<@celticminstrel>
Doesn't Python let you override the new operator?
22:22
<@celticminstrel>
(C++ does too, but that doesn't count because it only handles memory allocation, not construction.)
22:26
<@Namegduf>
That doesn't do this.
22:26
<@Namegduf>
You write a function. It calls "new Whatever()". When it calls that, it always invokes the same thing.
22:26
<@Namegduf>
You write a function, taking a WhateverFactory as a parameter.
22:27
<@Namegduf>
It calls whateverFactory.new(). Where and how its Whatever is created is now controllable by the calling code.
22:27
<@Namegduf>
Well, not where but what exactly the Whatever is.
22:27
<@celticminstrel>
In Python you can write a class function (__new__, I think) which is called before __init__.
22:27
<@Namegduf>
Continue?
22:29
<@celticminstrel>
It's a static method which takes the arguments passed to the constructor and returns a new object instance.
22:29
<@Namegduf>
SOunds like you might be able to pass it around as a factory function, then.
22:29
<@celticminstrel>
http://docs.python.org/2/reference/datamodel.html#object.__new__
22:29
<@Namegduf>
Assuming you can call it directly.
22:30
<@celticminstrel>
When you write MyClass(a,b,c), it's called automatically.
22:30
<@Namegduf>
Okay, so how does this allow code calling a function to specify what subclass of Whatever is instantiated when that function wants to get a new one?
22:31
<~Vornicus>
you can name the class, and add that's class's dict or something.
22:31
<@celticminstrel>
Based on the arguments?
22:31
<@Namegduf>
celticminstrel: Without having it preprogrammed in as a special case...
22:33
<@celticminstrel>
Not sure, then. I think all the times I've used static factories was in situations where I knew all the possible subclasses.
22:33
<@Namegduf>
It's just the same as any other use of a first class function.
22:33
<@Namegduf>
Or, well, any use of passing a function as a parameter.
22:34
<@Namegduf>
Yes, if you can preprogram everything it might need to call you could just pass an int and switch on it or something.
22:34
<@Namegduf>
But 1) Ew. 2) You sometimes can't.
22:35
<@celticminstrel>
I dunno. Pass in a string, look it up in a dictionary of known subclasses?
22:36
<@Namegduf>
Yes, you can do the same thing to avoid needing first class functions sometimes.
22:36
<@Namegduf>
The "ew" holds.
22:37
<@Namegduf>
It's also not just about subclasses, it can be about the parameters the thing is created with.
22:37
<@Namegduf>
You could for example have code taking a ConnectionFactory which had a method for getting a new connection, and an implementation which you instantiated passing authentication information and connection information, and then passed to that code.
22:38
<@celticminstrel>
Passing around a WhateverFactory seems kinda odd to me, actually...
22:40
<@Namegduf>
It's just an object which gives you another object of a certain type on request.
22:43
<@Namegduf>
It lets you write algorithms reasoning over such without concern for the operational details of where a Whatever or where a Connection comes from or what information is needed to make one.
22:43
<@Namegduf>
I'm no fan of pattern overuse, but it has its uses.
22:47
<~Vornicus>
y'know, I used to hate that some languages had a separate operator for string concatenation. Now I miss it.
22:57
< AnnoDomini>
This pathing sometimes works and at other times doesn't.
23:09
< AnnoDomini>
Hmm. Whether the zombies can path or not seems determined largely on where they are in relation to me.
23:32 You're now known as TheWatcher[T-2]
23:34 * RichyB snickers
23:34
< RichyB>
"Hammock Driven Development"
23:34
< RichyB>
turns out that this is Rich Hickey's name for his style of development
23:35
<~Vornicus>
optimizing for developer time, i see
23:35
< RichyB>
optimising for snoozing on a hammock while thinking hard
23:36 Derakon is now known as Derakon[AF]
23:36 Derakon[AF] is now known as Derakon[AFK]
23:39 You're now known as TheWatcher[zZzZ]
23:45
<@Tarinaky>
RichyB: Sounds like a manifesto I can get behind :V
23:46
<&McMartin>
14:29 <@Namegduf> Yes, if you can preprogram everything it might need to call you could just pass an int and switch on it or something.
23:46
<&McMartin>
14:30 <@Namegduf> But 1) Ew. 2) You sometimes can't.
23:46
<&McMartin>
14:31 <@celticminstrel> I dunno. Pass in a string, look it up in a dictionary of known subclasses?
23:47
<&McMartin>
This is the 'morphing' technique I was saying was the pythonic way that was terrible and that you shouldn't do
23:48
<&McMartin>
And even *then* the regress has to end somewhere, and since a simple constructor method is like three lines of code it is not a huge stretch to do "the allocator is the thing that sets the type" just like everyone else
23:48
< RichyB>
oh gods this is excellent
23:48
< RichyB>
http://bodil.org/coffeescript/#the-secret-slide
23:49
< RichyB>
^- succinct explanation of why JavaScript sucks more than Lisp, C, C++, Java and Python.
23:49
< RichyB>
Bottom-right photo is Brendan Eich, the person who originally designed JS.
23:49
<@celticminstrel>
I get nothing.
23:50
<@celticminstrel>
ie, it's not loading for me.
23:50
<&McMartin>
He is the only man on the list without a beard
23:50
<&McMartin>
Also, argh
23:51
<@celticminstrel>
Why do people code sites that don't function when cookies are disabled?
23:51
<&McMartin>
Why do people get so bent out of shape about typeof(NaN) == number?
23:51
<&McMartin>
NaN is part of IEEE 754
23:51
<~Vornicus>
Yeah that I don't get.
23:51
<@celticminstrel>
More specifically, sites that don't need cookies that don't function when cookies are disabled.
23:51
< RichyB>
McMartin, because it is "not" a number! But seriously, let's chalk that one up as an amusing mistake on the part of the author.
23:52
<@celticminstrel>
Anyway, I don't think JavaScript is all that bad.
23:52
<&McMartin>
RichyB: It's not just the author
23:52
<&McMartin>
This is a consistent rant from people who should really know better.
23:52
<&McMartin>
Crockford calls it out as one of the irredeemably terrible bits of JavaScript
23:53
<@celticminstrel>
On an unrelated note, is there some way to prevent Firefox tabs from stealing focus when a script in them produces an alert/confirm box?
23:53
<&McMartin>
Though to be fair he also calls out "+ will also concatenate strings" as one too, which is kind of entertaining tunnel vision
23:54
<~Vornicus>
Like I mentioned earlier, having recently worked in a language with an explicit string concatenation operator I kind of wish more languages did it that wayt
23:54
< AnnoDomini>
pastie.org/8543400 <- It paths! Has some issues (creatures in the way) and the path is not exactly a straight one, but it paths.
23:54
<&McMartin>
Vornicus: Well, the actual reason this is terrible is because JS has hilarious ideas of legal coercions
23:55
<~Vornicus>
yeah, that's no fun
23:56
<&McMartin>
Saying that the flaw here is that + is overloaded is rather dramatically missing the point
23:58
< RichyB>
no, really
23:58
< RichyB>
the flaw here is that Brendan Eich attempted to design a programming language without growing fa⦠er, never mind.
23:58 * Vornicus patpats richyb
23:59
< RichyB>
It is definitely the coercions thing.
23:59
<~Vornicus>
Even Matz tried, and he's japanese.
23:59
<&McMartin>
Java's designer has facial hair, C#'s does not.
23:59
<&McMartin>
Myth busted~
--- Log closed Wed Dec 11 00:00:00 2013
code logs -> 2013 -> Tue, 10 Dec 2013< code.20131209.log - code.20131211.log >

[ Latest log file ]