tim: Tim with short hair, smiling, wearing a black jacket over a white T-shirt (work)

The subject line is a little misleading, since I actually had an intense gdb session today (at least compared to the usual way in which I use gdb, which is to get a backtrace and then quit).

I got into working on one of those bugs today that's like gambling or playing a video game (two activities I try to avoid as much as possible, since I get paid to debug and don't get paid to gamble or play games :-D). There's always one more strategy you can try and maybe *this* time you'll find the bug... and since sometimes you do find it, the intermittent reinforcement keeps you going until 4 in the morning. Cut for length )

tim: Tim with short hair, smiling, wearing a black jacket over a white T-shirt (work)

I can barely bring myself to write anything today, both because I'm annoyed about some work-bureaucracy stuff (but isn't that always the source of annoyance?) and because I spent today on work that, while highly enjoyable (to me), is especially interesting (to anyone else), but writing every day is a habit I want to have, so I'll try.

Today was bug triage day! So I triaged ALL the bugs -- no, not really, I triaged bugs 2396-2526. Not a particularly notable number of duplicates or obsolete bugs today, but a fair number that were in need of labels and milestones. I stopped assigning bugs to people as much as I was before, so that there are some unassigned bugs for interns and new contributors to work on. Cut for length )

tim: Tim with short hair, smiling, wearing a black jacket over a white T-shirt (Default)
You can still ask me to ask you questions if you want to, too!

1. Are role models a thing that work for you? If so, describe a role model relationship you've had, past or present.

Yes, they are very much a thing... but perhaps I should say "were". I've kind of formed this kind of relationship with every academic advisor I've had (and a few job supervisors), but "relationship" implies something where the role model is aware that they are a role model, and I doubt that was true every time. I don't want to talk about specifics in public, because some of these situations didn't end well and others just kind of make me sound like a gushy fanboy if I talk about them. (And there's overlap between those two.) Instead, though, I shall reflect on why I don't have role models anymore. It just gets more navel-gazey from here (plus, four more questions and answers) )

tim: Tim with short hair, smiling, wearing a black jacket over a white T-shirt (work)
Today felt like a day that was mostly spent waiting for snapshots to build... and I'm still waiting for one to build right now:
  • In the morning, I found that the snapshot I'd finally started last night had built, but it didn't do me much good because there was another bug fix I'd made right after that that didn't make it into the snapshot, which stopped any progress on my main task (changing the standard library code to use classes with destructors instead of resources).
  • I pushed a new snapshot, but it failed to build only on FreeBSD because of a random pretty-printing problem (we have tests that check that the pretty-printer generates output that can be parsed, but somehow a warning message was getting mixed in with the pretty-printer output and preventing one test from passing).
  • After failing to achieve understanding of exactly what changed to cause this test to fail, I fixed the test to suppress the warning (by prefixing the name of an unused variable with "_" -- sadly, test cases often end up having unused variables, but we warn about them now...) and started a new snapshot going.
  • That new snapshot is finished compiling on every platform but Mac. Right now I'm not sure if the Mac bot is wedged or just slow, and for whatever reason I only have ssh access to the linux machines and not the Mac, so I can't just kill processes or anything.

Oh, the glamorous life of a professional open-source hacker... Cut for length )

tim: Tim with short hair, smiling, wearing a black jacket over a white T-shirt (work)

I skipped writing a post yesterday, but fortunately I didn't work on anything all that different from today: which is, destructors, all the time!

Porting the run-fail tests to use classes instead of resources mostly went smoothly, with the exception of the test morestack3, which after porting looked like (in part):

fn getbig_and_fail(&&i: int) {
     let _r = and_then_get_big_again();
[snip]
 }

class and_then_get_big_again {
[snip]
Cut for length )

tim: Tim with short hair, smiling, wearing a black jacket over a white T-shirt (work)
Well, I missed a couple days, due to moving from San Francisco to San José. Turns out that takes effort!

Today, I felt like going back to porting test cases from using resources to using classes with destructors, rather than fixing other bugs. I guess because most of the test cases had turned out to be pretty easy to change, and I wanted to see if I could blow through most of them. Naturally, I found a couple of bugs. Cut for length )

