denise: Image: Me, facing away from camera, on top of the Castel Sant'Angelo in Rome (Default)
Denise ([staff profile] denise) wrote in [site community profile] dw_news2012-07-20 11:14 pm

Dreamwidth Update: 21 July 2012

Hello, Dreamwidth! Now that we have returned from tonight's maintenance (as I said on Twitter, we were all in the room where [personal profile] alierak and [staff profile] mark were doing the maintenance and we still kept trying to refresh things) and are reasonably convinced the site is not going to blow up any second (*knock wood*), I am pleased to announce that we have a lot of REALLY AWESOME THINGS to share with you.

This week we brought a number of our senior developers out here to Portland for OSCON, O'Reilly's annual conference about open source. (We were able to do this thanks to all y'all supporting us -- so thank you!) Not only has the conference let us attend a number of interesting sessions about technologies and standards that we're all super excited about applying to Dreamwidth, we've also taken the opportunity afforded by having so many of our people in the same space to get in some serious hack time on a lot of big projects we've all been working on.

Thanks to a lot of concentrated effort, we were able to get a few of them into "releasable" state -- as a first draft that we'll continue to refine and expand over time, of course, but we thought you'd like the chance to play with the first round. We'll be improving all of these things over time, as we also work to get some of the other long-term projects people have been hacking on this week released.

In the meantime ... well, I'll just go ahead and tell you about all the fun things we have in store.

Behind the cut:

* Development
* Surprise #1: Images
* Tales from the Conf #1
* Surprise #2: Icons
* Tales from the Conf #2
* Preview: Responsive Mobile Site
* A Word From The Head Office



Development



In addition to the awesome amount of hacking done by those of us who are in Portland, we had a bunch of other changes, bugfixes, and additions. You can read the code tour for a closer look.

Highlights include improving the post-by-email function so that it's a bit smarter about figuring out what part is your .signature when you're using HTML email, adding CSS classes to styles for when entries and comments don't have a subject (so they can be easily styled by designers), clearer text in the inbox to make it more obvious when a notification is because a comment was edited, fixes to the Latest Things page to make the tag feed at the top more reflective of recent popular tags instead of all-time popular tags, fixing the weird bug in the beta update page where trying to post an entry after previewing it in Internet Explorer would cause a 404, and a whole slew of display bugfixes, and style improvements.

All of this code is live; we took the opportunity to do a code push along with tonight's maintenance.


Surprise #1: Images



We are pleased to announce the very first draft of the integrated Dreamwidth image hosting service! (I will now pause for all of you to stop jumping up and down in your chairs. Or, okay, that may just be me.)

This project took a ton of work, both backend and frontend, and [staff profile] mark and [personal profile] fu have been conspiring with their heads down and slaving over hot keyboards, after a bunch of feature design brainstorming with all of us throwing out ideas (and, at least in my case, brainstorming out loud for like a minute before realizing I'd talked myself out of whatever I'd just suggested, heh.)

This is "version .5" or so of image hosting. It doesn't have a lot of the frontend done yet, and we don't have a web-based upload form. (But we will, very soon!) We wanted to give you all a chance to play around with the basics and give us some feedback.

To post an image to your journal, either from your mobile phone or from your computer, you'll need to send it to us in an email post. All account levels can set up and configure email posting. Once you have email posting set up for your account, send an email with the image you want to post as an attachment to the email and the text of the entry (if any) you want to post in the body of the email, and it will appear in your journal.

Most of the eventual features aren't implemented yet -- there's a very limited image management page, you can't describe photos yet (this unfortunately does include not being able to specify the alt text, but we will add that very soon, I swear) and essentially all you can do is email an image in to your journal. (It'll get the same security level as you've set as the default security level for your whole journal, so if your journal has a minimum security of private, your images will be private; if your minimum security is public, your images will be public; etc. You can change an image's security once it's been uploaded, though.)

[staff profile] mark and [personal profile] fu have built a to-do list for next week and beyond and we're hoping to get from version .5 to at least version .9 or so in the next week or two. In the meantime, try it out and tell us what you think. You'll need to set up email posting first, and you can edit your files (to change security or delete files) once they've been uploaded. Everything else will be forthcoming as more awesomeness is developed.

Once again, this code is not yet fully functional. There will be bugs! There will be a lot of things missing! But we know you've been waiting for this for a long time, and we wanted to let you start playing with it early.


Tales from the Conf: #1



When you were in elementary school, did you have to write those "What I Did On My Summer Vacation" essays your first week back to school, or was that just my school being evil at me?

At any rate, I've asked the DW contributors who are here for the conference to write up bits to tell all y'all about what they've all been learning and working on all week. They have been remarkably tolerant of being assigned homework, and so I will be turning over bits of the news post to them:

[personal profile] alierak:
Coffee is yummy. Too much coffee is yucky. Properly caffeinated, I learned just enough about git to be dangerous, bent and twisted my brain into the shape necessary to understand our HTML cleaner, and wait, maybe that wasn't enough coffee after all. But now I know a little jQuery, more about mysql replication, and some new Perl tricks. For a minute there I actually understood some of Damian Conway's genius code that uses regexps to help people understand regexps, but then when I tried it nothing happened (I guess I already understand regexps). I finally realized it was time to start cutting back on the coffee when I found myself debugging the debugger and filing a bug report just for the fun of it, then studying Perl to see if it might actually be a Perl bug. A roomful of DW folks achieving this level of caff, um, concentration is a force (or probably several forces) to be reckoned with.

[personal profile] allen:
Dear Princess Celestia,

Over my summer vacation, I learned an important lesson about friendship.

I attended OSCON, and while there, went to some sessions that were immediately practical (jQuery, jQuery Mobile, HTML5, performance tuning, developer anti-patterns), some not so immediately practical (asynchronous event handling for when we add in real-time websocket-based updates, WebRTC for, umm, our video-conferencing app?), and...well, a bunch of Java stuff for $dayjob.  While not at the conference itself, though, I hung out with a bunch of really smart and talented folks, some of whom I'd met in person, and some of whom I'd only met online.  I spent a lot of time eating snacks and napping and doing $dayjob work (and looking at the new bookmarks code, which is coming along), while everyone else around added cool new features to the site.  

And that's the lesson that I learned--if you hang out with friends who are awesome, and they do awesome stuff while you're there, then you can feel good about the time that you spent.  Even if all you really do is nap and eat bonbons.

[personal profile] deborah:
Clearly I need a memory upgrade, because I can't personally remember anything that happened before I started eating this taco five minutes ago. But if I look at my schedule in the Official OSCON App™, I see that I learned about HTML 5, object-oriented Perl, jQuery, git, profiling memory usage in Perl, regular expressions, and ♥vim♥. (Seriously, some of the vim tricks I learned made me swoony.) In any case, some of it must have been written into my long-term memory, because somehow this week I have modified the site-schemed pages to HTML 5, forked the dw-free git repository, done baby's first code review, and assisted [personal profile] foxfirefey with her mobile port of the site using jQuery Mobile.

Wait, I didn't even attend the jQuery mobile session. How did this even happen?

Ooh, look, more tacos.


Surprise #2: Icons



So, you know how I've been promising y'all that I've been working on icon add-on packages for, like, six months, and y'all have been so very patient about it while I flail around and try to figure out what the heck I'm doing? I got to the point where I had to admit that the payment system had defeated me, and I asked [staff profile] mark really nicely to take over. (There was a point while he was working on it where the payment system almost defeated him, and he wrote it. The code for our payment system is really complex.)

But, I'm really pleased to announce that we, and by 'we' I mean 'Mark', with review help from a handful of the rest of us, are now indulging your craving for those tiny bits of journal jewelry. Paid, premium paid, and seed accounts can now buy extra icon slots in the Dreamwidth Shop.

You don't have to buy extra icons in packages of any particular number: you pick how many slots you want and add them to your cart. Buying extra icons is a one-time payment: once you've bought an extra icon slot, it's yours forever and ever (as long as you have the accompanying paid account, but if your account ever expires, we'll hold the slots for you and when you renew your account the slots will become active again). You can buy icons as a gift for somebody else. We haven't finished the code that will let you transfer extra icons from one account of yours to another, but we'll be adding that soon. (We just couldn't get to that part of the feature in time!)

We're kind of guessing about what each icon slot should cost. We've done some calculations and predictions, and based on those and our best guess about how things will shake out, it costs $1 (10 points) per extra icon. We reserve the right to raise that cost sometime in the future if it winds up costing us more (in which case anyone who bought icons at the current price will keep all the slots they bought, but future slots will cost the new price) or lower that cost if it winds up costing us less (in which case we will count up how much you've spent on buying icons for each account and give you the number of extra icon slots that would have bought you at the new, lower price).

In order to prevent the system from being totally overwhelmed, there is an upper limit of how many icons you can buy for a particular account. Currently, the icon limit is 500 icons total. (That means that the total of number of icons your account level gets + number of icons you've bought can't go over 500, not that you can buy 500 icons in addition to the number of icons your account level gets.) We may increase that in the future based on how usage shakes out.

This feature's been pretty well thought out (and we've tested it -- and already found and fixed a glitch that slipped in when we had our backs turned) but it's entirely possible there's a few bugs lurking. If you run into problems, open a support request in the Account Payments category and I'll get back to you as soon as I can. We're traveling tomorrow, so it might not be an immediate response, but if something goes wrong for you, we'll definitely make it good.

We hope that this will help ease some of those agonizing decisions over which icons you want to keep around! (We noticed that a few of you already managed to find this even without a formal announcement *g*)


Tales from the Conf: #2



[personal profile] exor674:
Over the course of this week I attended various talks on Perl-related [and a few non-Perl related things], including Damian Conway's talks about Features in Modern Perls, Regexp::Debugger (which, like [personal profile] alierak, I promptly found a bug in -- and reported it), and a talk about vim.

On Dreamwidth-related projects, I spent time working on the beginnings of fuzzy feed matching, as well as helping to review (verify that the patches are good before we insert them into our code), as well as teaching [personal profile] deborah how to review patches. More reviewers = very good.

[personal profile] fu:
There is nothing quite like grabbing a laptop and piling onto a couch with everyone else to hack on stuff. I've learned a lot of things this week about other DW contributors -- including who has the best singing voice at 3am in the morning (no I'm not telling).

