Macil's recent activity

  1. Comment on What programming/technical projects have you been working on? in ~comp

    Macil
    Link
    I wrote a script that screenshots whatever game I'm playing every 2 minutes and then uses GPT-4 to say something about the screenshot. Its messages are pretty lame so far, but I'm impressed it...

    I wrote a script that screenshots whatever game I'm playing every 2 minutes and then uses GPT-4 to say something about the screenshot. Its messages are pretty lame so far, but I'm impressed it understands the games I'm playing this well (I queued for an Overwatch match, switched to play as the healer Mercy, etc). My goal is to make it work so I can use it while I'm streaming on Twitch and have it be interesting for me and chatters to interact with. (I don't regularly stream on Twitch, but I like the idea of doing it to push me to make presentable software like this.)

    I'm still experimenting in trying to make it say things that are more interesting. It sees its previous messages, a couple of the most recent screenshots, and my messages in the chat too when generating a message. At first I kept changing its hard-coded system prompt and restarting it to adjust its behavior, but then I finally realized I could just tell it in chat to act differently. As a lifelong programmer, it's still so trippy to me to chat with a program I made to change how it works.

    It's written in Typescript using Deno, the discordeno library, the official openai npm library, and also a small Powershell script I wrote with ChatGPT's help to use the Windows API to screenshot a specific program.

    2 votes
  2. Comment on Popular AI chatbots found to give error-ridden legal answers in ~tech

    Macil
    Link Parent
    Well, Google is extremely useful for this, as long as you can apply a little critical thought and further research to the results you get, and ChatGPT seems similar to me. It's easy to make fun of...

    Well, Google is extremely useful for this, as long as you can apply a little critical thought and further research to the results you get, and ChatGPT seems similar to me. It's easy to make fun of the people who do their own research with these tools hilariously badly but it's harder to recognize the many people who get real value out of it.

    7 votes
  3. Comment on Popular AI chatbots found to give error-ridden legal answers in ~tech

    Macil
    Link Parent
    Sycophancy is a big problem with LLMs right now. The issue has been recognized and is being studied a lot lately so I'm hopeful solutions will be found eventually.

    Sycophancy is a big problem with LLMs right now. The issue has been recognized and is being studied a lot lately so I'm hopeful solutions will be found eventually.

    1 vote
  4. Comment on Single-player games to play with my partner in ~games

    Macil
    Link Parent
    A remaster of Braid is being released on April 30 this year!

    A remaster of Braid is being released on April 30 this year!

    2 votes
  5. Comment on Playing Quake for the story (A franchise retrospective) in ~games

    Macil
    (edited )
    Link
    It's a very interesting look into the shift from plain game logic to cinematic style that happened across the Quake series and games in general, and also the ways that narrative can come through...

    It's a very interesting look into the shift from plain game logic to cinematic style that happened across the Quake series and games in general, and also the ways that narrative can come through outside of the modern cinematic style.

    I remember as a kid being very confused and disappointed by the lack of connection between the story in the manual of the original Quake and the actual game. I wanted to daydream in the settings of games I played and see the game interact with the ideas of my daydreaming, and no experience in playing Quake fit with my early conception of it. Later on, Quake 2 with its actual coherent narrative felt like an acknowledgment of my desire. And then much later on Quake 4 seemed to answer my desire even further. For a while, it really felt like games adopting more of a cinematic style was huge progress as a part of the shift to 3d and realistic graphics. It was brand new and cool. Games that didn't have that style suddenly felt dated and ready to be replaced.

    But now the cinematic style is the norm in games. We've seen it explored in tons of ways now. Quake 4 banked on "Quake 2 but modernly cinematic" being enough to carry it, but it was a little late to that. To people no longer starving for the cinematic style, it feels a bit generic outside of a few signature moments. The older games now feel much more distinct with their more experimental approaches to narrative and level design.

    I'm really glad the video continues from there by exploring the throwbacks that are the recent Quake 1 and 2 expansions. It's very cool to see the ways the level design can evolve once the designers are unshackled from the idea that Quake campaigns need to get more cinematic to get better for modern sensibilities. I really agree with the video that this was a better way to follow up Quake than a remake or a sequel, and that it's a shame the new levels haven't gotten more attention.

    Within just one of five units of the new campaign [Dimension of the Machine], the developers demonstrate complete tonal mastery over the conflicting elements of sci-fi and fantasy that the original completely failed to resolve. Here they are in actual harmony, a sci-fi civilization using their slipgates to explore a magical universe filled with dark secrets man was not meant to know, hidden horrors never meant to be unearthed. The Realm of the Astrologers, using only level design, creates a more coherent narrative than anything in the first game, and a more creative narrative than anything in the second game.

    Call of the Machine is so conscious of how the fact that Quake has never had much of a plot or much consistency is actually a kind of artistic freedom if you're willing to look at it that way. It can be reshaped and newly molded into so many strange configurations and still remain faithful to the original campaign.

    An even longer video would have something to say at this point about the revival of "boomer shooters" as an indie game genre including Dusk, or about the mapping community that still exists for Quake with the amazing work that is Arcane Dimensions, but this is probably more than enough for one video.

    One thing about the original Quake's very loose non-cinematic approach to narrative is that it makes it the perfect base for user-made levels, because tons of styles fit in with it and it's acceptable for a level to provide just mere gameplay arenas without much narrative of its own.

    7 votes
  6. Comment on The morality of using AI-generated art in my web app in ~comp

    Macil
    (edited )
    Link Parent
    The main consequence of this is that Midjourney itself can't copyright the images they automatically generate for you. Guidelines from the US Copyright Office explain that it's possible to combine...

    The main consequence of this is that Midjourney itself can't copyright the images they automatically generate for you. Guidelines from the US Copyright Office explain that it's possible to combine human authorship with an AI-generated work, through editing or even arrangement of AI outputs, and the result can be covered by copyright. So people could reuse any individual image you put up that's unedited, but if you substantially further edit the images or say build a site template out of them, those results are your own.

    10 votes
  7. Comment on Cory Doctorow: What kind of bubble is AI? in ~tech

    Macil
    (edited )
    Link
    It's surreal to see Uber brought up as directly analogous to Enron when everyone I know in SF completely switched from taxis to Uber/Lyft many years ago, raved about the improvement, and can't...

    It's surreal to see Uber brought up as directly analogous to Enron when everyone I know in SF completely switched from taxis to Uber/Lyft many years ago, raved about the improvement, and can't imagine going back. I know there was a bubble where investors were overly excited about Uber years ago, they're less excited about it now, and the prices are up a bit, but the product is still here. Taxis and city transit were already bad and it's far from obvious to me that the situation would be better now if more people had sat around waiting on them to get good instead of making rideshare services. (I still dutifully vote for all kinds of public improvements in the city.)

    I totally believe that there's a bubble in businesses building on current AI tech, but I expect that mainly has to do with there being many more people trying to get in early than there are good workable business ideas right now for the current technology level, and not because the technology is going to top out right here. I don't think the companies at the center making the biggest models (OpenAI) are going to die. They have absolutely no shortage of research directions to make current models much cheaper and new models much more powerful. The article seems to posit that copyright cases are maybe going to kill OpenAI (weird that Doctorow almost seems to be cheering for copyright here), but a recent case is looking good for AI companies. Both OpenAI and Anthropic are confident enough right now that they're offering to cover any legal cases for customers related to copyright issues from using their models. Even if copyright proved to be a big obstacle for AI companies, I fully believe they'd soon find ways to deal with the issue through training on fully licensed or artificial data.

    I feel like the general public's annoyance with the overhyped cryptocurrency bubbles has created a market for tech-industry-skeptic articles, and this article is filling that role more than providing insight on the technology and the future. I think people who primarily try to understand the tech industry as a social phenomena of certain subjects being either hyped or overhyped will understand the future less well than people who spend more time directly thinking about the technology and its possibilities.

    10 votes
  8. Comment on Netflix and Apple open door to bundling with streaming rivals in ~tv

    Macil
    (edited )
    Link Parent
    It feels weird to consider bundling the main difference between cable and streaming. I didn't start using Netflix because I didn't like bundling that cable services did. I started using Netflix...

    It feels weird to consider bundling the main difference between cable and streaming. I didn't start using Netflix because I didn't like bundling that cable services did. I started using Netflix because I wanted to be able to watch whatever episode of a show whenever I wanted instead of at a mysterious TV schedule.

  9. Comment on Node's "Single Threaded, Event Driven" programming model seems highly deceptive and farcical in ~comp

    Macil
    (edited )
    Link
    For small amounts of concurrent IO/threads it's relatively true that there's not much performance benefit to async IO over threads, but the difference is when you have a lot. Async IO doesn't use...

    For small amounts of concurrent IO/threads it's relatively true that there's not much performance benefit to async IO over threads, but the difference is when you have a lot. Async IO doesn't use threads in the background but more efficient OS APIs that allow IO to be done without extra threads. This is important because each thread has its own performance and memory cost.

    Async IO became popular in the context of the C10k problem, when it became obvious that having a thread per IO operation performed terribly at handling thousands of concurrent connections. Apache, the most popular webserver, was built on the threaded IO model, and it lost its top position to Nginx, which was built on the async IO model and performed much better at handling many concurrent connections.

    As async IO became popular, developers found that it was hard to program for in existing programming environments (like C, Python, and Java), because most standard library functions and third-party libraries used blocking IO, and calling any blocking IO functions within async code would often silently negate the performance benefit or completely destroy the performance of async code. Developers had to carefully avoid using pre-existing code that used blocking IO.

    The creator of Node, Ryan Dahl, decided that one way to solve this problem would be to create a brand new server programming ecosystem that (mostly) had no blocking IO functions and was built from the ground up for async IO. He realized that this would be hard to do within most existing language ecosystems, and that it would be easiest to do on a language not already commonly used on servers. Javascript was a convenient choice because it fit that, had no blocking IO in its standard library, and already had well-optimized implementations from its use in browsers. Unlike the common misconception, Node did not primarily exist to allow frontend JS developers to program on servers but to be a programming environment built on async IO.

    18 votes
  10. Comment on Day 3: Gear Ratios in ~comp.advent_of_code

    Macil
    Link
    Using Typescript and Deno together still. I flipped my approach to solving this a few times. Originally I decided I would process the text character-by-character to look for symbols, and then also...

    Using Typescript and Deno together still. I flipped my approach to solving this a few times. Originally I decided I would process the text character-by-character to look for symbols, and then also do that to look for numbers, but then I would have to do some annoying book-keeping to remember where I encountered each of a number's digits. I realized it would be much easier if I used a regex to recognize strings of multiple digits together, and then searched for symbols around it. I also used regexes to search for the symbols. I would use the slice() method on the strings of the surrounding rows to make a substring of only the positions neighboring the number, and then use a regex to search those for symbols.

    For part 2, I did a similar search, but I would only look for "*" symbols neighboring the numbers, and I kept track of the locations of all "*" symbols and the numbers that neighbored them in a Map object. Then I iterated through the map looking at all locations which had exactly two numbers as neighbors.

    Typescript
    import { assertEquals } from "https://deno.land/std@0.208.0/assert/mod.ts";
    import { runPart } from "https://deno.land/x/aocd@v1.5.1/mod.ts";
    
    class Coordinate {
      row: number;
      column: number;
    
      constructor(row: number, column: number) {
        this.row = row;
        this.column = column;
      }
    
      toString() {
        return `${this.row},${this.column}`;
      }
    
      static fromString(str: string): Coordinate {
        const [row, column] = str.split(",").map(Number);
        return new Coordinate(row, column);
      }
    }
    
    function parse(input: string): string[] {
      return input.trimEnd().split("\n");
    }
    
    function* getNumberSymbolNeighbors(
      lines: string[],
      numberCoordinate: Coordinate,
      numberLength: number,
      symbolRegex = /[^0-9.]/g,
    ): Generator<Coordinate> {
      for (
        let row = numberCoordinate.row - 1;
        row <= numberCoordinate.row + 1;
        row++
      ) {
        const line = lines[row];
        if (!line) {
          continue;
        }
        const searchPartStart = Math.max(0, numberCoordinate.column - 1);
        const searchPart = line.slice(
          searchPartStart,
          numberCoordinate.column + numberLength + 1,
        );
        for (const symbolMatch of searchPart.matchAll(symbolRegex)) {
          yield new Coordinate(row, searchPartStart + symbolMatch.index!);
        }
      }
    }
    
    function numberHasSymbolNeighbors(
      lines: string[],
      numberCoordinate: Coordinate,
      numberLength: number,
      symbolRegex?: RegExp,
    ): boolean {
      for (
        const _value of getNumberSymbolNeighbors(
          lines,
          numberCoordinate,
          numberLength,
          symbolRegex,
        )
      ) {
        // Just return true as soon as we've found one, don't need to keep looking.
        return true;
      }
      return false;
    }
    
    function part1(input: string): number {
      const lines = parse(input);
      const partNumbers: number[] = [];
      lines.forEach((line, row) => {
        for (const numberMatch of line.matchAll(/[0-9]+/g)) {
          const numberCoordinate = new Coordinate(row, numberMatch.index!);
          if (
            numberHasSymbolNeighbors(lines, numberCoordinate, numberMatch[0].length)
          ) {
            partNumbers.push(Number(numberMatch[0]));
          }
        }
      });
      return partNumbers.reduce((a, b) => a + b, 0);
    }
    
    function part2(input: string): number {
      const lines = parse(input);
      // keys are stringified coordinates
      const gearCoordsToNumbers = new Map<string, number[]>();
      lines.forEach((line, row) => {
        for (const numberMatch of line.matchAll(/[0-9]+/g)) {
          const numberCoordinate = new Coordinate(row, numberMatch.index!);
          for (
            const gearCoordinate of getNumberSymbolNeighbors(
              lines,
              numberCoordinate,
              numberMatch[0].length,
              /\*/g,
            )
          ) {
            const gearCoordinateString = gearCoordinate.toString();
            let gearNumbers = gearCoordsToNumbers.get(gearCoordinateString);
            if (!gearNumbers) {
              gearNumbers = [];
              gearCoordsToNumbers.set(gearCoordinateString, gearNumbers);
            }
            gearNumbers.push(Number(numberMatch[0]));
          }
        }
      });
      return Array.from(gearCoordsToNumbers.values())
        .filter((gearNumbers) => gearNumbers.length === 2)
        .map(([a, b]) => a * b)
        .reduce((a, b) => a + b, 0);
    }
    
    if (import.meta.main) {
      runPart(2023, 3, 1, part1);
      runPart(2023, 3, 2, part2);
    }
    
    const TEST_INPUT = `\
    467..114..
    ...*......
    ..35..633.
    ......#...
    617*......
    .....+.58.
    ..592.....
    ......755.
    ...$.*....
    .664.598..
    `;
    
    Deno.test("part1", () => {
      assertEquals(part1(TEST_INPUT), 4361);
    });
    
    Deno.test("part2", () => {
      assertEquals(part2(TEST_INPUT), 467835);
    });
    
    1 vote
  11. Comment on The Boys | Season 4 official teaser trailer in ~tv

    Macil
    (edited )
    Link Parent
    I'm not against it in principle, but I hate how they seem to stick to an overly predictable strict schedule of having one shockingly violent scene per episode. It's so routine that you know if the...

    I'm not against it in principle, but I hate how they seem to stick to an overly predictable strict schedule of having one shockingly violent scene per episode. It's so routine that you know if the episode is most of the way through without it happening yet that a twist is going to happen any minute now with one.

    6 votes
  12. Comment on Play Steam VR games on Meta Quest 2, 3, and Pro in ~games

    Macil
    Link Parent
    The maps are built for specific songs. There are programs that can autogenerate a map for a given song, though they're a bit uninspired usually.

    The maps are built for specific songs.

    There are programs that can autogenerate a map for a given song, though they're a bit uninspired usually.

    2 votes
  13. Comment on <deleted topic> in ~tech

    Macil
    (edited )
    Link Parent
    It's hard to see Elon as a valiant fighter against cancel culture when he defends people such as the Libsoftiktok account whose harassment of LGBT people has regularly lead to targets losing jobs...

    It's hard to see Elon as a valiant fighter against cancel culture when he defends people such as the Libsoftiktok account whose harassment of LGBT people has regularly lead to targets losing jobs and getting death threats, unless you strictly define cancel culture as something where the right is targeted. Cancel culture isn't synonymous with whether websites ban people.

    9 votes
  14. Comment on Play Steam VR games on Meta Quest 2, 3, and Pro in ~games

    Macil
    Link Parent
    When playing Steam VR games using Air Link, you have both the Oculus PCVR overlay and the Steam VR overlay available on different controller menu buttons, and people commonly report the...

    When playing Steam VR games using Air Link, you have both the Oculus PCVR overlay and the Steam VR overlay available on different controller menu buttons, and people commonly report the performance isn't as good as playing Oculus PCVR games with Air Link. Using Steam Link should cut out the redundant UIs and help performance when playing non-Oculus PCVR games.

    4 votes
  15. Comment on Day 1: Trebuchet?! in ~comp.advent_of_code

    Macil
    (edited )
    Link
    I solved it with Typescript and Deno, using my aocd library for handling fetching the inputs and submitting answers. Part 1 was very straight forward by using a regex to remove all non-numeric...

    I solved it with Typescript and Deno, using my aocd library for handling fetching the inputs and submitting answers. Part 1 was very straight forward by using a regex to remove all non-numeric characters from the line. Part 2 required me to throw that out and iterate character by character to see if it was a digit or was the position a digit's name started.

    My first attempt at part 2 passed the test but failed on the real data because as an optimization I skipped to the end of the digit's name in the line when I recognized a digit's name, but it turns out some of the lines actually have the digit names overlapping, like in "eightwothree" where you're meant to read both "eight" and "two" despite them sharing a letter. I deleted the line I had that advanced i by the word's length and then my code worked fine.

    Typescript
    import { assertEquals } from "https://deno.land/std@0.208.0/assert/mod.ts";
    import { runPart } from "https://deno.land/x/aocd@v1.5.1/mod.ts";
    
    function parse(input: string) {
      return input.trimEnd().split("\n");
    }
    
    function part1(input: string): number {
      const items = parse(input);
      return items.map((line) => {
        const onlyNumbers = line.replace(/[^0-9]+/g, "");
        const firstDigit = onlyNumbers[0];
        const lastDigit = onlyNumbers[onlyNumbers.length - 1];
        return Number(firstDigit + lastDigit);
      }).reduce((a, b) => a + b, 0);
    }
    
    const digits = [
      "zero",
      "one",
      "two",
      "three",
      "four",
      "five",
      "six",
      "seven",
      "eight",
      "nine",
    ];
    
    function part2(input: string): number {
      const items = parse(input);
      return items.map((line) => {
        const digitsInLine: number[] = [];
        for (let i = 0; i < line.length; i++) {
          if (line[i] >= "0" && line[i] <= "9") {
            digitsInLine.push(Number(line[i]));
          } else {
            for (
              let digitIndex = 0;
              digitIndex < digits.length;
              digitIndex++
            ) {
              if (line.startsWith(digits[digitIndex], i)) {
                digitsInLine.push(digitIndex);
                break;
              }
            }
          }
        }
        const firstDigit = digitsInLine[0];
        const lastDigit = digitsInLine[digitsInLine.length - 1];
        return firstDigit * 10 + lastDigit;
      }).reduce((a, b) => a + b, 0);
    }
    
    if (import.meta.main) {
      runPart(2023, 1, 1, part1);
      runPart(2023, 1, 2, part2);
    }
    
    const TEST_INPUT = `\
    1abc2
    pqr3stu8vwx
    a1b2c3d4e5f
    treb7uchet
    `;
    
    Deno.test("part1", () => {
      assertEquals(part1(TEST_INPUT), 142);
    });
    
    const TEST_INPUT2 = `\
    two1nine
    eightwothree
    abcone2threexyz
    xtwone3four
    4nineeightseven2
    zoneight234
    7pqrstsixteen
    `;
    
    Deno.test("part2", () => {
      assertEquals(part2(TEST_INPUT2), 281);
    });
    
    2 votes
  16. Comment on Sam Altman to return as OpenAI CEO with new board members in ~tech

    Macil
    (edited )
    Link
    Seems like there's a lot of information about the story not being made public. What specifically was he not "consistently candid" about that the board ousted him for? Did the board stay quiet...

    Seems like there's a lot of information about the story not being made public. What specifically was he not "consistently candid" about that the board ousted him for? Did the board stay quiet about the specific reasons as a favor to keep the negotiations open with Sam? Did Sam and the board just have some mundane business disagreements that escalated out of control? (Interim CEO Emmett Shear says the issue was not about safety of an AI system.) Does it have to do with a board member writing a paper very softly critical of OpenAI? (https://twitter.com/pitdesi/status/1727122839235657976)

    This has all left me less confident in Sam Altman, but overall I'm glad to see OpenAI didn't implode.

    14 votes
  17. Comment on Emmett Shear becomes interim OpenAI CEO as Sam Altman talks break down in ~tech

    Macil
    Link Parent
    Last month, Sam Altman's twitter bio was "eliezer yudkowsky fan fiction account" referencing the same story. Apparently it wasn't enough to prove himself as a true fan for the board, and they had...

    Last month, Sam Altman's twitter bio was "eliezer yudkowsky fan fiction account" referencing the same story. Apparently it wasn't enough to prove himself as a true fan for the board, and they had to find a more dedicated fan.

    1 vote
  18. Comment on Emmett Shear becomes interim OpenAI CEO as Sam Altman talks break down in ~tech

    Macil
    (edited )
    Link
    In the past I've seen Emmett in a few Twitter discussions about AI and AI safety with good takes and had followed him, so it's interesting to see him suddenly get the spotlight. I hope he can...

    In the past I've seen Emmett in a few Twitter discussions about AI and AI safety with good takes and had followed him, so it's interesting to see him suddenly get the spotlight. I hope he can figure out what's going on at OpenAI and be effective at communicating about it.

    3 votes
  19. Comment on Sam Altman will join Microsoft to lead a new advanced Al research team following his ouster from OpenAl, CEO Satya Nadella said in ~tech

    Macil
    Link Parent
    I assume at least in the short term they're going to build on top of what they get from the OpenAI partnership. It could evolve into replacing OpenAI but I don't think enough is known or planned...

    I assume at least in the short term they're going to build on top of what they get from the OpenAI partnership. It could evolve into replacing OpenAI but I don't think enough is known or planned yet to know if that's how it will work out.

    5 votes
  20. Comment on Why do you think Sam Altman was fired from OpenAI? in ~finance

    Macil
    (edited )
    Link Parent
    I've felt this confusion too today after reading a lot of the discourse. I think a lot of people think safety could only be a concern related to a firing if OpenAI had dangerous AGI today, and...

    I've felt this confusion too today after reading a lot of the discourse.

    I think a lot of people think safety could only be a concern related to a firing if OpenAI had dangerous AGI today, and that it's unlikely that OpenAI has AGI today, therefore this concern must be an obviously false pretense for the firing, but there are multiple ways this reasoning is false. For one, it's easy to me to imagine that a disagreement over how to handle safety in the long-term lead to multiple people in charge digging in and losing the ability to work together. I think people incorrectly expect the reason for dramatic news to be more dramatic than something that mundane.

    15 votes