/srv/irclogs.ubuntu.com/2014/04/28/#ubuntu-mir.txt

dufluRAOF: I tried to make a little progress on Mir's support for i915 but the issue appears to be lower level any idea?  https://bugs.launchpad.net/mir/+bug/127539801:22
ubot5Launchpad bug 1275398 in Mir "i945: Mir GL clients are rendered as black or transparent windows when using i945 graphics" [High,Triaged]01:22
duflu(i915 driver, i945 chip)01:22
RAOFduflu: Do you know if it's black buffers, or transparent buffers?01:45
dufluRAOF: Varies between clients :)01:45
dufluPossibly varies between clients on RGBX/RGBA01:45
RAOFAh, so the buffers would just be uninitialised, then.01:46
RAOFAlmost.01:46
RAOFI guess our buffer initialiser gets to them, but they never get _new_ content.01:46
RAOFduflu: Does in-process rendering work?01:46
RAOFIn-process client, I mean.01:46
dufluRAOF: I need to test more I guess but render_surfaces is perfect01:47
RAOFduflu: mir_demo_standalone_inprocess_egl ?01:48
dufluRAOF: I'll have to boot up the noise machine again01:48
dufluafk01:48
xnox* libmirclient7 [amd64 armhf i386]  (for libboost-system1.54.0)01:57
xnox* libmirplatformgraphics-mesa [amd64 armhf i386]  (for libboost-program-options1.54.0)01:57
xnox* libmirserver18 [amd64 armhf i386]  (for libboost-program-options1.54.0)01:57
xnox* libmirserver18 [amd64 armhf i386]  (for libboost-system1.54.0)01:57
xnoxAbove packages are the last few that are in main and use boost1.54 in utopic, is a daily release (even if no-change one) planned soon into the utopic archive?01:58
dufluRAOF: inprocess_egl fails too -- black screen just the cursor01:58
xnoxor should i upload no change rebuild into utopic?01:58
RAOFxnox: Feel free to no-change rebuild.01:59
xnoxRAOF: thanks.01:59
RAOFxnox: We don't daily-release into utopic, thanks to our current embarrassing lack of ABI.01:59
dufluNew competition: Who can make Mir work on something older than this '06 Pentium D? :)02:00
dufluAlthough I think we're most limited by DRI2/Mesa support :(02:00
xnoxRAOF: and are boost-templates known to leak to ABIs of things that build against lib*mir*-dev ? i don't think there are any abi/api changes to system&program-options, but still would be interesting to know.02:01
RAOFxnox: It would not surprise me if boost templates leaked into the ABI (such as it is), but I'm not sure.02:02
xnoxRAOF: ok, thanks.02:02
RAOFHm. Actually, I'm pretty sure that boost::asio is a part of our current ABI.02:02
dufluReally?02:03
xnoxRAOF: i wish boost had stable abi =(02:04
RAOFduflu: Well, it's hard to say, isn't it. There's certainly a bunch of boost::asio in include/server/*.h, which is ostensibly public.02:04
* RAOF wonders what contortions boost would need to go through in order to ensure a stable ABI.02:05
xnoxRAOF: well, stdlib and stl manage it =) the piles of diff in asio alone from boost1.54 -> boost1.55 do not make me happy...02:11
xnoxRAOF: i think i'll wait until we have some images of utopic before rebuilding those and/or wait for a release to utopic.02:11
RAOFxnox: That seems sensible; we've got a process that'll rebuild all our reverse-depends when that happens, anyway.02:12
xnoxRAOF: excellent!02:12
=== chihchun is now known as chihchun_afk
dufluRAOF: If your hacking journeys have you retained any system that uses the i915 driver?02:41
duflu-If +In02:41
RAOFduflu: I've got an Atom netbook; I forget whether or not that uses i915_dri.so02:42
dufluRAOF: Yeah it should02:42
dufluMine does02:42
dufluAs long as it predates PowerVR02:42
RAOFIt does :)02:42
dufluRAOF: It's fun to try even if you just install trusty plus mir-demos. Suddenly the old system has super-smooth graphics and some new potential :)02:43
dufluAlthough unity7 is also less of a hog in trusty than previous releases too. Somewhere in the last 12 months it's gone from 60 seconds opening the dash to almost instant. \o/02:47
=== chihchun_afk is now known as chihchun
=== chihchun is now known as chihchun_afk
=== chihchun_afk is now known as chihchun
dufluRAOF: What is DRM_API_HANDLE_TYPE_SHARED?06:15
dufluI can see some logic in Mesa's i915 changed for that type in the Mir patch06:15
RAOFThat would be for flink, IIRC.06:16
dufluOops, actually the change affects != DRM_API_HANDLE_TYPE_SHARED06:16
RAOFHm. It's entirely possible that I just haven't done the necessary hookup bit for i915?06:16
RAOFAt one point it was sharing files with i965, then that got split and they got copies of identical files that then diverged...06:17
duflu+   if (whandle->type != DRM_API_HANDLE_TYPE_SHARED)06:17
duflu+      return NULL;06:17
dufluThat's new. Did it ever work?06:17
RAOFOh!06:17
RAOFYou're looking at the wrong i91506:17
RAOF:)06:17
dufluRAOF: Looking at my Ubuntu Mesa source :)06:17
RAOFThat's the Gallium driver, which we don't use.06:17
RAOFYou want src/mesa/drivers/dri/i915.06:18
RAOFConfusingly, there are two separate i915 drivers in the mesa source.06:18
dufluI'm confused by most of the Mesa source so that's OK06:19
RAOFHm. Is there some way to add a target to each compiled target in cmake?06:55
dufluRAOF: Umm, rephrase that?06:57
dufluAdd a dependency?06:58
dufluRAOF: http://www.cmake.org/cmake/help/v2.8.8/cmake.html#command:add_dependencies06:58
RAOFduflu: Specifically, I want to grab a total list of sources (to run them through clang-check -analyze)07:10
anpokRAOF: last time I did that by replacing the add_executable and add_library alls with homegrown macros that behave same07:16
RAOFanpok: Yay? Ok, I'll stop trying to make a branch that'll automatically run the static analyser :/07:16
dufluRAOF: cmake usually has an existing answer if you can wade through the docs07:19
anpokback then I also wanted to acchieve something like virtual library target, since the project could be build all static libs or as shared libraries or static exectuables.. and avoid fpic where possible..07:20
dufluanpok, RAOF: I hear GNU Make is still awesome07:52
dufluJust that CMake dumbs it down too much, sometimes07:52
dufluWhee, all the (review) things.08:25
duflualf_: I spent a while looking at the screencasting stuff on the weekend. What was the motivation for recompositing to screencast? is ReadPixels truly infeasible?09:12
dufluI mean the whole thing relies on the assumption that it's faster to GL render twice than to render one and then glReadPixels... ?09:13
=== chihchun is now known as chihchun_afk
=== alan_g is now known as alan_g|lunch
=== alan_g|lunch is now known as alan_g
alan_galf_, anpok: are you OK with this? https://code.launchpad.net/~alan-griffiths/mir/purge-some-sessions/+merge/21725212:32
alf_alan_g: looking12:34
alan_gthanks12:39
kgunnAlbertA: is this bug a dup really of the stale socket cleanup ?13:44
kgunnhttps://bugs.launchpad.net/mir/+bug/118977013:44
ubot5Launchpad bug 1189770 in Mir "[DRM/GBM] Killing (or crashing) Mir often leaves the screen blank and difficult to recover" [Medium,Triaged]13:44
kgunnkinda feels like it is13:44
alan_gkgunn: no - that's about locking up the VT (e.g. input doesn't work)13:48
alf_kgunn: alan_g: Have you seen that recently?13:52
alan_gno13:53
=== dandrader is now known as dandrader|afk
=== dandrader|afk is now known as dandrader
AlbertAkgunn: no that's different it still happens actually14:27
AlbertAkgunn: alf: alan_g: I see that all the time when I kill (not sigkill) mir on my intel laptop14:27
AlbertAwell maybe not all the time14:27
AlbertAactually I think when mir dies14:28
AlbertAwith an exception14:28
AlbertAI usually get a blank screen that I can only switch out of with sudo chvt 714:28
alan_gAlbertA: is that a consequence of bug 1285084?14:29
ubot5bug 1285084 in Mir "Exceptions are raised in a compositing thread and not handled" [Undecided,New] https://launchpad.net/bugs/128508414:29
alan_gBecause exceptions in most threads are handled sanely14:30
AlbertAalan_g: could be, I haven't investigated it14:30
alf_AlbertA: kill => inadverently kill by doing something wrong that leads to exception?14:31
AlbertAalan_g: the last time I saw it was when i investigated the power off display bug which was throwing an exception14:31
AlbertAalf_: Sorry not by killing that works fine. I mis-remembered14:32
alf_AlbertA: interesting, do you remember from which thread it was thrown from? We can force an exception there to reproduce consistently...14:32
alf_AlbertA: s/from//14:33
AlbertAalf_: Yeah it was the bug daniel fixed, so the DisplayConfiguration valid check14:33
alf_AlbertA: thanks14:33
AlbertAalf_: which was I suppose the demo shell responding to a power key event14:33
AlbertAalf_ : whatever that thread is14:34
sil2100kgunn: hi!14:35
sil2100kgunn: so, we would need to re-assign your Mir silo for utopic, as it's currently still building stuff for trusty14:36
sil2100kgunn: are you guys using the silo right now? Since my re-assignment will require a rebuild of all packages14:36
mterrygreyback, welcome back!  I'm sure you have a backlog of stuff, but when you have a few minutes, I wanted to pick your brain on lifecycle events & nested servers14:39
greybackmterry: am happy to talk whenever you'd like14:40
mterrygreyback, OK.  So I have USC sending lifecycle events like will_suspend and resumed to the greeter (which is a glorified unity8 session -- nested mirserver etc).  It never seems to see them...  I went down the stack to platform-api on the greeter side, and it never seems to get the event14:42
sil2100kgunn: tell me when you think I could do that14:42
mterrygreyback, does the nested server hide such events or not listen for them in the first place?14:42
kgunnsil2100: hmmm....letme just grab the packages real quick and then you can have it, i'll ping you....14:43
sil2100kgunn: ok, thanks!14:43
greybackmterry: I don't know. I'm not aware of any reason why a nested server would hide those events or ignore them. Have you any sample code I could test with?14:45
kgunnsil2100: ok, go for it14:46
sil2100kgunn: thanks, doing o/14:47
kgunnsil2100: yeah...we'll want to target utopic14:47
mterrygreyback, sorry, got distracted.  Sample code...   no just some local edits to my various split branches.  I could try to reproduce using mir demo code15:00
greybackmterry: ok. well on idea is that platform-api only has lifecycle listenening code in its client library, not its server lib (lp:platform-api:src/ubuntu/mirclient)15:03
mterrygreyback, nested servers don't run both code?15:03
mterryI figured they would be clients on one side and servers on the other15:03
greybackmterry: I don't see how one process can use platform-api client & server simultaneously tho15:05
greybackmaybe they can, but I expected symbol collisions15:06
mterryYeah, I don't know how the code fits together.  I just assumed that a nested mirserver was re-using the client code somehow.  But if it isn't, that would explain some of what I'm seeing15:06
greybackmterry: the nested server is a Mir server itself, it is run with QT_QPA_PLATFORM=ubuntumirserver right?15:07
mterrygreyback, right, which would pick up the side of platform-api without the listening it seems15:07
greybackif so, then the platform-api server plugin is being used, and that doesn't have lifecycle event listening code build in15:07
greybackindeed15:07
greybackthat's my best theory at the moment15:07
mterrygreyback, alright.   I'll test that out, thanks15:07
greybackmterry: let me know if I can help more15:08
alf_AlbertA: How do you support a buffer queue of one in the new implementation? Won't that lead to the compositor blocking?15:36
AlbertAalf_: I add the only buffer to the free queue15:37
AlbertAalf_: so then the compositor and clients end up sharing the same buffer15:37
AlbertAalf_: all the time15:37
AlbertAalf_: then after I added to the free queue at the very beginning the15:38
AlbertAoperations are all the same as in the other cases15:38
AlbertAalf_: i.e. a client's next request (after release) will block until compositor composites that buffer15:39
=== alan_g is now known as alan_g|afk
alf_AlbertA: but what if a buffer is held by the client when the compositor acquires it? It will just get it?15:40
AlbertAalf_: yes because it wil fall under the "use current buffer" condition15:41
alf_AlbertA: ok, I am not sure how well SwitchingBundle handles this scenario...15:42
AlbertAalf_: hence why I wrote the unit test :)15:42
alf_AlbertA: it's conceivable that it doesn't handle it well (since we don't have users of this use case)15:42
AlbertAalf_: some of the unit tests in SwitchingBundle do exercise constructing a SwitchingBundle of 1 buffer15:43
AlbertAalf_: but there wasn't any specifically testing the behavior of 1 buffer scenario.15:44
greybackmterry: question for you: what launches unity-system-compositor? I can't see a system upstart job for it15:45
mterrygreyback, lightdm manages it15:46
greybackmterry: ah ok15:46
=== alan_g|afk is now known as alan_g
alf_AlbertA: I wonder if the logic around buffer_to_release in compositor_acquire() could be problematic for the single buffer scenario. For example, we pop() the buffer from the ready_to_composite_queue and set the current_compositor_buffer with it. Then we release() it and in give_buffer_to_client() we need to resize, so the buffer pointer in current_compositor_buffer is now invalid.15:54
AlbertAalf_: yes you are right15:55
AlbertAalf_: I need to add that to the unit test15:55
alf_AlbertA: ahhh, the beautiful land of the component formerly known as SwitchingBundle :)15:58
alf_AlbertA: at least in the new version we can *read* the code and *find* the problems15:59
AlbertAalf_: :)15:59
AlbertAalf_: it kinda mirrors government15:59
AlbertAalf_: because it shows the danger of centralizing many things in one16:00
AlbertAalf_: :)16:00
kdublol16:01
=== chihchun_afk is now known as chihchun
=== dandrader is now known as dandrader|lunch
mterryMir folks -- why is there no version of mir_connection_set_lifecycle_event_callback for mirservers that are nested?  Surely nested servers want to hear about such events too.  I'll file a feature request bug unless ya'll tell me it doesn't make sense17:03
mterryHmm, the mirserver library links to mirclient.  Maybe I can use that API after all17:11
josharensonQuestion: I have a thread that calls "run_mir" (which blocks). Is there a graceful way to stop mir?17:28
kdubthat function is more of a helper17:37
kdubmir::DisplayServer has run() and stop()17:37
kdubjosharenson, ^^17:38
josharensonkdub, ack17:55
kdubmterry, don't know the specific problem, but if something in the mir client api is useful to the things the custom nested server is doing, then no reason not to use the client api18:32
kduband, if its a thing that should be universally done, then we should pull it into the nested code18:32
mterrykdub, yeah...  but MirConnection isn't exposed to mirserver users.  You can get the HostConnection, but that class isn't defined externally18:32
mterrykdub, I ended up filing bug 131383218:33
ubot5bug 1313832 in mir (Ubuntu) "[enhancement] Allow nested mirservers to listen for lifecycle events" [Undecided,New] https://launchpad.net/bugs/131383218:33
=== dandrader|lunch is now known as dandrader
josharensonkdub, when I start the display server via display_server.run() and join the thread, the client application says it cannot connect to the display server... After looking at the example basic server, I can't figure out what I'm missing (client app runs under example server just fine)18:58
kdubhow do you join the thread if the display server is still running? o.O19:05
josharensonI'm kicking off a thread that calls a function that calls run... joining my thread back to the main thread.... is the server supposed to block after calling run?19:06
kdubiirc, it is running until stop()19:07
josharensonso is the best way to call run_mir with the command to start the client as the lambda arg?19:08
josharensonpunctuation would have made that more clear... is the best way, to run a client without manually starting a server beforehand, ^^19:09
kdubjosharenson, it depends on what you're trying to do really19:13
josharensonkdub, start mir server -> run glmark2 -> stop server19:14
kdubrun_mir is helpful code if you're starting an executable that you'd expect to respond to ctrl-c19:14
kdubso with that, I'd come up with an executable that fires off the mir server, forks out the client, waits for the child to end19:14
kdubthen DisplayServer::stop()19:15
kdubsomething like that19:15
kdubi think the acceptance tests do something similar19:15
josharensonkdub, ok thanks.. I just got something that _kind of_ works.. ill reference the acceptance tests19:16
kdubjosharenson, yw19:18
kdubcamako, have some time to chat about https://code.launchpad.net/~kdub/mir/overlay-gl-program/+merge/217153/comments/517227 ?19:56
camakokdub, can I ping you in a bit?19:57
kdubcamako, sure, no rush19:57
=== dandrader is now known as dandrader|afk
camakokdub, sorry that took a while21:01
kgunnAlbertA: might give a look over this21:16
kgunnhttps://blueprints.launchpad.net/ubuntu/+spec/client-1410-unity-ui-power21:16
kgunni just added a potential policy idea...21:16
AlbertAkgunn: yes it's being discussed over e-mail, I have to change the mir tasks21:16
AlbertAkgunn: as that changed a while back during previous IRC discussions21:17
kgunnAlbertA: we need to land things faster i can tell :) before they change on irc21:17
AlbertAkgunn: :)21:17
AlbertAkgunn: well what I implemented is in sync with the IRC discussions21:18
kgunnthats god news21:18
kgunnor good news even21:18
AlbertAkgunn: the missing parts so far21:18
AlbertAkgunn: is long-press power button (new to me)21:18
kgunnah21:19
AlbertAkgunn: and who will communicate the per session timer settings/backlight value preferences21:19
AlbertAkgunn: to USC21:19
kgunnAlbertA: so kinda feels like either usc reads them direct ?...or...relies on shell & we make in interface to keep it all agnostic...21:20
kgunnbut...u of u-s-c is unity...21:20
kgunnso...21:20
kgunnwhat are your thoughts21:21
AlbertAkgunn: right...currently it's built in defaults, overridable through the command line21:21
AlbertAkgunn: but we do need an interface, just don't know if DBus, or resuing the mir socket21:21
AlbertAkgunn: depends on who will communicate the info21:21
AlbertAkgunn: could be the lightdm socket as well...21:22
kgunnmmm...right, it is per user session21:22
AlbertASaviq: ^21:24
AlbertAprobably too late21:25
kdubcamako, pong, np21:25
kgunnAlbertA: actually...he doesn't sleep...i'm convince21:25
kgunnd21:25
camakokdub, I see your points and am updating my comments...21:25
kdubcamako, cool, thanks21:26
* kgunn loves that camako is going to help on sticky subjects21:26
camakokdub, I 'm good... Just the naming bothers me a bit...21:26
kdubyeah, I have to address some of daniel's naming comments too21:26
kdubi think that overlay vs optimized-surface is a good distinction to make in the naming21:27
kdubwith overlay being the android concept21:27
camakokdub, I like :-)21:27
kgunnAlbertA: and would u-s-c really be involved for brightness/ALS ?21:27
AlbertAkgunn: only as a proxy to powerd21:27
kgunnah21:27
kgunnpass thrug21:27
AlbertAkgunn: yeah21:28
kgunndamn i can't type today21:28
camakokdub, on second thought, they'd be "optimized" if hwc wouldn't reject them..21:29
camakokdub, perhaps "fallback" or smth like that21:29
camakokdub, but if nothing works, "optimized" is better than "overlay"21:30
camakokdub, also this means that by falling back to gl, we are requiring gl capable gpu on the SoC.. should we worry about that?21:31
kdubcamako, i don't think so, we won't hit an opengles-less android device soon21:39
kdubcamako, 'optimized' was from the perspective of the DisplayBufferCompositor21:40
kdubwithin the android platform, 'overlay' vs 'fallback' is a good distinction21:42
kdubthe pot o gold at the end of the rainbow for me is like... wobbly windows, and then when the animation stops, the hwc overlay stuff seamlessly kicks in21:44
camakokdub, I'm not worried abt Android-capable devices.... But there are devices coming out with only a 2D gpu e.g... Those devices could replace GLRenderer... but now we *require* GL for the "overlays"21:45
kdubwell, we don't though, they can just give a stub gl program factory21:45
kduband then that would be another platform without gl21:45
kdub s/stub/null21:46
camakokdub, how will they render overlays?21:46
kdubwell, thats for that platform to figure out, like say its the omap dss21:46
kduband there is made an explicit opengl-less platform for that... they can just reject the optimization function, or under the hood, they can do what they want21:47
kdublike, I sent out this line on the ML21:47
kdubhttp://bazaar.launchpad.net/~kdub/mir/future-default-display-buffer-compositor/view/head:/src/server/compositor/default_display_buffer_compositor.cpp#L4921:47
kduband at that line, if the platform returns true for line 64, then the platform gets the RenderableList to the screen however it wants21:48
kdubor,  for mesa, mesa can accept a renderlist that has a 64x64 image + a fullscreen image21:49
kduband under the hood, it figures out 'hey, this is a hardware cursor, and this is a bypass'21:50
kduband that same line would work for android, where under the hood, it does the whole HWC dance21:50
camakokdub, the term "overlay" is already confusing us....   I mean how will they render overlay-rejects? The only method we provide for layers rejected by hwc, which is not replaceable, is gl... Or am I misunderstanding...21:51
kdubcamako, like, a hwc extension would have to come out, I think21:53
kdubthat is like OpenGL-less HWC21:53
camakokdub, I'm not worried what happens under the hwc hood (it's SoC specific... 2D, DSS are all fair game)... But the fallback path is the common denominator and minimum requirement assumption21:53
kdubcamako, taking a step back... what are you anticipating happening?21:54
camakokdub, when we have taken much pain to make things replaceable, are we okay with having this assumption which ties us to opengl21:55
AlbertAcamako: but that's a requirement of opengl hinted strongly by the hwc headers21:55
kdubwell, it ties us to opengl only for a platform which has a hard opengl requirement anyways21:55
camakokdub, yes as long as we are in the Android world we are good21:56
camakokdub just wanted to make clear that just because GLRenderer can be replaced doesn't mean we can do without GL21:56
AlbertAcamako: isn't that the point of having a separate GL program as fallback for android?21:57
camakokdub, I'm ok with this assumption... Just want to make sure it's explicit21:57
kdubright21:59
camakoAlbertA: yes21:59
kdubthe other thing though is post_update() on mg::DisplayBuffer assumes OpenGL too21:59
camakoOk so we basically require opengl... which is ok...22:00
AlbertAcamako: oh I think I see your point...why put an extra program if we require GL implicitly anyway22:01
AlbertAcamako: is that it?22:01
camakoAlbertA: Yes part of it...22:01
camakoAlbertA: But that means factoring the heck out of GLREnderer and making things difficult22:02
kdubbut, my big point is that the HWC program has strict requirements, GLRenderer will grow and flex22:02
kduband I don't want the HWC to break as GLRenderer grows and flexes to support like... window decorations or animations22:03
camakoSure, I basically don't have a problem with what we are doing...22:03
camakoBut was under the impression that, with GLRenderer being replaceable22:03
camakowe could do away with GL and support GL-less platforms eventually (of course not possible now with hwc etc)22:04
AlbertAcamako: yeah, I would think it would be another folder under platform :)22:04
camakobut I understand now that GLRenderer being replaceable is not necesarily to get rid of gl-capable gpu22:04
kdubperhaps, although there is other plumbing that would have to be done22:04
kduband a lot of that plumbing would be rooting the GL concepts out of the platform interfaces22:05
kdubbut, overall, yes :)22:05
camakoBefore that we'd have to break the Android dependency... Android require gles2 capable gpu now22:05
AlbertAcamako: yeah no doubt more changes would be needed to support it22:06
AlbertAcamako: but your gpu-less platform would basically provide a rendererfactory that creates22:06
AlbertAcamako: the gl less renderer22:06
kdubright22:06
kduband really, the GLRenderer and DefaultDisplayBufferCompositor are just split between "this one doesn't have GL and this one does lines"22:07
kdubI think the more important interface is DisplayBufferCompositor22:07
kdubesp because  GLRenderer's interface is kinda weird22:07
kdublike, 'begin()'  just does a glClear, and end() does a texture cache flush, and if you don't call it, you leak and explode22:08
kduband, if you call end() before the eglSwapBuffers, you get tears22:08
kdubthings like that :)22:08
AlbertAkdub: yeah it's tricky to wrap state machines22:09
camakoWon't be long before compositors run on ucontrollers... Some gpu companies working on it... Mostly 2D at first...22:10
camakoAnyways... would be a good problem to have for ubuntu22:10
kdubright, like maybe raspberry pi or something.. maybe some of our intrepid lurkers could look at that :)22:11
kdub'there's only 2 things hard in computer science, cache invalidation and naming things'22:30
* kdub thinks of that quote often when trying to come up with class names22:31
=== dandrader|afk is now known as dandrader
Saviqkgunn, AlbertA, :P23:42
RAOFkdub: That quote's incorrect; the correct one is “There are only two hard problems in computer science: cache invalidation, naming things, and off-by-one errors” ☺23:46
kdubRAOF, haha, clever23:50

Generated by irclog2html.py 2.7 by Marius Gedminas - find it at mg.pov.lt!