(“This Week in Data” is a series of blog posts that the Data Team at Mozilla is using to communicate about our work. Posts in this series could be release notes, documentation, hopes, dreams, or whatever: so long as it’s about data.)
I’ve erased the y-axis because the absolute values don’t actually matter for this discussion, but this is basically a sparkline plot of active users of Firefox Desktop for 2025. The line starts and ends basically at the same height but wow does it have a lot of ups and downs between.
I went looking at this shape recently while trying to estimate the costs of continuing to collect Legacy Telemetry in Firefox Desktop. We’re at the point in our migration to Glean where you really ought to start removing your Legacy Telemetry probes unless you have some ongoing analyses that depend on them. I was working out a way to get a back-of-the-envelope dollar figure to scare teams into prioritizing such removals to be conducted sooner rather than later.
Our ingestion metadata (how many bytes were processed by which pieces of the pipeline) only goes back sixty days, and I was worried that basing my cost estimate on numbers from December 2025 would make them unusually low compared to “a normal month”.
But what’s “normal”? Which of these months could be considered “normal” by any measure? I mean:
January: Beginning-of-year holiday slump
February: Only twenty-eight days long
March: Easter (sometimes), DST begins
April: Easter (sometimes), something that really starts suppressing activity
May: What’s with that big rebound in the second half?
June: Last day of school
July: School’s out, Northern Hemisphere Summer means less time on the ‘net and more time touching grass
August: Typical month for vacations in Europe
September: Back-to-school
October: Maybe “normal”?
November: US Thanksgiving
December: End-of-year holiday slump
October and maybe May are perhaps the closest things we have to “normal” months, and by being the only “normal”-ish months that makes them rather abnormal, don’t you think?
Now, I’ve been lying to you with data visualization here. If you’re exceedingly clever you’ll notice that, in the sparkline plot above, not only did I take the y-axis labels off, I didn’t start the y-axis at 0 (we had far more than zero active users of Firefox Desktop at the end of August, after all). I chose this to be illustrative of the differences from month to month, exaggerating them for effect. But if you look at, say, the Monthly Active Users (now combined Mobile + Desktop) on data.firefox.com it paints a rather more sedate picture, doesn’t it:
This isn’t a 100% fair comparison as data.firefox.com goes back years, and I stretched 2025 to be the same width, above… but you see what data visualization choices can do to help or hinder the story you’re hoping to tell.
At any rate, I hope you found it as interesting as I did to learn that December’s abnormality makes it just as “normal” as the rest of the months for my cost estimation purposes.
I’m a few days late publishing this, but this October marks the tenth anniversary of my first day working at Mozilla. I’m on my third hardware refresh (a Dell XPS which I can’t recommend), still just my third CEO, and now 68 reorgs in.
For something as momentous as breaking into two-digit territory, there’s not really much that’s different from last year. I’m still trying to get Firefox Desktop to use Glean instead of Legacy Telemetry and I’m still not blogging nearly as much as I’d like. Though, I did get promoted earlier this year. I am now a Senior Staff Software Engineer, which means I’m continuing on the journey of doing fewer things myself and instead empowering other people to do things.
As for predictions, I was spot on about FOG Migration actually taking off a little — in fact, quite a lot. All data collection in Firefox Desktop now either passes through Glean to get to Legacy Telemetry, has Glean mirroring alongside it, or has been removed. This is in large part thanks to a big help from Florian Quèze and his willingness to stop asking when we could start and just migrate the codebase. Now we’re working on moving the business data calculations onto Glean-sent data, and getting individual teams to change over too. If you’re reading this and were looking for an excuse to remove Legacy Telemetry from your component, this is your excuse.
My prediction that there’d be an All Hands was wrong. Mozilla Leadership has decided that the US is neither a place they want to force people to travel to nor is it a place they want to force people to travel out of (and then need to attempt to return to) in the current political climate. This means that business gatherings of any size are… complicated. Some teams have had simultaneous summits in cities both within and without the US. Some teams have had one or the other side call in virtually from their usual places of work. And our team… well, we’ve not gathered at all. Which is a bummer, since we’ve had a few shuffles in the ranks and it’d be good to get us all in one place. (I will be in Toronto with some fellow senior Data Engineering folks before the end of the year, but that’s the extent of work travel.) I’m broadly in favour of removing the requirement and expectation of travel over the US border — too many people have been disappeared in too many ways. We don’t want to make anyone feel as though they have to risk it. But it seems as though we’re also leaning away from allowing people to risk it if they want to, which is a level of paternalism that I didn’t want to see.
I did have one piece of “work” travel in that I attended CSV Conf in Bologna, Italy. Finally spent my Professional Development budget, and wow what a great investment. I learned so much and had a great time, and that was despite the heat and humidity (goodness, Italy. I was in your North (ish). In September. Why you gotta 30degC me like this?). I’m on the lookout for other great conferences to attend in 2026, so if you know any, get in touch.
My prediction that I’d still be three CEOs in because the search for a new one wouldn’t have completed by now: spot on. Ditto on executing my hardware refresh, though I’m still using a personal monitor at work. I should do something about that.
My prediction that we’d stop putting AI in everything has partially come true. There’s been a noticeable shift away from “Put genAI in it and find a problem for it to (maybe) solve” towards “If you find a problem that genAI can help with, give it a try.” You wouldn’t notice it, necessarily, looking at feature announcements for Firefox, as quite a lot of the integration infrastructure all landed in the past couple of months, making headlines. My feelings on LLMs and genAI have gained layers and nuance since last year. They’re still plagiarism machines that are illegally built by the absolute worst people in ways that worsen the climate catastrophe and entrench existing inequalities. But now they’ve apparently become actually useful in some ways. I’ve read reports from very senior developers about use cases that LLMs have been able to assist with. They are narrow use cases — you must only use it to work on components you understand well, you must only use it on tasks you would do yourself if you had the time and energy — but they’re real. And that means my usual hard line of “And even if you ignore the moral, ethical, environmental, economic, and industry concerns about using LLMs: they don’t even work” no longer applies. And in situations like a for-profit corporation lead by people from industry… ignoring the moral, ethical, environmental, economic, and industry concerns is de rigeur.
Add these to the sorta-kinda-okay things LLMs can do like natural language processing and aiding in training and refinement of machine translation models, and it looks as though we’re figuring out the “reheat the leftovers” and “melt butter and chocolate” use cases for these microwave ovens.
It still remains to be seen if, after the bubble pops, these nuclear-powered lake-draining art-stealing microwaves will find a home in many kitchens. I expect the fully-burdened cost will be awfully prohibitive for individuals who just want it to poorly regurgitate Wikipedia articles in a chat interface. It might even be too spicy for enterprises who think (likely erroneously) that they confer some instantaneous and generous productivity multiplier. Who knows.
All I know is that I still don’t like it. But I’ll likely find myself using one before the end of the year. If so, I intend to write up the experience and hopefully address my blogging drought by publishing it here.
Another thing that happened this year that I alluded to in last year’s post was the Google v DOJ ruling in the US. Well, the first two rulings anyway. Still years of appeal to come, but even the existing level of court seemed to agree that the business model that allows Mozilla to receive a bucketload of dollabux from Google for search engine placement in Firefox (aka, the thing that supplies most of my paycheque) should not be illegal at this time. Which is a bit of a relief. One existential threat to the business down… for now.
But mostly? This year has been feeling a little like 2016 again. Instead of The Internet of Things (IoT, where the S stands for Security), it’s genAI. Instead of Mexico and Muslims it’s Antifa and Trans people. The Jays are in the postseason again. Shit’s fucked and getting worse. But in all that, someone still has to rake the leaves and wash the dishes. And if I don’t do it, it won’t get done.
With that bright spot highlighted, what are my predictions for the new year:
I will requisition a second work monitor so I stop using personal hardware for work things.
FOG Migration (aka the Instrumentation Consolidation Project) will not fully remove all of Legacy Telemetry by this time next year. There’s evidence of cold feet on the “change business metrics to Glean-sent data” front, and even if there weren’t, there’s such a long tail that there’s no doubt something load-bearing that’d delay things to Q4 2025. I _am_ however predicting that FOG Migration will no longer being all-encompassing work — I will have a chance to do something else with my time.
I predict that one of the things I will do with that extra time is, since MoCo insists on a user population measurement KPI, push for a sensible user population measurement. Measuring the size of the user population by counting distinct _profiles_ we’ve _received_ a data packet from on a day (not that the data was collected on that day)? We can do better.
I don’t think there’s going to be an All Hands next year. If there is, I’d expect it to be Summit style: multiple cities simultaneously, with video links. Fingers crossed for Toronto finally getting its chance. Though I suppose if the people of the US rose up and took back their country, or if the current President should die, that could change the odds a little. Other US administrations saw the benefit of freedom of movement, regardless of which side of the aisle.
Maybe the genAI bubble will have burst? Timing these things is impossible, even if it weren’t the first time in history that this much of the US’ (and world’s) economy is inflating it. The sooner it bursts, the better, as it’s only getting bigger. (I suppose an alternative would be for the next shiny thing to happen along and the interest in genAI to dwindle more slowly with no single burst, just a bunch of crashes. Like blockchain/web3/etc. In that case a slower diminishing would be better than a sooner burst.)
I predict that a new MoCo CEO will have been found, but not yet sworn in by this time next year. I have no basis for this prediction: vibes only.
My Papa, my mother’s father, C. J. Mortimer died in Saint John, New Brunswick in 2020. Flying through the Toronto and Montreal airports in September to his funeral was one of the surreal experiences of my life, with misting tunnels of aerosolized alcohol to kill any microbe on your skin, hair, clothes, and luggage; airport terminals with more rodent traps than people; and a hypersensitivity to everyone’s cough and sniffle that I haven’t been able to shake.
I was angry, then. I’m still angry. Angry that I couldn’t hug my grandmother. Angry that weeping itself was complicated and contagious. Angry that I couldn’t be together or near or held. Angry that I was putting my family at home at risk by even going. Angry that we didn’t hold the line on the lockdowns long enough to manage the disease properly. Angry at the whiners.
This isn’t a pandemic post, though. Well, no more than any post I’ve made since 2020. No more than any post I will make for the foreseeable.
This is a post about what my grandfather gave to me.
Y’see, I’m not the first computer nerd in the family. My Grampy, my father’s father, was and my father is a computer nerd. Grampy’s memoirs were typed into a Commodore 64. Dad is still fighting with Enterprise Java, of all things, to help his medical practice run smoothly.
And Papa? In the 60s he was offered lucrative computer positions at Irving Oil in Saint John and IBM in the US. Getting employment in the tech industry was different in those days, not leastwise because the tech industry didn’t really exist yet. You didn’t get jobs because you studied it in school, because there weren’t classes in it. You didn’t get jobs because of your experience in the field, because the most experienced you could be was the handful of years they’d been at it. You didn’t get jobs because of your knowledge of a programming language, because there were so few of them and they were all so new (and proprietary).
So what was a giant like International Business Machines to do? How could it identify in far-flung, blue-collar Atlantic Canada a candidate computer programmer? Because though the tech industry didn’t exist in a way we’d necessarily recognize, it was already hungrier for men to work in it than the local markets could supply.
In my Papa’s case, they tested his aptitude with the IBM Aptitude Test for Programmer Personnel (copyright 1964):
Again, though, how do you evaluate programmer aptitude without a common programming language? Without common idioms? Without even a common vocabulary of what “code” could mean or be?
IBM used pattern-matching questions with letters:
And pattern-matching questions with pictures:
And arithmetic reasoning questions:
And that was it. For the standardized portion of the process, at least.
Papa delivered this test to my siblings and I when I think I was in Grade 9, so about 15 years of age. Even my 2- and 4-year-younger siblings performed well, and I and my 2-year-older sibling did nearly perfectly. Apparently the public education system had adapted to turning out programming personnel of high aptitude in the forty years or so since the test had been printed.
I was gifted Papa’s aptitude test booklet, some IBM flowcharting and diagramming worksheets, and a couple example punchcards before his death. I was thrilled to be entrusted with them. I had great plans for high-quality preservation digitization. If my Brother multi-function’s flatbed scanner wouldn’t do the trick, I’d ask the local University’s library for help. Or the Internet Archive itself!
The test booklet sat on my desk for years. And then Papa died. I placed the bulletin from the funeral service next to it on my desk. They both sat on my desk for further years.
I couldn’t bring myself to start the project of digitizing and preserving these things. I just couldn’t.
Part of it was how my brain works. But I didn’t need a diagnosis to develop coping mechanisms for projects that were impossible to start. I bragged about having it to my then-coworker Mike Hoye, the sort who cared about things like this. Being uncharacteristically prideful in front of a peer, a mentor, that’d surely force me to start.
They sat on my desk for years more.
We renovated the old spare room into an office for my wife and moved her desk and all her stuff out so I could have the luxury of an office to myself. We repainted and reorganized my office.
I looked at the test booklet.
I filed it away. I forgot where. I gave up.
But then, today, I read an essay that changed things. I read Dr. Cat Hicks’ Why I Cannot Be Technical. Not only does she reference Papa’s booklet (“Am I the only person who is extremely passionate about getting their hands on a copy of things like the IBM programmer aptitude tests from the 60s?”) but what she writes and how she writes reminds me of what drew me to blogging. What I wanted to contribute to and to change in this industry of ours. The feeling of maybe being a part of a movement, not a part of a machine.
I searched and searched and found the booklet. I looked at the flatbed scanner and remembered my ideas of finding the ideal digitization. The perfect preservation.
I said “Fuck it” and put it on the ground and started taking pictures with my phone.
To hell with perfect, I needed good enough.
I don’t remember what else was involved in IBM’s test of my Papa. I don’t even know if they conducted it in Canada or flew him to the States. He probably told me. I’m sorry I don’t remember.
I don’t know why he never kept up with programming. I don’t remember him ever working, just singing beautifully in the church choir, stuttering when speaking on the telephone, playing piano in the living room. He did like tech gadgets, though. He converted all our old home movies to DVD without touching a mouse or keyboard. I should’ve asked him why he never owned a minicomputer.
I do know why he didn’t choose the IBM job, though. Sure, yes, he could stay closer to his family in Nova Scotia. Sure, he wouldn’t have to wear quite as many suits. But the real crux was the offer that Irving gave him. IBM wanted him as a cog in their machine. Another programming person to feed into their maw and… well, who knows what next. But Irving? Well, Irving _also_ wanted that, true. They needed someone to operate their business machines for payroll and accounts and stuff.
But when the day’s work was done? And all the data entry girls (because of course they were all women) were still on the clock? And there were CPU cycles available?
Irving offered to let my Papa input and organize his record collection.1
My recollection of my grandfather isn’t perfect. But perhaps it’s good enough.
Our first vehicle was, until late last year, our only vehicle: a 2009 Honda Fit we acquired at the end of 2008. Once it hit fifteen years old, we started looking for what would replace it. (Unfortunately we live in a part of Canada that isn’t downtown Toronto, Vancouver, or Montreal meaning that the country has been built in a way that requires car ownership.) We toyed with the idea of a full electric vehicle (a Battery Electric Vehicle or BEV) but I was the only driver in the household who found it neat to manage charge volumes and charger availability and regular prolonged recharge stops and on and on (aka “the BEV lifestyle”) so we didn’t end up going that route.
(( And let’s not forget to note that the criminally negligent policies and regulations around automotives in Canada have perverted the incentives of car makers to make not more than a token amount of a token variety of kinds of vehicle that can burn electrons pulled from a wall. Your choices in this country are basically Teslas or nothing, and Teslas can suck it. ))
We put a deposit down on a Toyota Prius Prime plug-in hybrid electric vehicle (PHEV for short — a car that runs both on stored electricity drawn from a socket as well as chemical energy liberated by exploding hydrocarbons) in mid 2023 with a probable delivery date of mid 2025. The Prius Prime with its all-electric range of 72km (in ideal conditions) would suit basically all of our use cases from day-to-day and week-to-week, and its range including the hybrid drivetrain (and let’s be frank: oversized gas tank) of around 900km would more than handle visits to far-flung family members. That it’s too long, too wide, and too heavy is annoying, but it was in 2023 and remained in 2024 the least-worst option.
Come mid-late 2024, I reach out to double-check that everything is still as it should be and just happen to send my email on the day that two Prius Primes were on the lot, ordered but unbought by people earlier than us on the list.
It was thus to our pleasant surprise that we were offered the opportunity to get our chosen new vehicle nearly a full year ahead of schedule at the end of October, 2024. Which was good, because our venerable Fit was making ever-more-concerning old-age noises.
Three months in
It’s fine?
It is definitely fulfilling the expected role of being able to bop around town only ever running on very clean electricity. We’re still getting into the habit of plugging it in when we park it so it’s always topped up, and I’m still learning just what a difference it makes when it’s cold or there’s a headwind. It’s being thwarted a bit by the weather and having two very different drivers, but it’s becoming a better estimator of its own range, getting as high as 53km in subzero (but not face-hurtingly-cold) temps. All in all I’ve so far never really been unpleasantly surprised by the beast.
But it _is_ a beast. We were going to park both it and the Fit in a two-car garage, but there’s no way to do that _and_ still have room to take out the garbage. Or get to our bicycles. Or gardening equipment. Or freezer. (And I went to such an effort to clean out the garage so we’d be able to. Alas.)
And it’s a bit of a beast to drive: it’s heavy. It has more power than I know what to do with, beyond getting it up to speed in a reasonable time. It does lead to having a very smooth ride, though, which I appreciate given the seasonal road deterioration.
I’m still finding new systems to turn off, though. Toyota packed it with all sorts of assists: lane-keeping, distance-keeping, cross-traffic-avoiding, lane-following, etc etc… quite a lot of them are pretty okay. Parking assist letting me know precisely how far my front or rear bumper is to what I’m parking next to? Wonderful. Adaptive cruise control that keeps its distance from any car in front of me? I like it.
But so many of these systems are taking a page from the Tech Industry and are being shipped while their behaviour is still, to a degree, stochastic. The driver inattention monitor 1) Uses a camera pointed at your face, which I hate, and 2) Can’t handle eyeglasses or sunglasses. Lane-keeping will tug the wheel if you’re stretching into the oncoming lane to avoid a cyclist (which the car failed to recognize). Lane-following will beep and give up if there’s snow on the road. The cross traffic monitor will yell at you when you take your foot off the brake, even if you’re just crawling forward to see around the tall grass. And will fail to notice cars behind you while reversing out of a parking space some of the time.
Meanwhile, they could’ve shipped deterministic systems that I’d love to leave on. Like remembering infotainment settings per driver (keyed to the key). Or allowing us to turn off the headlights when in Park gear or either of the Accessory modes. Or telling me the kWh it’s pulling down when charging, or how much it charged, or allowing me to start a charge outside of the schedule from the charging port instead of having to jump back behind the wheel. Or even just telling me why it’s running the gas-powered engine instead of the electrical one against my express wishes (reasons I know about from reading the manual (of course I read the manual): starting the front windshield defroster, it reaching -12 outside, it running out of electrons in the battery (aside from the 30% reserved for running the hybrid)).
And Android Auto? What a piece of junk that is. Unreliable connection, inability to compose messages on even Google Talk (now called Chat? Teams? GTalk? Meet? ICQ? Who knows), poor UI integration with VLC, keeps trying to play music on YouTube Music even when I tell it to stop.
And the bloody app? What a joke. Overflowing text. Terrible UI choices. Obvious mistranslation. Inability to open web links. Inscrutable organization. The only reason I keep using it is because it’s January and I can remote-start the heat pump, in-seat and in-steering-wheel heaters, and rear defrost. And its UI for creating charging schedules is at least better than trying to do so via the steering wheel controls.
It’s really easy to blame Canadian car culture (heavily imported from the US) for most of these problems, and the tech industry for the rest. Of course the car is too big: bigger cars are the current fad, against rhyme and reason. Of course the app and Android Auto are trash: there is no functional competition or regulation keeping these companies in check.
Not to say that there aren’t things that I don’t like about it. Heated seats and steering wheel. The smooth ride. The comfy seats. The styling of the interior and exterior. The backup camera (required by law in Canada since 2018). The USB ports. The sound system.
So, three months in: it’s fine. It was in 2023 and in 2024 the least-worst option, at least for us. And after owning it three months and into 2025, it still really is no more or less than that. If it were less car and less tech it could have been so much better. Alas.
On this day (or near it) in 2015, I joined the Mozilla project by starting work as a full-time employee of Mozilla Corporation. I’m two hardware refreshes in (I was bad for doing them on time, leaving my 2017 refresh until 2018 and my 2020 refresh until 2022! (though, admittedly, the 2020 refresh was actually pushed to the end of 2021 by a policy change in early 2020 moving from 2-year to 3-year refreshes)) and facing a third in February. Organizationally, I’m three CEOs and sixty reorgs in.
I’m still working on Data, same as last year. And I’m still trying to move Firefox Desktop to use solely Glean for its data collection system. Some of my predictions from last year’s moziversary post came true: I continued working on client code in Firefox Desktop, I hardly blogged at all, we continue to support collections in all of Legacy Telemetry’s systems (though we’ve excitingly just removed some big APIs), Glean has continued to gain ground in Firefox Desktop (we’re up to 4134 metrics at time of writing), and “FOG Migration” has continued to not happen (I suppose it was one missed prediction that top-down guidance would change — it hasn’t, but interpretations of it sure have), and I’m publishing this moziversary blog post a little ahead of my moziversary instead of after it.
My biggest missed prediction was “We will quietly stop talking about AI so much, in the same way most firms have stopped talking about Web3 this year”. Mozilla, both Corporation and Foundation, seem unable to stop talking about AI (a phrase here meaning “large generative models built on extractive data mining which use chatbot UI”). Which, I mean, fair: it’s consuming basically all the oxygen and money in the industry at the moment. We have to have a position on it, and it’s appropriating “Open” language that Mozilla has a vested interest in protecting (though you’d be excused for forgetting that given how little we’ve tried to work with the FSF and assorted other orgs trying to shepherd the ideas and values of Open Source in the recent past). But we’ve for some reason been building products around these chatbots without interrogating whether that’s a good thing.
And you’d think with all our worry about what a definition of Open Source might mean, we’d make certain to only release products that are Open Source. Butno.
I understand why we’re diving into products and trying to release innovative things in product shape… but Mozilla is famously terrible at building products. We’re okay at building services (I’m a fan of both Monitor and Relay). But where we seem to truly excel is in building platforms and infrastructure.
We build Firefox, the only independent browser, a train that runs on the rails of the Web. We build Common Voice, a community and platform for getting underserved languages (where which languages are used is determined by the community) the support they need. We built Rust, a memory-safe systems language that is now succeeding without Mozilla’s help. We built Hubs, a platform for bringing people together in virtual space with nothing but a web browser.
We’re just so much better at platforms and infrastructure. Why we don’t lean more into that, I don’t know.
How can Mozilla make money if our search deal becomes illegal? Maintaining a browser is expensive. Hosting services is expensive. Keeping the tech giants on their toes and compelling them to be better is expensive. We need money, and we’ve learned that there is no world where donations will be enough to fund even just the necessary work let alone any innovations we might try.
How do you monetize a platform? How do you monetize infrastructure?
Governments do it through taxation and funding. But Mozilla Corporation isn’t a government agency. It’s a conventional Silicon Valley private capital corporation (its relationship to Mozilla Foundation is unconventional, true, but I argue that’s irrelevant to how MoCo organizes itself these days). And the only process by which Silicon Valley seems to understand how to extract money to pay off their venture capitalists is products and consumers.
Now, Mozilla Corporation doesn’t have venture capital. You can read in the State of Mozilla that we operate at a profit each and every year with net assets valued at over a billion USD. But the environment in which MoCo operates — the place from which we hire our C-Suite, the place where the people writing the checks live — is saturated in venture capital and the ways of thinking it encourages.
This means Mozilla Corporation acts like its Bay Area peers, even though it’s special. Even though it doesn’t have to.
This means it does layoffs even when it doesn’t need to. Even when there’s no shareholders or fund managers to impress.
This means it increasingly speaks in terms of products and customers instead of projects and users.
This means it quickly loses sight of anything specifically Mozilla-ish about Mozilla (like the community that underpins specific systems crucial to us continuing to exist (support and l10n for two examples) as well as the general systems of word-of-mouth and keeping Mozilla and Firefox relevant enough that tech press keep writing about us and grandpas keep installing us) because it doesn’t fit the patterns of thought that developed while directing leveraged capital.
(( Which I don’t like, if my tone isn’t coming across clearly enough for you to have guessed. ))
Okay, that’s more than enough editorial for a Moziversary post. Let’s get to the predictions for the next year:
I still won’t blog as much as I’d like,
“FOG Migration” might actually happen! We’ve finally managed to convince Firefox folks just how great Glean is and they might actually commit official resources! I predict that we’re still sending Legacy Telemetry by the end of next year, but only bits and pieces. A weak shadow of what we send today.
There’ll be an All Hands, but depending on the result of the US federal election in November I might not attend because its location has been announced as Washington DC and I don’t know if the United States will be in a state next year to be trusted to keep me safe,
We will stop putting AI in everything and hoping to accidentally make a product that’ll somehow make money and instead focus on finding problems Mozilla can solve and only then interrogating whether AI will help
The search for the new CEO will not have completed by next October so I’ll still be three CEOs in, instead of four
I will execute on my hardware refresh on time this February, and maybe also get a new monitor so I’m not using my personal one for work.
I recently finished playing Lies of P after a single playthrough of the main story, collecting what extra collectables and delving what optional areas I found along the way. I came away from it wondering what fans like about soulslike games, disappointed in the writing and voice acting and score (though the optional collectable songs were lovely), and soured on the genre as a whole. Spoilers follow.
This game feels like they wanted to hit a certain mood (sour, gross, sad, gloomy) and a certain game design philosophy (tough, derisive, “fair”). And goodness did they succeed. But I don’t think it’s for me.
I like the philosophy of levelling up the player instead of the character. The character doesn’t accumulate experience points for failing to advance (in fact: the opposite), but you as the player accumulate experience in the attempt. And that makes subsequent attempts more likely to succeed. However, the way they ensure this arc is by laughing at the player: hiding enemies around corners to surprise you only the first time, having pitfalls to catch you only the first time. Yeah, of course it feels like my (the player’s) experience is valuable in subsequent runs… but only because jumpscares only work the first time.
For bosses, it’s the same thing but instead of pitfalls and hidden enemies, it’s hidden rhythms in the moveset and unknown numbers of stages. This appears to be the more “pure” expression of the philosophy of player experience over character experience points, though, as even knowing and having seen the entirety of a boss doesn’t mean you can avoid the punishment for failure. Repetition (training) is what grants you the resilience to outlast the onslaught and sneak in your attacks just enough so their health reaches zero just before yours.
If you’re familiar with soulslikes, I apologize for writing out stuff you already know. This was my first of this genre and I don’t think I like it. Though the philosophy appeals to me academically, I struggle to imagine an expression of it that doesn’t involve laughing at the player. I don’t know that there’s an expression of it that isn’t _mean_. And I don’t like that relationship between video game and player: to me we’re collaborators in my enjoyment. We’re in this together to trick me into not optimizing the fun out of the experience, to divert my attention from the real world for a while, and maybe to get me to think about things in a new way.
I believe the enjoyment in these games is supposed to be catharsis from overcoming a challenge with, predominantly, your improved mastery over the game’s systems. For some reason, that doesn’t stick with me. Defeating a boss, making it through a dangerous area unscathed… that feeling doesn’t last long, replaced quickly with frustration when there’s another pitfall or mean punishment for stepping foot in a new place or swinging a sword against an enemy for the first time. And many times even the catharsis was sour as it didn’t feel as I did anything better on the run that succeeded over the runs that failed.
On top of not being really sure I like this genre, or how others like this genre, I’m unsure that this is a perfect example of the type. There’s three decision prompts in the dialog system that all serve the same purpose. The writing is very tell don’t show, the voice acting is unevenly skilled, and the antagonist motivations range from cliche to nonsensical. At some point I began wondering if I was playing the game incorrectly: I never really wanted to use any of the items or any of the Legion Arms. Heck, I mostly forgot about Fable Arts, and never customized a weapon except to upgrade its damage level. Was I missing the joy because I didn’t play with all the toys? Or did I do the best I could with systems that were neither necessary nor pleasant to use?
The one thing I liked was the portrait I found in a house that grew a nose whenever I lied or did something else “human” (as opposed to “puppet”). It was goofy and gamey and strange and unsettling and odd. Wonderful. And that I could’ve walked right past it without noticing felt nice. Would that the rest of the game’s mechanics had been similarly playful in tone.
All in all, I didn’t like the game. It performed and responded well to my inputs, communicated its mechanics in a way that encouraged engagement, and had a difficulty that was surmountable after challenge… but it was mean, frustrating, nonsensical, gloomy, overwrought, and unfun. If it is indeed a typical exemplar of its genre, I might recommend it to others who like this kind of thing. Otherwise, I don’t think I could recommend it at all.
So you’ve found yourself a plot that looks like this:
You suspect this has something to do with a code change because, wouldn’t you know it, the sharp decline starts around Feb 22 and we released Firefox 123 on Feb 20. But where do you go from here? Here’s a step-by-step of how I went from this plot arriving in Slack#data-help to finding the bugfix that most likely caused the change:
1. Ensure this is actually a version-specific change
It’s interesting that the cliff in the plot happened near a release day, and it’s an excellent intuition to consider code releases for these sorts of sea-changes in data volume or character. But we should verify that this is the case by grouping by mozfun.norm.truncate_version(app_version, 'major') AS major_version which in our case gives us:
Sure enough, in this case the volume cliff happens entirely within the Firefox 123+ colours. If this isn’t what you get, then it’s somewhat less likely that this is caused by a client code change and this guide might not help you. But for us this is near-certain confirmation that the change in the data is caused by a code change that landed in Firefox 123… but which one?
( This is where I spent a little time checking some frequent “gotcha” changes that could’ve happened. I checked: was it because data went from all-channel to pre-release-only? (No, the probe definitions didn’t change and the fall isn’t severe enough for that (would look more like an order of magnitude)) Was it because specific instrumentation within the group happened to expire in Fx123? (No, the first plot is grouped by specific probe, and all of the groups shared the same shape as their sum) Was it an incredibly-successful engagement-boosting experiment that ended? (No, there haven’t been any relevant experiments since last July) )
2. Figure out which Nightly builds are affected
Firefox Desktop releases new software versions twice a day on the Nightly channel. We can look at the numbers reported by these builds to narrow down what specific 12h period the code landed that caused this drastic shift. Or, well, you’d think we could, but when you group by build_id you get:
Because our Nightly population isn’t randomly distributed across timezones, there are usage patterns that affect the population who use which build on which day. And sometimes there are “respins” where specific days will have more than 2 nightlies. And since our Nightly population is so small (You Can Help! Download Nightly Today!), and this data is a little sparse to begin with, little changes have big effects.
No, far more commonly the correct thing to do is to look at what I call a “build day”. This is how GLAM makes things useful, and this is how I make patterns visible. So group by SUBSTR(build_id, 1, 8) AS build_day, and you get:
Much better. We can see that the change likely landed in Jan 18’s nightlies. That Jan 18-20 are all of a level suggests to me that it probably ended up in all of Jan 18’s nightly builds (if it only landed in one of the (normally) two nightly builds we’d expect to see a short fall-off where Jan 18 would be more like an average between Jan 17 and 19.).
Regardless of when during the day, we’re pretty sure we have this nailed down to only one day’s worth of patches! That’s good… but it could be better.
3. Going from build days to pushlog
Ever since I was the human glue keeping the (now-decommissioned) automated regression detection system “alerts.tmo” working, I’ve had a document on my disk reminding me how to transform build days or build_ids into a “pushlog” of changes that landed in the suspect builds. This is how it works:
Get the hg revisions of the suspect builds by looking through this list of all firefox releases for the suspect builds’ ids. You want the final build of the day before the first suspect build day and the final build of the final suspect build day, which in this case are Jan 17 and Jan 18, so we get f593f07c9772 and 9c0c2aab123:
This gives you a list of all changes that are in the suspect builds, plus links to the specific code changes and the relevant bugs, with the topic sentence from each commit right there for you. Handy!
4. Going from a pushlog to a culprit
This is where human pattern matching, domain expertise, organizational memory, culture and practices, and institutional conventions all combine… or, to put it another way, I don’t know how to help you get from the list of all code that could have caused your data change to the one (or more) likely suspects. My brain has handily built me a heuristic and not handed me the source code, alas. But I’ve noticed some patterns:
Any change that is backed out can be disregarded. Often for reasons of test failures changes will be backed out and relanded later. Sometimes that’s later the same day. Sometimes that’s outside our pushlog. Skip any changes that have been backed out by disregarding any commits from a bug that is mentioned before a commit that says “Backed out N changesets (bug ###)…”.
You can often luck out by just text searching for keywords. It is custom at Mozilla to try to be descriptive about the “what” of a change in the commit’s topic, so you could try looking for “telemetry” or “ping” or “glean” to see if there’s anything from the data collection system itself in there. Or, since this particular example had to do with Firefox Relay’s integration with Firefox Desktop, I looked for “relay” (no hits) and then “form” (which hit a few times, like on the word “information”, … but also on the culprit which was in the form detector code.)
This is a web view on the source code, so you’re not limited to what it gives you. If you have a mozilla-central checkout yourself, you can pull up the commits (if you’re using git-cinnabar you can use its hg2git functionality to change the revs from hg to git) and dump their sum-total changes to a viewer, or pipe it through grep, or turn it into a spreadsheet you can go through row-by-row, or anything you want. I’m lazy so I always try keywording on the pushlog first, but these are always there for when I strike out.
5. Getting it wrong
Just because you found the one and only commit that landed in a suspect build that is at all related, even if that commit’s bug specifically mentions that it fixed a double-counting issue, even if there’s commentary in the code review that explains that they expect to see this exact change you just saw… you might be wrong.
Do not be brusque in your reporting. Do not cast blame. And for goodness’ sake be kind. Even if you are correct, being the person who caused a change that resulted in this investigation can be a not-fun experience. Ask Me How I Know.
Firefox Desktop is a complex system, and complex systems fail. It’s in their nature.
And that’s it! If you have any comments, question, or (better yet) improvements, please find me on the #glean:mozilla.org channel on Matrix and I’d love to chat.
I’ve finished playing Final Fantasy XVI after completing the storyline and all side quests and hunts. It was a visually-stunning but stiltingly-animated JRPG romp with a more adult tone but childish treatment of themes and characters that ultimately satisfied mostly on the back of its real-time action battle system. Spoilers follow.
This is my Active Time Lore Appreciation Paragraph. I will hear nothing bad said about Active Time Lore as the ability to pause any cutscene at any time and be able to remind myself what the heck is going on is invaluable to me and anyone else who can’t devote hours every day to keep a game fresh in the mind. Plus, it helps flesh out the things that no character would ever say but might be bloody interesting to know, like the symbolism of the Sanbreque Imperial Flower gobbin. There’s always a tension in high fantasy between building a world Not Like Our Own but having to make it comprehensible to an audience that only knows our own world. Add in a visual show-don’t-tell medium like video games, and your narrative lens is almost exclusively through characters that already know everything about their world. You can dump in an amnesiac or isekai in a high schooler to give yourself someone to explain the weird and interesting stuff to… or, if, like Final Fantasy XVI, the narrative doesn’t want that, you can, like Final Fantasy XVI, be careful to keep the fantasy word salad to a minimum while providing backstory via Active Time Lore. Very nice.
This is my Vivienne’s Table Appreciation Paragraph. When at your Act 2 hideout you can review the entire cast in relation to each other and the map as it currently sits with motions of important characters and forces. So outstandingly helpful for all the same reasons as Active Time Lore.
A pity I never actually needed either of them.
The story and themes of Final Fantasy XVI are kinda boring. You’re the chosen one who falls from a privileged position to one of an oppressed class who then discovers that oppression is bad, actually. Through a mentor figure you are given an opportunity to fight back for yourself and your fellow people, but in no way that upsets the status quo that resulted in the existing power dynamic. You have a romantic subplot in which you are the subject and she is the object. Nobles (as in bloodlines) are noble (except for the evil one), and bloodlines are the best way to supply the right to lead (except for the evil one who is destroyed by it). In the final boss fight you kill god.
You know, the usual.
It keeps feeling like it wants to say something. It wants to liken crystals to oil, or something. It wants to liken the subhuman classification and treatment of Bearers to slavery or the treatment of indigenous peoples. It wants to liken the Blight to climate change. …but maybe that’s me wishing it had the will to say anything about anything at all, as there’s certainly nothing I saw in the text that would suggest this. Which is disappointing.
And it’s not afraid to treat the audience maturely. (And I don’t mean the sideboob and abattoir’s amount of gore.) It’s willing to supply two philosophies at odds with each other and not immediately resolve which one is “better”, most notably when the Templar-equivalent researchers sacrifice their brethren instead of the mission and Clive is all angry about it. Unresolved tension between schools of thought! Like maybe there isn’t a clear answer to every conflict?
Except that the mechanics of the game really hold it down. With no branching narrative, there’s no choices of meaning. With nothing but a sword, there’s no way to choose diplomacy or intrigue or cleverness to resolve things that are needed to progress. It is a fun sword to swing, mind: you spend an awful lot of time inside the battle system and it does satisfy. Attacks and abilities land solidly, enemy designs are sufficiently varied to keep it interesting, bosses hit like a dumptruck only after obvious windups. It’s fun in that realtime battle way: can you read and react in time. But when the battle is done it is sorely disappointing to be shown that not all bandits are bad, actually… and then immediately have more battles with bandits where you kill them really really dead (well, maybe they don’t die. There’s no clarity about whether “defeated” or “slain” actually means dead.).
What isn’t disappointing is the visual fidelity. The landscapes and humans are very well modeled and textured. Clive’s hair is really pretty, and moves exceedingly well. The draw distance appears infinite, and I only found one vantage point where the grass tiled diagonally: the rest of the wild and built world looked and felt like it had some supreme attention paid to it. (Except the water. Water’s hard. Though Horizon: Forbidden West had better water.)
The performance-capture-driven character animation is also a visual treat. Expressions, emotions, tiny gestures… the performance-capture cutscenes are well-directed and acted with motions and emotions small and large expressed exceedingly well in most cases. Jill checks her boot for mud just before the akhashic marlboro (sorry, they’re called “morbol” now) fight. Leaders wishing for deniability hide their mouths when talking. They paid attention, folks.
But there’s a sharp decline in animation fidelity once you’re out of performance capture. At my count there are three conversation systems: performance-capture cutscene, lip-flapping (though it’s clear the engine’s trying to match mouths to phonemes, it’s failing), and shopkeepers (who only voice the first line. You get to read the rest). None of them support branching dialogues. All but the first are really awful to look at, especially coming from Horizon: Forbidden West, let alone The Last of Us: Part II. Especially when they use a lower-fidelity system for Important Story Moments. Especially when the writing is so gosh-darn wordy that I can cut off characters mid-line and the same information is conveyed. For a game with nothing to say, it spends a lot of time saying it.
And it’s bonkers that they got the water reflections around the hideout so wrong and specifically turn the camera to frame them on the elevator. And how their inverse kinematics never seem to place people’s feet actually on the surfaces they’re standing on.
The voice acting is most excellent, though. You can really hear the cast giving it their all, and Clive has some truly emotional scenes that are sold convincingly (even if sometimes the animations don’t live up). Which is why it’s disappointing that Ultima can’t seem to decide whether to pronounce the ‘u’ in Mythos.
The score was nice. Maybe over-orchestrated for how thin the story and setting turned out to be… but maybe they were playing for the concept over the execution. No one told them they didn’t need to bring their A game and their forty-voice choir.
I still like it better than the XIII sequels. I like that they told a whole story, unlike XV. I like that they’re trying to age their series with its audience. I like that they kept chocobos and the victory fanfare and sixteen-bit sprites for some menu stuff. I really liked Cid.
I was disappointed that the visual fidelity couldn’t be supported at framerate. I couldn’t unsee how bad the lip-sync and water was. And worst of all, I can’t forgive that they had this world and cast and budget to say something and chose to not.
Recommended for fans of Final Fantasy and other RPGs that don’t have their hopes set too high.
I recently completed the story of Persona 5 (not the Royal re-release), getting a little over half the achievements. It’s not my first experience with a JRPG with Lifestyle Simulator elements (I did play Fire Emblem: Three Houses (no So I’ve Finished article for that one, sorry)), but it’s only my second. I found it to be incredibly stylish, political-aesthetic, mechanically consistent, and enjoyable… but so, so very long. Spoilers ahead.
With no grounding in previous games of this type I really didn’t know how to handle the two “halves” of the game. You’re given latitude in challenging the dungeons over several in-game days. Coupled with sparse save points (how nostalgic!) and expensive/rare healing items you can’t replenish within the dungeon, there’s a clear push-your-luck framework. Do you have the stamina to get to the next save point, are you going to spend all this time getting part of the way there and fail, and how many of these rare/expensive healing items are you willing to expend to make it less likely you’ll wipe?
As for the second, Lifestyle Simulator, half, while there’s a dungeon to be delved you _can_ do some lifestyle stuff (hanging out with friends, studying for tests, eating burgers, etc.) but the game often interjects “Hey, are you -sure- you want to do that? Here’s an easy button to go to the dungeon instead.” It’s nice to be reminded, and there are some hard stops to try and keep a distracted player from going too far and entering an unwinnable situation, but it’s uncomfortable. So too is the helper companion Mona’s insistence in putting you someplace where the only thing you can do is go to sleep. If all I can do is sleep: just put me in bed already. Putting me in the room and having me choose sleep does not make me feel like I have agency.
Between the two it’s hard to figure out what exactly I’m “supposed” to be doing. Eventually I got the hint and did whatever I felt like, but going from more typical JRPGs like Final Fantasy XV, it felt weird to actually have freedom.
I feel as though I made the right choice playing it with the Japanese voice acting. Some of the voice lines have some of what I semi-affectionately call “anime bullshit” in them, and I’m primed to ignore the bullshit if it sounds like it comes from a Japanese voice actor. And it made the repetitive barks easier to bear.
Speaking of repetition, there are only like seven songs in this game. And 120 hours of gameplay. Yes, they do a clever thing and enrich the arrangement over time so it develops as the plot develops, but not nearly enough and not for every track. The saving grace is that all of them (except Mementos, which I took to playing on mute) are bangers, so I don’t really mind kicking into battle for the eleventy-millionth time to hear the same tune (though my wife started to):
Battle is an interesting change from other JRPGs I’ve played. Sure, yes, it’s attack and magic, item and escape. Take your turn, suffer the enemies’ turns, rinse and repeat. But there are meaningful changes that reinforce the game’s themes really satisfyingly. You’re a bunch of stylish, clever, thieves, right? So you’re weak as a wet paper bag. But your wit and charm give you your edge, if only you can turn the tables on your adversaries. Mechanically this means knowing the elemental weaknesses of the enemies (from the ten possibilities) and exploiting them until you have the upper hand. At that point you can talk them into giving you things (items or cash) or joining forces with you (hi ho, a-pokemon we go). Or you can smack them upside the head for ludicrous damage, likely ending the fight in one all-out attack. And if you started this battle by attacking from stealth and surprising the enemy? You might end the whole shebang without the enemies even having a chance to act. This results in a pleasant rotation on the JRPG battle formula: it makes more of a puzzle of it that rewards thoughtful play, emphasizes tension of the heist, and supports the game’s premise, setting, characterization, and themes.
It’s pretty good, is what I’m saying. And it looks damn sharp. I was worried going in. In screenshots and video the constant pulsing motion of UI elements, the arbitrary changes of font and highlighting of letters or phrases, the incredibly busy screens full of text — how could you play a game with all that going on?But no. Somehow in the transfer from looking at the game to playing it I always knew where to look and how to parse the information. It didn’t matter how busy the screen was, I could instantly get the information I needed. The visual density was a welcome enhancement as it gave me something interesting to look at when it was the fiftieth time I was in that menu.
So is what I’m saying is that it’s a stylish and cohesive game that everyone should play? Well… yes, it is very nice bumping around Tokyo (I want Tokyo metro in my life. Driving sucks.) hanging out with my friends and devising how to topple the systems of injustice unfairly and supernaturally holding power over us. But it gets weird in the corners of the systems.
Like relationships. P5 is half relationships and half JRPG. The reward for improving your relationships is tangible effects in the JRPG half of the game, lending you aid when and where you need it most. And the reward for maxing out your relationship is _never having to do relationship side quests with that person again_. Worse, if you’re then given an opportunity to hang out with someone you’re besties with, or even _in a romantic relationship with_, and someone else, it is mechanically more optimal to hang out with someone else instead (because getting more relationship points in a maxed-out relationship does you no good). This is the exact opposite of how the mechanics of battle mesh with and support the game. The mechanics of relationship building are in opposition to the text of building and maintaining relationships and their importance to the plot and themes of P5.
Social stats, which both fuel and are rewards for relationships, are another weird corner. In the late game certain events require you to have maxed out a social stat… only to then reward you with that stat as you progress. How this escaped testing boggles me. I can only assume the order you meet confederates was kept fluid until late in development.
And then there’s the game’s atrocious treatment of gay people. The “best” part about it is that the game pretty much ignores that gay people exist aside from two ignorant, backwards interactions. This game was released in 2016, c’mon. And for a game about fighting the system’s injustices, what would be better than fighting for equal recognition in a country where a majority of people support same-sex marriage despite it not being legal?
…which makes me wonder if the game really is about fighting the system. Yes, the supernatural god (it’s a JRPG, of course the final boss is God) convincing everyone to give up their free will for an easy path through life has been defeated and its hellscape earth has been destroyed. But the characters all need to put their faith in adults to “do the right thing” in a largely-unchanged status quo in the ending and epilogue. Mischief: yes. Reform: no.
This way lies the most resonance between mechanics and theme, for only this way does it explain why a cat telling you not to stay up late actually works on a supposed delinquent/rebel/thief/hero.
All this is to say that I found Persona 5 to be a game about aesthetics. Its veneer is very shiny and hip, and it’s willing to put lip service to a few interesting ideas. But when it gets deep in to the core it is more interested in preserving the status quo with few changes: to its battle mechanics, to its orchestration, to its social interactions, or to its world. It’s a game that could be mistaken for having something to say. But mostly it’s flashy entertainment.
Which isn’t nothing! It’s difficult to be entertaining. And it’s allowed to be “just” entertained.
But it disappoints me when something so much better was well within reach.
I recommend this game for fans of JRPGs and Life Simulators who have 120 hours to put into being entertained and can look past some blink-and-you’ll-miss-it hateful representations of queer folk.
Last year I finished a playthrough of the story and some of the side content of Kena: Bridge of Spirits, a 3D action-adventure game. I enjoyed exploring the world, the fighting and progression systems, the score, and most of all the art style. Spoilers follow.
First and foremost: how in the world do you pronounce her name? Is it Key-Na, or Kay-Na?
(19m26s-19m30s)
Ah, Kay-Na. I played this game and for the longest time I coulda sworn that they pronounced it both ways in the game. Anyway.
I looks and plays like an all-ages game. It has Uncharted-style climbing, plus some platformer traversal (Kena can double jump from the get-go). The style looks child-friendly, the soundtrack is anything but subtle, and the script is very simple. The polish is quite nice (though switching between animation states (walk, run, jump, fall, double-jump, attack, roll) is a bit jarring after spending some time in the crunch-fueled shine of The Last of Us Part II’s animations), and it controls very straightforwardly. Mix in a cute little soot-sprite species that you can dress up (by discovering and purchasing outfits with one of the several in-game currencies) and it’s pretty clear who the audience is expected to be, right?
But then there’s the bosses. I can’t help but notice the influence of, yes, Dark Souls. You need to dodge, parry, and go after those bosses again and again until you “git gud” and learn how to beat them. And then learn how to execute on learning how to beat them. I was _not_ expecting a game so friendly and, well, easy to have such punishing boss fights.
I was also not expecting it to be quite so obvious when they changed engine between cutscenes and gameplay. I’ve been spoiled by recent fads where everything is rendered in-engine, even if they turn up the quality knobs for story beats where they can control the camera. It was almost nostalgic to see the seams.
A bug report: If you turn off the “button legend” setting (telling you which buttons do what) then there’s no prompt for the one action that lets you escape the tutorial area by ducking under a tree (an action you never do again). I try turning off more of the screen clutter when giving the option (video games are a visual medium, and I’m easily distracted by HUD elements), and this one had me lost for a minute.
Another juxtaposition with the childlike world is how muddled the philosophy is. You’d expect an easy good vs. evil, maybe a little redemption… but no. And this is in contrast with the politics, which are openly conservative. A bit of that is in the “conserve the environment” sort of way, but a lot of it is also “accept your fate” and “listen to the elders and do what they tell you”. Which not only doesn’t resonate with me in particular, it doesn’t flow through to how they paint the “bad guy”. There’s an evil worldview of… trying to save people’s lives and livelihoods? And the good worldview of… sometimes entire villages just need to die? And there’s no conversation between the “good” philosophy and the “evil” one. It’s very disconnected, and not in the “it is actively trying to have nothing to say” blandness I’ve come to expect from corporate art. I just don’t know what it’s trying to say?
If you want a less conflicting and simplistic view of the inevitability of death, you’ll have to play Spiritfarer, I guess. And if you want a more cohesive and complete and consistent set of mechanics and worldbuilding, you can dig out your PS2 and play Beyond Good and Evil.
Recommended for people looking for that Jak and Daxter experience, but with lush Ghibli visuals and rich orchestral score… and only if you’re willing to wipe and repeat the bosses a couple handfuls of times.