livingcoder

joined 1 year ago

I never would have guessed when I first installed RIF that some years later I would end up feeling sad as I uninstalled it.

[–] livingcoder@lemmy.austinwadeheller.com 1 points 1 year ago* (last edited 1 year ago)

And the GPL is okay with that? Can every repo under GPL put up a paywall?

Google: "The GNU General Public License (GNU, GPL, or GPL) is a free software license originally written by Richard Stallman of the Free Software Foundation, which guarantees that users are free to use, share, and modify the software without paying anyone for it."

[–] livingcoder@lemmy.austinwadeheller.com 1 points 1 year ago* (last edited 1 year ago) (2 children)

Within the analogy (as it compares to Redhat and the Rebuilders), how is Foo helping Bar? Isn't Foo simply leaving the TVs outside the factory for people to come and pickup? A bunch of trucks branded "Bar" come by, pick some of them up, rebrand them, and take jobs to install them, jobs that Foo thought they were going to get? Isn't Foo now requiring individual people to walk through a lockable door, sign their name, verify that they don't work for Bar, and grab a TV instead of just leaving them outside in a pile?

[–] livingcoder@lemmy.austinwadeheller.com 2 points 1 year ago (4 children)

I don't see how Company Foo can dictate that all other entities (customers, for example) can receive a free TV on their doorstep (since the code is open source) except for Company Bar. To make it map better to the situation, Company Bar would receive a shipment of free TVs, rebrand them, ship them out to customers, and install them.

"They don't have to give Company Bar TVs to install." So the GPL doesn't require that Company Foo permit free access to the TVs? They could decide to not give out their TVs to anyone?

Also, what if I wanted to get my cousin a free TV but charge him a few bucks to install it? Is this only a problem at scale?

[–] livingcoder@lemmy.austinwadeheller.com 4 points 1 year ago* (last edited 1 year ago) (6 children)

Oh, I see. But what do you think of this translation:

"Company Foo makes TVs and is always working to make them better. They give them out for free with the hopes of making money installing them and providing guidance on how to use them, but someone starts Company Bar and installs them for cheaper and starts taking on installation jobs."

Is this wrong? Isn't this just the definition of an open market? Please let me know if I'm missing some kind of context. I hope that we can continue to discuss this respectfully.

I should say that I want any open source project with the motivation to write good software to have all of the funding they need to make that happen. I just don't see how it can be justified in this instance when compared to any other market.

[–] livingcoder@lemmy.austinwadeheller.com 4 points 1 year ago (13 children)

What's the harm in doing a rebuild? Serious question. I simply don't understand where the harm comes from. I would appreciate any insight. Thanks.

Yeah, looking at these notes, they don't appear particularly useful for my purposes either. It's a challenge to find good, ready-to-use material. Thanks for sharing them, though.

[–] livingcoder@lemmy.austinwadeheller.com 2 points 1 year ago (1 children)

If I wanted to use these notes as direct source material for an open source quiz project, would that be okay? I've been looking for good, free, open source notes, Q&As, and diagrams but it's not easy.

Here's a post on Mastodon that links to their blog where they describe different clients.

https://writing.exchange/@erlend/110616473377954593

I haven't experienced any crashes. I'm just getting annoyed with it resetting the view when I rotate my phone by accident. It takes me back to Local and changes my filter back to default. Painful.

[–] livingcoder@lemmy.austinwadeheller.com 0 points 1 year ago (1 children)

I think we may be talking about two different things with regards to corporate control. I'm saying that, in the case with Redhat specifically, that their injection of a fee to access the source code now no longer makes the code freely available to downstream repositories. If they comically charged a billion dollars to access the source code (with a GPL) it would practically become closed source, so I'm curious why any entity can charge any amount to access open source software. And if it's totally legal with this type of license, doesn't that mean that we should be avoiding GPL at all costs?

[–] livingcoder@lemmy.austinwadeheller.com 1 points 1 year ago (3 children)

Correct me if I'm mistaken. What I read from your post sounds to me like you think that we should accept that a company will inject a revenue stream into the process that we all were working on as an open source project. We weren't expecting to get paid, so why not allow the company to get paid, regardless of the downstream impacts for other projects that once relied on the project being completely free and open. Do I understand that properly? I don't want to misrepresent your intent. I feel like I must be misunderstanding something.

 

