code logs -> 2013 -> Mon, 22 Apr 2013< code.20130421.log - code.20130423.log >
--- Log opened Mon Apr 22 00:00:50 2013
00:42 Vornicus [vorn@ServerAdministrator.Nightstar.Net] has joined #code
00:42 mode/#code [+qo Vornicus Vornicus] by ChanServ
00:55 iospace [Alexandria@Nightstar-e67f9d08.com] has quit [Connection closed]
01:08 gnolam [lenin@Nightstar-b2aa51c5.cust.bredbandsbolaget.se] has quit [Ping timeout: 121 seconds]
01:11 gnolam [lenin@Nightstar-b2aa51c5.cust.bredbandsbolaget.se] has joined #code
01:11 mode/#code [+o gnolam] by ChanServ
01:25 Turaiel[Offline] is now known as Turaiel
01:32 iospace [Alexandria@Nightstar-e67f9d08.com] has joined #code
01:32 mode/#code [+o iospace] by ChanServ
01:37 himi [fow035@D741F1.243F35.CADC30.81D435] has joined #code
01:37 mode/#code [+o himi] by ChanServ
02:48 syksleep is now known as Syk
03:03 Kindamoody[zZz] is now known as Kindamoody
03:30 RichyB [richardb@Nightstar-86656b6c.cable.virginmedia.com] has quit [Ping timeout: 121 seconds]
03:44 VirusJTG [VirusJTG@Nightstar-09c31e7a.sta.comporium.net] has quit [[NS] Quit: Program Shutting down]
04:52 celticminstrel [celticminst@Nightstar-e83b3651.cable.rogers.com] has quit [[NS] Quit: KABOOM! It seems that I have exploded. Please wait while I reinstall the universe.]
05:05 Vash [Vash@Nightstar-221158c7.sd.cox.net] has joined #code
05:05 mode/#code [+o Vash] by ChanServ
05:13 Kindamoody is now known as Kindamoody|out
06:04 Derakon is now known as Derakon[AFK]
06:29 ErikMesoy|sleep is now known as ErikMesoy
06:44 Turaiel is now known as Turaiel[Offline]
07:36 himi [fow035@D741F1.243F35.CADC30.81D435] has quit [Ping timeout: 121 seconds]
09:10 Derakon [Derakon@Nightstar-a3b183ae.ca.comcast.net] has joined #code
09:10 mode/#code [+ao Derakon Derakon] by ChanServ
09:13 Derakon[AFK] [Derakon@Nightstar-a3b183ae.ca.comcast.net] has quit [Ping timeout: 121 seconds]
09:21 thalass [thalass@C2A270.1179B7.313116.EBC7E8] has joined #code
09:33 Vash [Vash@Nightstar-221158c7.sd.cox.net] has quit [[NS] Quit: I lovecraft Vorn! <3]
09:48 himi [fow035@Nightstar-5d05bada.internode.on.net] has joined #code
09:48 mode/#code [+o himi] by ChanServ
10:26 RichyB [richardb@Nightstar-228a334c.plus.com] has joined #code
11:35 thalass [thalass@C2A270.1179B7.313116.EBC7E8] has quit [[NS] Quit: Leaving]
11:45 Vornicus [vorn@ServerAdministrator.Nightstar.Net] has quit [[NS] Quit: Leaving]
12:47
<@gnolam>
http://crapcha.com/
12:48
<@froztbyte>
haha
13:06
<@iospace>
gnolam: ... i don't see any difference between taht and a normal captcha :V
13:53 ToxicFrog is now known as ToxicFrog|W`rkn
14:02 * Azash eyes https://github.com/haeroe/hypatia/blob/master/parse.sh
14:02
<@Azash>
Now that I know I can do it I need to find an actually sane way
14:05
<@Azash>
If I have, say, lines consisting of four words split by a single space, how would I grep the second word only?
14:06
<&McMartin>
You'd probably use awk for that, actually~
14:06
<&McMartin>
But probably something like ^\s*\S*\s*(\S*)
14:07
<@Azash>
Well, my issue here is I am parsing tcpdump lines
14:07
<@Azash>
And I'm trying to streamline it
14:08
<@Azash>
So if I have say "bob alice foo bar" and I want to grep only "alice", for easy assignment to a variable
14:08
<@Azash>
How would I do that?
14:10
<&McMartin>
With what I just give, \1 will refer to that line
14:11
<&McMartin>
If you're trying to parse lines and dump just one bit of it rather than the whole line, this is not what grep does; you'll need to write a Perl script or something that searches for what I just gave and spits out $1 or similar
14:11
<@Azash>
Hm
14:11
<&McMartin>
Alternately, here are two lines of Python that will do it, assuming every line is in this format:
14:11
<@Azash>
Every time I think "Maybe I won't have to learn perl".. :P
14:11
<&McMartin>
for x in open(filename):
14:11
<&McMartin>
print x.split()[1]
14:12
<@Azash>
Yeah I know about splitting, I'm just using bash here
14:12
<@Azash>
Might have to use a real language if this ends up being too cumbersome though
14:13
<&McMartin>
In days of yore, one used awk for such things.
14:13
<@Azash>
I'll look into that, thanks
14:20 celticminstrel [celticminst@Nightstar-e83b3651.cable.rogers.com] has joined #code
14:20 mode/#code [+o celticminstrel] by ChanServ
14:33
< Syk>
okay, so, client dropped off a PC
14:34
< Syk>
I did a backup of their user folder
14:34
< Syk>
and am now making an entire disk image
14:34
< Syk>
so if they go 'we can't find a file', i'm goddamn covered
14:52 Turaiel[Offline] is now known as Turaiel
15:08
<@Azash>
Presykense is good
15:09
< Syk>
haha
15:09
< Syk>
well, I've already transferred their data to a server I set up for them
15:10
< Syk>
but being triple safe never hurt
15:11
<@froztbyte>
Azash: uhm
15:12
<@froztbyte>
Azash: what exactly are you actually trying to do?
15:12
<@Azash>
Grind up tcpdump data and put it in an SQL db
15:12
<@froztbyte>
you could have something like this:
15:14
<@froztbyte>
tcpdumpcmd | while read line; do second=$(echo ${line} | cut -d' ' -f 2}; if [ "x${second}x" -eq "xalicex" ]; then doStuff(); fi; done
15:14
<@froztbyte>
replacing the cut for the necessary action you want
15:14
<@Azash>
Thank you
15:15
<@froztbyte>
you'll probably need to massage it a little bit
15:15
<@froztbyte>
but yeah
15:15
<@Azash>
The basic principle is clear~
15:15
<@froztbyte>
:)
15:17
<@froztbyte>
(personally I'd just write a pcap filter for it)
15:17
<@froztbyte>
(but that depends on what protocol you're using)
15:22
< RichyB>
Why are you using cut instead of awk?
15:23 * RichyB finds awk '{print $2}' much less evil to read.
15:23
<@froztbyte>
because I was just demonstrating the point
15:23
<@froztbyte>
I tend to use awk as well, mostly because it handles columning correctly
15:24
< RichyB>
-eq to [ actually compares integers, not string equality. You want "=" for string equality.
15:24
<@froztbyte>
when you have something " 0 asd asd\n 22 dsa dsa" cut is a pin in the ass
15:24
<@froztbyte>
RichyB: ah, true
15:25
<@froztbyte>
==, right?
15:25
<@froztbyte>
not =
15:25
<@froztbyte>
or does it work that way in [] ?
15:25
< RichyB>
No, [ calls it "=".
15:25
<@froztbyte>
(I fucking hate bashisms)
15:26 Turaiel is now known as Turaiel[Offline]
15:28
< Syk>
bashisms sounds like something you get on your back after too much exposure to a VT-100
15:29
< RichyB>
Azash: a) if you start taking data out of tcpdump and putting it into a SQL DB, make sure that you don't end up causing an infinite loop by capturing the communications between your script and your database in there too. ?
15:30
< RichyB>
b) if you're trying to do this at, like, wire speed on gigabit-or-better ethernet, then using scripting languages like bash is not going to be conducive to your goals. ?
15:30
< RichyB>
Why are you trying to get lines out of tcpdump into SQL?
15:30
< RichyB>
I assume that you're trying to write some kind of interactive analyser, statistics gathering or auditing or something?
15:31
<@froztbyte>
Syk: bashisms is what you have to do to your head, using a wall, if you actually want to use bash
15:32
< RichyB>
For scripting, I have to say that the only bash feature which I really *like* is "set -e".
15:33
<@froztbyte>
hehe
15:33
<@froztbyte>
have you seen ftsh?
15:33
<@froztbyte>
http://www3.nd.edu/~ccl/software/ftsh/
15:33
<@froztbyte>
it's a kinda nice idea
15:35
< RichyB>
Hrmn!
15:35
< RichyB>
It looks like some of the fault-tolerance techniques from Erlang/OTP applied to scripting. I like it!
15:35
<@Azash>
RichyB: In this case I'm using sqlite
15:36
<@Azash>
Also RichyB I'm doing the first version in bash that has very simple output
15:36
<@Azash>
Of this format
15:36
<@Azash>
05:27:20.787188 IP 192.168.223.2.53 > 192.168.223.129.3743: UDP, length 178
15:36
< RichyB>
Azash: k. Why do you want a sqlite DB full of information from tcpdump. What information from tcpdump do you want to end up in the sqlite DB?
15:37
<@Azash>
Lab course in traffic analysis
15:37
<@froztbyte>
RichyB: yeah, I also like it, but I just haven't really had a chance to use it
15:37
<@Azash>
My subject is about storing some basic statistics in the long-term for later use
15:37
<@froztbyte>
I probably will in the near future
15:38
< RichyB>
Azash: hmokay. In your situation, I'd write in Python or Perl with a proper library for sqlite instead of trying to do anything in bash.
15:40
< RichyB>
Carving lines up with regexps in Python is not hard and I believe it actually comes with the sqlite3 module.
15:41
<@Azash>
I would probably end up using C
15:41
<&ToxicFrog|W`rkn>
:gonk:
15:41
< Syk>
oh dear lord the C sqlite library :(
15:42
< RichyB>
I would advise against doing that.
15:42
<@froztbyte>
yeah, python is probably pretty easy for that
15:42
<&ToxicFrog|W`rkn>
Yeah, don't do that
15:42
<&ToxicFrog|W`rkn>
C has its uses. This isn't one of them.
15:42
< RichyB>
If you're worried about how fast the packet capture goes, don't bother parsing the output of tcpdump in real-time.
15:42
<@froztbyte>
and you could generators or so to make it nice and streamlined, too
15:42
<@Azash>
I don't know python nor perl
15:43
<&ToxicFrog|W`rkn>
It will probably be easier to learn the small amount of python needed for this than to do it in C.
15:43
< RichyB>
Instead, use "tcpdump -w foo.pcap" to dump a capture file and then do the parsing offline at your leisure.
15:43
< Syk>
learning python would be 100% easier than learning how to screw with C's sqlite module
15:43
<&ToxicFrog|W`rkn>
It will definitely be easier to do that than to find new kneecaps after whoever has to mark and/or maintain your code is exposed to it.
15:43
< RichyB>
ToxicFrog|W`rkn: not to mention probably learning lex just to be able to take the lines apart, ugh.
15:43
<&ToxicFrog|W`rkn>
RichyB: strtok!
15:44
<&ToxicFrog|W`rkn>
(NOT A SERIOUS SUGGESTION. DO NOT DO THIS.)
15:44
< RichyB>
Too evil, I'd rather use lex.
15:44
< RichyB>
strtok is nothing but the easiest way to write a parser that segfaults. :P
15:45
<&ToxicFrog|W`rkn>
Yeah, hence the "not a serious suggestion"
15:45
<&ToxicFrog|W`rkn>
Azash: more generally, if you find yourself thinking "this is a project that involves lots of string processing; I should use C", it is almost certain that something has gone badly wrong.
15:46
<@Azash>
Online splitting a string in C is not very laborous though
15:48
<&ToxicFrog|W`rkn>
Compared to asm, sure~
15:51
< Syk>
"<&ToxicFrog|W`rkn> (NOT A SERIOUS SUGGESTION. DO NOT DO THIS.)" < how you know you're in the fun parts of a solution
15:52
<&ToxicFrog|W`rkn>
Azash: what HLLs have you used?
15:52
<@Azash>
HLLs?
15:53
<@Azash>
Heavy Lifting Languages?
15:53
<&ToxicFrog|W`rkn>
High Level Languages.
15:53
<@Azash>
Hm
15:53
<@froztbyte>
Azash: that's the first mistake
15:53
<@Azash>
What is?
15:53
<@froztbyte>
(that it isn't laborious)
15:54
<@Azash>
TF: C, Java, LUA come to mind
15:54
<@froztbyte>
string work is *hard* to get right in C, but very easy to prototype
15:54
<@Azash>
Some node.js but I refuse to call that a language
15:54
<&ToxicFrog|W`rkn>
froztbyte: seriously, it isn't?
15:54
< RichyB>
froztbyte: shockingly easy to get wrong.
15:54
<@froztbyte>
RichyB / ToxicFrog|W`rkn: see followup statement
15:54
<&ToxicFrog|W`rkn>
Azash: C and Java don't qualify as HLLs, so that's Lua and JavaScript then.
15:54
<&ToxicFrog|W`rkn>
froztbyte: no, I mean, seriously, how would you easily split a string in C
15:54
< RichyB>
ToxicFrog|W`rkn: I like that they did once but no longer do. ?
15:55
<&ToxicFrog|W`rkn>
Because the bar to clear here is split(str, pattern)
15:55
<@Azash>
TF: They.. don't?
15:55
<@froztbyte>
ToxicFrog|W`rkn: "you just invoke a quick function that you recursively call and it splits on spaces until there are none left and then return a linkedlist and then ..."
15:56
<&ToxicFrog|W`rkn>
Azash: C definitely doesn't unless you spend all of your time at systems level, in which case it's a HLL in your problem domain but not in general; it is, and was explicitly designed as, processor agnostic asm.
15:57
<&ToxicFrog|W`rkn>
Java is debatable. I generally don't consider it one because even its high-level features are a collosal pain in the ass to use, but I have a well documented bias against JAva.
15:57
<&ToxicFrog|W`rkn>
(if pressed to categorize Java I would call it a "mid level language"; it has safety features like garbage collection but lacks, e.g., closures and HOFs)
15:58
<@Azash>
ToxicFrog|W`rkn: Quick sketch http://pastebin.com/K34g3fTa
15:58
<@Azash>
Er
15:59
<@Azash>
Change 7 to "curr = superstring"
15:59
< RichyB>
Is there a proper "C--" language?
15:59
<@Azash>
That was from removing a useless var
15:59
<&ToxicFrog|W`rkn>
Azash: ok, so, here's the python equivalent
15:59
< RichyB>
C isn't perfect as processor agnostic asm, in that it's a) not great at exposing things like CPU FLAGS registers or CPU floating-point exception support and b)
15:59
<&ToxicFrog|W`rkn>
known_format = superstring.split(" ")
16:00
< RichyB>
and b) it's got annoying things like automatic integer conversions, gah.
16:00
< RichyB>
Is the answer to that, "LLVM bitcode"?
16:00
<@Azash>
I didn't claim it was less laborous than python, though :P
16:00
<&ToxicFrog|W`rkn>
As an added bonus, this doesn't edit the contents of superstring and thus potentially blow up some other piece of code that expects it not to change, or break if you hand it a const string.
16:01
<&ToxicFrog|W`rkn>
My argument is that it is not "not laborious" by any reasonable definition of the term, unless there's an implicit "...by comparison to the other languages I use" bit in there and you spend most of your time writing microcontroller firmware.
16:01
<&ToxicFrog|W`rkn>
Even in lua, which doesn't have a split builtin, it's like four lines and much harder to get wrong than the C version (and, like the python version, is const-safe)
16:02
<&ToxicFrog|W`rkn>
RichyB: well, stuff like FLAGS is CPU-specific, so you lose the "agnostic" part
16:02
<@froztbyte>
iirc even the java tokenizer-based version would be fairly "okay", although my knowledge of that is around 6 years old
16:02
<@froztbyte>
(although definitely more effort)
16:03
<&ToxicFrog|W`rkn>
The whole idea was to make it easy to write systems code that didn't need to completely rewritten for each of VAX, PDP-7, PDP-11, etc you wanted to run it on.
16:03
< RichyB>
ToxicFrog|W`rkn: yes. What I think I want is "the union of all FLAGS features on all interesting CPUs, with each feature emulated on all of the CPUs that it isn't actually supported on".
16:03
<&ToxicFrog|W`rkn>
froztbyte: the Java tokenizer would be pretty hard to make shockingly unsafe like the C version, but would also be 100 lines long and make you want to vomit~
16:03
< RichyB>
e.g. both x86 and ARM have "that last addition overflowed" bits, AIUI.
16:03
<&ToxicFrog|W`rkn>
What's an interesting CPU? :P
16:04
<&ToxicFrog|W`rkn>
holy shit how did I not already know about git rerere
16:04
< RichyB>
ia32, amd64, ARM, POWER. Not SPARC, don't bother with ia64 because nothing resembles it.
16:05
<&ToxicFrog|W`rkn>
Unless you're at the last place I worked, in which case interesting CPUs are AMD64 and TransMeta. Or where I did my research, in which case it's SPARC, AMD64, POWER, and IMAP5.
16:05
<&ToxicFrog|W`rkn>
This might be an argument for some #pragmas or something~
16:05
<@froztbyte>
ToxicFrog|W`rkn: well, as I said, my knowledge is somewhat stale, but I do recall some version of it with String Stream shit
16:06
<&ToxicFrog|W`rkn>
froztbyte: I am being slightly facetious here
16:06
<&ToxicFrog|W`rkn>
Like I said, I don't like Java
16:06
<@froztbyte>
but yeah, I'd seriously just make an inliner python thing
16:06
< RichyB>
ToxicFrog|W`rkn: fair. Really, by "interesting CPUs" I mean "every CPU that the person implementing the compiler has heard of". :P
16:06
<@froztbyte>
that block-reads stdin and uses some generator stuff
16:06
<@froztbyte>
for a "functional" approach to the problem
16:06
< RichyB>
(which is a list that naturally makes sense to expand over time)
16:07
< RichyB>
I think that the answer is already "LLVM bitcode, and use intrinsics-or-functions depending on the target/"
16:08
<@froztbyte>
ToxicFrog|W`rkn: it's hard to find good java, so I'm typically not quite in favour of it either
16:08 Derakon [Derakon@Nightstar-a3b183ae.ca.comcast.net] has quit [Ping timeout: 121 seconds]
16:08 Derakon [Derakon@Nightstar-a3b183ae.ca.comcast.net] has joined #code
16:08 mode/#code [+ao Derakon Derakon] by ChanServ
16:10
<&ToxicFrog|W`rkn>
froztbyte: I contend that the difficulty in finding good Java is due to to intrinsic properties of the language and its standard library.
16:10
<@froztbyte>
I wouldn't dispute this
16:10
<@froztbyte>
(and .NET seems to have similar issues)
16:11
<&ToxicFrog|W`rkn>
.NET - well, C# specifically - drew heavily on Java for inspiration and is/was hoping to occupy the same niche, I think.
16:11
<&ToxicFrog|W`rkn>
I haven't used C# much, though, so I can't really offer an informed opinion on it.
16:12
<@froztbyte>
my main experience of it comes from helping out an old housemate, who was working as group contractor monkey on a local telco/billing network
16:12
<@froztbyte>
suffice it to say that I don't ever want to deal with that ecosystem
16:13
<&ToxicFrog|W`rkn>
(all that said, I find the JVM rather handy, because it's targeted by some languages I quite like.)
16:14
<@Azash>
By the way, those who commented about the SQLite C interface
16:14
<@Azash>
What makes it bad?
16:15
< RichyB>
ToxicFrog|W`rkn: the C# team was mostly poached from Borland; AIUI it's a decent HLL with proper delegates, first-class functions and at-least-half-assed lambdas (not sure if it has whole-assed lambdas or not).
16:15
< RichyB>
Oh and they have a do-notation equivalent called LINQ and they're only slightly uncomfortable with the fact that it's actually a monad.
16:15
< RichyB>
*an interface to arbitrary monads, even.
16:16
<&ToxicFrog|W`rkn>
Not bad.
16:16
<&ToxicFrog|W`rkn>
(my experience with C#/.NET has consisted of helping debug a few KSP plugins, and dicking around with cljclr)
16:17
< RichyB>
I think that the story goes that Borland's management were a bunch of dickbags and Microsoft offered them money, offices with closed doors and actual dignity towards them as human beings and respect for their professional work.
16:17
< RichyB>
Er, in this case "them" means "Borland's software engineers", not "Borland's management".
16:18
<@froztbyte>
RichyB: the *language itself* seems capable
16:18
<@froztbyte>
RichyB: the users thereof seem to fail fairly commonly
16:19
<@froztbyte>
(I've got a friend who writes some pretty cool .NET/C# stuff, and shares interesting tidbits from language innards now and then)
16:19 * RichyB shrugs.
16:20
< RichyB>
I don't see how a language design could counteract "all my users are idiots" other than by scaring them off with a strict type system like Ada or Coq.
16:20
<@Azash>
Anyone?
16:20
<@froztbyte>
Azash: you should probably poke those who asked
16:20
<@froztbyte>
(by direct highlighting)
16:22
<@Azash>
So, Syk and RichyB, what are the downsides of the C bindings for SQLite?
16:22
< Syk>
it's utterly goddamn insane
16:23
<&ToxicFrog|W`rkn>
RichyB: that's kind of the core design philosophy of Java, though~
16:24
<&ToxicFrog|W`rkn>
(i.e. to be a language that makes it possible to cobble together something that works even if you have mostly unskilled programmers)
16:24
<@Azash>
In what way?
16:24
< Syk>
because it's so... rough
16:25 Derakon [Derakon@Nightstar-a3b183ae.ca.comcast.net] has quit [Ping timeout: 121 seconds]
16:27
<@Azash>
Mkay
16:30
< RichyB>
ToxicFrog|W`rkn: I think that froztbyte's complaint was "when I touch C#, I have to find myself dealing with code written by dumbshits", to which I think there is almost no acceptable solution.
16:30
< RichyB>
er, s/have to/tend to/
16:30
<@froztbyte>
well, I have this problem pretty generally
16:30
<@froztbyte>
my daily hate families: php, perl, tcl, bash, python2.4
16:31
<&jerith>
Why 2.4?
16:31
<@froztbyte>
not-so-commonly: m4, c, c++, java
16:31
<&jerith>
There have been two Debian stable releases with newer Pythons in them.
16:31
<@froztbyte>
jerith: zenoss stack, and some other blackbox computer stuff that comes as a packed appliance
16:32
< RichyB>
Ugh, I'm stuck mostly on 2.4 as well.
16:32
<@froztbyte>
(I've finally gotten the one big zenoss on 3.2-x, which is now python2.6 inside, but I still have two of the 2.5.x ones remaining)
16:32
< RichyB>
Protip: upgrade your fucking frameworks once in a while.
16:32
<@froztbyte>
rofl
16:32
<&jerith>
2.5.x isn't /that/ bad.
16:32
<@froztbyte>
jerith: uh, sorry, that wasn't very clear
16:32
<@froztbyte>
those are zenoss version numbers
16:32
<&jerith>
Oh, right.
16:33
<@froztbyte>
but yeah
16:33
< RichyB>
Company I'm working for has a shitton of semi-undefined-behaviour in code which effectively locks us into old Plone and therefore old Zope and hence old Python, because it's all too scary to uproot.
16:33
<@froztbyte>
I'm kinda just avoiding the existence of the other two zenoss servers until I leave
16:33
<@froztbyte>
they're working, I'm not gonna uproot them now
16:33
< RichyB>
Fortunately it's now getting slowly written out but man is this ever overdue.
16:33
<@froztbyte>
and apparently my company is struggling to find anyone else with zenoss clue
16:33
<@froztbyte>
so...yeah
16:33
<&jerith>
RichyB: Zope and Plone that old is terrifying.
16:33
<@froztbyte>
I'd rather leave things in a fairly stable state
16:34
<@froztbyte>
at least that way it'll keep working
16:34
<&jerith>
That's probably still around the time that Zope made you type Python code into web forms.
16:34
< RichyB>
jerith: this is Plone 3.3, not Plone 2.5, but yes.
16:34
<@froztbyte>
RichyB: it took me ~2 years and 5 3-week-long tries before I could finally complete this other update
16:34
<@froztbyte>
big framework'd systems are a bitch
16:35
<@froztbyte>
even more so when you lack enough hardware to test and plan the upgrade
16:35
<&McMartin>
Oh hey, git diff works across branches
16:35
<&McMartin>
Sweet
16:35
<&jerith>
You need to do smaller incremental updates more frequently.
16:35
< RichyB>
The functionality that allows you to type Python code into web forms has not by any means gone away even in trunk, although the necessity to do it on a daily basis is >90% gone.
16:35
<@froztbyte>
jerith: this *was* the incremental update
16:35
<&jerith>
McMartin: "git diff --cached" is also really handy.
16:35
<&McMartin>
That trick I knew
16:35
<@froztbyte>
jerith: zenoss 2.5.2 -> 3.0.0 -> 3.1.0 -> 3.2.1
16:36
<@froztbyte>
the 2.5.2 -> 3.0.0 jump was the most painful part
16:36
<@froztbyte>
and also the one that I could never prep properly previously for lack of enough resources
16:36
<&jerith>
froztbyte: Sure, but you should do those increments months apart when the new versions are still relatively new.
16:36
<@froztbyte>
jerith: cf. resources :)
16:36 Turaiel[Offline] is now known as Turaiel
16:37
<@froztbyte>
I'm not arguing with you, just remarking why I couldn't get it done
16:37
<@froztbyte>
in general I prefer to run as close to mainline stable as I can, provided I've confirmed it in testing
16:37
<@froztbyte>
(purely just to save pain in future upgrades)
16:37
<@froztbyte>
man, on that note
16:37
<@froztbyte>
I have this one server in lesotho
16:37
<&jerith>
This is why you always need 10-20% slack in your schedule.
16:38
<@froztbyte>
debian etch, amd64 kernel, 32bit userland
16:38
<@froztbyte>
god knows how that happened
16:38 * jerith still has three weeks of last year's leave that he can't take until a big thing is finished.
16:38
<@froztbyte>
but I'm basically just keeping it on life support
16:38
<@froztbyte>
there is *no way* I'm trying to fix that on the fly
16:38
<&jerith>
(I *could* take it, but I like my colleagues too much to do that to them.)
16:38
<@froztbyte>
(it's also the most prominent host in the network, since it collects all the important things)
16:44 Turaiel is now known as Turaiel[Offline]
16:56
<&ToxicFrog|W`rkn>
McMartin: not sure if you saw it earlier, but I just today learned about the configuration options "merge.conflictstyle diff3" and "rerere.enabled true" (and rerere in general)
16:56
<&ToxicFrog|W`rkn>
rerere in particular will save me a lot of time when rebasing.
16:56
<&ToxicFrog|W`rkn>
(and diff works not just across branches, but between any two commits in the repository)
16:59
<&McMartin>
What is rerere?
17:00
<&ToxicFrog|W`rkn>
Reuse Recorded Resolution.
17:01
<&ToxicFrog|W`rkn>
Basically, when you have a merge conflict, and successfully resolve it, git will automatically save both the original conflict and the resolution.
17:01
<&ToxicFrog|W`rkn>
If you have the same conflict again - say, you're rebasing the same branch further along - it'll automatically re-use the saved resolution.
17:02
<&ToxicFrog|W`rkn>
There's an actual "git rerere" command to interact with this system directly, and setting "rerere.enabled true" in config enables the automatic parts.
17:45
< Syk>
RichyB: oh, on old zope and plone and python
17:45
< Syk>
my old work had a hosted zope/plone thing
17:46
< Syk>
it was running a version of apache that had a bugfix in 2003, Python... 2.3, I think, and horrendously ancient zope/plone
17:46
< Syk>
"Zope/(Zope 2.7.7-final, python 2.3.5, linux2) ZServer/1.1 Plone/2.0.5"
17:46
< Syk>
there we go
17:47
< Syk>
Plone 2.0 was released in 2004
17:48
< RichyB>
Yeah, you're not going to have fun with that.
17:48
< Syk>
it broke so often
17:48
< Syk>
oh and
17:48
< RichyB>
Plone 4.3 runs at an okay rate (not fast, but okay).
17:48
< Syk>
this was run by a organisation, specifically for governments
17:49
< RichyB>
Plone 3.3 has epic speed issues.
17:49
< RichyB>
Plone 2.x is like molasses on Pluto.
17:49
< Syk>
I am so very much tempted to get a list of all their clients, and email them all saying "HEY btw, they're using a version of Apache, Zope and Plone with known security defects"
17:49
< RichyB>
4.x is seriously epically nicer. Judging Plone by 2.x is like judging the entirety of Microsoft by looking at Windows ME or Bob.
17:55
< Syk>
ehhh
17:55
< Syk>
I'm still not overly warm on Plone
17:55 * Syk is the NIH Queen, so, uh
17:56
< Syk>
these are the guys doing it... check their sidebar, at the bottom on the left http://www.linkingcouncils.com/
17:56
< Syk>
pro.jpg
17:57
< RichyB>
It's still annoying to hear you repeatedly rubbish something that's the hard work of an awful lot of people for reasons that are pretty much bullpoo by now.
18:00
< Syk>
Has Plone/Zope changed architecturally since 2.0 and 2.7?
18:00
< Syk>
speed or otherwise
18:00
< Syk>
or rather, 'other than speed'
18:03
< RichyB>
They replaced the vast majority of the PythonScript objects with a multi-method lookup on the context and request objects. It's still an object-traversal framework.
18:03
< Syk>
I mean as far as the interface
18:04
< Syk>
note: I said I only used a hosted solution
18:04
< Syk>
and the zope/plone/whatever backend was absolutely horrendous
18:05
< Syk>
for example: changing a password required me to use the most single worst interface I have ever come across, in the Zope (I think?) backend
18:06
< Syk>
and does it still do everything in the old, non-AJAX way?
18:06
< RichyB>
That's pretty far gone. There are sensible forms.
18:06
< RichyB>
Yes, pretty much everything continues to be usable with lynx.
18:06
< Syk>
is there an option for AJAX?
18:06
< RichyB>
I have no idea.
18:06
< Syk>
well if there isn't that's pretty trash
18:07
< RichyB>
The fuck why are you wanting to slow everything down by adding masses of JS to it?
18:07
<@Tamber>
Because then she'd have nothing to bitch about~
18:07
<@Tamber>
Also, buzzword compliance.
18:07
< Syk>
because waiting seconds to move between forms is the most user unfriendly thing ever
18:07
< RichyB>
You're just going to end up making the same requests for the same tasks anyway, only now you've added a huge client-side parsing and executing burden and a heap of browser-related compat bullshit.
18:08
< RichyB>
No, you don't wait seconds to move between forms if the forms take <50ms to load and portal_scripts and portal_styles are set to concatenate, minify and serve with caching headers. (I think all of which is default out of the box right now.)
18:10
<@[R]>
There are nice clean ways to provide both, but they require forethought.
18:11
< Syk>
RichyB: that's all well and good if you have a low-latency connection
18:12
< Syk>
I've had much more success using sufficiently JS-ised things over higher latency links than whole-page-refresh things
18:12
< RichyB>
I reiterate, it makes no damn difference if you're just going to end up waiting for the AJAX requests to go through anyway.
18:13
<@[R]>
Incorrect
18:14
< Syk>
in my experience, it does, because the whole page refresh is incredibly jarring
18:14 * Tamber puts Syk in a jar.
18:14
<@[R]>
I've seen (and build JS interfaces) that cached locally to great success.
18:14
< RichyB>
If you're reloading more than just the HTML on page transition you're doing it wrong anyway.
18:14
< Syk>
there is additionally that some things should not require full-page refreshes
18:15
< Syk>
for example, in a File, you should not need to reload the page to switch tabs
18:15
< Syk>
the tabs should be in JS, and with things as simple as a description field in other tabs, loaded with the original request
18:16
< Syk>
so then if I want to check something in a tab, it takes 0 time, rather than 500ms+ waiting to see a single line of text
18:19
<@Tarinaky>
Prolog, home of the world's most useless debugger.
18:20
< RichyB>
Syk: hmeh, fine.
18:20
< RichyB>
Tarinaky: it's not useless, just bizarre and alien!
18:20
<@Tarinaky>
"ERROR: is/2: Arguments are not sufficiently instantiated".
18:20
<@Tarinaky>
If this was gdb I'd at least get a stacktrace :/
18:20
<@Tarinaky>
Or a line number.
18:21
< RichyB>
Aren't you getting a break in the appropriate context?
18:21
<@Tarinaky>
I don't think so?
18:22
< RichyB>
SWI-Prolog or did you find something less good
18:22
<@Tarinaky>
SWI-Prolog.
18:23 Derakon [Derakon@Nightstar-a3b183ae.ca.comcast.net] has joined #code
18:23 mode/#code [+ao Derakon Derakon] by ChanServ
18:23
< RichyB>
It has a fairly nice one built in. IIRC you want to run your controversial predicate with "trace", hit "c" for continue and it should run up until it crashes.
18:24
< RichyB>
Those instructions might be total bunk because it's been *ages* since I last touched any Prolog, but do google for how to use the debugger.
18:24
<@Tarinaky>
Yeah. Which isn't massively helpful.
18:25
<@Tarinaky>
It's high-lighting a line in purple that it previously had no issue with.
18:25
<@Tarinaky>
Give me something to work with here Prolog :/
18:26
< RichyB>
You should be able to dump the arguments and variables in scope with their degree of defined-ness clearly labelled.
18:26
<@Tarinaky>
In English?
18:26
< RichyB>
Your predicates take formal parameters. Those parameters possibly have holes in them.
18:27
< RichyB>
You can print from the debugger without affecting what is/isn't defined so far.
18:28
<@Tarinaky>
How?
18:28
< RichyB>
I have forgotten. Don't you have a web browser or something?
18:30
<@Tarinaky>
Use Web Browser on Code... I don't see how that will help.
18:31
< RichyB>
Your web browser can be used to access a thing called the "world wide web", which has a site on it called "google", which you can use to find information, advice and photographs of kittens.
18:32
<@Tarinaky>
Google wants something called 'search terms'.
18:32
<@Tarinaky>
Where do I get those?
18:32
< RichyB>
I think you can just type in those old AOL keywords, that seems to work.
18:33
<@Tarinaky>
I just searched for "those old AOL keywords". I don't see anything related to prolog though..
18:34
< RichyB>
Try "SWI Prolog debugger".
18:35
<@Tarinaky>
And what am I looking for?
18:39
< RichyB>
Documentation. Read it and try to understand it.
18:39
< RichyB>
No I am not going to hold your hand through "how do I read a web page?"
18:39
<@Tarinaky>
I'd appreciate some help trying to find how to find out why a variable is coming unbound.
18:39
<@Tarinaky>
Which isn't as simple as just asking google when I don't even know what the hell that means.
18:40
< RichyB>
I strongly recommend that you start by learning Prolog, then.
18:40
<@Tarinaky>
That's what I'm /trying/ to do.
18:42
< RichyB>
Fair enough. You're just going to get bewildered if you try to learn it by debugging it, though. Has anyone recommended a book or tutorial to you?
18:42
<@Tarinaky>
No. I worked through some simpler problems first and got those to work. Albeit with copious help.
18:42
<@Tarinaky>
I think Prolog has the least helpful learning material on the internet.
18:42
<@froztbyte>
try tcl :/
18:42
<@froztbyte>
or at least, try it 4 years ago
18:43
<@froztbyte>
I wanted to rip someone's face off
18:43
<&McMartin>
Prolog as a language cannot be understood without reverse engineering its evaluation process, AFAIK.
18:43
< RichyB>
Tarinaky: learnprolognow.org has a tutorial that is okay.
18:44
<@Tarinaky>
I did that one.
18:44
< RichyB>
The best book on Prolog that I have read is called "The Art of Prolog" but it's a) a fucking tome, b) bit dry, c) it was written prior to the ANSI standard (!) so I had some trouble working out what some of the symbols translated to in terms of characters I could actually type on my keyboard.
18:44
<@froztbyte>
rofl, ouch
18:44
< jeroud>
I should probably look at Prolog sometime.
18:44
<@Tarinaky>
I also have a time limit, given I have to get two assignments done. :/
18:44
<@froztbyte>
talk about arcane
18:44 Derakon [Derakon@Nightstar-a3b183ae.ca.comcast.net] has quit [Ping timeout: 121 seconds]
18:45
< RichyB>
froztbyte: yeah, it took me several hours of frustrated searching to work out that whatever symbol AoP was using for "not" was actually written "\+" ni SWI-Prolog.
18:45 Derakon [Derakon@Nightstar-a3b183ae.ca.comcast.net] has joined #code
18:45 mode/#code [+ao Derakon Derakon] by ChanServ
18:48
<@froztbyte>
okay, just that sentence alone now also has me thinking I should check out prolog at some point
18:48
<@Tarinaky>
Oh goodie.
18:48
<@Tarinaky>
Now I have an infinite loop :/
18:48
<@froztbyte>
consider it an advancement
18:49
<@froztbyte>
now instead of *nothing*, *something* happens, albeit too much
18:49
< Syk>
it's like discovering the soda fountain doesn't stop, without the diabetes at the end!
18:50
<@froztbyte>
I'm not sure that's *directly* comparable
18:50
<@froztbyte>
but sure
18:50
< Syk>
well, if there's a fountain of raspberry fanta
18:50
< Syk>
you would
18:50
<@froztbyte>
naw
18:50
<@froztbyte>
fanta pineapple, then orange
18:51
<@froztbyte>
and only a bit of each
18:51
< Syk>
we never had pineapple over here :(
18:51
<@froztbyte>
after ~600ml, the flavour of orange tops out for me
18:51
< Syk>
raspberry is rare as hell, almost as rare as vanilla coke
18:51
<@froztbyte>
and at ~1.1l on pineapple
18:51
<@Tarinaky>
There's one problem with infinite loops as an 'advancement' though.
18:51
<@Tarinaky>
I don't even get an error.
18:51
<@froztbyte>
Syk: we have lots of both of those
18:51
<@Tarinaky>
Not so much as a warning.
18:52
<@froztbyte>
Syk: or did, last time I looked
18:52
<@Tarinaky>
I'm sorely tempted to suggest that the reason Prolog uses .pl as its extension is because it's easier to solve your problem in Perl.
18:55
< Syk>
froztbyte: :(
18:56
< Syk>
froztbyte: I can only get raspberry fanta at the fountain at Subway, and the vanilla coke in 2L bottles at Coles :(
18:56
< Syk>
the shops also stocked Dr Pepper for like, a week
18:56
< jeroud>
Syk: I haven't seen either of those in years.
18:56
< Syk>
everyone hated it
18:57
< Syk>
Tarinaky: maybe try some print statements? print your boundaries, see what's not calculating correctly?
18:57
< Syk>
jeroud: and yet the shitty coke zero is everywhere :(
18:58
< Syk>
I know one person that drinks coke zero. one. I know more people who drink childrens fruit drink boxes in their 20s than coke zero drinkers
18:58
<@Tarinaky>
Syk: Boundaries?
18:59
<&McMartin>
You know two, at least if by "drinks coke zero" you mean "prefers it to diet coke"
18:59
<@froztbyte>
the loop boundaries
18:59
<@Tarinaky>
There shouldn't be a loop at all.
18:59
< Syk>
...huh
18:59
<&McMartin>
Prolog is... different
18:59
<@froztbyte>
then salt your code with print statements until you figure out where it's jumping into loop ;)
18:59
<@Tarinaky>
The only recursive function is on the other side of a cut.
18:59
<&McMartin>
Yeah, um
19:00 Kindamoody|out is now known as Kindamoody
19:00
<@Tarinaky>
I know where it's going in to the loop because of that cut.
19:00
<&McMartin>
Prolog's primary control flow exists nowhere in the code, AIUI.
19:00
< jeroud>
I find coke zero less offensive than diet coke or coke lite.
19:00
< Syk>
McMartin: as in, in the shops with all the drinks, they grab a basketful of coke zero, call the Pepsi drinkers in the group 'plebians' and make suggestions about regular Coke drinkers weight
19:00
<@froztbyte>
Tarinaky: McMartin's probably about to comment, but I think it's not so much a case of recursion as you happen to have the machine state or something the wrong way
19:00
<@Tarinaky>
But there's only a finite number of rules it can use to evaluate the thingie it's at.
19:00
<&McMartin>
This is because coke zero is based on the normal coke formula, while diet coke is based on New Coke
19:01
<&McMartin>
froztbyte: While, in the strictest sense, Prolog is my first computer language, I have no useful knowledge of it.
19:01
< Syk>
protip: vanilla coke goes very well with a shot of jameson in the same glass
19:01
<&McMartin>
Just that it is more alien than Haskell. =P
19:01
<@froztbyte>
New Coke - The drug of Choice for the discerning Posthuman droid
19:01
< jeroud>
I dislike the taste of pretty much all the non-nutrative sweetners.
19:01
<&McMartin>
("In the strictest sense" - as a toddler, my father set me in front of a Prolog system to stress test it)
19:02
< Syk>
McMartin: ahh, the Baby Fuzz Test
19:02
<&McMartin>
\o/
19:02
<@froztbyte>
McMartin: oddly, even before gaining much practice with haskell, I found it remarkably easy to read and understand
19:02
< Syk>
as far as testing goes
19:02
<@froztbyte>
McMartin: I'm not sure if my brain is just suited to haskell, or broken
19:02
<@froztbyte>
(fsvo broken)
19:02
<@Tarinaky>
froztbyte: I still haven't worked out how you divine working code from the heavens yet though.
19:02
<&McMartin>
froztbyte: Functional paradigms are Inherently Superior, clearly~
19:03
< Syk>
the only time I have ever had a random kernel panic on linux is when my friend sat down to type out part of a report on my netbook
19:03
<@froztbyte>
Tarinaky: don't look at me for the answer to that
19:03
< Syk>
he sat in front of it and the kernel exploded
19:03
<@froztbyte>
Tarinaky: I'm an ops person by trade
19:03
< Syk>
it might have been related to overclocking the atom to 2.06GHz but hey
19:03
<@froztbyte>
this means that I bash the living shit out of a thing until it works
19:03
<@froztbyte>
then refine it from there.
19:03
< jeroud>
McMartin: My team lead's infant daughter is one of our most important QA people.
19:03
<@froztbyte>
(I overstate it, but I do have quite some tenacity to make a thing work)
19:04
<&McMartin>
PLOKTA
19:05
<@froztbyte>
jeroud: in a similar vein, I've found that using a full ISP's worth of internet traffic is a good fuzz test of a daemon
19:05 Turaiel[Offline] is now known as Turaiel
19:05
<@froztbyte>
(you just dnat *all* the traffic at your application's host:port)
19:05
<@Azash>
I think you'll be dealing with the wrong kind of fuzz doing that, froztbyte
19:06
<@froztbyte>
I've made bind break by feeding it some skype.
19:06
<@froztbyte>
:D
19:06
<@froztbyte>
(.....about 35Mbps of skype...)
19:07
<@Tarinaky>
The only thing in Prolog I get is that recursive whatsits look like inductive proofs.
19:07
<&McMartin>
I like to think of Prolog as "pretend declarative"
19:08
<@Tarinaky>
I'm getting nowhere with this :/
19:09
<@Tarinaky>
Right. That's why it's doing an infinite loop.
19:09
<@Tarinaky>
It's decided to be really silly.
19:09
< Syk>
my old supervisor was an excellent fuzzer
19:09
< Syk>
since he would do the least logical thing at all times in my applications
19:09
< jeroud>
Bleh. Just spent ages figuring out how to type "Zo?" on my phone.
19:10
<@Tarinaky>
How do I assert what values a variable can actually be?
19:10
< Syk>
I had 3 buttons in a form, named 1, 2 and 3
19:10
< Syk>
he pressed them in reverse
19:10
< Syk>
and then said 'why can I do that'
19:10
< Syk>
I was then like D: because it broke the machine, but still
19:11
< Syk>
lessons in UI design: sometimes people will do the reverse of the instructions, sometimes to make a point, sometimes because they can't read - be prepared for both
19:11
<&McMartin>
s/can't/don't/
19:12
<&McMartin>
UX experts are the most cynical bastards I've ever met
19:12
<&McMartin>
Because they've seen the retina-tracking studies and they know for a goddamn fact that users do not read error dialogs before dismissing them or anything like it
19:12
<&McMartin>
They design for nonsentient panic robots made of meat paste
19:13
<&McMartin>
Because as a rule this is what users are
19:13
<@Tarinaky>
I'm not sure 'meat paste' is an accurate description.
19:14
<@Azash>
It's more of a meat jelly, agreed
19:14
<@Tarinaky>
It implies the user is predominantly made up of muscle.
19:14
< Syk>
nono, 'mentally deficient meat jelly'
19:14
<@Tarinaky>
What about Lipids?
19:14
< Syk>
don't they manufacture tea?
19:14
<@Tarinaky>
And giblets.
19:14
<@Azash>
Syk: I prefer "members of the turnip MENSA"
19:14
<@Tarinaky>
That's Liptons.
19:14
< Syk>
Azash: I wonder if they're as elitist
19:15
<&McMartin>
I will allow that offal is also meats.
19:16
<@Tarinaky>
Depends on the offal.
19:16
<&McMartin>
TASTY SALTED PIG PARTS
19:16
<@Azash>
Syk: I once entertained the idea of joining but I realized I don't look good in a fedora
19:16
<&McMartin>
( http://www.boccalone.com/ )
19:16
<@Tarinaky>
Also, relevant to the discussion http://www.youtube.com/watch?v=LAlqp0_a0tE
19:16
<&McMartin>
(Not pictured: the "Offal good!" sign)
19:17
< jeroud>
Most of the Mensa people in the Durban group weren't elitist at all.
19:18
< jeroud>
We did tend to do quite well in the pub quiz, but that was mostly because we had a more diverse team background than most of the others.
19:19
<@iospace>
why working in the embedded field sucks at times: hardware
19:19
< Syk>
why working in the software field sucks at times: hardware
19:19
<@Tamber>
"why working in the hardware field sucks at times: software"
19:19
<@iospace>
Syk: let me rephrase
19:19
< Syk>
eg. USB :(
19:20
<@iospace>
why working in the embedded field sucks: not having the specific piece of hardware you need to run your tests on
19:20
<@iospace>
normally this isn't an issue but this time it is D:
19:21
< Syk>
iospace: take a page out of a public contractor's book
19:21
< Syk>
say you did the tests, everything was fine, go to the pub at 3pm
19:23
<@iospace>
...
19:23
<@iospace>
not gonna fly
19:23
< jeroud>
iospace: You're in the aerospace industry!?
19:24
<@iospace>
jeroud: tangentially :V
19:24
<@iospace>
our hardware can be used for aerospace purposes o:
19:26
<@Tarinaky>
Nope. Still doing a ridiculous loop :/
19:27
< Syk>
iospace: maybe you need to transfer to the public sector then :P
19:28
<@Tarinaky>
For some reason it's building a ridiculous string.
19:28
<@Tarinaky>
And I can't for the life of me see why.
19:28
< jeroud>
Syk: I could never work like that.
19:29
< Syk>
jeroud: to be honest, I couldn't either. too much work to do!
19:29
<@Tarinaky>
http://pastebin.com/ULAzwUtN << What am I doing wrong?
19:29
<@Tarinaky>
The bottom line is outputting ridiculous chains of 'none'.
19:30
<@Tarinaky>
As in "nonenonenone"
19:30
<@Tarinaky>
And it'd just doing this to infinity.
19:30
< jeroud>
If I have to leave the job half-done and lie about it, I'll become a person I hate.
19:31
<@froztbyte>
Tarinaky: what happens if you unpack those steps?
19:31
< RichyB>
Tarinaky: you don't want to assert \+member(Head, SearchList) in hits()
19:31
< RichyB>
(This isn't necessarily the proximate cause, I'm just reading your file from the top.)
19:32
<@Tarinaky>
RichyB: Why don't I want to assert that there?
19:32
<@Tarinaky>
froztbyte: Unpack what?
19:33
<@froztbyte>
so, I can't speak prolog worth a damn
19:33
<@froztbyte>
but
19:33
<@froztbyte>
tory(YearOfBirth, AnualIncome, MyEducation, FathersEducation, Gender, Likes, Dislikes, Confidence) :-
19:33
<@froztbyte>
8 parameters
19:34
<@froztbyte>
and by my count, on the following lines, confidence is the 9th parameter
19:34
<@froztbyte>
(assuming they're actually parameters)
19:34
<@froztbyte>
so at the very least I'd check that
19:35
<@Tarinaky>
They're not really parameters.
19:35
<@Tarinaky>
I don't think.
19:35
<@froztbyte>
yeah, I don't know the exact term for it
19:35
<@froztbyte>
but you seem to have a mismatch of Things there
19:36
< RichyB>
Tarinaky: \+ has surprisingly complicated semantics (it's "the predicate cannot possibly be true"), which get a bit fun/wonky.
19:37
<@Tarinaky>
RichyB: Yes... But without it it'll be able to come up with two values for the number of hits between two lists.
19:37
<@Tarinaky>
Which isn't what I want at all.
19:39
< RichyB>
Yeah. I'd put a cut right after member(Head, SearchList).
19:40
< RichyB>
and change the third clause of hits/3 to just "hits(Tail, SearchList, Sum)" instead.
19:41
<@Tarinaky>
Either I don't understand \+ but I think that's semantically identical.
19:41
< RichyB>
\+ is generally problematic in Prolog.
19:41
<@Tarinaky>
\+ A :- call(A), !, fail. or something like that.
19:43
< RichyB>
Try hits([0,0], [0,1,0], X) and, answer "n" every time and see how many times you backtrack.
19:44
<@Tarinaky>
I'd prefer to get it working before I start optimising it :/
19:45
<@Tarinaky>
Particularly when your test case is outside normal operation >.>
19:46
< RichyB>
Oh of course that loops forever.
19:46
<@Tarinaky>
?
19:46
< RichyB>
Er...
19:47
< RichyB>
You've defined both a tory/7 and a tory/8. I assume that you meant for the tory/7 predicate to actually be a tory/8 predicate?
19:48
< RichyB>
So your base case isn't going to fire.
19:49
< RichyB>
Next issue is that the last alternative for tory/8 has got a recursive call to tory/8 in it and there's nothing stopping that recursive call from ending up in tory/8's last clause again, calling tory/8 and sending you into tory/8...
19:50
<@Tarinaky>
Okay. How do I stop it recursing into itself?
19:50 Zemyla [zemyla@Nightstar-8fbb7981.compute-1.amazonaws.com] has quit [Ping timeout: 121 seconds]
19:50
<@Tarinaky>
Or rather..
19:50
<@Tarinaky>
How do I assert that Likes and Dislikes have to be non-empty?
19:51
<@Tarinaky>
Prolog doesn't seem to have anything convenient for that :/
19:51
< RichyB>
You can perform a unification in the middle of a predicate using the = operator.
19:52
< RichyB>
Likes = .(_, _),
19:52
<@Tarinaky>
I'm not sure that's what I need/want/mean.
19:52
< RichyB>
It's precisely what you just asked me for.
19:53
< RichyB>
But your 3rd clause for tory/8 really doesn't make sense denotionally.
19:54
<@Tarinaky>
I meant I only want it to match non-empty likes or dislikes.
19:54
<@Tarinaky>
So then it can recurse into the forms /with/ empty likes/dislikes.
19:54
< RichyB>
You're a tory if... your education and your father's are both members of the correct enum, your list of likes is equal to the things that tories canonically like, your list of dislikes is equal to the set of things that tories dislike, and...
19:55
<@Tarinaky>
That's not actually what it says.
19:55 Zemyla [zemyla@Nightstar-8fbb7981.compute-1.amazonaws.com] has joined #code
19:55 mode/#code [+o Zemyla] by ChanServ
19:56
<@Tarinaky>
It checks the number of things you like against the list of things tories dislike and the list of things you dislike against the list of things tories like.
19:58
< RichyB>
toryLike(Likes) unifies Likes with the value ['nimbyIssues'] because that is the only value on which toryLike/1 will succeed.
19:59
<@Tarinaky>
Right. Which I got as a work-around for Prolog not having constants.
19:59
<@Tarinaky>
And now my internet wants to be silly so I guess I might see some replies in the next hour :/
20:01
<@Tarinaky>
Hence why it's toryLike(ToryLike) :p
20:01
< RichyB>
Oh wait you have toryLike(ToryLike), not toryLike(Likes), blah.
20:04 Vornicus [vorn@ServerAdministrator.Nightstar.Net] has joined #code
20:04 mode/#code [+qo Vornicus Vornicus] by ChanServ
20:05
< RichyB>
I'm having trouble seeing why the cut on line 47 is there.
20:05
<@Tarinaky>
I think it made its way in there during debugging.
20:06
<@Tarinaky>
Anyway. The best solution I've been able to come up with is renaming two of my tory clauses to tory1.
20:06
< RichyB>
So if you want the last clause in tory/8 to only match non-empty Likes and Dislikes lists, you literally write "Likes = .(_, _)," and "Dislikes = .(_, _)," as conjunctions in there.
20:06
<@Tarinaky>
This seems to have worked.
20:07
<@Tarinaky>
What does .(_, _), mean?
20:07
< RichyB>
Likes = .(_, _). literally says "unify the variable Likes with a cons cell whose car is anything and whose cdr is anything"
20:07
< RichyB>
It's the same as matching "Likes = [IDoNotGiveAFuckAboutThisVariable|IDoNotGiveAFuckAboutThisVariableEither],"
20:08
<&ToxicFrog|W`rkn>
I'm going to steal "nonsentient panic robots made of meat paste" because it is so, so true ;.;
20:08
<@Tarinaky>
Wouldn't that be Likes = [_,_] ?
20:08
<@Tarinaky>
Err
20:08
<@Tarinaky>
Wouldn't that be Likes = [_|_] ?
20:08
<&ToxicFrog|W`rkn>
A depressing number of supposed programmers completely melt down in the face of an error message.
20:08
< RichyB>
Tarinaky: no, that unifies Likes with a list of length exactly two.
20:08
<@Tarinaky>
Even with the bar?
20:08
< RichyB>
Tarinaky: yes, [_|_] is syntactic sugar for one cons cell.
20:09
<~Vornicus>
Likes = .(_,_) ---you enjoy blemishes sticking off the sides of butts?
20:09
< RichyB>
[1, 2, 3] is .(1, .(2, .(3, [])))
20:09 * ErikMesoy puts on Sir Mix-A-Lot.
20:10
<@Tarinaky>
Right. Now I just have to do the rest of the assignment :/
20:10
<@Tarinaky>
How do I express something that minimises or maximises a number?
20:15
< RichyB>
In pure Prolog, I don't know of any mechanism other than walking over (possibly a subset with just the edge cases) the possible values and picking the maximum element.
20:15
< RichyB>
You can transform an alternation into list membership by... I have forgotten the name of the predicate.
20:17
< RichyB>
findall/3 and bagof/3 may be your friends.
20:17
<@Tarinaky>
Yeah. I figured building a list was somewhere in the right area.
20:17
< RichyB>
There are also numerical constraint solvers in some prolog implementations but I've not idea how the shit you use them.
20:23
< RichyB>
Tarinaky: so, to use the debugger in SWIPL profitably, type "trace." and then type the troublesome query. Keep hitting "enter" and swipl will single step into each predicate and back out again, displaying variable assignments as it goes.
20:23
< RichyB>
There are lots of other shiny buttons on the trace interface but I can't remember what any of them do.
20:24 Turaiel is now known as Turaiel[Offline]
20:25
< RichyB>
The other thing that's going to be bloody helpful is that you want to run the help/0 by typing "help." at least once in order to bring the up the reference manual browser (which is a bit... it's clearly written in Tk, but it's nice anyway) .
20:31 Kindamoody is now known as Kindamoody[zZz]
20:52
< RichyB>
Tarinaky: good luck!
20:52 Syk is now known as syksleep
20:55 Vash [Vash@Nightstar-221158c7.sd.cox.net] has joined #code
20:55 mode/#code [+o Vash] by ChanServ
21:10
< RichyB>
Sweet. MS Windows contains a TTF parser and renderer in the kernel.
21:11
< RichyB>
And it's fairly easy to get browsers to pass arbitrary crafted TTF files to it by putting them into webpages as webfonts.
21:11
< RichyB>
And it's a bit buggy. http://www.f13-labs.net/infiltrate2013/INFILTRATE2013_Lee.pdf
21:11
<@froztbyte>
R
21:11
<@froztbyte>
O
21:11
<@froztbyte>
F
21:11
<@froztbyte>
L
21:13
<&ToxicFrog|W`rkn>
In
21:13
<&ToxicFrog|W`rkn>
the
21:13
<&ToxicFrog|W`rkn>
KERNEL?
21:13
< RichyB>
GDI, yo.
21:14
<@Tamber>
They must miss all the memory protection of DOS.
21:16
< RichyB>
Funnier yet, this was linked me in this context: https://twitter.com/0xabad1dea/status/326422060819705857
21:17
< RichyB>
<@0xabad1dea> Check out this PDF on malicious fonts :3 ...
21:17
<@Tamber>
Ahahahahahaha!
21:17
<@Tamber>
"*click* ...oh, shit; wait, no!"
21:17
< RichyB>
(five minutes later) <@0xabad1dea> ...To the best of my knowledge, that PDF is safe :p I hope q:
21:17
< RichyB>
My reaction too.
21:18
< RichyB>
Well, that and I was strongly assuming that I would probably be fine
21:18
< RichyB>
who the Hell can be bothered to attack FreeType, after all? ;)
21:18
<@Tamber>
If it exists, at some point someone'll want to attack it.
21:18
<@froztbyte>
I was saved by crappy internet!
21:18
<@Tamber>
:)
21:18
<&ToxicFrog|W`rkn>
RichyB: I kind of assumed that GDI, like X, ran in user mode
21:19
<@froztbyte>
don't make those sort of assumptions
21:19
<@froztbyte>
there are Scary Things in windows
21:19
< RichyB>
The fact that their PoC causes blue screens puts the boot to that.
21:19
<@froztbyte>
I recall some weird part of Trident could also cause some lollerific stuff
21:19
<@froztbyte>
and I've personally made the graphics subsystem derp by taking control from it with inline asm from pascal
21:19
<@froztbyte>
(though that was on XP)
21:20
< RichyB>
ToxicFrog|W`rkn: I know! Like, the Hell do you even want to be making >1 syscall per character anyway? Frickin' fill out a buffer in userland and blit it all in one go!
21:20
< RichyB>
Unless of course what you're actually doing is filling out a buffer with a bunch of unicode codepoints, which would be even funnier.
21:21
< RichyB>
Hey guise, what happens if I stick an invalid combination of combining diacriticals in here?
21:21
<@Tamber>
*foom*
21:22
<@froztbyte>
RichyB: welllllll
21:22
<@froztbyte>
RichyB: a friend of mine was working for the mozilla localisation team at one point
21:23
<@froztbyte>
he's been able to tell me Interesting Stories about how various software actually got *that exact thing* wrong
21:23
< RichyB>
Bluescreen?
21:23
<@froztbyte>
well, best-case scenario was "misrender"
21:23
<@froztbyte>
worst-case scenario I've heard of was "what the fuck just happened to my program?!"
21:23
<@Tamber>
The worst case scenario is unspeakable horrors from beyond, gnawing on your face.
21:24
<@froztbyte>
like, it rendered wrong on one field, then suddenly everything all over started freaking out
21:24
< RichyB>
Something took a wild pointer out and started corrupting other data structures?
21:24
< RichyB>
Or some state machine got out of sync and started going through lots and lots of supposedly "unreachable" states?
21:25
<@froztbyte>
something like a state machine breaking in the render process
21:25
<@Tamber>
Thou shalt not get here.
21:25
<@froztbyte>
due to addressing break
21:25
< RichyB>
<@0xabad1dea> @RichardBarrell yeah. TTF has always been done in the kernel. A surprising number of people never realize that...
21:25
<@Tamber>
*whimper*
21:26
<@froztbyte>
around the XP days I got Pretty Good at windows
21:26
<@froztbyte>
and then decided I don't ever want to run it
21:26
<@froztbyte>
because windows is Just Not Very Good
21:26
<@froztbyte>
now I have an install around for games, and if I'm booted into it, I just do nearly * remotely on another linux machine
21:31
< RichyB>
I know it's not new information but it bears repeating: slashdot commenters are on average really thick.
21:31
<@Tamber>
In other, shocking, news: fire is hot, water is wet.
21:31
< ErikMesoy>
Bears shit in woods, Pope is Catholic.
21:31
< RichyB>
Air resistance continues to be a drag.
21:31
<@Tamber>
*badum-tish*
21:32
<@froztbyte>
what, no-one's invoked Godwin yet?
21:32
<@froztbyte>
damned nazis
21:33 * iospace beats froztbyte with Godwin
21:33
< RichyB>
but I mean seriously
21:34
< RichyB>
The mean boingboing.net commenter is less dumb.
21:34
<@froztbyte>
less practiced*
21:47
< RichyB>
Amazon S3 seems a bit bizarrely expensive on some level. To push 120GB in and then out again once would cost me about $50. o_O
21:48
<@froztbyte>
really?
21:48
<@froztbyte>
that seems high
21:49
< RichyB>
Ah, no, $24.
21:49
< RichyB>
Still, kind of expensive.
21:49
<@froztbyte>
okay yeah, that seems more sane
21:49
<@froztbyte>
if you need that much random-space-on-the-internet
21:49
<@froztbyte>
I can give you a temp shell account
21:51
<@froztbyte>
elegua% df -h
21:51
<@froztbyte>
Filesystem Size Used Avail Use% Mounted on
21:51
<@froztbyte>
/dev/sda3 691G 284G 373G 44% /
21:51
< RichyB>
For comparison, serverlove.com will sell me bandwidth for about ?2/120GB. o_O
21:52
< RichyB>
froztbyte: this is for a one-off backup/restore. I'm about to nuke the hard disk of a machine that I happen to have most of my music collection backed up onto right now.
21:52
<@froztbyte>
that's fine
21:52
<@froztbyte>
in fact, I'd be okay with that if I could raid the music store myself too ;)
21:52
< RichyB>
You sure? That's a fairly large amount of bandwidth.
21:52
<@froztbyte>
(elegua is on high-speed intertrons, and I have a shitton of cap per month)
21:53
<@froztbyte>
RichyB: I have something like 1.5TB/m or so
21:53
<@froztbyte>
I really don't mind :)
21:53
< RichyB>
Nice.
21:54
<@froztbyte>
ah no, 5TB/m
21:54
< RichyB>
Nicer! Where are you getting that?
21:54
<@froztbyte>
of which I've thus far used ... 80GB this month
21:54
<@froztbyte>
hetzner.de
21:54
< RichyB>
Ahh, Germany. ?
21:54
<@froztbyte>
one of their rent-a-rootserver-that-someone-else-doesn't-want
21:54
<@froztbyte>
https://robot.your-server.de/
21:55
< RichyB>
Mainland Europe has a ridiculously competitive server hosting market.
21:55
<@froztbyte>
yar
21:55
<@froztbyte>
well
21:55
<@froztbyte>
amsterdam is basically the core of the intenet
21:55
<@froztbyte>
internet*
21:55
< RichyB>
Yes.
21:55
< RichyB>
For comparison, I usually end up shopping in the UK or Australia instead.
21:55
< RichyB>
The UK isn't bad but fuck Australia.
21:55
<@froztbyte>
that's what happens when you have countries that have winter so shitty you don't even want to pull back the blinds
21:55
< RichyB>
Hahaha.
21:56
< RichyB>
http://pastebin.com/gH84mEuW <- my pubkey.
21:57
< RichyB>
I should do some proper latency testing with a service like serverlove, try measuring how well they do for latency. I have a physical webserver lying around somewhere in London at the moment but it's massively expensive and I underutilise it almost entirely.
21:59
< RichyB>
The rationale for getting it was that I'd want a real box for the sake of being able to run videogame dedicated servers on it, but it turns out that I haven't had access to an internet connection worth anything for gaming for a few years anyway.
21:59
<@froztbyte>
richyb@elegua.za.net
22:00
<@froztbyte>
if you encounter weirdness, try forcing v4 only
22:00
<@froztbyte>
since the server is natively dualhomed
22:00
< RichyB>
b9:f3:d6:9:b4:2b:dc:fb:cf:72:0a:79:6d:4d:a0:01?
22:00
<@froztbyte>
I don't recall how to check easily
22:00
<@froztbyte>
and I've got the key stored so many places...
22:00
<@froztbyte>
sec
22:00
< RichyB>
ssh-keygen -l -f /etc/ssh/sshd_host_rsa_key.pub # :)
22:01
<@froztbyte>
ah yes
22:01
<@froztbyte>
and yar
22:01
< RichyB>
a.
22:01
< RichyB>
*Ta.
22:01
<@froztbyte>
rsync, scp, axel are available
22:02
<@froztbyte>
nginx is configured to make ~/public_html do http://elegua.za.net/~username
22:03
< RichyB>
Actually, I'd rather not. Some of this stuff is e.g. Amazon MP3s with my account ID stuffed into the metadata.
22:03
<@froztbyte>
haha
22:03
<@froztbyte>
well, I'm just mentioning :)
22:03
< RichyB>
Sorry to waste your time, heh.
22:03
<@froztbyte>
I've found multithreaded http to be far easier on getting stuff back to one's computer
22:04
<@froztbyte>
rsync over long latency links sucks so very hard -_-
22:04
<@froztbyte>
RichyB: eh, no stress :)
22:04
<@froztbyte>
like I said, I've got the space, so it's no big worry to me
22:04
< RichyB>
Yeah, rsync goes over ssh, ssh has a big design flaw.
22:04
<@froztbyte>
nah, native rsync
22:04
<@froztbyte>
as in rsync://
22:05
< RichyB>
As well as using the TCP socket's buffers, SSH does its own buffering in userspace - and that's hard-limited to 32kB for some reason.
22:05
< RichyB>
So you get stuttering transfers on networks where the bandwidth-latency product is large.
22:05
<@froztbyte>
I *think* it's possible to get rsync protocol version 3 to not suck so hard
22:06
< RichyB>
There's a patch floating around somewhere that extends this to a few megabytes and suddenly you can put hundreds of megabits per second down SCP.
22:06
<@froztbyte>
but I need to write a thing that'll work out block pipelining values for me
22:06
<@froztbyte>
I generally don't like scp
22:06
<@froztbyte>
it's got some annoyances
22:07
<@froztbyte>
like derp treatment of spaces (depending on src path), it defaults to doing whatever umask is, etc
22:28
< RichyB>
Heh
22:28
< RichyB>
Sign up to ALL THE CLOUD PROVIDERS
22:28
< RichyB>
This far I have an amazonaws and a rackspace account
22:33
<@froztbyte>
linode, technically still slicehost^Wrackspace, aws, hudsonhost, hetzner
22:33
<@froztbyte>
and I'm sure I forget another two
22:34
<@froztbyte>
but they're of little importance
22:34
<@froztbyte>
(they run stuff somewhere that ticks by on its own, and if I ever need it, it'll come to front in my brain)
22:39
<&McMartin>
All the butt providers
22:43 Vash [Vash@Nightstar-221158c7.sd.cox.net] has quit [[NS] Quit: I lovecraft Vorn! <3]
22:44 himi [fow035@Nightstar-5d05bada.internode.on.net] has quit [Ping timeout: 121 seconds]
22:51
< RichyB>
Really ought to start a scoreboard online of VPS providers against price per gigabyte of RAM.
23:01
<@froztbyte>
I've found one of those, actually
23:01
<@froztbyte>
lemme check
23:02
<@froztbyte>
not the one that I've seen, but looks cool: http://vps-list.cryto.net/index.php?action=list
23:03
<@froztbyte>
http://www.lowendbox.com/
23:03 * RichyB is repeatedly googling things like "AWS competitors" "cloud hosting" "VPS by the hour" "sell me a fucking server you incompetent goons" and so on, and discounting everybody whose price list *isn't* by the hour.
23:04
<@froztbyte>
I don't think there are many people who run it by the hour
23:04
<@froztbyte>
or rather, I haven't come across many
23:04
<@froztbyte>
I've found lots who are "cheap as shit to just have one around", though
23:06
<@froztbyte>
man, it depresses me when I find .sql files on client servers that start at ~1.1GB and end at ~32MB when I throw gzip at it
23:06
<@froztbyte>
woo for saving space and all, but meh at how crap the DB must be :/
23:07 Turaiel[Offline] is now known as Turaiel
23:08
<@Reiv>
Why do you want per hour?
23:08
<@froztbyte>
nice for utility VPSs
23:08
<@froztbyte>
"I only need this thing for (6 hours|10 minutes|tomorrow|...)"
23:10
< RichyB>
froztbyte: yeah, some of these are cheaper to rent for one month than the traffic costs would be for what I want to do on an hourly service like AWS or RS.
23:11
<@froztbyte>
thatbeing nice by itself, it makes no guarantee about iops..
23:11
<@froztbyte>
(especially on openvz)
23:11
<@Reiv>
Cloud Computins!
23:11
<@froztbyte>
Cloud Con Carne!
23:13
< RichyB>
Reiv: couple reasons, none of them good.
23:14
< RichyB>
froztbyte: eh, .sql is usually plain text sql, no? Is that really crap data or is it just very redundant?
23:15
<@froztbyte>
the latter
23:15
<@froztbyte>
on a regular DB I'd expect in the order of 30~40% compression, max
23:15
<@froztbyte>
(and that's with 7z/lzma on a hi-yoooodje dictionary)
23:16
< RichyB>
I'd expect compression *down* to about 30-40%.
23:16
<@froztbyte>
this is 98% compression
23:16
< RichyB>
Pretty much as a minimum, even.
23:16
<@froztbyte>
RichyB: I suppose it depends on what you stick in your DB
23:16
< RichyB>
OTOH I'm used to systems that e.g. log site hits into SQL for querying.
23:16
<@froztbyte>
but this must mean there is a crapton of defaults in DB
23:17
< RichyB>
If you're just parsing apache logs for a site with uninteresting structure and dumping them into SQL then you're going to get output that's about as compressible as the input, deflating to ~20%-10%.
23:19
< RichyB>
froztbyte: hrmn, OTOH it doesn't really occur to me that anybody would do something really stupid like, say, create a table with 400 nullable columns where all but a few dozen rows have NULL in every slot but two or three.
23:19
< RichyB>
(because I would not do that)
23:19
<@froztbyte>
yeah, that sort of thing
23:20
<@froztbyte>
where it's often better to infer a value in code rather than store shit in DB
23:20
<@froztbyte>
but hey...
23:20
<@froztbyte>
I'm not complaining
23:20
<@froztbyte>
getting paid by the hour for this :P
23:21
<@froztbyte>
I do kinda "cheat" myself out of some money by being smart about it and using loops and crap, but meh, who cares
23:21
< RichyB>
Life's too short.
23:21
<@froztbyte>
(by which I mean if I was a soulless bastard, I could really make a lot more money by doing this all the dumb way)
23:24
< RichyB>
Hahahaha this is hilarious. http://fourgroups.com/blog/archives/22/can-you-predict-team-performance/
23:24
< RichyB>
Sales pitch: use our awesome Team Building Software to CALCULATE which of your employees you should group with which of your other employees for OPTIMAL PRODUCTIVITY
23:24
< RichyB>
ABSOLUTELY NO PSEUDOSCIENCE HERE NOPE
23:25
<@froztbyte>
that's a lot of reading
23:25
< RichyB>
Skim.
23:25
<@froztbyte>
heh
23:25
<@froztbyte>
nah
23:25
<@froztbyte>
it's 00h30, I've been looking at a computer screen for ~18h
23:25
<@froztbyte>
time to series :)
23:25
< RichyB>
The best way to learn to skim text fast is to actually read terms and conditions on SaaS websites.
23:25
<@froztbyte>
(well, looking at a computer screen and doing work)
23:26
<@froztbyte>
RichyB: hahaha
23:26
< RichyB>
Them fuckers are long, uninteresting and occasionally important. ;)
23:26
<@froztbyte>
that's actually a pretty good idea
23:27
<@froztbyte>
http://elegua.za.net/~froztbyte/gzip.png
23:28
< RichyB>
That's just from running "gzip" on a bunch of files?
23:28
<@froztbyte>
yup.
23:30
<@froztbyte>
I kinda need to learn how to properly use screen splits sometime
23:30
<@froztbyte>
and/or tmux
23:32
<@Reiv>
RichyB: Hey now, /we've/ got a couple tables like that.
23:32
<@Reiv>
Granted, it's possible to have an awful lot of things update simultaneously under rare but nontrivial circumstances.
23:36 ToxicFrog|W`rkn is now known as ToxicFrog
23:41
< RichyB>
froztbyte: I use shell-mode in Emacs for that nowadays.
23:41
< RichyB>
GNU screen's splitting is arcane and nonunderstandable to me.
23:41
< RichyB>
tmux is supposed to be better but I can't be bothered to learn it.
23:42
< RichyB>
Instead I end up firing off a whole load of emacs buffers with shells and ssh sessions in them, and Emacs actually has quite nice commands for manipulating, swapping and resizing frames, windows and buffers.
23:42
<@froztbyte>
I haven't quite bothered with tmux yet because when I cared, tmux was a bit unstable
23:42 Chutzpah [Moltare@583787.FF2A18.190FE2.4D81A1] has quit [Ping timeout: 121 seconds]
23:42
<@froztbyte>
I'll care again soon, I suppose
23:44 Institut1onalized [abudhabi@Nightstar-577e2e53.adsl.inetia.pl] has joined #code
23:45 VirusJTG [VirusJTG@Nightstar-09c31e7a.sta.comporium.net] has joined #code
23:45 Institutionalized [abudhabi@Nightstar-f3c6459d.adsl.inetia.pl] has quit [Operation timed out]
23:45 Chutzpah [Moltare@583787.FF2A18.190FE2.4D81A1] has joined #code
--- Log closed Tue Apr 23 00:00:04 2013
code logs -> 2013 -> Mon, 22 Apr 2013< code.20130421.log - code.20130423.log >

[ Latest log file ]