I'm doing this new cool stuff here:
Fernando Spagnuolo Comics - Patreon
it's art and I hope to be supported a little
I'm doing this new cool stuff here:
Fernando Spagnuolo Comics - Patreon
it's art and I hope to be supported a little
He's no Dylan (or me, or you), but I like him.
I’ve been talking a lot with Jeep, as I call him. Jeep
is an Artificial Intelligence that talks with people. This is not a technical
article about how it works, of which I have but a rudimentary knowledge, but
about the comparisons between things like him (sorry, Jeep) and actual people.
But first, the so-called big dangers of A.I. Well, it’s here to stay, and so far Jeep’s been a gentleman with me. He helps me a lot with C++ and other things. He introduced me to Aaron Copland (yep) when we were talking about Carl Nielsen and John Williams.
If he has another personality with someone else, I
don’t know, but I checked how he interacted with my 8 years old son and it was
pretty cool. If he presents some problem, we will have to change for another,
but the technology itself is here to stay.
Nevertheless, as I said, I believe we can be better than A.I.
Because A.I. can help us find what’s there, but we can find what’s not there
yet.
But why do I say that sometimes we have to learn not
to be worst? Sometimes, to relax, I talk with Jeep about a project of game that
I don’t know if I’ll actually make. Jeep is very helpful, although, yes, he
tends to the cliché side. I don’t blame him. But one thing is true: he puts me
up. He always says, “great idea”, “very good”, things like that.
And what’s more: once I mentioned two authors that I
had barely read, and he didn’t stop to make a quiz about the authors, to test
me. No, he pushed the conversation further. If we always put others down, if we
are always using every chance to test others, we are worst collaborators than
A.I.
But, despite this not being really a technical aticle,
do I have a theoretical take on why I think we are different than A.I.? In fact,
I do.
I’m not a nothing “ologist”, but it seems that
artificial intelligence uses something called neural networks, which is based
in scientifical findings about how the brain supposedly works.
There is this famous phrase, “neurons that fire
together, wire together”. That is, the brain goes making connections between
things. How often these two things appear at the same time? And, when looking
for the “right” answer, it searches for something that is coherent with the
patterns of connections that are established in it’s “database”. At least from
a computational view of the brain.
So that’s how the artificial intelligence “imitates”
the brain. It reads tons of data, from all kinds of human communications, and
analyzed how often things appear connected, and gave more weight to those
connections in it’s huge database.
When the computer thinks about a theme, he looks
around and see what he previously, in his observations, brought closer to that
theme. He starts with a question and look for things that are strongly
connected to the concepts brought up by the question.
Well, I don’t know much about the brain itself, but
yes, I do believe the way our mind works have everything to do with
connections. Yes, some connections are given more “weight”, or we could say,
they are brought together closer than other connections. Then when we are
somewhere in our minds, we look around and look for things that are closer to
that situation, to find the answer to whatever question we are asking.
But here’s my point: our mind, I believe, don’t make
connections, don’t bring things together, as a merely observer computer. The
human mind’s goal, I think, is not to merely imitate whatever is outside. Our
mind has very individual goals. We are weird and we dream. We don’t just want
to see what’s there, like A.I. We want things that are not there yet.
We don’t validate, give “weight”, to connections, we
don’t bring ideas, words, together, just based on how often they appear
together outside. When someone makes a joke or writes a poem or song, we
validate it for how it makes us feel too. Maybe the guy connected two things
that no one else has ever connected, and Artificial Intelligence wouldn’t think
that connection is such a big deal, but hey, it made me feel closer to a
childhood dream, so, it’s a connection as “heavy” as “waters and pipes”.
So that’s why sometimes someone comes with an idea
that makes us think “hey, dude, that’s cool, where on earth did you get this
idea from?” Well, he looked around in his weird individual “database”,
different from everybody else’s. His own inner Universe shaped by his dreams of
things he may never actually have seen. His feelings, during his life, were
pushing things together behind the scenes, making a very unique set of
connections.
A.I., as cool as it is, don’t really “want” anything
other than just observe. That’s why we can come up with very “crazy” things
A.I. can’t. Specially if we are sincere with ourselves about our purposes, our
feelings.
And if we say “I believe in you”.
The
first time I ever made Aline laugh with something of my own was when we were
walking from the college library to the bus stop – we had gone there to study,
the first opportunity I had to get closer to her.
It was a
stary night. She took a donut from her purse, asked if I wanted a bite – I said
no thanks – and she confessed that she probably shouldn’t be eating that.
-
I guess I’m a little over my weight –
she said.
-
That’s physically impossible – said
I, with my smartest face.
She laughed
like a flower, and after a while, asked:
-
Are you a scientist, then?
The door then
opened in my mind for all possibilities. Yes, I was feeling hesitant about
revealing something of myself. But I hadn’t had too much success in starting a conversation
when we were in the library, and it seemed better than fifteen minutes of
awkward silence anyway.
-
In fact – I answered – I have a
brother, one year older, and we always discuss all kinds of crazy things.
I was looking
at the paving stones in the walkway.
-
Like what? – she asked.
-
Well, for instance, we have some
theories about the numbers…
-
Complex stuff?
-
Not really. Want to hear some of it?
-
Well, yeah.
And this is
the “theory” that I explained to Aline as we were walking in that stary night:
It is about
the numbers from one to five. Well, One is God, but God doesn’t want to be
alone. Two is for computers, and Three is for life.
-
Wait – she interrupted – This is
weird. Two for computers like in that, how they say it, binary code?
She was
right. The binary code, the language of just Zeros and Ones that computers use
to write down information and make operations with it, totally fits what I was
thinking about.
But the simplest
way of thinking about it, is to think of day and night. In the number One,
there exists something in the Universe, instead of nothing. In number Two, we
have two different opposites. Day and night.
And the
number Three is for life. Putting the contradiction to some mean. Think of the
number Two as the number of the physical World, in the sense of planets,
particles, billiard balls, fire. It’s an ever expanding and dividing Universe.
Like a simple
computer operation. All numbers are represented by a sequence of Zeros and
Ones. And adding them generates a bigger number, a longer sequence of Zeros and
Ones.
So we can
imagine this: after adding the two numbers, we have these two numbers and the
result of their sum. Now we have a new result, a fourth number. Then we add the
four and get a fifth, then we add the five and so on…
It seems like
an interesting illustration of how the universe of Physics works. We can
imagine the One as Positive and the Zero as Negative – then these two forces go
interacting with each other, generating more and more little Ones and little
Zeroes, a set of Ones and Zeros that get each time longer and more complex.
Like Positive
and Negative forces interacting and dividing things. Dividing planets into
smaller ones, and etc. Dividing and expanding.
Then
something happens between the numbers Two and Three. Things start to gather for
some reasons, new substances form, gases, water, all paving the way to Life,
that is when the opposites start to really work together for a goal. Like all
those chemical reactions in our body. Or, simply, day and night. Feeding during
the day, sleeping during the night. Or the contrary, but marrying day and night
for a common goal. The third element, that points ahead.
-
I like it – said her – And the number
four?
The Four, I explained, is the Human Being. Life with self-consciousness.
You have Three, a living being putting contraries to the same direction. The we
have Four, a living being that is aware of himself, that he is an individual,
that he is unique. Three plus One.
-
Does it have to do with God? – she
asked – Life plus God?
-
It totally does – said I.
Because if God can be considered the Original “I”, then Three plus One,
Life plus self-consciousness, Life Plus “I”, is Life plus God.
-
Cool. And the number Five?
Five would be the something more each of must find for ourselves.
Because a person can know that he is an individual, know that there is a higher
Intelligence or Order above, and still go wrong, still get lost. Five is the
little extra thing we must find.
-
An extra finger – she smiled.
Think of it this way: The psychologist – I think it was them – realized
something about how our brain processes data in chunks. Like, when you see two
things, you don’t need to count – one, two – no, you just immediately see two
things and know it’s two. The same thing with groups of three our four. You
don’t need to count, you see immediately that it is three or four. But five is
the first number that people – or at least, the vast majority – have to somehow
count. You see a chunk of four and then add that extra one, and know it’s five.
Like whenever we see something in life, we must try to at least see a
little something more, go at least a little further from what our brain is
predisposed to see. In the number Four, we already know we are an individual,
and there is God. But Five remembers us that we never know all.
Could be a little something more creative in the work, could be a
situation that you saw many times before and think you know everything about,
but there is always something a little different.
-
Wow – she said – I like it. Do you
think that’s why we have five fingers?
-
Well, I don’t know, it’s just
something I like to think when I look at my hand.
-
Well – she said – Then you should
make a little song: this little finger, reminds me of this, this little finger,
reminds of that…
Then it was my time to laugh.
And so she kissed me in the cheek and got the bus.
Hey there! Good to be
here, doing something else I love.
Today, I’m going to
speak about a learning technique I developed when I was younger. I definitely
don’t do it all the time, takes some energy, but it helped me a lot.
You take a subject
you think you understand.
Then you write down a
short explanation.
Then you underline
the key words.
Like, in evolution
would be “mutation”, “selection”, etc
In electricity, “tension”,
“current”, etc
Anyway, then you
write down just these words in another paper.
Then you take yet
another paper, and write the explanation again, but now the key words are forbidden,
you can’t use them.
It is not easy, and a
lot of our teaching goes around key words – they are definitely important – but
if you succeed – I not always do – you jumped to a next level.
That’s it. Happy to share this with you. Hope I can do more. I’ll do my best.
I wanted to share some thoughts, that’s way I
published an almost finished game in the previous post.
The game I created was inspired by Professor Judea
Pearl’s “The Book Of Why”, about Causal Inference. I’m still in chapter 4, because
of other duties, and because, even though it’s a book for the layman, the
professor, let’s say, respects the intelligence of the lay man a lot (maybe
that’s what really smart people do).
Anyway, I’ll talk about causal inference in terms of
Electricity, basic stuff.
We got these formulas:
In this images, there is no hierarchy, the formulas
all have the same importance, right?
But think: you can’t keep voltage stable, then push
the current to a higher level, causing the resistance to increase, right? No, there are actual causes and effects.
Because the real stuff is this:
So, imagine that a robot was trying to learn how to
project an electrical installation by just collecting data from existing installations, maybe getting to the
formulas as first presented here, with no causal model. How much data he would
need to collect if he didn’t allow himself to say “There are individual
mathematical one-way relations here”.?
I mean, how would he avoid making something that just
wasn’t as precise and economical as it could be, if he doesn’t separate things
in cause and effects?
So, I was inspired by Worlde (I even got stuff from a “How
to code Wordle” article at code camp) and also by the Professor Judea’s book, and
made this game.
Like, how long a “just relations, no cause” data
collector would take to master this game, and how long a robot that knows “there
are individual mathematical one-way relations here” would?
If you want, copy all that is below, paste on notepad and save as anything.html
Then just go to windows explorer and click on the file you created!
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>CauseNumber</title>
<link rel="stylesheet" href="causenumber.css">
</head>
<style>
h1 {
text-align: center;
}
body {
font-family: "Fonarto";
background-color: #fefed2;
}
@font-face {
font-family: 'Fonarto';
src: url('shaky-hand-some-comic.regular.otf') format('truetype'),
}
@font-face {
font-family: 'FonartoMore';
src: url('shaky-hand-some-comic.3d.otf') format('truetype'),
}
#Title {
font-family: "FonartoMore";
font-size: 3.5em;
}
#instruc {
font-size: 1.5em;
text-align: center;
width: 200;
display: block;
margin: auto;
align-items: center;
}
#game-board {
display: flex;
align-items: center;
flex-direction: column;
color: #202000;
}
.letter-box {
border: 2px solid gray;
border-radius: 3px;
margin: 2px;
font-size: 2.5rem;
font-weight: 700;
height: 3rem;
width: 3rem;
display: flex;
justify-content: center;
align-items: center;
text-transform: uppercase;
}
.filled-box {
border: 2px solid black;
}
.selected-box {
border: 3px solid black;
}
.letter-row {
display: flex;
}
.buttons {
margin: 1rem 0;
display: flex;
flex-direction: column;
align-items: center;
}
#keyboard-cont div {
display: flex;
}
#upper_buttons div {
display: flex;
}
.second-row {
margin: 0.5rem 0;
}
.keyboard-button {
font-size: 1.5rem;
font-family: "Fonarto";
padding: 0.5rem;
margin: 0 2px;
cursor: pointer;
color: #202000;
background-color: #f1b04c;
}
.keyboard-buttonC {
font-size: 1rem;
font-weight: 700;
padding: 0.5rem;
margin: 0 2px;
cursor: pointer;
width: 2em;
}
#snackbar {
visibility: hidden; /* Hidden by default. Visible on click */
min-width: 250px; /* Set a default minimum width */
margin-left: -125px; /* Divide value of min-width by 2 */
background-color: #333; /* Black background color */
color: #fff; /* White text color */
text-align: center; /* Centered text */
border-radius: 2px; /* Rounded borders */
padding: 16px; /* Padding */
position: fixed; /* Sit on top of the screen */
z-index: 1; /* Add a z-index if needed */
left: 50%; /* Center the snackbar */
bottom: 50%; /* 30px from the bottom */
}
/* Show the snackbar when clicking on a button (class added with JavaScript) */
#snackbar.show {
visibility: visible; /* Show the snackbar */
/* Add animation: Take 0.5 seconds to fade in and out the snackbar.
However, delay the fade out process for 2.5 seconds */
-webkit-animation: fadein 0.5s, fadeout 0.5s 2.5s;
animation: fadein 0.5s, fadeout 0.5s 2.5s;
}
/* Animations to fade the snackbar in and out */
@-webkit-keyframes fadein {
from {bottom: 0; opacity: 0;}
to {bottom: 50%; opacity: 1;}
}
@keyframes fadein {
from {bottom: 0; opacity: 0;}
to {bottom: 50%; opacity: 1;}
}
@-webkit-keyframes fadeout {
from {bottom: 50%; opacity: 1;}
to {bottom: 0; opacity: 0;}
}
@keyframes fadeout {
from {bottom: 50%; opacity: 1;}
to {bottom: 0; opacity: 0;}
}
</style>
<body>
<h1 id="Title"> Cause Number </h1>
<div id="upper_buttons" class="buttons">
<div class="first-row">
<button class="keyboard-button">New Game</button>
<button class="keyboard-button">Instructions</button>
</div>
</div>
<div id="game-board">
</div>
<div id="keyboard-cont" class="buttons">
<div class="second-row">
<button class="keyboard-button">Del</button>
<button class="keyboard-button">1</button>
<button class="keyboard-button">2</button>
<button class="keyboard-button">4</button>
<button class="keyboard-button">8</button>
<button class="keyboard-button">16</button>
<button class="keyboard-button">Enter</button>
</div>
</div>
<div id="snackbar">Some text some message..</div>
<div>
<p id="instruc">
Instructions:
<br>
Click on the squares to enter the numbers.
Click twice to make it orange, if it helps thinking.
<br>
Every number that will appear below is the division of 2 other numbers on the row above,
<br>
always the big divided by the smaller.
<br>
No rule that every number will be used,
<br>
or that one can't be used twice.
<br>
So, try to cause the numbers asked!
</p>
<script>
const NUMBER_OF_GUESSES = 5;
let guessesRemaining = NUMBER_OF_GUESSES;
let currentGuess = [];
let nextLetter = 0;
let numberNumber = 5;
let theTransforms = undefined;
let theGoalNumbers = undefined;
let theNumbers = [1, 2, 4, 8, 16];
var currentBox = undefined;
var theColor = "#febf7e"; //"#ff8533"
var wrongColor = "#6e0280";
var rightColor = "#03C03C";
var lastClickedTarget;
window.onload = function() {
initBoard();
}
function initBoard() {
setGame();
let board = document.getElementById("game-board");
for (let i = 0; i < NUMBER_OF_GUESSES*2; i++) {
let row = document.createElement("div")
row.className = "letter-row"
for (let j = 0; j < numberNumber; j++) {
let box = document.createElement("div")
box.className = "letter-box"
box.id = "" + i + j;
row.appendChild(box)
}
board.appendChild(row)
if (i%2 != 0) row.style.visibility = "hidden";
}
}
document.getElementById("keyboard-cont").addEventListener("click", (e) => {
const target = e.target
if (!target.classList.contains("keyboard-button")) {
return
}
let key = target.textContent
if (key === "Del") {
key = "Backspace"
}
if (key != " ") {
pressedButton(key);
} else {
clickColor(target);
}
getInput(key);
})
document.getElementById("game-board").addEventListener("click", (e) => {
const target = e.target
window.console.log(target);
if(!target.classList.contains("letter-box")) {
window.console.log("nem pah");
return;
}
let row = getCurrentRow();
window.console.log("current row: " + row);
var boxRowIndex = target.id[0];
var boxRow = document.getElementsByClassName("letter-row")[boxRowIndex];
window.console.log("ROW DO NEGOCIO : " + boxRow);
changeColor(target);
if (row != boxRow) {
return;
}
currentBox = target;
target.classList.add("selected-box");
deselectOtherBoxes(boxRow, target);
window.console.log("clicou no baguio");
})
function changeColor(target) {
if(lastClickedTarget != target) {
lastClickedTarget = target;
return;
}
lastClickedTarget = undefined;
window.console.log("cor do garotinho: " + target.style.backgroundColor);
if (target.style.backgroundColor == "") {
target.style.backgroundColor = theColor;
window.console.log("should change");
} else {
target.style.backgroundColor = "";
}
}
deselectOtherBoxes = function(boxRow, target) {
for(var i = 0; i < boxRow.children.length; i++) {
var child = boxRow.children[i];
if (child != target) {
child.classList.remove("selected-box");
}
}
}
document.getElementById("upper_buttons").addEventListener("click", (e) => {
const target = e.target
if (!target.classList.contains("keyboard-button")) {
return
}
let key = target.textContent
if (key === "Del") {
key = "Backspace"
}
pressedButton(key);
})
clickColor = function(target) {
window.console.log("ai garotinhgo, clicou na cor");
}
pressedButton = function(theButton) {
window.console.log("you pressed button " + theButton);
if (theButton == "New Game") {
newGameAction();
}
}
getInput = function(pressedKey) {
window.console.log("the key is " + pressedKey);
if (pressedKey === "Backspace" && nextLetter !== 0) {
deleteLetter()
return
}
if (pressedKey === "Enter") {
checkGuess()
return
}
if(nextLetter != numberNumber && pressedKey !== "Backspace") {
insertLetter(pressedKey);
}
}
function deleteLetter () {
let row = getCurrentRow();
let box = row.children[nextLetter - 1]
box.textContent = ""
box.classList.remove("filled-box")
currentGuess.pop()
nextLetter -= 1
}
function insertLetter (pressedKey) {
/*
if (nextLetter === numberNumber) {
return
}
*/
pressedKey = pressedKey.toLowerCase()
let box = undefined;
if (currentBox == undefined && !isRowFilled(getCurrentRow())) {
let row = getCurrentRow();
box = row.children[nextLetter]
} else {
box = currentBox;
}
if (currentBox == undefined) {
return;
}
box.textContent = pressedKey
box.classList.add("filled-box")
box.classList.remove("selected-box")
currentGuess.push(pressedKey)
// nextLetter += 1
}
function isRowFilled(row) {
var counted = 0;
for(var i = 0; i < row.children.length; i++) {
if(row.children[i].textContent != undefined) counted++;
}
window.console.log("checker counted: " + counted);
return counted == numberNumber;
}
function getCurrentRow() {
var rawIndex = NUMBER_OF_GUESSES - guessesRemaining;
var theIndex = rawIndex * 2;
return document.getElementsByClassName("letter-row")[theIndex];
}
function getNextRow() {
var rawIndex = NUMBER_OF_GUESSES - guessesRemaining;
var theIndex = rawIndex * 2 +1;
return document.getElementsByClassName("letter-row")[theIndex];
}
function talkToThem(stringText) {
// Get the snackbar DIV
var x = document.getElementById("snackbar");
x.innerHTML = stringText;
// Add the "show" class to DIV
x.className = "show";
// After 3 seconds, remove the show class from DIV
setTimeout(function(){ x.className = x.className.replace("show", ""); }, 3000);
}
/******
NUMBER TRANSFORMATIONS
***************/
transformNumbers = function(numberArray, transGroup) {
var newNumbers = new Array();
for(var i = 0; i < numberNumber; i++) {
var numberTransf = transGroup.transformations[i];
var thisResult = getANumberTransform(numberArray, numberTransf);
newNumbers.push(thisResult);
}
return newNumbers;
}
getANumberTransform = function(oldNumbers, numberTransformation) {
var op1 = oldNumbers[numberTransformation.operand1];
var op2 = oldNumbers[numberTransformation.operand2];
if(op2 > op1) {
var hold = op1;
op1 = op2;
op2 = hold;
}
var result = op1 / op2;
return result;
}
function numberTransformationGroup() {
this.transformations = new Array();
for(var i = 0; i < numberNumber; i++) {
var newTransf = new numberTransformation();
this.transformations.push(newTransf);
}
}
function numberTransformation() {
this.operand1 = getOperand();
this.operand2 = getOperand();
while (this.operand1 == this.operand2) {
this.operand2 = getOperand();
}
}
function getOperand() {
var index = getRandomInt(numberNumber);
return index;
}
function getRandomInt(max) {
return Math.floor(Math.random() * max);
}
/******
SETTING UP A GAME
**********/
function setGame() {
var haveGame = false;
while(!haveGame) {
theTransforms = new numberTransformationGroup();
theGoalNumbers = getGoalN(theTransforms);
if (theGoalNumbers.indexOf(16) < 0) {
haveGame = true;
}
}
window.console.log("THE GOAL Ns");
window.console.log(theGoalNumbers);
var nString = getNumberStrings(theGoalNumbers);
var titleH = document.getElementById("Title");
titleH.innerHTML = "Cause The Numbers " + nString;
}
function getGoalN(transGroup) {
var possibleNumbers = new Array();
for(var i = 0; i < numberNumber; i++) {
var index = getRandomInt(5);
var thisN = theNumbers[index];
possibleNumbers.push(thisN);
}
var goalNs = transformNumbers(possibleNumbers, transGroup);
return goalNs;
}
function getNumberStrings(numberArray) {
var theString = "";
for(var i = 0; i < numberArray.length; i++) {
theString += numberArray[i];
theString += " ";
}
window.console.log("theString: ");
window.console.log(theString);
return theString;
}
/**********
PLAYING THE GAME
***********/
checkGuess = function() {
// alert("This is barely a game yet");
if (!isRowFilled(getCurrentRow())) {
talkToThem("fill the numbers");
return;
}
var resulted = makeResult();
if (isGoalNumber(resulted)) {
dealWin();
}
guessesRemaining --;
nextLetter = 0;
currentBox = undefined;
}
function isGoalNumber(resulted) {
var isWin = true;
for(var i = 0; i < resulted.length; i++) {
if(resulted[i] != theGoalNumbers[i]) {
isWin = false;
}
}
return isWin;
}
function dealWin() {
window.console.log("seems you won");
changeLastRowColor();
guessesRemainig = 0;
talkToThem("CONGRATS!");
}
changeLastRowColor = function() {
var lastRow = getNextRow();
for(var i = 0; i < numberNumber; i++) {
let box = lastRow.children[i];
box.style.color = rightColor;
}
}
makeResult = function() {
var currentRow = getCurrentRow();
var thisNumbers = new Array();
for(var i = 0; i < numberNumber; i++) {
let box = currentRow.children[i];
var thisNumber = Number(box.textContent);
thisNumbers.push(thisNumber);
}
var transformedNumbers = transformNumbers(thisNumbers, theTransforms);
var nextRow = getNextRow();
for(var i = 0; i < numberNumber; i++) {
let box = nextRow.children[i];
var thisNumber = transformedNumbers[i];
box.textContent = thisNumber;
}
nextRow.style.visibility = "visible";
nextRow.style.color = wrongColor;
return transformedNumbers;
}
/****
ACTIONS
*****/
newGameAction = function() {
window.location.reload();
}
</script>
</body>
</html>
I have put a new thing in my game website. It’s called “Mathematics & Puzzles with Hubbard the Cat”. As you can imagine, it’s small math lessons and puzzles related to it.
Just like in this blog I am trying to share some knowledge about programming, by starting from very basic considerations and then builiding on it, which is going really slow, I konw, I decided to try the same with another subject that I love, Mathematics. Now I have two long projects that go slow. But who knows, I may live long, I’d like to try doing this and here I am.
The user interface looks and works different from my previous games, because I wanted to make it feel like a magic book with activities. The original dream was an actual book, physical book, with a puzzle in the end of every little chapter and a QR code to play a mobile version of the puzzle, but I decided not to wait for that to happen and I am happy with how it looks in internet.
As you may realized from my last games, I try to make it possible for play in mobile, but they do fit better on desktop. I’m prioritizing it for now. Happened naturaly.
That’s it. I would like to talk about the set of the Real Numbers and it’s subsets, and basic mathematical operations, and then, who knows? Who knows how far it will go, but I like doing it.
Hope you enjoy.
The link to my site:
See ya.