--- Log opened Tue Jan 21 00:00:12 2014 |
00:31 | | You're now known as TheWatcher[T-2] |
00:45 | | You're now known as TheWatcher[zZzZ] |
02:42 | | Turaiel[Offline] is now known as Turaiel |
03:27 | <&Derakon> | "I just got some crash reports emailed to me. Have a look at them, and it's a graphics crash - looks like the card doesn't like shader model 2.0 stuff. What sort of card is it? Oh, the report says it's a GeForce 3 from 2001!" |
03:28 | <&Derakon> | "I'm more impressed than anything." |
03:40 | | Kindamoody[zZz] is now known as Kindamoody |
04:08 | | Turaiel is now known as Turaiel[Offline] |
04:10 | | VirusJTG [VirusJTG@Nightstar-6i5vf7.sta.comporium.net] has quit [[NS] Quit: Program Shutting down] |
04:13 | | Thalass [thalass@Nightstar-bce70i.eastlink.ca] has quit [[NS] Quit: Leaving] |
04:13 | | Thalass [thalass@Nightstar-bce70i.eastlink.ca] has joined #code |
04:16 | | * Thalass ponders the proper connection protocol to use between a python server script and a python client script (running on different machines, communicating over the intertoobs) |
04:21 | <&Derakon> | Thal: one simple option would be to use the Pyro4 library. |
04:33 | < Thalass> | Interesting. Thanks. |
04:34 | <@Shiz> | would i be really stupid to propose json? |
04:37 | < Thalass> | I'm still learning python. JavaScript would probably make my eyes melt |
04:37 | <@Shiz> | json isn't javascript |
04:37 | <@Shiz> | well, it's based on some JS parts |
04:37 | <@Shiz> | but it's a full data interchange format on its own |
04:38 | <@Shiz> | (and python has a native library for it, it's a matter of doing json.dumps/json.loads) |
04:38 | | * Thalass nods |
04:38 | < Thalass> | It looks interesting, too. |
04:38 | <@Shiz> | if all you need to send is trivial values, lists or dicts then I'd definitely recommend considering json |
04:38 | <@Shiz> | it's pretty much a Web Standard(tm) |
04:41 | < Thalass> | heh |
04:42 | < Thalass> | I'm not entirely sure of the exact nature of what i want to send. Currently I think it might be a "start moving" command on keypress/mouseclick and then a "stop moving" on key/mouse release. So not a huge stream of data - however i've never worked with this kind of thing before so i'm not sure even how to do that. |
04:43 | < Thalass> | However as usual i'm most mojonated when i should be sleeping. >.< |
04:50 | <@Shiz> | sounds familiar |
04:50 | | * Shiz is a night worker, but day committer |
04:56 | | Vornicus [Vorn@Nightstar-sn7kve.sd.cox.net] has joined #code |
04:56 | | mode/#code [+qo Vornicus Vornicus] by ChanServ |
04:58 | | Thalass is now known as Thalass|sleep |
04:58 | | Kindamoody is now known as Kindamoody[zZz] |
04:58 | < Thalass|sleep> | Thanks for the advice. I'll have a go heh |
04:58 | | Thalass|sleep [thalass@Nightstar-bce70i.eastlink.ca] has quit [[NS] Quit: zomg] |
05:05 | | Stalker [Z@Nightstar-484uip.cust.comxnet.dk] has joined #code |
05:07 | | Derakon is now known as Derakon[AFK] |
06:18 | | RichyB [RichyB@Nightstar-c6u.vd5.170.83.IP] has quit [[NS] Quit: Gone.] |
06:22 | | RichyB [RichyB@Nightstar-c6u.vd5.170.83.IP] has joined #code |
06:25 | | OrthDroid [Orthia@Nightstar-5m8.1ee.224.119.IP] has joined #code |
06:28 | | Orth [Orthia@Nightstar-huc.cvq.148.118.IP] has quit [Ping timeout: 121 seconds] |
06:30 | | celticminstrel [celticminst@Nightstar-mhtogh.dsl.bell.ca] has quit [[NS] Quit: And lo! The computer falls into a deep sleep, to awake again some other day!] |
06:34 | | AbuDhabi1 [AbuDhabi@Nightstar-79du1a.78.getinternet.no] has joined #code |
06:35 | | AbuDhabi_ [AbuDhabi@Nightstar-p6q73m.89.getinternet.no] has quit [Ping timeout: 121 seconds] |
06:41 | | AbuDhabi_ [AbuDhabi@Nightstar-mdtb2c.tmi.telenormobil.no] has joined #code |
06:43 | | AbuDhabi1 [AbuDhabi@Nightstar-79du1a.78.getinternet.no] has quit [Ping timeout: 121 seconds] |
07:17 | | AverageJoe [evil1@Nightstar-fb1kt4.ph.cox.net] has joined #code |
07:56 | | Orth [Orthia@Nightstar-5m8.1ee.224.119.IP] has joined #code |
07:56 | | OrthDroid [Orthia@Nightstar-5m8.1ee.224.119.IP] has quit [Connection reset by peer] |
08:23 | | AverageJoe [evil1@Nightstar-fb1kt4.ph.cox.net] has quit [[NS] Quit: Leaving] |
09:16 | | Syka [the@Nightstar-kik.bbb.126.1.IP] has joined #code |
09:32 | | You're now known as TheWatcher |
11:04 | | * TheWatcher hairpulls vaguely at javascript and objects and madness |
11:24 | | Vornicus [Vorn@Nightstar-sn7kve.sd.cox.net] has quit [Connection reset by peer] |
11:24 | | Erik [8f610223@Nightstar-fsq7h2.mibbit.com] has joined #code |
11:25 | < Erik> | Fuck cyclic graphs. |
11:26 | < Erik> | I've been clearing out giant repository of linked documents at this one company. Only leaf-node documents can be cleared out without Problems; and now I've tentatively identified 1044 documents that are part of cycles. |
11:27 | < Erik> | I picked a sample document and found that about 400 of the documents are reachable from that sample. Now I get to figure out how to map giant cyclic graphs in order to figure out where to snip links and create leaf nodes. |
11:30 | < Erik> | Sample document X shows up in reachable-from-X on the program I'm writing, and I've manually verified that cycle. But reachable-from-X isn't the same set as cycles-with-X; cycle A can have a member that points to an item in cycle B without reciprocity. |
11:31 | < Erik> | So I figured I'd identify "minimal" cycles, but those turned out to overlap significantly. |
11:33 | < Erik> | Any advice on how to map/sort/structure/get a handle on large cyclic graphs? |
11:33 | | Orth [Orthia@Nightstar-5m8.1ee.224.119.IP] has quit [Connection reset by peer] |
11:33 | | OrthDroid [Orthia@Nightstar-5m8.1ee.224.119.IP] has joined #code |
11:34 | <@Tarinaky> | Erik: Sounds kinda like the Halting Problem... |
11:35 | <@Tarinaky> | Unless I'm missing something. I'm not really sure what you mean by 'get a handle' |
11:35 | < Erik> | Tarinaky: Well, worst case it halts when the project runs out of time/budget/techsupport. |
11:35 | < Erik> | At that point, basically all the links are declared broken. |
11:36 | < Erik> | I'd like to find some way of minimizing the amount of links I need to force-break in order to go back to having leaf nodes that I can recursively prune |
11:37 | <@Tarinaky> | Try a systematic search over the graph to find paths with cycles in them? |
11:38 | <@Tarinaky> | That's only NP :V |
11:39 | <@Tarinaky> | Since it's a finite graph you'll have to reach a termination or a cycle eventually. |
11:39 | < Erik> | I have pruned all terminations/leaf nodes. I know that every remaining node and path is part of a cycle. |
11:40 | <@Tarinaky> | So what's the problem? |
11:41 | < Erik> | So I have a thousand nodes and an index of which nodes point to other nodes. How do I figure out where it's a good idea to start destroying paths in order to destroy the fewest paths while breaking the most cycles? |
11:42 | < Erik> | How do I write a script to identify "all" cycles? |
11:42 | < Erik> | "All" in quotes due to not wanting recursive stupidity like listing both ABC and ABCABC. |
11:43 | <@Tarinaky> | I think the simplest approach is probably to do a search over the space. |
11:43 | <@Tarinaky> | Anything else probably involves really involved mathematics. |
11:43 | < Erik> | I'm working in Python, math is fine, import math. :) |
11:43 | <@Tarinaky> | That's not what I mean by really involved mathematics. |
11:46 | | VirusJTG [VirusJTG@Nightstar-6i5vf7.sta.comporium.net] has joined #code |
11:50 | < RichyB> | Erik, max flow / min cut is the kind of thing that you want here, I think |
11:52 | | AbuDhabi1 [AbuDhabi@Nightstar-i3u5cr.78.getinternet.no] has joined #code |
11:52 | | AbuDhabi_ [AbuDhabi@Nightstar-mdtb2c.tmi.telenormobil.no] has quit [Connection reset by peer] |
11:52 | <@Tarinaky> | Searching over a space is a simple way to solve any problem though. |
11:52 | <@Tarinaky> | By which I mean you should really be comfortable to apply the technique to an arbitrary problem. |
11:53 | <@Tarinaky> | Even if it is basically the base-line worst possible solution worth considering for any problem it has the advantage that you don't have to actually understand the problem to apply it. |
11:53 | < Erik> | Still not sure how to formulate the search in a way that doesn't involve massive brute force. |
11:53 | <@Tarinaky> | It /is/ brute force. |
11:53 | <@Tarinaky> | That's the point. |
11:53 | < RichyB> | just start with brute force |
11:55 | < Erik> | I think this will take ages, but OK. >_> |
11:57 | | AbuDhabi1 [AbuDhabi@Nightstar-i3u5cr.78.getinternet.no] has quit [Ping timeout: 121 seconds] |
11:57 | | AbuDhabi_ [AbuDhabi@Nightstar-i3u5cr.78.getinternet.no] has joined #code |
11:57 | < RichyB> | If you want a fast answer, start with an incorrect greedy approximation. |
11:57 | < Erik> | Pick the single path to break that allows for the most pruning, repeat? |
11:58 | < RichyB> | Yes, that constitutes a greedy algorithm. |
11:59 | < RichyB> | I'd go with "find a min-cut, cut all of those vertexes. Now you have to smaller graphs to search both of." |
12:00 | < RichyB> | *two, not "to". Idiot. |
12:01 | < RichyB> | I say go with that specifically because I assume that you probably have access to some graph-theory library which has operations like "find a min-cut" as built-in functions. |
12:01 | < Erik> | Min-cut to split the graphs will be "cut the path from Huge_Most_Of_Graph to a 2-cycle or 3-cycle" to start with. Thinking about how it'll behave when it can no longer trim a single connection like that... |
12:02 | | AbuDhabi1 [AbuDhabi@Nightstar-dpjndf.bb.online.no] has joined #code |
12:02 | < Erik> | I don't have a graph-theory library on hand, but I can probably get one. |
12:03 | < RichyB> | carving off 2-cycles and 3-cycles to break them up is pretty much what you want, right? |
12:04 | < Erik> | It'll work, but it's not optimal. Suppose A and B point to each other, forming a 2-cycle. X is in Huge_Most_Of_Graph and points to A. |
12:04 | < Erik> | If I forcibly break the X->A link, I'll also have to forcibly break either A->B or B->A later. But if I forcibly break B->A, then B becomes a leaf node I can prune; pruning B leaves A a leaf node; and pruning A will take away the X-A link naturally. |
12:05 | | AbuDhabi_ [AbuDhabi@Nightstar-i3u5cr.78.getinternet.no] has quit [Ping timeout: 121 seconds] |
12:05 | < RichyB> | wouldn't the min-cut here be to carve B off instead? |
12:05 | < Erik> | Maybe I don't understand min-cut, then. |
12:06 | < Erik> | From my brief impression on Wikipedia, it sounds as though carving off B would require a cut through both A->B and B->A, but carving off the 2-cycle only requires a cut through X->A. |
12:06 | < Erik> | (Assume links are directional and there is no A->X link.) |
12:06 | | AbuDhabi1 [AbuDhabi@Nightstar-dpjndf.bb.online.no] has quit [Ping timeout: 121 seconds] |
12:07 | | AbuDhabi_ [AbuDhabi@Nightstar-i3u5cr.78.getinternet.no] has joined #code |
12:08 | < RichyB> | Erik, ye-es. Well, I recommended looking at it because, while I've forgotten most of the graph theory I've ever known, the faint memory that I have about flow/cut problems was asserting that they smelled right. |
12:10 | < Erik> | At present I don't even have a graph representation; I have a giant python dictionary which maps {node X: [array of nodes that X points to]}. Sounds like getting a graph theory library should be a high priority. |
12:12 | < RichyB> | That *is* a graph representation. :) |
12:12 | < RichyB> | It's a dictionary from nodes to their adjacency lists. :) |
12:14 | < Erik> | Yes, well, it doesn't have any notion of an edge. |
12:17 | < RichyB> | reduce(list.__add__, [[(start, end) for end in ends] for start, ends in graph.iteritems()]) |
12:19 | < RichyB> | graph_to_edge_list = lambda graph: â |
12:20 | < Erik> | Oooh. |
12:22 | < Erik> | RichyB: I have now spent five minutes staring at your clever reduce function :-D |
12:24 | < RichyB> | graph.iteritems() generates (node, node-it-points-to) pairs |
12:24 | < Erik> | The nested for-in particularly makes me wonder how the hell this can be parsed nicely. |
12:24 | < RichyB> | for each of those pairs, [(start, end) for end in ends] generates the edges pointed to by this node |
12:24 | < RichyB> | reduce(list.__add__, list_of_lists) concatenates them. |
12:26 | < RichyB> | oh and there's a bug, it should be reduce(list.__add__, list_of_lists, []) # because an empty graph is valid. |
12:27 | < RichyB> | e.g. read it as: reduce(+, [ [edge1], [edge2], [edge3, edge4] ], []) |
12:28 | < RichyB> | = [] + [edge1] + [edge2] + [edge3, edge4] |
12:29 | < RichyB> | reduce(+, list, startval) = (((startval + list[0]) + list[1]) + list[2]) ⦠|
12:41 | | Syka [the@Nightstar-kik.bbb.126.1.IP] has quit [Ping timeout: 121 seconds] |
12:41 | | Syka [the@Nightstar-kik.bbb.126.1.IP] has joined #code |
12:45 | | Orth [Orthia@Nightstar-5m8.1ee.224.119.IP] has joined #code |
12:45 | | OrthDroid [Orthia@Nightstar-5m8.1ee.224.119.IP] has quit [Connection closed] |
12:45 | | Syka [the@Nightstar-kik.bbb.126.1.IP] has quit [Connection closed] |
12:46 | | OrthDroid [Orthia@Nightstar-5m8.1ee.224.119.IP] has joined #code |
12:46 | | Orth [Orthia@Nightstar-5m8.1ee.224.119.IP] has quit [Connection closed] |
12:49 | | * Erik finds a 1-cycle. |
12:49 | < Erik> | What misbegotten functionary uploaded a document, thereby assigning it a place in the document archive and an address, then edited the document to point to itself? |
12:50 | <@TheWatcher> | I believe the appropriate classification is "Troll" |
12:59 | | * Erik finds more 1-cycles. |
12:59 | < Erik> | TheWatcher: No, I think it's just incompetence. Because earlier in the process I found a bunch of links pointing to "V". |
12:59 | < Erik> | Which I presume should have been a link pasted in with Ctrl-V, but they failed to hit the keys properly. |
13:00 | | * TheWatcher facepalm |
13:19 | <@Tarinaky> | Erik: See Also: for further information please consult the document already in your hands. Bibliography: This document. Acknowledgements: Ha Ha Fuck You |
13:41 | | * Erik writes code to find 2-cycles, packs it inside a function 2_Cycle_Finder, gets error message that Python apparently doesn't accept function names starting with a digit, renames it Bicycle_Finder. :-D |
13:43 | < Erik> | Quadcycle_Finder or Tetracycle_Finder? |
13:44 | < Erik> | Tempted to use Farcical_Finder... |
13:45 | <&ToxicFrog> | ...why not just find all cycles of any length? |
13:45 | < Erik> | Because I haven't figured out how to generalize yet. |
13:45 | < Erik> | I will stare at this problem shortly after I have the 2-cycle, 3-cycle and 4-cycle versions. |
13:58 | | Orth [Orthia@Nightstar-5m8.1ee.224.119.IP] has joined #code |
13:58 | | OrthDroid [Orthia@Nightstar-5m8.1ee.224.119.IP] has quit [Connection closed] |
14:02 | < Erik> | My coworker suggests that I should have a "proper object model", by which he means that every node should be an object with methods to search its own paths and call the functions of the nodes it links to. o_O |
14:02 | < Erik> | I think this may be overkill, but maybe I'm just lazy. |
14:11 | <@froztbyte> | no, there are some people who get high on objects |
14:12 | <@froztbyte> | and then you end up with zope |
14:12 | <@froztbyte> | but it probably depends on what you need to do |
14:13 | | KiMo|autorejoin [Kindamoody@Nightstar-180u8i.tbcn.telia.com] has joined #code |
14:13 | < Erik> | That's his suggestion on how to generalize the N-cycle finder. |
14:14 | | Kindamoody[zZz] [Kindamoody@Nightstar-180u8i.tbcn.telia.com] has quit [Ping timeout: 121 seconds] |
14:14 | <@TheWatcher> | I'd suspect the "high on objects" case here |
14:27 | <&McMartin> | OOP is a cult |
14:30 | <@simon_> | it is. |
14:31 | <@simon_> | if not also a mental disorder. |
14:32 | <&McMartin> | I can't call it a disorder; its techniques are useful in a handful of real problem domains and its core structures allow for a more structured use of function pointers |
14:32 | <@simon_> | yes. certainly. |
14:32 | <&McMartin> | Eschewing objects for the fact that it's "added on" would be like eschewing structs because tuples exist |
14:32 | <@simon_> | but it is easily overdone. |
14:33 | <&McMartin> | Yes |
14:33 | <&McMartin> | I usually prescribe a certain level of LISP hipsterism to get it out of the system |
14:33 | <&McMartin> | "Big deal, map-reduce was pulling shit like that back in the 1970s." |
14:35 | | celticminstrel [celticminst@Nightstar-mhtogh.dsl.bell.ca] has joined #code |
14:36 | | mode/#code [+o celticminstrel] by ChanServ |
14:36 | < RichyB> | McMartin, map-reduce in the 2000s is still novel if the Lisp hipsters weren't distributing it. : |
14:37 | < Erik> | I was fiddling with LISP ten years ago and never saw it again... |
14:37 | <&McMartin> | All the cool kids use comprehensions |
14:37 | <&McMartin> | Though I guess you can't reduce with a comprehension |
14:37 | <&McMartin> | Erik: Yeah, you don't *use* it |
14:38 | <&McMartin> | It's just there to grant you the proper level of jadedness |
14:38 | <&McMartin> | Also, conceptual primitives that are closer to math than to hardware registers or drug-fuelled committee meetings |
14:39 | < Erik> | Moving from LISP to Java was a big letdown. "You mean I can't create functions without a ton of boilerplate?" |
14:39 | <&ToxicFrog> | Moving from most things to Java is a big letdown, in my observation. |
14:39 | < Erik> | Heh. |
14:40 | <@froztbyte> | why the hell even /do/ that? |
14:40 | | Erik [8f610223@Nightstar-fsq7h2.mibbit.com] has quit [[NS] Quit: Going home. No more cycles today!] |
14:40 | <@froztbyte> | java is a thing to get away from |
14:40 | <&ToxicFrog> | froztbyte: school course taught in Java. New project needs to interoperate with Java software, or run on Android. New job is at a java-heavy company. |
14:41 | < RichyB> | Relative to what? C â Java, for any project that didn't actually need C's runtime speed or unsigned integers, is a great way to almost completely ditch the entire concept of âundefined behaviourâ in your program and all the debugging load that comes with it. |
14:41 | <@froztbyte> | ToxicFrog: jskdljfklshfsdjklfhrjklfwehafjksdhf |
14:42 | | Turaiel[Offline] is now known as Turaiel |
14:43 | < RichyB> | IMHO Java is worth it, relative to C or C++, for a _lot_ of projects, just because it adds GC. |
14:43 | <&ToxicFrog> | RichyB: it's also a great way to end up actively hating the entire concept of OO, wondering why your programs are now three times as many LOC despite using a "high-level" language, and start asking inconvenient questions like "so, if this runs in a VM anyways, why do we have a separate compilation stage" |
14:43 | <&ToxicFrog> | Also, the entire Java standard library and all its documentation. |
14:44 | <&McMartin> | You can fall a lot further than the Java library docs. |
14:44 | <&McMartin> | I actually use them as the calibration point, which does admittedly mean a score of zero |
14:44 | <&ToxicFrog> | You can. And to be fair, the java library docs are excellent references if you already know what classes you want. |
14:44 | < RichyB> | Of course a fairly large subset of *those* would be even better off in Ruby, Python, Go, Scheme, Clisp, TCL, SML, D⦠almost bloody anything. :) |
14:44 | < RichyB> | McMartin, haha :) |
14:44 | <&McMartin> | Having recently used Clisp I can think of no reason to use it instead of Python for new projects. |
14:44 | <&ToxicFrog> | Where they fail completely is at helping you figure out which six similar-but-different-in-significant-ways classes you need, and how to combine them, in order to, say, read a file. |
14:45 | <&McMartin> | Scheme remains "the world's least portable programming language" |
14:45 | <&McMartin> | I have yet to see a proper treatment of large program organization with SML or OCaml |
14:45 | <&ToxicFrog> | Especially in domains like GUI programming where there are multiple complete sub-libraries for this and all but one of them are informally deprecated but still given first-class treatment in the docs. |
14:45 | <&McMartin> | They describe the mechanisms to use to do it, but pretend those mechanisms aren't utterly alien and thus demanding a wholly novel discipline of organization |
14:46 | <&ToxicFrog> | The upshot of this is that the Java docs are great for experienced Java programmers who already know what they need and just want a refresher on method signatures and contracts, but are worse than useless for a newbie. |
14:47 | <@simon_> | McMartin, I thought SML's module system was superior for large programs, but I assume what you're saying is that you've never seen that done? |
14:47 | <&McMartin> | To be fair, there *is* a set of Java tutorials nobody reads |
14:47 | <&McMartin> | simon_: Yes, I mean the treatment I've seen boils down to "Here's how structures and functors work. They are superior." |
14:47 | <&ToxicFrog> | RichyB: that was kind of my point; most of the people I know who had bad experiences with Java started with a HLL like Python and were then subjected to Java. The rest were C programmers who liked the increased safety but hated how dearly you pay for it in other respects. |
14:48 | <&McMartin> | It's not even clear *to what*. To Pascal modules? To traditional notions of interface-based contracts via OO inheritance? To OO entirely? |
14:48 | <@simon_> | McMartin, well, I've extremely limited knowledge of their actual use, too, but it seems from reading Working Programmer and some of the MLton source code that you can do stuff with it. it's just that nobody ever did it. ;-) |
14:48 | <&McMartin> | Working Programmer is indeed my primary source here ;-) |
14:48 | <@simon_> | McMartin, to... umm... the kind of module systems you find in Java, Python and Haskell, perhaps. |
14:49 | <&McMartin> | Yeah, that's not a strong enough claim to permit "SML is therefore feasible for large software projects" - Java and Python *don't use* their module systems for much, relying instead on features SML doesn't have (notably reflection) |
14:50 | <@simon_> | McMartin, my interpretation of SML's module system's supposed superiority is this: structures work exactly like you expect modules do. functors allow some re-use of modules that is perhaps comparable to abstract classes, which are really cool anyway. |
14:50 | <&McMartin> | Right. This is why I want a formal treatment of it. |
14:51 | <&McMartin> | "Look, we can do things like abstract classes with a toy problem nobody would ever use" isn't very reassuring, especially when the library itself never does this |
14:52 | <@froztbyte> | McMartin: liquidsoap has a rather sizable chunk of ocaml in it, iirc |
14:55 | <&McMartin> | Right, and SML compilation is not exactly easy and SML compilers are self-hosted. |
14:55 | <&McMartin> | I am not denying it's *possible* |
14:55 | <&McMartin> | I'm denying that it's gotten the kind of attention that even Python's module and object system got. |
14:55 | <&McMartin> | Possibly out of ignorance, but this is then [citation needed]~ |
14:57 | <@simon_> | doesn't Python's module system also get cherished? |
14:57 | <&McMartin> | Yes, but mostly for staying out of your way |
14:58 | <@simon_> | I like that it follows directory structure. |
14:58 | <&McMartin> | It's handy. |
14:58 | <@simon_> | it's amazing how easy making a decent module system is and how few do it. |
14:59 | <&McMartin> | It's also a thing Java has, and I've often wanted a python equivalent to JARs >_> |
14:59 | <@simon_> | (easy as in: just copy whoever is doing it well already) |
14:59 | <&McMartin> | Right |
14:59 | <&McMartin> | Anyway, that's the extra lift that SML has there |
14:59 | <&McMartin> | Without structures and functors, ML is noticably deficient in the same ways that, say, R4RS Scheme is. |
14:59 | <@simon_> | yeah, JARs are nice. you can include a whole bunch of things in your classpath with just including one file. :) |
14:59 | <&McMartin> | Also, single-download distribution |
14:59 | <@simon_> | yeah! |
15:00 | | * simon_ has come to appreciate Java a little more in this last course he had. |
15:00 | <&McMartin> | (These are lies for Java, just ask TF about Kessler >_<) |
15:00 | <&McMartin> | Java's killer app is middleware, IMO |
15:00 | <@simon_> | I should shut up about Java, then ;P |
15:00 | <@simon_> | middleware? |
15:01 | <&McMartin> | Anyway, SML's structures and functors are supposed to be things that you actively build your system out of, not merely a convenience to keep everything from sharing the same namespace |
15:01 | <@simon_> | as in 3rd party libraries? |
15:01 | <&McMartin> | Specifically as in "You have 500 3rd party libraries and need to make a product out of that ideally with nothin gmore than configuration files" |
15:01 | <&McMartin> | There are languages that are better at this than Java, but Java ended up with the ecosystem where it kicked ass at this |
15:02 | <@simon_> | right... |
15:02 | <@simon_> | I like that I made a threaded HTTP client in two lines of code. |
15:03 | <@simon_> | I guess it takes a critical mass of users to produce these things. |
15:04 | | OrthDroid [Orthia@Nightstar-5m8.1ee.224.119.IP] has joined #code |
15:05 | | Orth [Orthia@Nightstar-5m8.1ee.224.119.IP] has quit [Connection closed] |
15:05 | <&ToxicFrog> | McMartin: at this point I've just settled for adding a bunch of plausible directories to the end of %PATH% on windows and if it still doesn't work telling people to (re)install java |
15:07 | | Turaiel is now known as Turaiel[Offline] |
15:11 | | ErikMesoy [Erik@Nightstar-3kot9q.80-203-17.nextgentel.com] has joined #code |
15:11 | | Orth [Orthia@Nightstar-5m8.1ee.224.119.IP] has joined #code |
15:11 | | OrthDroid [Orthia@Nightstar-5m8.1ee.224.119.IP] has quit [Connection closed] |
15:11 | | OrthDroid [Orthia@Nightstar-5m8.1ee.224.119.IP] has joined #code |
15:11 | | Orth [Orthia@Nightstar-5m8.1ee.224.119.IP] has quit [Connection reset by peer] |
15:31 | | * McMartin tiles his IDE, his terminal, and a DVD playback window |
15:35 | < RichyB> | simon_, using what? :) |
15:36 | | Tarinaky [tarinaky@Nightstar-e99cts.net] has quit [Operation timed out] |
15:36 | <@froztbyte> | <McMartin> It's also a thing Java has, and I've often wanted a python equivalent to JARs >_> |
15:36 | <@froztbyte> | latest pip has wheels |
15:36 | <@froztbyte> | which more or less can be that, I think |
15:36 | | Tarinaky [tarinaky@Nightstar-e99cts.net] has joined #code |
15:36 | | mode/#code [+o Tarinaky] by ChanServ |
15:36 | <@froztbyte> | modulo path fuckery |
15:37 | <&McMartin> | I can't even parse "latest pip has wheels" |
15:37 | <@froztbyte> | ah |
15:37 | <@froztbyte> | proper python packages, basically |
15:37 | <@froztbyte> | instead of compiling shit on your server |
15:38 | <@froztbyte> | everything gets packaged after a build, and that's the way warehouse will serve it out |
15:46 | | * McMartin watches this design sprout class nesting three deep. |
15:46 | <&McMartin> | Time to make a new namespace I think~ |
15:59 | < RichyB> | "wheel" is a replacement for distributing python code as eggs |
15:59 | < RichyB> | Wheels have a bunch more metadata and stuff in convenient places like the filename and files in the tarball, instead of it inconvenient places like inside a turing-complete setup.py. |
16:10 | | ErikMesoy [Erik@Nightstar-3kot9q.80-203-17.nextgentel.com] has quit [[NS] Quit: Leaving.] |
16:12 | <&ToxicFrog> | McMartin: you may find it amusing to know that the Google internal LGBTQ channel is also full of UQM players. |
16:12 | <&ToxicFrog> | It has been *spitting* *happy spices* all morning. |
16:14 | | Turaiel[Offline] is now known as Turaiel |
16:16 | <&McMartin> | Hey, have them test the top of master, it's got namable savegames~ |
16:17 | | ErikMesoy [Erik@Nightstar-3kot9q.80-203-17.nextgentel.com] has joined #code |
16:23 | | OrthDroid [Orthia@Nightstar-5m8.1ee.224.119.IP] has quit [Connection closed] |
16:24 | | Orth [Orthia@Nightstar-5m8.1ee.224.119.IP] has joined #code |
16:24 | | Orth [Orthia@Nightstar-5m8.1ee.224.119.IP] has quit [Connection reset by peer] |
16:24 | | Orth [Orthia@Nightstar-5m8.1ee.224.119.IP] has joined #code |
16:36 | | AbuDhabi1 [AbuDhabi@Nightstar-i3u5cr.78.getinternet.no] has joined #code |
16:38 | | Orth [Orthia@Nightstar-5m8.1ee.224.119.IP] has quit [Ping timeout: 121 seconds] |
16:38 | | Orthia [orthianz@Nightstar-5m8.1ee.224.119.IP] has quit [Ping timeout: 121 seconds] |
16:38 | | AbuDhabi_ [AbuDhabi@Nightstar-i3u5cr.78.getinternet.no] has quit [Ping timeout: 121 seconds] |
16:41 | | Orthia [orthianz@Nightstar-5m8.1ee.224.119.IP] has joined #code |
16:41 | | mode/#code [+o Orthia] by ChanServ |
16:50 | | ErikMesoy is now known as Harrower |
17:01 | | AbuDhabi_ [AbuDhabi@Nightstar-1q2q7e.tmi.telenormobil.no] has joined #code |
17:01 | | AbuDhabi2 [AbuDhabi@Nightstar-1q2q7e.tmi.telenormobil.no] has joined #code |
17:02 | | AbuDhabi2 [AbuDhabi@Nightstar-1q2q7e.tmi.telenormobil.no] has quit [Connection reset by peer] |
17:02 | | AbuDhabi_ [AbuDhabi@Nightstar-1q2q7e.tmi.telenormobil.no] has quit [Connection reset by peer] |
17:02 | | AbuDhabi_ [AbuDhabi@Nightstar-1q2q7e.tmi.telenormobil.no] has joined #code |
17:02 | | AbuDhabi1 [AbuDhabi@Nightstar-i3u5cr.78.getinternet.no] has quit [Ping timeout: 121 seconds] |
17:04 | | Stalker is now known as Chan_Yasu_Daishi |
17:24 | | * TheWatcher proceeds to try and merge two hashes of arrayrefs of hashes containing google calendar data |
17:30 | | celticminstrel [celticminst@Nightstar-mhtogh.dsl.bell.ca] has quit [[NS] Quit: And lo! The computer falls into a deep sleep, to awake again some other day!] |
17:32 | <@simon_> | I wonder what is most efficient: |
17:32 | <@simon_> | private AtomicInteger n; ...; public foo(int bar) { int i = n.getAndIncrement(); ...; } |
17:32 | <@simon_> | or some kind of non-blocking queue |
17:33 | <@simon_> | basically I'm trying to measure a concurrent java class |
17:33 | <@simon_> | and I want to be as little invasive as possible and ruin any concurrency perks that the class itself has. |
17:34 | <@simon_> | e.g. I have a non-blocking solution to something that's probably working more than my wrapper class, but at least it doesn't block. |
17:34 | < RichyB> | AtomicInteger.getAndIncrement() and AtomicInteger.compareAndSet() are the primitives on which a lock-free queue will be implemented. |
17:35 | < RichyB> | e.g. to reserve slots inside buffers or whatever. |
17:36 | <@simon_> | ok. |
17:37 | < RichyB> | If you want your software to actually _work_, use data structures that have already been worked out such as java.util.concurrent.ConcurrentLinkedQueue. |
17:38 | < RichyB> | Building lock-free algorithms directly from CAS and FAA is really subtle and you'll get non-trivial ones wrong for sure. |
17:39 | < RichyB> | For goodness' sake don't implement your own concurrency lock-free queue directly out of CAS and FAA instructions when ConcurrentLinkedQueue is right there, and has been tuned for performance already! :) |
17:39 | < RichyB> | s/concurrency/concurrent/ |
17:39 | <@simon_> | I'm not ;) |
17:39 | <@simon_> | I'm basically recording a bunch of numbers |
17:39 | <@simon_> | I want to do arr[i++] = x; but I want i to be thread-safe. |
17:40 | < RichyB> | That might be a reasonable use for raw FAA, then. |
17:40 | <@simon_> | I'm already using ConcurrentLinkedQueues and ConcurrentHashMaps in combination with thread-pools in my actual application. |
17:41 | < RichyB> | Be aware that FAA is expensive. In my own benchmarks on recent Intel CPUs, I see getAndIncrement() taking ~10ns in the uncontended case up to ~400ns per operation when threads on different cores in the same chip are trying to write to the same spot. |
17:42 | <@simon_> | FAA? |
17:42 | < RichyB> | That could suck if you're trying to benchmark things like functions that complete in mere dozens of instructions. |
17:42 | < RichyB> | FAA = Fetch-And-Add. CAS = Compare-And-Swap. |
17:42 | <@simon_> | ah. |
17:42 | <@simon_> | my functions don't complete in dozens of seconds, they probably finish in a number of milliseconds. |
17:43 | < RichyB> | Ah it'll be fine. |
17:43 | <@simon_> | do you have a reference to the ~400ns case? that sounds like what I'm doing. |
17:43 | <@simon_> | I don't really have the time to benchmark the primitives. :P~ |
17:44 | < RichyB> | simon_, https://github.com/RichardBarrell/snippets/blob/master/atomics.c |
17:44 | < RichyB> | if you want, I'll change that so that it runs a bunch of different test cases and then prints out a table |
17:44 | < RichyB> | instead of recompiling it manually and re-running a bunch of times |
17:45 | <@simon_> | RichyB, ah, no worries. that's very nice, thanks! |
17:46 | < RichyB> | You're welcome. |
17:49 | < RichyB> | simon_, btw, in that code, RING_SIZE = number of ints that the competing threads attempt to FAA on. SEGMENTS = number of threads that compete to increment them. |
17:51 | < RichyB> | simon_, oh and I've just noticed an extra source of failure; I don't put padding between those ints. |
17:51 | < RichyB> | so they cache-pong a lot even if the FAA instructions aren't quite contending :) |
17:53 | | KiMo|autorejoin is now known as Kindamoody |
17:53 | | mode/#code [+o Kindamoody] by ChanServ |
18:00 | <@simon_> | RichyB, I'm nowhere near being concerned at that level of efficiency right now ;-) |
18:00 | <@simon_> | s/at /about / |
18:07 | < RichyB> | btw I think Java has an atomic integer array? |
18:09 | < RichyB> | Accesses to elements of a single `java.util.concurrent.atomic.AtomicIntegerArray` will be way faster than accesses through an array of `java.util.concurrent.atomic.AtomicInteger`s |
18:10 | < RichyB> | The former is one heap-allocated object containing a dense array of `n` integers that the GC won't need to scan. The latter is a heap-allocated array containing pointers to `n` heap-allocated objects each containing space for one integer. |
18:11 | < RichyB> | Your GC will probably have to scan through all of those little object refs if it happens to kick in. |
18:17 | <@simon_> | RichyB, oh, I don't have an array of atomic integers! |
18:18 | <@simon_> | RichyB, I have one atomic integer that indexes the array of regular integers. |
18:18 | <@simon_> | RichyB, that way I guarantee that any call to this function will have its own spot in the array. |
18:18 | <@simon_> | RichyB, but thanks a lot for pointing out the AtomicIntegerArray. java.util.concurrent really has a whole lot to offer that I haven't dug into. |
18:34 | < RichyB> | uh huh |
18:35 | < RichyB> | If you use FAA to allocate slots out of a single array, you're going to get really bad contention. |
18:36 | < RichyB> | So (1) you contend on the counter that you're adding to. (2) Adjacent slots will be in the same cache line, so concurrent writes to them will cache pong. |
18:36 | < RichyB> | Modern CPUs can only modify memory in cache-line-sized chunks. Typically that'll be 64 bytes on x86. |
18:38 | < RichyB> | If two different CPUs try repeatedly to modify two integers that fit into the same cache line then you get an effect called "cache pong". CPU A grabs exclusive ownership of the cache line in order to modify i[0], then CPU B grabs exclusive ownership of the cache line in order to modify i[1], then CPU A grabs exclusive ownership of the cache line in order to modify i[0] again⦠|
18:39 | < RichyB> | You get cache-line contention when cores attempt to simultaneously modify memory that sits in the same cache line. Just about as expensive as FAA contention. :) |
18:39 | < RichyB> | Sometimes it's referred to as "false sharing" because the two cores are trying to alter different bits of memory that merely happen to be too close together to be distinguishable as different. |
18:41 | < RichyB> | Thread-safe malloc() implementations get around this by having a separate nursery for each thread. |
18:43 | < RichyB> | (of course I'm still talking about hundreds of nanoseconds here) |
18:54 | <@simon_> | RichyB, thank you. I didn't know it was called a "cache pong", but I suspected that the phenomenon had to exist. |
18:55 | <@simon_> | RichyB, it seems that some people call it cache-line ping-pong. |
18:56 | <@simon_> | okay, so separate nurseries is the way to go. |
18:59 | <&ToxicFrog> | "false sharing" is the general/formal term; cache pong is one specific manifestation of it. |
19:11 | | Kindamoody is now known as Kindamoody|afk |
19:29 | | Vornicus [Vorn@Nightstar-sn7kve.sd.cox.net] has joined #code |
19:29 | | mode/#code [+qo Vornicus Vornicus] by ChanServ |
19:37 | <@Tarinaky> | The thought occurs that if I want to find work I should really stop getting into arguments with alumni on facebook. |
19:39 | | Turaiel is now known as Turaiel[Offline] |
19:39 | <@Tamber> | But... someone on the Internet is wrong! |
19:39 | <@Tarinaky> | Tamber: /Exactly/ |
19:40 | <@Tarinaky> | I can never quite tell where the line between looking clever on Facebook so I'm signalling that I understand advanced material blurs with looking difficult as a person. |
19:41 | | Harrower is now known as ErikMesoy |
19:56 | <@froztbyte> | lols |
19:56 | <@froztbyte> | subtlety ftl |
20:08 | | Kindamoody|afk is now known as Kindamoody |
20:12 | <~Vornicus> | operator.add, don't go straight to special methods |
20:13 | <~Vornicus> | (re: <RichyB> reduce(list.__add__, list_of_lists) concatenates them.) |
20:13 | < RichyB> | Vornicus, wrong complaint. itertools.chain(*list_of_lists) is the most correct thing because reduce(list.__add__) is quadratic. :) |
20:14 | <~Vornicus> | Point! |
20:14 | <~Vornicus> | But still |
20:14 | <~Vornicus> | the operator library is best pony. |
20:14 | <~Vornicus> | well, okay. second best pony, itertools is best pony. |
20:18 | <&ToxicFrog> | Missile pony is best pony. |
20:20 | <&McMartin> | NO MISSILE PONY FOR YOU. |
20:20 | <&McMartin> | *toot toot* |
20:20 | <&ToxicFrog> | OH YEAAAAAAAAAAAAAAH |
20:21 | <&ToxicFrog> | (do you remember which bit OH YEAH is from? Symbol and I have been trying to remember for like a year, and haven't managed to trigger it again) |
20:21 | <&McMartin> | Uh, in my fatigue-addled state I am only mapping this to the Kool-Aid Man and thus also Cave Story+ Balrog. |
20:22 | <&McMartin> | Hrm |
20:22 | <&McMartin> | I *do* have the source around here somewhere, re-rendered as proper XML and GML files. |
20:23 | <&ToxicFrog> | Oooh. |
20:23 | <&ToxicFrog> | And that reminds me, I need to look at the source for the Scrambler and implement it as a generalized tool. |
20:23 | <&McMartin> | I don't think the Scrambler was part of the pre-source-release text dumps. |
20:24 | <&McMartin> | But yeah, this will have to wait until I've maintained "16 hours of sleep in the past 48" for some time. |
20:24 | <&ToxicFrog> | It wasn't, but I remember looking at the source for it at one point and going "this doesn't look too hard to implement", so I must have gotten it somehow |
20:26 | <&ToxicFrog> | Found it! |
20:26 | <&ToxicFrog> | ...and it looks like it's just an unlikely random occurence. |
20:26 | <&ToxicFrog> | Pity, it must have gotten the right sequence of rolls for it to look like a prepatterned thing. |
20:26 | <&ToxicFrog> | Whatever it was, it had us both dying. |
20:27 | <&McMartin> | ISTR that the missile ponies were hardcoded |
20:27 | <&ToxicFrog> | Yes |
20:29 | <&ToxicFrog> | Or I'm wrong! no, those are also a random occurence, looks like. |
20:30 | <&ToxicFrog> | "Author: Komato Assassin Asha |
20:30 | <&ToxicFrog> | Subject: DING DING DING |
20:30 | <&ToxicFrog> | " |
20:30 | < AbuDhabi_> | If there are a lot of wireless networks in one place, do they interfere with one another's reception, or is there some kind of brilliant technical solution to that problem? |
20:31 | <&ToxicFrog> | Anyways, it looks like the text dump only includes scrambler whole-word or whole-textbox replacement maps, not the scrambler algorithm itself. |
20:31 | <&ToxicFrog> | Hrm. |
20:33 | <@Tamber> | AbuDhabi_, they interfere. |
20:33 | <@Tamber> | There's some technical wizardry that make it less horrible, but eventually it can't cope. |
20:37 | <@simon_> | apparently, Eclipse doesn't like it when I 'make clean' to remove .class files recursively in its source tree. |
20:39 | <@Tarinaky> | On the subject of Eclipse. Anyone know of any good vim plugins to make dealing with Java's package naming madness less maddening? |
20:40 | <@Tarinaky> | That is, basically, the only reason anyone uses Eclipse right? :V |
20:40 | | Kindamoody is now known as Kindamoody[zZz] |
20:41 | <@froztbyte> | a quick search gave me http://www.vim.org/scripts/script.php?script_id=1785 |
20:41 | <@froztbyte> | but I suspect that that, by itself, will be somewhat underwhelming |
20:41 | <@Tarinaky> | Aaaand... now Chrome's on strike... |
20:41 | <@froztbyte> | especially if you don't know vim well |
20:41 | <@Tarinaky> | Define 'well'? |
20:42 | <@froztbyte> | well, not particularly/gigantically well, I guess |
20:42 | <@froztbyte> | but its features and mechanisms |
20:43 | <@froztbyte> | more than "press i or a to input text, and know the movement keys" |
20:43 | <@Tarinaky> | That plugin looks like what I need. Need to check version though as Ubuntu uses an old one and I like to keep my plugins synch'd to avoid dissonance >.> |
20:44 | <@froztbyte> | http://packages.ubuntu.com/search?suite=precise&searchon=names&keywords=vim |
20:44 | <@froztbyte> | vim7's been in precise already |
20:44 | <@froztbyte> | so that's 2 years by now |
20:44 | <@Tarinaky> | Or maybe not. Haven't developed Python recently enough to remember why it annoys me. |
20:44 | <@froztbyte> | lucid had 7.2 |
20:44 | <@froztbyte> | so you should be fine |
20:45 | <@froztbyte> | if you were writing python, you almost certainly ran into vim doing tabs by default |
20:45 | <@Tarinaky> | *lubuntu |
20:46 | <@Tarinaky> | froztbyte: You say that like it's a bad thing :p |
20:46 | <@froztbyte> | what, tabs by default? |
20:46 | <@froztbyte> | it is a bad thing in python |
20:47 | <@Tarinaky> | No it's not. |
20:47 | <@froztbyte> | if you don't think so, proceed directly to accepting you're wrong |
20:47 | <@Tarinaky> | Mixing tabs and spaces is bad in python. |
20:47 | <@Shiz> | s/ in python.// |
20:47 | <@froztbyte> | Syka tried to argue this point in bullshit kinds of nuances as well |
20:47 | <@froztbyte> | proceed directly to accepting you're wrong. |
20:48 | <@Tarinaky> | Because PEP8? |
20:48 | <@froztbyte> | correct, more or less |
20:48 | <@Shiz> | fuck pep8 |
20:48 | <@froztbyte> | but also because the whole rest of the world and accepted standards |
20:48 | <@froztbyte> | it's like not doing K&R in a K&R C codebase |
20:48 | <@Shiz> | I can't take any kind of standard that still enforces 80 char width lines seriously |
20:49 | <@Tarinaky> | I would not call it an accepted standard. |
20:49 | <@Tarinaky> | The rule in PEP8 about tabs vs spaces is one of the most violated/ignored part of that document. |
20:49 | <@Shiz> | (K&R also didn't specify spaces vs tabs) |
20:49 | <@Tarinaky> | It's not universally accepted. |
20:49 | <@froztbyte> | you'll have responses varying from "meetings with the senior team" to "revoked commit permission" |
20:49 | <@froztbyte> | Tarinaky: I ... okay, no |
20:49 | <@froztbyte> | I'm not going to bother |
20:50 | <@froztbyte> | like I said, all of those are nuanced bullshit arguments |
20:50 | <@froztbyte> | feel free to keep fucking about with them |
20:50 | <@Shiz> | god forbid people try to not see shit in black and white |
20:50 | <@Tarinaky> | I'm sorry but I have regularly encountered code that does not conform to that rule and when dealing with existing code following the code style already in place is more important than imposing an external style guide. |
20:50 | <@Tarinaky> | That said I use spaces. |
20:51 | <@Tarinaky> | The PEP8 is not the 10 commandments though. |
20:51 | <@Tarinaky> | It is a style guide. |
20:51 | <@Shiz> | PEP8 has particularly stupid docstring conventions |
20:51 | <@Shiz> | I don't know who decided that PEP8-style docstrings were readable |
20:51 | <~Vornicus> | Why are there bullshit arguments about tabs vs spaces now? |
20:52 | <@Tarinaky> | Apparently froztbyte feels strongly about uniformity in the Python ecosystem. |
20:52 | <@Shiz> | no, varnicus, we've gone one level deeper |
20:52 | <@Tarinaky> | I think? |
20:52 | <@Shiz> | it's now a meta-spaces vs tabs argument |
20:52 | <@froztbyte> | Vornicus: I basically just said other people are shitheads |
20:52 | <@Shiz> | or something |
20:52 | <~Vornicus> | froztbyte: you shithead |
20:52 | <@froztbyte> | Vornicus: amen! |
20:53 | <@froztbyte> | Vornicus: nazi |
20:53 | <~Vornicus> | NO U |
20:53 | <@froztbyte> | Vornicus: just to win at godwin first |
20:53 | <@froztbyte> | unst unst |
20:54 | <@simon_> | RichyB, if I want a concurrent application to write a logfile using the same file and not proceed until something has been logged (transaction style), is there any way to avoid putting a queue in front of that? |
20:54 | <@Tarinaky> | Sometimes Godwin's Law makes me sad because there are some really valid comparisons with Hitler I want to present but I would feel far too self-conscious about being called out. |
20:54 | <@Tarinaky> | Well. Maybe not valid. |
20:54 | <@Shiz> | Tarinaky: you can always compare to stalin |
20:55 | <@Tarinaky> | Shiz: I don't know as much about Stalin. |
20:55 | <@simon_> | did you know that Stalin means Steel in russian and that he took the name himself? |
20:55 | <@Tarinaky> | And Dictators are not fungible. |
20:55 | <@Shiz> | just tell someone they're literally being stalin |
20:55 | <@Tarinaky> | simon_: Actually it's a corruption of the word steel / man of steel and yes. |
20:55 | <@Shiz> | all you need to know |
20:56 | <@simon_> | Tarinaky, ok. :) |
20:56 | < RichyB> | simon_, yeah, that has to serialise. |
20:56 | <@Azash> | Honestly there are very few arguments where you can repeatedly say "proceed to accepting you're wrong" and be taken seriously |
20:56 | <@simon_> | RichyB, what a pain! |
20:56 | <@Tarinaky> | In hindsight, froztbyte was probably being funny and I took him more seriously than I should have. |
20:57 | <@Shiz> | he took it seriously too afterwards |
20:57 | <@Shiz> | :p |
20:57 | <@froztbyte> | I'm only half facetious |
20:57 | < RichyB> | simon_, a bunch of different requests to append come in, only one of them can be the first byte of the *next* line to get put into the file, so there necessarily has to be contention on "what's the next line of the file going to be?" |
20:57 | <@froztbyte> | most of the arguments people make on this matter are bullshit |
20:57 | <@froztbyte> | I've seen, like, 3 codebases ever |
20:57 | <@froztbyte> | that couldn't be fixed up in minutes |
20:57 | <@simon_> | RichyB, right. I guess you have checkpointing in transaction systems because you don't actually want to write disk all the time. |
20:57 | < RichyB> | simon_, also write(2) calls are not necessarily going to be made atomic for you by the OS. A write(2) syscall can return early! |
20:57 | <@froztbyte> | and *everyone else* has the problem of their editor not being configured by default |
20:58 | <@froztbyte> | a problem typically fixed in about 2 lines of config |
20:58 | < RichyB> | simon_, uh yeah uh |
20:58 | < RichyB> | simon_, the answers to your question depend on what kind of performance you want. |
20:58 | <@simon_> | RichyB, yeah, like when copying a file to USB and it tells you you're done even though you can see the darn thing blinking. ;-) |
20:58 | < RichyB> | If we're still in "counting nanoseconds" territory then just give up on the entire concept of interacting with the filesystem in the firstplace, like. |
20:59 | | * Shiz thinks he should make some of his code threadsafe |
20:59 | <@Shiz> | I was wondering if the Python import system was threadsafe |
20:59 | <@Shiz> | but then I GIL'd |
20:59 | < RichyB> | If you're in "milliseconds" territory then don't worry about it, just write() under a mutex. |
21:00 | <@simon_> | hmmm, ok. |
21:00 | <@simon_> | well, I've got RPCs across HTTP, so... |
21:00 | < RichyB> | simon_, also what kind of safety are you after? Do you want to be sure that the data will survive a power loss? You need to fsync() and that will take a long time regardless of how nice your stuff is. |
21:01 | <@simon_> | RichyB, I do fsync() actually. I'm just getting really bad performance when running directly without RPC. |
21:01 | < RichyB> | If you want to be sure that your data will survive the hand of god reaching down and crushing your entire data centre then you need to send it to a remote location and wait for that remote location to send you back a message telling you that it has safely been fsync()'d there, too. |
21:01 | <@Tarinaky> | froztbyte: I genuinely don't see why it matters. It's an arbitrary choice one way or the other. |
21:02 | < RichyB> | simon_, to me it sounds like you could just use a concurrent blocking queue, leave a thread reading from it and writing to the log file, and append to the queue. |
21:02 | < RichyB> | Your safety constraints aren't stringent. It's not like you're expecting the process to segfault and prevent the logger thread from getting around to writing the message to disk eventually, right? |
21:03 | < RichyB> | oh and use a *bounded* blocking queue, so that fast writers will eventually block, too. |
21:04 | <~Vornicus> | "*spitting* *happy spices*" successfully befuddles me |
21:05 | <&McMartin> | Orz is Orz |
21:05 | <&ToxicFrog> | Orz are *fingers* |
21:05 | <@simon_> | RichyB, well, actually I was sort of making it resistant to sudden kills. |
21:06 | <@simon_> | RichyB, I don't want my RPC mechanism to respond over the network that "It's stored!" and then have the service killed. |
21:06 | < RichyB> | it honestly sounds like an Orz euphemism |
21:06 | <~Vornicus> | <3 the orz |
21:07 | < RichyB> | simon_, makes sense. I'd still trust the OS that it's as good as written as soon as write() comes back, because fuck it, your customers will probably understand you losing data if your machine borks. |
21:08 | < RichyB> | by "borks" I mean "loses power or kernel panics within ~30 seconds" |
21:08 | < RichyB> | unless these logs actually result in bodily harm or money being lost or whatever |
21:08 | <@Tamber> | At which point, that's worth spending the extra time fretting (and, thus money) over it~ |
21:09 | <@simon_> | yeah :) |
21:09 | < RichyB> | I have become incredibly laissez-faire about supposed safety properties of code as I have grown aware of actual failure rates |
21:09 | <@Tamber> | For something non-critical, I'd just go with "OS says it's written. Good enough for me." ...ooh, my quote key works again! \o/ |
21:10 | < RichyB> | so I'd write() to the log, under a mutex. |
21:13 | | * AbuDhabi_ hearts the Orz too. |
21:13 | <@Shiz> | it's all ogre |
21:14 | | Turaiel[Offline] is now known as Turaiel |
21:25 | | celticminstrel [celticminst@Nightstar-mhtogh.dsl.bell.ca] has joined #code |
21:25 | | mode/#code [+o celticminstrel] by ChanServ |
--- Log closed Tue Jan 21 21:31:31 2014 |
--- Log opened Tue Jan 21 21:31:36 2014 |
21:31 | | TheWatcher [chris@Nightstar-ksqup0.co.uk] has joined #code |
21:31 | | Irssi: #code: Total of 38 nicks [19 ops, 0 halfops, 0 voices, 19 normal] |
21:31 | | mode/#code [+o TheWatcher] by ChanServ |
21:32 | | Irssi: Join to #code was synced in 36 secs |
21:34 | | Tarinaky [tarinaky@Nightstar-e99cts.net] has joined #code |
21:34 | | mode/#code [+o Tarinaky] by ChanServ |
22:00 | | Chan_Yasu_Daishi is now known as Red_Queen |
22:07 | | Turaiel is now known as Turaiel[Offline] |
22:09 | | ErikMesoy is now known as ErikMesoy|sleep |
22:17 | | Red_Queen [Z@Nightstar-484uip.cust.comxnet.dk] has quit [Ping timeout: 121 seconds] |
22:55 | | thalass [thalass@Nightstar-bce70i.eastlink.ca] has joined #code |
23:43 | | Orth [Orthia@Nightstar-5m8.1ee.224.119.IP] has joined #code |
--- Log closed Wed Jan 22 00:00:28 2014 |