tim: Tim with short hair, smiling, wearing a black jacket over a white T-shirt (work)

I'm back from vacation, which means Daily TMI is back! In my confused post-vacation state, I decided I'd better set aside destructors (the last thing I worked on), as they're a new feature, and focus on fixing bugs in the compiler for a little while. There's a general consensus we need to do a sprint of fixing-bugs-not-adding-features, as the bugs seem to be piling up.

Cut for length )

tim: "System Status: Degraded" (degraded)
Emphasis added.
What astonished me was that no one had asked the churches if they wanted to be stared at like living museums. I wondered what would happen if a group of blue-jeaned blacks were to walk uninvited into a synagogue on Passover or St. Anthony's of Padua during high mass---just to peer, not pray. My feeling is that such activity would be seen as disrespectful, at the very least. Yet the aspect of disrespect, intrusion, seemed irrelevant to this well-educated, affable group of people. They deflected my observation with comments like "We just want to look," "No one will mind," and "There's no harm intended." As well-intentioned as they were, I was left with the impression that no one existed for them who could not be governed by their intentions. While acknowledging the lack of apparent malice in this behavior, I can't help thinking that it is a liability as much as a luxury to live without interaction. To live so completely impervious to one's impact on others is a fragile privilege, which over time relies not simply on the willingness but on the inability of others---in this case blacks---to make their displeasure heard.
-- Patricia Williams, The Alchemy of Race and Rights

And that's why whenever someone tells you that you can't feel bad about the way in which they've hurt you, because "they would never hurt you intentionally", that is not a gesture of friendship or, in fact, of any kind of relationship other than one based on fundamentally unfair power dynamics. They are saying "You are governed by my intentions, merely because I have the power to coerce you into being so governed." They are committing an act of discursive violence.
tim: "Bees may escape" (bees)
Welp, I finally told my mom that she was never really a parent to me and that I'd had to raise myself. This came up in the context of an argument about the phone bill. (Why am I paying my mom's cell phone bill, you might ask? Well, I'm not anymore!) Her response was actually -- for her -- shockingly mature: "you might feel that way, but I don't agree." I was expecting something more along the lines of "you don't really feel that way" or "you don't mean that".

Not that that didn't come up in another part of the conversation, in which she used my old name and referred to me as "her" in the space of about a minute, at which point I started yelling about how she's had five years to get it right and I'm not going to take it anymore. The conversation that followed consisted basically of her saying "How could you possibly think I would deliberately say that to hurt you?", me explaining that intent is not fucking magic, and then -- wait for it -- her repeating the exact same thing, repeating "But how could you possibly think I would deliberately say that to hurt you?" This cycle was repeated about 5-6 times. I asked her if she actually had listened to what I said, she said no because she said she had bad reception because her phone battery was low (phones don't work that way) and that I was talking too fast (I was talking at my normal speed). But instead of asking me to repeat it, she just saw fit to repeat what she'd already said, which I'd refuted, again. So in other words, she'd fit right in on Reddit... I said to her that every time she repeated that she didn't mean any harm by misgendering me, she was just hurting me worse. She said she was "flabbergasted" by that.

It needed to be said, but now I'm just staring at a wall (or more accurately, at my screen) instead of going to bed, even though I need to get up in less than 8 hours to go meet someone. The thing is, yelling isn't very productive, but there's just no productive way to communicate with someone who is either indifferent to or incapable of understanding the simple truth that other people have thoughts, feelings and perspectives of their own. When I was younger, my mom always told me not to air my dirty laundry in public, because she wanted to control who knew about her abuse of me (specifically, nobody). Well, fuck that.

Which reminds me, I never got around to doing my laundry tonight...
tim: 2x2 grid of four stylized icons: a bus, a light rail train, a car, and a bicycle (public transportation)
Clipper Card Customer Service custserv@clippercard.com

6:06 PM (2 hours ago)

to me

Dear Clipper Patron,

On August 30, 2011 you made a payment to Clipper for value added to your Clipper card. Unfortunately, at that time, your Visa card was mistakenly billed twice. The first of these charges occurred on August 31 while the second, duplicate billing, occurred the following day, September 1, 2011.