But what I can say is that there's a lot of awesome stuff out there. HTML 5 is fantastic, and I've picked up a few nifty jQuery-related tricks which I hope to use to good (but not annoying!) effect to build more presents for you all. Along the way I fell in love with a new Perl module (Regexp::Debugger, hello there).

If you'll notice we have a couple nice presents for all of you :) You might have noticed we just turned on mobile photo hosting. [staff profile] denise lays it all out elsewhere in this entry, but I hope that you enjoy what we have far. (We'll soon have more!)

[personal profile] kareila:
I divided my conference time pretty evenly between Perl topics, contributor participation/diversity topics, and Other Things (a bit of jQuery, HTML5, Unicode, and Git).  My session notes are available in the [community profile] oscon community.  When not on site at the conference, I read sections of the Pro Git book and practiced with Git on the command line.  My latest vgifts code is almost ready for the next round of review and I am migrating my work in progress on vgifts to Github.

Being together with so many of the other contributors has really inspired all of us to finish things we were already working on and has sparked some new ideas as well.  I hope this is just the first of many times we will be able to come together like this!  Especially if we get the hotel with the outdoor hot tub again.  :)


Preview #1: Mobile Stuff



When I asked everybody to give me a little summary of what they're working on or a preview of their big project right now, [personal profile] foxfirefey delivered times ten! I thought I'd give her her own section of the post to explain what she's been working on, and let her show off some of the truly, truly attractive work she's managed to produce. So, turning it over:

