-
19 votes
-
SolarRoof.Cool — A crash course on Tesla's Solarglass roof, Powerwall, and sustainable energy systems, from the perspective of an owner.
26 votes -
Sinkholed
12 votes -
Tracking flight details while in the air
8 votes -
Email authentication: SPF, DKIM and DMARC out in the wild
8 votes -
Book-focused Discord server
Howdy, I think this might appeal to some of you, sorry if it comes off a bit spammy. I've started a Discord server mostly for discussion of books (Other things too...our rule is if it's text-based...
Howdy, I think this might appeal to some of you, sorry if it comes off a bit spammy. I've started a Discord server mostly for discussion of books (Other things too...our rule is if it's text-based or if it's printed on a page, it's allowed. We welcome interactive fiction, comics, poetry, theory, visual novels, etc.) that is aiming to keep discussion at least somewhat serious and a respectful atmosphere similar to what Tildes aims for. Eventually we'll do wider recruitment (posters in universities, probably), but for now we're trying to get a decent server culture going with people we can trust to not shit all over everything. If this sounds appealing, we'd love to have you :)
Paste with rules, should look familiar.
Permanent link for those who would like to join: https://discord.gg/yr4pA96
8 votes -
Minimal TOTP Generator in 20 lines of Python
7 votes -
ZzArt - Abstract Art Evolution - Now Open Source on GitHub!
8 votes -
𝓩𝔃𝓐𝓻𝓽 ~ Abstract Art Evolution (A genetic art tool I just released)
8 votes -
Dissecting A Dweet: Shattered Tunnel - How to make a 3D tunnel in 140 bytes of JavaScript!
8 votes -
Faster ZIP Decompression
8 votes -
A site to randomly stumble on to new and unique webpages - stumblingon
27 votes -
Safeway coupons, automation, and reversing private APIs
9 votes -
I created a Hacker News Clone in Django for the Python community
5 votes -
JS13k Results Are Out! - Small JavaScript games playable in browser + source code
5 votes -
I made a (very, very) basic Tildes scraper and cli browser ruby gem
Here's the ruby gem page and here's the github. Right now it comes with a command line browser that can browse the front page and group pages with no sorting options, and you can view the contents...
Here's the ruby gem page and here's the github. Right now it comes with a command line browser that can browse the front page and group pages with no sorting options, and you can view the contents of a topic (link or text) aswell as the comments. The methods defined in lib/tilde-scraper/api.rb can be used to scrape tildes pages into Group, Page, Topic, and Comment objects.
Right now it's super basic and messy, but I figured if anyone was interested in it it would be the people here.
9 votes -
Bounce Back Postmortem: A Zelda Style Boomerang Game for #JS13k
7 votes -
YouTube's Database "Procella"
5 votes -
Bounce Back ~ My Boomerang Roguelite / Zelda Homage for JS13k
9 votes -
Ember.js, Dr. Carvers Shave Butter, and disappearing products
10 votes -
I made my own thermostat using a Raspberry Pi
14 votes -
I finally open sourced something: Pliant, a flexible blog skeleton
https://gitlab.com/smoores/pliant I’ve been a software developer for about three years, and I’ve always been enticed by and passionate about the open source scene. I have an assortment of projects...
https://gitlab.com/smoores/pliant
I’ve been a software developer for about three years, and I’ve always been enticed by and passionate about the open source scene. I have an assortment of projects variously available on GitHub and GitLab, but this is the first time I’ve ever created an open source project intended to be used by others.
Pliant is a barebones starter kit for anyone wanting to self host their own blog. It came out of my own efforts to start a blog, and it’s what currently powers https://tfhe.shanemoore.me.
I’d love to hear you’re feedback, or just discuss open source, blogging, web technologies, or whatever else comes up.
20 votes -
Dissecting A Dweet: Parallax Mountains (Analyzing a 140 byte JavaScript demo)
3 votes -
Just finished making a 64x64 pixel synthwave game for lowrez jam. (Play in Browser)
9 votes -
Dissecting A Dweet: Breaking Broke
6 votes -
Dissecting a Dweet: Strange Attractor (a tiny 3D Lorenz system in javascript)
9 votes -
Dissecting A Dweet: Ring Weave ~ a 140 byte javascript animation
9 votes -
Dissecting A Dweet: Mini Black Hole
6 votes -
A music Discord server borrowing some principles from Tildes
Hi there, I've started a new public server on Discord for music discussion, recommendations, etc. I've seen a number of these go down in flames or completely lose the appeal for their core...
Hi there, I've started a new public server on Discord for music discussion, recommendations, etc. I've seen a number of these go down in flames or completely lose the appeal for their core audience, so I've borrowed some principles from Tildes, adapted for the somewhat different but related issues this kind of Discord server typically runs into. I thought this may be of interest to some users here, so you're all welcome as long as you play by our rules!
If you'd like to see our rules and goals first, check the paste here. They'll be pretty familiar to anyone here, though they are subject to change depending on our needs. This should go without saying, but to be clear, this server is not officially connected to Tildes, nor is it exclusive to Tildes users. There just might be some overlap in ideas :)
Here's our permanent invite link if you'd like to join: https://discord.gg/kC4sSQq
14 votes -
Dissecting A Dweet ~ Spirograph Design Generator
6 votes -
Dissecting A Dweet ~ Spiral Javascript Quine Explained
12 votes -
Having issues setting goals and sticking with them? I’m working on a solution
I am working on an app called Percent Done that is a combination of goal setting, time tracking and habit tracking. I like setting time-based goals for myself every day, such as “write for an...
I am working on an app called Percent Done that is a combination of goal setting, time tracking and habit tracking.
I like setting time-based goals for myself every day, such as “write for an hour” or “work on Percent Done for four hours.”
I also like Seinfeld’s “don’t break the chain” method. For example, Apple Watch shows you how many days you have completed your exercise circle and tells you that you have been keeping at it for x days.
Percent Done is a marriage of these two concepts. It allows you to set goals and track the time you spend on them, as well as how many days in a row you have consistently completed them. For example, you can add a goal that says “write for an hour every day,” and Percent Done will notify you every day to write for an hour. You will be able to tap on this goal and Percent Done will start counting back from one hour. You will also be able to see how many days in a row you have written for an hour.
You can also add one-time goals to Percent Done with or without time tracking, so it is a task management tool as well.
You can play with the design prototype here: Percent Done design prototype
I would really love to get your feedback on this. If you are interested in being a beta tester, feel free to reply to this topic or e-mail me at "hi at evrim dot io."
By the way, this is almost completely a self-promotion post. If it is against the rules, I'd be happy to remove this.
23 votes -
Apos Chess Variant
7 votes -
Genetic Algorithms
Introduction to Genetic Algorithms Genetic algorithms can be used to solve problems that are difficult, or impossible to solve with traditional algorithms. Much like neural networks, they provide...
Introduction to Genetic Algorithms
Genetic algorithms can be used to solve problems that are difficult, or impossible to solve with traditional algorithms. Much like neural networks, they provide good-enough solution in short amount of time, but rarely find the best one. While they're not as popular as neural networks nor as widely used, they still have their place, as we can use them to solve complicated problems very fast, without expensive training rigs and with no knowledge of math.
Genetic algorithms can be used for variety of tasks, for example for determining the best radio antenna shape, aerodynamic shapes of cars and planes, wind mill shapes, or various queing problems. We'll use it to print "Hello, World!".
How does it work?
Genetic algorithm works in three steps.
- Generate random solutions
- Test how good they are
- Pick the best ones, breed and mutate them, go to step 2
It works just like evolution in nature. First, we generate randomised solutions to our problem (in this case: random strings of letters).
Then, we test each solution and give it points, where better solutions gain more points. In our problem, we would give one point for each correct letter in the string.
Afterwards, we pick the best solutions and breed it together (just combine the strings). It's not bad idea to mutate (or randomize) the string a bit.
We collect the offsprings, and repeat the process until we find good enough solution.
Generate random solutions
First of all, we need to decide in which form we will encode our solutions. In this case, it will be simply string. If we wanted to build race cars, we would encode each solution (each car) as array of numbers, where first number would be size of the first wheel, the second number would be size of the second wheel, etc. If we wanted to build animals that try to find food, fight and survive, we would choose a decision tree (something like this).
So let's start and make few solutions, or entities. One hundred should be enough.
from random import randint goal = "Hello, World!" allowed_characters = list("qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM ,!") def get_random_entity(n, string_length): entities = [] for _ in range(0, n): entity = "" for _ in range(0, string_length): entity += allowed_characters[randint(0, len(allowed_characters)-1)] entities.append(entity) return entities print(get_random_entity(100, 13))
Test how good they are
This is called a "fitness function". Fitness function determines how good a solution is, be it a car (travel distance), animal (food gathered), or a string (number of correct letters).
The most simple function we can use right now will simply count correct letters. If we wanted, we could make something like Levenshtein distance instead.
def get_fitness(entity): points = 0 for i in range(0, len(entity)): if goal[i] == entity[i]: points += 1 return points
Crossover and mutation
Now it's time to select the best ones and throw away the less fortunate entities. Let's order entities by their fitness.
Crossover is a process, when we take two entities (strings) and breed them to create new one. For example, we could just give the offspring one part from one parent and another part from second parent.
There are many ways how to do this, and I encourage you to try multiple approaches when you will be doing something like this.
P: AAAABBB|BCCCC P: DDDDEEE|FGGGG F1: AAAABBB|FGGGG
Or we can just choose at random which letter will go from which parent, which works the best here. After we have the offsprint (
F1
), we should mutate it. What if we were unfortunate, andH
(which we need for ourHello, World!
) was not in any of the 100 entities? So we take the string and for each character of the string, there is a small chance to mutate it - change it at random.F1: ADDDEBEFGCGG F1`: ADHDEBEFGCGG
And it's done. Now kill certain part of old population. I don't know which percentage is best, but I usually kill about 90% of old population. The 90% that we killed will be replaced by new offsprings.
There is just one more thing: which entities do we select for crossover? It isn't bad idea - and it generally works just fine - to just give better entities higher chance to breed.
def get_offspring(first_parent, second_parent, mutation_chance): new_entity = "" for i in range(0, len(first_parent)): if randint(0, 100) < mutation_chance: new_entity += allowed_characters[randint(0, len(allowed_characters)-1)] else: if randint(0, 1) == 0: new_entity += first_parent[i] else: new_entity += second_parent[i] return new_entity
When we add everything together, we get this output:
Generation 1, best score: 2 ::: QxZPjoptHfNgX Generation 2, best score: 3 ::: XeNlTOQuAZjuZ Generation 3, best score: 4 ::: weolTSQuoZjuK Generation 4, best score: 5 ::: weTgnC uobNdJ Generation 5, best score: 6 ::: weTvny uobldb Generation 6, best score: 6 ::: HellSy mYbZdC Generation 7, best score: 7 ::: selOoXBWoAKn! Generation 8, best score: 8 ::: HeTloSoWYZlh! Generation 9, best score: 8 ::: sellpX WobKd! Generation 10, best score: 9 ::: welloq WobSdb Generation 11, best score: 9 ::: selloc WoZjd! Generation 12, best score: 10 ::: wellxX WoVld! Generation 13, best score: 10 ::: welltX World! Generation 14, best score: 10 ::: welltX World! Generation 15, best score: 10 ::: welltX World! Generation 16, best score: 11 ::: zellov Wobld! Generation 17, best score: 11 ::: Hellty World! Generation 18, best score: 11 ::: welloX World! Generation 19, best score: 11 ::: welloX World! Generation 20, best score: 11 ::: welloX World! Generation 21, best score: 12 ::: welloX World! Generation 22, best score: 12 ::: Helloy World! Generation 23, best score: 12 ::: Helloy World! Generation 24, best score: 12 ::: Helloy World! Generation 25, best score: 12 ::: Helloy World! Generation 26, best score: 12 ::: Helloy World! Generation 27, best score: 12 ::: Helloy World! Generation 28, best score: 12 ::: Helloy World! Generation 29, best score: 12 ::: Helloy World! Generation 30, best score: 12 ::: Helloy World! Generation 31, best score: 12 ::: Helloy World! Generation 32, best score: 12 ::: Helloy World! Generation 33, best score: 12 ::: Helloy World! Generation 34, best score: 13 ::: Helloy World! Generation 35, best score: 13 ::: Hello, World!
As we can see, we find pretty good solution very fast, but it takes very long to find perfect solution. The complete code is here.
Maintaining diversity
When we solve difficult problems, it starts to be increasingly important to maintain diversity. When all your entities are basically the same (which happened in this example), it's difficult to find other solutions than those that are almost the same as the currently best one. There might be a much better solution, but we didn't find it, because all solutions that are different to currently best one are discarded. Solving this is the real challenge of genetic algorithms. One of the ideas is to boost diverse solutions in fitness function. So for every solution, we compute distance to the current best solutions and add bonus points for distance from it.
20 votes -
I made a web app to show your recent top twenty-five Spotify tracks
12 votes -
3D Sierpinski Pyramid in 140 Characters of Javascript
10 votes -
MinBytes - A Minimal ByteBeat Album in 1024 Bytes of Javascript
11 votes -
Trio of ByteBeat Tracks - Arranged by me to be played by my tiny 140 character javascript player
4 votes -
I made 7 1k javascript demos in 2 weeks for JS1k! - My Epic Post-Mortem
6 votes -
Announcing my first business card size C++ game: Tiny Ski
14 votes -
Announcing my first business card size C++ game: Tiny Ski
6 votes -
Cleaning your GitHub profile with a simple Bash script
5 votes -
Abandoned
17 votes -
Making a Nintendo Switch frame for a TV
7 votes -
Altered MTG Commander Deck - Elves
11 votes -
[Super Stoney Owny] - A Rap, Hip-hop and Various Genre Playlist
7 votes -
Experiments, growth engineering, and the perils of not disguising your API routes: Part 1
7 votes -
Using Vim to take time-stamped notes
8 votes -
Scams, American Express, and obfuscated Javascript
10 votes -
Crochet moose and bear
12 votes