We identified the duplicate billing soon after it occurred and processed a credit to your Visa card during the period September 13-19, 2011. However, we have just been informed by our payment card processor that Visa had also identified the duplicate billing transactions and issued a credit to your Visa account on September 1, 2011. Consequently, Clipper® added value to your card without having collected any payment.

After identifying this error, Clipper’s payment card processor charged your Visa card on May 11, 2012 for the same amount that should have been collected for your purchase on August 30, 2011. You will see this charge on your credit card statement for this billing period.

We apologize for the confusion this may cause and appreciate your patience and understanding. If you have any questions about this issue please feel free to contact us at the phone number or email address listed below.

Sincerely,

Clipper Customer Service

877 878 8883

custserv@clippercard.com


Thank you, Clipper Customer Service, for making my day just that much more surreal!
tim: Tim with short hair, smiling, wearing a black jacket over a white T-shirt (Default)
"I hope you live without the need to dominate, and without the need to be dominated. I hope you are never victims, but I hope you have no power over other people. And when you fail, and are defeated, and in pain, and in the dark, then I hope you will remember that darkness is your country, where you live, where no wars are fought and no wars are won, but where the future is."

-- Ursula K. Le Guin, commencement speech at Mills College, 1983.

(Her comment about "separatism" strikes me as dancing at the edge of trans erasure... but then, it's their world. As with many things, good if you ignore that.

And you know, I hope she wasn't talking about the need to dominate and/or be dominated in an overarchingly affectionate context of consent, but one just never knows that either.)
tim: Tim with short hair, smiling, wearing a black jacket over a white T-shirt (work)

Yesterday

Finishing up porting resource tests to use destructors. I got behavior I couldn't understand with one test, resource-cycle, so I'll ignore that for now and move on to resource-generic.

Aside from having to prefix every field reference with self., the porting itself is pretty straightforward. (As I'd expect, since a class with a destructor is a pretty straightforward generalization of a resource.)

Random thought: I love seeing an internal compiler error -- it's much better than a program segfaulting -- because I know it's absolutely a bug no matter what, and that I can get a backtrace that will probably be helpful. In this case it was a non-exhaustive match in type_use::type_uses_for. Yet another reason why I despise alt check (Rust's non-exhaustive pattern-matching construct, like an incomplete case in Haskell) -- when I'm extending the compiler with new variants for a data type, I get less help from the compiler than I should otherwise.

Cut for length )

Times when I have to remember extra hard to redact my debug statements before checking in code: when I'm feeling inarticulate and just use #debug("meow") to denote which alt pattern matched.

tim: Tim with short hair, smiling, wearing a black jacket over a white T-shirt (working)

Yesterday and today, I worked on adding destructors to classes. A destructor is a method that can't be named directly, to which the compiler inserts a call whenever the memory for the class is about to be freed (so, whenever its reference count becomes zero). Here's a super simple example of a class with a destructor:

class shrinky_pointer {
  let i: @@mut int;
  fn look_at() -> int { ret **(self.i); }
  new(i: @@mut int) { self.i = i; }
  drop { **(self.i) -= 1; }
}
Read more... )

tim: Tim with short hair, smiling, wearing a black jacket over a white T-shirt (work)
I used to think that arguing on the Internet was a way of procrastinating, and that if I got into an argument it would distract me for the rest of the afternoon because hey, I'm a lazy procrastinator. Now I'm not so sure. I don't want to appropriate the language of triggers, because I'd rather leave that for the people who actually have PTSD (and I'm not one of them, as far as I know). But I am tempted to appropriate it because I'm not sure how else I can talk about the physical effect on me that it has when someone makes a boundary-crossing remark (usually not personally directed at me, but at a group I'm part of, for example); I engage because it's my reflex to; and they respond by shitting all over boundaries even more so. It's a heart-racing, dreading-opening-up-the-next-reply but doing it anyway and then it just gets worse kind of thing. And then I either stay in the argument, or do other equally non-productive things because my ability to focus on anything else is ruined for the next few minutes, the next few hours, or the whole day, depending.

Knowing what I know now, I'm less inclined to explain it in terms of conscious mechanisms (I don't want to do work -- or I don't want to go to bed -- so I procrastinate by seeking out wrong people on the Internet so I can tell them they're wrong) and more inclined to explain it in terms of subconscious mechanisms. Except I don't know how the latter work, or how to talk about it, or whether that even applies to me because my mental health is "not that bad". This doesn't tend to happen to me when arguing about anything work-related, and it doesn't even always happen when arguing about politics. That, I think, has less to do with the content, and more to do with how invalidating the other person is being (which is why the Mozilla code of conduct discussions ruined my ability to do much work for a few weeks -- but that's another post I'm still writing); while there are some technical communities where emotional invalidation is common in technical discussions, I'm fortunate to be in one that's not like that. (It's happened a few times in work-related discussions at places where I used to work; essentially hasn't happened in those discussions in the past year, though.)

I don't recall being actively invalidated or dismissed as being a big part of my early life (although being ignored sure was). I'm almost tempted to posit some sort of collective memory shared by abuse survivors that would explain why it's so upsetting to me to feel like I'm actively not being listened to or not being heard (when someone replies to what they think I said, or to what I represent in their mind, rather than what I said), when I don't have clear memories of having experienced that early on in life. Then again, there's a lot I can't remember.

Does anyone have ways of explaining / thinking about this kind of thing that doesn't step on anyone else's feet? I'm not sure any of this is even understandable; hi.
tim: Tim with short hair, smiling, wearing a black jacket over a white T-shirt (Default)
Friday, I talked about @class on IRC with Patrick and Niko -- we concluded it's complicated and
unnecessary, so deferring it. Instead, I filed an RFC for static methods in classes. As in languages you may be more familiar with, static methods don't have an implicit self argument. They can take a self argument explicitly, of course. The only difference between a static method and a top-level function is that a static method can access class-private fields in its enclosing class. This would solve the problem of @class without needing special syntax.

I kind of feel foolish about spending 2-3 days on something when if I'd discussed it earlier, the answer would have been "YAGNI". Like I should have discussed it earlier. Then again, who knows what "should" means? Anyway, now there's an RFC open and with hope, we can improve the language, and hopefully avoid doing something ridiculously complicated (like @class was becoming). In general, behavior that's not reflected in types seems like a bad idea.

So I started afresh and wrote the code that actually checks whether self escapes. At first I wanted to make it part of the typechecker, but I realized because of how the visitors in the typechecker work, it was just easier to write a separate pass for the self-check. It was a very small amount of code -- just a visitor that skips over field references (since self.x is okay) and complains if it sees self anywhere else. I didn't end up finishing this till I was on the plane home on Sunday, though.
tim: Tim with short hair, smiling, wearing a black jacket over a white T-shirt (work)
Thursday, May 10:

Normally, Thursday would be a bug triage day, but I was on a plane with no wifi, so I started out by doing some classes hacking. The number of special cases for @class in trans was proliferating, which smells bad.

I don't even remember what I meant when I wrote what follows:

  • actually I think impl_self and class_self have to be totally different things (but only for @class)
  • there must be a cleaner way to handle the self arg stuff than just passing around the ty_self to everything?

I ended up taking most of the day off due to my travels, so not much else to say.

tim: Tim with short hair, smiling, wearing a black jacket over a white T-shirt (work)
(From Wednesday, May 9)

Continuing the work on heap-allocated classes (which I ended up abandoning), I ran into more bugs with how I was invoking GetElementPtr:

Assertion failed: (Ty && "Invalid GetElementPtrInst indices for type!"),
function checkGEPType, file /Users/TimChevalier/rust/src/llvm/include
/llvm/Instructions.h, line 703.

Read more... )
tim: Tim with short hair, smiling, wearing a black jacket over a white T-shirt (work)
I've been writing posts but not posting them for the past couple days, so now I'm catching up. This one is from Tuedsay, May 8.

Tuesday featured a marathon meeting session in the morning, after I continued working on heap-allocated classes. I started out being kind of puzzled about how to annotate classes
in the AST to indicate whether they're allocated in the stack or the heap -- because they
already have region parameter annotations.
Read more... )
tim: Tim with short hair, smiling, wearing a black jacket over a white T-shirt (working)