I made a 2D platformer randomization crate called Shiftnanigans (https://github.com/AustinHellerRepo/Shiftnanigans) as part of my work on the open source game Jumpy (https://github.com/fishfolk/jumpy). Within the map editor of Jumpy, the Randomize button will randomize the placement of tiles and elements, maintaining the general structures of the map. I've described the two abstract concepts and sets of structs used to accomplish this functionality below. This is just a general overview, but I am happy to elaborate further if anyone has questions about the algorithms and data structures used.

Web demo (click Map Editor -> Open Map -> Level #12 -> Randomize (in the top right)): https://fishfolk.github.io/jumpy/player/latest/

The PixelBoard and PixelBoardRandomizer

In order to randomize a 2D platformer or tile-based map, the PixelBoardRandomizer takes in a grid of "pixels" as a PixelBoard, detects wall and non-wall pixels, groups them together, and finds locations for those groups such that no two groups overlap while also maintaining contact with adjacent walls (or not, as applicable). Wall chunks that do not make contact with the corners are considered "wall segments" and can shift around along the edge of the map. Each randomized PixelBoard can be repeatedly randomized itself without affecting the size or adjacency of pixel groups, allowing repeated execution of the randomization function on a previously randomized PixelBoard. To optimize this process, shifters (described below) are ultimately used to compare pixel group locations to each other, incrementing to the next randomized location for the specific pixel group. All pixel groups are ultimately compared to each other to ensure that they are all valid together in some combination of locations. Instead of placing all of the pixel groups down randomly one at a time just to find out that the last pixel group won't fit (ultimately because the very first pixel group is in a bad spot), each pixel group is paired up with each other pixel group as a cartesian product and is compared together.

The PixelBoard and PixelBoardRandomizer Continued

This is where it gets a little complex. Each pair of pixel groups iterates over all possible locations for those pixel groups in a round robin cycle, allowing each pair of pixel groups an opportunity to check if their current random locations are valid together. As valid pairs of pixel groups are discovered, a hypergraph is filled with connecting edges between hypergraph node's subnodes where each hypergraph node is conceptually a pixel group, a subnode is a location for that pixel group, and the edge indicates that the two locations of each pixel group are valid together. Once a cliché is discovered between all hypergraph nodes, that indicates that each pixel group location connected together within the cliché are all valid together and would form a valid, randomized PixelBoard.

Shifters and Incrementers

Shifters are just 2-dimensional skewed arrays with a pointer to a current cell where navigation through the array is defined by a few basic operations: forward, backward, and increment. The shifter starts with a column pointer in the 0th row's 0th column. You can imagine that an increment moves the current column pointer down the array, a forward action creates a new active column pointer in the next column at the top row of the array, and a backward action removes the current column pointer and makes the previous column pointer active where it left off. If any action is not possible a None is returned, indicating that a backward action must occur so that the previous column can increment once, and then return forward at the top of the column again with a new column pointer, ultimately iterating over all possible combinations of column cells. An incrementer returns a collection of cells. One of the most useful applications is being basically a wrapper on a shifter that returns, with each iteration of the incrementer, a collection of cells (one per column) as a permutation of the underlying shifter as it moves forward and increments, only moving backward with subsequent iterations of the incrementer that would cause the underlying shifter to increment or move backward and then move forward again with each iteration. With these two data structures understood, it is possible to create many interesting variations of shifters and incrementers that "fail fast" while performing some interesting traversal of a state space. For example, the pair of pixel groups iterate over their possible locations in an expanding square sequence/permutation using the ShiftingSquareBreadthFirstSearchShifter. This could be improved upon by implementing a decrement movement on shifters and utilizing that functionality to search in a triangular shape outward instead of a square.

Efficiencies:

  • Shifters make it very easy to find invalid pairs of column cells and fail fast as opposed to generating a long list of column cells just to discover that the first pair are invalid together.
  • Only pairs of pixel groups that could ever conflict or overlap are compared (so one wall isn't paired with another wall, for example).
  • When a new edge is added to the hypergraph, that edge is the starting point for searching for a cliché within the hypergraph.
  • A cliché search is only performed if each hypergraph node's subnode for the new edge is connected to all other hypergraph nodes at least once.

Next steps:

  • Allow for specifying that "wall segments" should not shift around, greatly improving performance but reducing degree of randomness.
  • Create a few examples in the Github repository based on common uses of this functionality
  • Implement a decrement action for shifters, permitting more efficient state space search algorithms.
  • Create trait implementations that more easily convert existing iterators into variations of shifters or incrementers.
 

I want to find or contribute to an open source Android app that behaves as a browser so that I can incorporate saving web pages to a specified (self-hosted) wallabag docker instance. Any suggestions?

view more: next ›