So, on my summer vacation I got a refresher on data analysis in R and coding in jQuery, and introduced to good vi tricks, and an interactive Perl regex debugger.  But the most productive inspiration has come from my jQuery Mobile tutorial from Tuesday. Sitting through slide after slide of how important mobile has already become was pretty intimidating and scary because let's face it, Dreamwidth really falls down on mobile. People time and time again have asked for better mobile options and we haven't been able to provide them.  The thing about making apps for Dreamwidth is:

* The API needs a lot of work to get it up to a state where a client could really use it.  A lot of the people who could do the mobile app work are stymied by the poor API support.  We need to fix this, but it can be hard to get the ball rolling coordinating between backend devs and application devs.
* Everybody is very busy, and learning how to do native OS mobile development takes a lot of time investment, and sometimes money investment, too, for licenses and appropriate hardware.  And let's face it: it is very easy to make a bad app that does not perform well.  None of us are experienced mobile devs.
* There's not just one platform, there's several, and they each require their own apps.  That multiplies the amount of effort involved.

I'm sorry to say that the inspiration I got during OSCON wasn't for making native mobile apps, even though I know that they're better in a lot of ways.  HOWEVER.  I did learn a lot about something that could make a mobile version of the website much, much better for all devices.

Dreamwidth does currently have a mobile version of the site.  It's just that it's been pretty much untouched since, oh, 2006 (when it first originally appeared on LiveJournal), and is very much a creature of simpler device times: You can log in, you can make a post without even choosing an icon, and you can see a list of entries on your friends page with links that take you to the light schemed version of the entry page. (Which is not really optimized for small screens or touch screens; it is pretty much just like Tropospherical without the menus' style flair.)

My project inspired by OSCON is to make a mobile web version of the Dreamwidth site that's more up to snuff, using jQuery Mobile.  The advantages to doing this are:

* It can be accomplished quickly--I'm estimating a couple of weeks given the current rate.  (I have already implemented basic mobile reading and entry pages, and am working on comment pages; [personal profile] deborah is working on a profile page.  I have some work-in-progress screenshots of the reading page and an entry page if you want to see the current look.)
* It's easy to learn and simple to implement--the documentation for jQuery Mobile is very good, and it's based on technologies many of our devs are already familiar with: HTML, Javascript, and CSS.  Even babydevs would be able to help work on it.
* It will work for all mobile devices, without extra effort in making separate applications for each.
* It's accessible and degrades gracefully.

The mobile website isn't a replacement for native applications, but it will help the mobile experience greatly, so that you can interact with the site on your phone or tablet without feel like you're putting screws to your thumbs.

A Word From The Head Office



You saw many hints of some of the future awesomeness in everyone's conference reports, but this conference has gotten us totally jazzed up -- both because of awesome technologies we've been learning about, and because it's incredible to be in a room full of the people we work with regularly but never actually see. (Working solo gets lonely sometimes!)

Not everything that everybody was working on this week was finished in time to be included in this code push, of course -- there'll be additional stuff arriving over the next weeks and months, and we're hoping this conference trip will keep giving for a long time. (And I'm guessing everybody who's reading this will find some of the hints and teases in everyone's conf report truly tantalizing!)

I wanted to take a second to share a huge thank you, though -- and I know I speak for Mark, too, even though I'm writing this as he and [personal profile] alierak have their heads bent over their laptops as they watch our maintenance scripts run:

* Thank you to each of our contributors who took a week of their time (in many cases, by giving up some of their very limited vacation time at their day jobs!) to join us for the week.

* Thank you to everybody who has contributed to making Dreamwidth better -- not just the people who were here this week, and not even just the people who have ever contributed code, but everyone who has ever said "It would be awesome if the site did this" and then thought, hey, I'll tell them about it and maybe they'll be able to do it!

* Thank you to everybody who's supported us by paying for their accounts, because it's your payments that enabled us to have the budget to fund this trip. We've been able to do a lot more to support our volunteer developers this year than we've ever been able to do before, and it's an amazing feeling to be able to invest in the people who have been giving us so much of their time and in the site we all love.


I'll leave you all with my own version of What I Did On My Summer Vacation:

I learned that git is a heck of a lot easier to understand when it's explained and demonstrated with Tinkertoys. I learned that if you are nice to the hotel staff, and offer them slices of your pizza, they will let you colonize the lobby with a crew of 12 people and a whole lot of laptops every night straight for a week. I learned that it will never not be awesome when someone catches sight of your nametag and says, "Oh, you're from Dreamwidth! You guys are awesome!" I learned that my wife [personal profile] sarah is amazing at organizational details (but I knew that already). I learned that when you see a branded rubber duckie as a giveaway in the expo hall, you should grab one, because it will amuse your team for hours in the hot tub. I learned that you can motivate people a whole lot by offering hand-knit socks in exchange for fixes for particularly annoying bugs.

I learned that when you and your co-founder are sitting on beanbags in the conference center, kind of exhausted and a little overwhelmed, it perks you back up like whoa to realize that three or four of your contributors are sitting on the beanbag next to you and quietly plotting ways to make the mobile site awesome. I learned that when you say, "Somebody should try again to pull together a Perl Women group!", the answer you're going to get is, "Yes! You really should! Tell me when you get it running!" I learned that OpenHatch is even more awesome than I thought, and I already thought they were pretty awesome. I learned that no matter which sessions I plan on attending, I will never make it to more than half of the ones I intended on attending, but the ones I go to instead, totally on a whim, will usually wind up being fascinating. I learned that you can never have too much caffeine available for fueling hack nights, and no matter how strong your intentions of getting to bed before midnight are, it isn't going to happen. I learned that even when you are watching the sysadmins doing the maintenance that took the site down, you will still try to load a page on the site at least half a dozen times.

I learned that we have the awesomest, most passionate, most creative, most clever contributors in the world, and that no matter how many times I think I've gotten used to being a part of this whole wild ride, I will still have moments of being overwhelmed, humbled, amazed, and wildly in love with this thing we've built and all the people who've helped to build it.

In conclusion, I LOVE YOU ALL.

*

More exciting stuff will be coming over the next weeks and months. As always, if you're having problems with Dreamwidth, Support can help you; for notices of site problems and downtime, check the Twitter status page; if you've got an idea to make the site better, you can make a suggestion.

We'll see you soon for our next update!
easycompany: (rescue rangers)

[personal profile] easycompany 2012-07-21 07:11 am (UTC)(link)
I completely understand! And you guys are so amazing for giving us this option at all. You've always been so wonderful since day one and I'm so happy to be here RP-ing instead of on LJ. You actually LISTEN and respond to us. And when you do, it's always respectful.
moonvoice: (Default)

[personal profile] moonvoice 2012-07-21 07:27 am (UTC)(link)
You know, FWIW, I know $1.00 can come across as expensive, but when you consider the abundance of icons offered for paid / premium accounts anyway, it becomes quite reasonable - especially when factoring in the economics and the issues with icon size and how it all adds up.

I do hope you can keep it as a feature!
kyronae: (Academic Terms)

[personal profile] kyronae 2012-07-21 05:43 pm (UTC)(link)
Echoing what others have already said. You guys are really amazing. The amount of consideration and respect you have for your customers is wonderful and I am incredibly glad that I made the move from LJ to DW.

I know that this is something that will take time and careful consideration, because you have to judge how this will effect your profits (seeing as these icon spaces don't need to be renewed), but I will put in a vote for $.50 as well. Not just because we all want to pay less for more, but I just did a bit of math on the more expensive packs on LJ. You can buy 70 icons for $2 for 2 months, there. Assuming I didn't botch my math, that's about $.03 per icon. Still assuming my math isn't wonky (I'm an English major. Sorry), it would take 5 1/2 years of renewing to pay $1 for an icon space.

Now, considering how long people keep these accounts, that's not really unreasonable...especially since you won't get to make more money off of these, later. But the cost drops even more when you start looking at more icons for longer packages (aka: 70 for $10 for 12 months and all that jazz).

That said...your paid accounts give us more free icons than LJ does, and the service is wonderful. If you choose to keep the cost where it's at, I'll still happily participate in this. Just maybe not as much as I would have, otherwise. lol.
kyronae: (Passionate Sense)

[personal profile] kyronae 2012-07-21 09:13 pm (UTC)(link)
Oh! That makes sense.

And, really, the more I consider how many icons are already available with a paid...it's not a bad cost.

NM my ramblings. Carry on. ^.^
marahmarie: (M In M Forever) (Default)

[personal profile] marahmarie 2012-07-22 05:39 am (UTC)(link)
If anything, doing the math should encourage people to buy more premium paid accounts, not more icons:

Paid account: $25-50 per year, includes 100-250 icon slots, depending on account price
Icons a la carte: $1 per icon *plus* paid account costing $25-50 per year

So I'm a free user and I want 250 icons. (In reality, I'm a paid user and you can take all my icons away if you want - except the one above, which I treasure - I'm just not that into icons.)

I have two options: buy a paid account for $50. Boom! 250 icons are mine. Or buy a paid account for up to $35 per year, and boom! 100 icons are mine.

$50 / 250 = .20 cents an icon
$35 / 100 = .35 cents an icon

Option 1, buy a $50 paid account, gives me 150 more icons at .15 cents less per icon than Option 2. But Option 1 has to be renewed at $50 each year to not lose all but 15 of my icons.

Option 2, buy a $35 paid account, gives me 100 icons at .15 more per icon than Option 1. But if I add on 150 icons at $150, I never have to pay for my extra icon slots again, just my account's default 100 icons.

Total cost for my first year on DW at $35 + $150 for icons: $185
Second year: $35
Third year: $35
Fourth year: $35
Fifth year: $35
Sixth year: $35

Cost for six years at $35 per year plus $150 for icons: $360
Cost for six years at $50 per year including all 250 icons: $300

OK, so what's the math telling us? That whether you plan to stay here short or long term, if you want to use up to 250 icons, it's *always* cheaper to buy a premium paid account to do so than to buy a regular paid account and purchase another 150 icons a la carte.

Most RPGers want (and often need to use) a ton of icons, so the above example should cover most of them. For the rest of us, if we need more than 100 but less than 250 icons, we'll need to do the math on an individual basis to see what works best depending on how long we plan on staying here, how many icons we actually need, and whether or not the $50 premium paid account is in fact a better value than purchasing the extra icons we need a la carte.

(Someone needs to make a graph illustrating all of this, btw...*hint hint*)
Edited (typos) 2012-07-22 05:46 (UTC)
ironed_orchid: watercolour and pen style sketch of a brown tabby cat curl up with her head looking up at the viewer and her front paw stretched out on the left (Default)

[personal profile] ironed_orchid 2012-07-22 07:08 am (UTC)(link)
I like your maths!
marahmarie: (M In M Forever) (Default)

[personal profile] marahmarie 2012-07-22 09:42 pm (UTC)(link)
Yeah, I do, too. What we need is someone to illustrate the math for every possible situation so people can make informed decisions before blowing tons of money on extra icon slots. I understand Denise/DW et al needs to make money to cover server/processing/storage expenses and all, but when you can get icon slots for as little as .20 cents each just by buying premium paid time each year, and for no more than .35 cents each if you buy a year of regular paid time, then my question is, unless you truly want to support the site any way you can (in which case, the hell with the math, it doesn't matter - just do what makes you feel good) what are you doing paying up to five times more for each icon slot than DW will normally ever charge you? This is a serious question. And it needs a really thorough graph or chart of some sort that will provide a serious answer.
Edited 2012-07-22 21:44 (UTC)
ironed_orchid: watercolour and pen style sketch of a brown tabby cat curl up with her head looking up at the viewer and her front paw stretched out on the left (Default)

[personal profile] ironed_orchid 2012-07-22 11:34 pm (UTC)(link)
Well, I guess if people really want 500 icons and have lots of money to spare now, then they may not care too much about about the difference.

I can also see it being useful for people who have just a little more than 100 or 250 icons. I think when I migrated I had 113 icons, because of LJ adding a couple of permanent icon slots for every year of paid time. So being able to spend $13 in order to avoid having to think about which ones to delete would have been pretty tempting.

But then I got a premium account so it no longer applies.
velocitygrass: (Default)

[personal profile] velocitygrass 2012-07-22 08:54 am (UTC)(link)


I haven't actually verified your numbers, but if paid accounts cost $35 and premiums cost $50, the point where paid + icon slots gets cheaper is 10 years.
marahmarie: (M In M Forever) (Default)

[personal profile] marahmarie 2012-07-22 09:37 pm (UTC)(link)
I triple-checked my math last night and yours today, and it takes 10 years of paying $35 per year plus $150 one time for 150 extra icon slots to break even with paying $50 a year (which includes 250 icon slots per year) for ten years:

$50 x 10yrs = $500 (premium paid account, includes 250 icon slots)
$35 x 10yrs + $150 = $500 (regular paid account, includes 100 icon slots, plus a one time $150 purchase of 150 extra icon slots)

In your 11th year on DW, you will finally come out ahead by buying the icon slots once plus the cheaper paid time each year.

Nice graph, though. :)
velocitygrass: (Default)

[personal profile] velocitygrass 2012-07-22 09:58 pm (UTC)(link)
Yes, I should have clarified that 10 years is the break even point and after that (i.e. beginning with year 11) it gets cheaper. But I think it comes across in the graph.

It was actually cool to look for a tool to make graphs. The first one I tried wasn't immediately useful, but gnuplot did the job quite well.
havocthecat: the lady of shalott (Default)

[personal profile] havocthecat 2012-07-26 01:20 pm (UTC)(link)
People who said math wasn't useful when I grew up lied to me. That's all I'm saying. (Also, ty for running the numbers!)