I didn't get to writing a blog post on Friday, since I had a couple of interruptions and didn't get that much code written anyway. The main news from Friday is that classes can now implement parameterized interfaces! This was a pretty minor fix. That is to say, I can write:

class cat implements map<int, str> {
... }

which says that the type cat supports table- or map-like operations mapping integer keys onto string variables. Why a cat would support that, I don't know, but it's just an example. I went on to write a test like this: Cut for length )

tim: Tim with short hair, smiling, wearing a black jacket over a white T-shirt (working)
Today is Thursday, and Thursday is bug-triage day. Each day of the week gets assigned to one of the core paid Rust contributors to go through the bug database and triage newer bugs as well as reviewing older ones, looking for duplicates, closing obsolete bugs, and so on. When there's any time left, I grep for the string "FIXME" in the code -- not everybody uses "FIXME", but there's been more than enough FIXMEs to keep me busy -- which usually denotes either a minor issue that can be fixed in minutes (because it was blocked on another compiler feature that's since been completed), or something subtle that unexpectedly ends up taking days. I try to nudge myself towards just filing a new issue in the issue tracker (the goal is to have every FIXME in the code map to at least one issue in the issue tracker), but it's hard to resist that "I can do it!" urge that usually sends me too deep down into some rabbit hole.

I've been keeping track of what bug ranges I review, and today I went over the most recent 34 issues. I should probably start going over the older issues again, since it's been six weeks since I looked at some of them and probably some things have changed. It's always a bit difficult to figure out who to assign bugs to, since our team of paid contributors is still pretty small, and I generally don't want to drop work non-consensually on the volunteer contributors. Assigning milestones is a bit random as well, but I figure if I make a mistake, it'll eventually get noticed in a group meeting and we'll move something to a different milestone. I wish github's issue tracker had a notion of priorities ("trivial", "important", "crucial") as well as milestones -- since some of the issues arising from FIXMEs, especially, can be pretty trivial, but I still want them to be on the record -- but it doesn't. So if at all possible, I try to make sure everything is milestoned (except for RFCs, enhancements, and "wishlist" items -- I see "wishlist" as like "enhancement", but even more optional); I also try to make sure bugs are assigned (using "git blame" to figure out who last touched the relevant bit of code, although it's misleading for occasions when we move directories around and do big reformats), though I'm more ok with leaving things unassigned than unmilestoned. (After all, unassigned bugs are openings for new contributors to get involved!)

Then I started in on FIXMEs. Most of the ones today were either comments I didn't understand, or quickly proved to be way too complicated (like, when I removed an unused constant -- should have been trivial -- promptly causing a scary memory corruption error, probably because the RTS also depended on the "unused" constant). So I filed issues. There were a few minor issues that I could fix quickly, and that was satisfying, like moving code over to use new for loops. When I left the office I had gotten started on one of those bugs where you pull the thread in the sweater and the entire thing unravels (changing some constants from int-type to unsigned-int-type in the back-end -- I think it should be done, but it's death by a thousand type errors). I won't detail the other bugs I fixed and filed, because that would, maybe, be too much detail even for this blog. I find joy and satisfaction in mundane, routine work. It's something I can do, and it's always still there for me no matter how long I've been away. And even though my highfalutin job title is "Research Engineer", it's my feeling that most of the effort involved in turning research into a thing that people can use (whether that thing is a programming language, or a compiler for it, or a browser implemented in the language) is the mundane, routine details that you're just Not Allowed to be too interested in when you're a grad student. Something feels right to me about giving myself over to that unglamorous work now. So while I might say that my blog posts are boring, that's just because I don't automatically expect other people to care just because I care. I've been many things at work over the past few months, but I haven't been bored.

...Except when something's recompiling and I don't have the energy to context-switch when I know I'll have to context-switch again in 2 or 3 minutes. Then I'm bored.

Profile

tim: Tim with short hair, smiling, wearing a black jacket over a white T-shirt (Default)
Tim Chevalier

November 2021

S M T W T F S
 123456
78 910111213
14151617181920
21222324252627
282930    

Syndicate

RSS Atom

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags