💾 Archived View for siiky.srht.site › atom.xml captured on 2023-11-14 at 08:03:12.
⬅️ Previous capture (2023-11-04)
-=-=-=-=-=-=-
<?xml version="1.0" encoding="utf-8"?> <feed xmlns="http://www.w3.org/2005/Atom"> <author> <name>siiky</name> <email>~siiky/public@lists.sr.ht</email> </author> <generator uri="https://github.com/ursetto/atom-egg" version="0.1.5">atom egg for Chicken</generator> <id>gemini://siiky.srht.site/atom.xml</id> <link href="https://siiky.srht.site/atom.xml" rel="self" type="application/atom+xml" hreflang="en" title="nothing interesting here" /> <title type="text">nothing interesting here</title> <updated>2020-05-26T00:00:00Z</updated> <entry> <content type="html"><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"><html lang="en" xml:lang="en"><head><meta charset="utf-8"></meta></head><body><h1>just quotes</h1><p>siiky<br></br>2020/05/26<br></br>2023/11/10<br></br>en</p><h2>2023-11-10</h2><blockquote>Not to go where one can go would be subversive. It would unmask as folly the assumption that every satisfied demand entails the discovery of an even greater unsatisfied one. Such insight would stop progress.</blockquote><p>Ivan Illich</p><ul><li><a href="https://archive.org/details/DeschoolingSociety/">https://archive.org/details/DeschoolingSociety/</a></li><li><a href="https://portal.mozz.us/gemini/thrig.me/blog/2023/11/09/more-on-education.gmi">https://portal.mozz.us/gemini/thrig.me/blog/2023/11/09/more-on-education.gmi</a></li><li><a href="../reclog.html">../reclog.html</a></li></ul><h2>2023-10-27</h2><blockquote>We&#39;re all going to die, all of us, what a circus! That alone should make us love each other but it doesn&#39;t. We are terrorized and flattened by trivialities, we are eaten up by nothing.</blockquote><blockquote>The further away I am from the human race, the better I feel. Even though I write about the human race, the further away I am from them, the better I feel. Two inches is great, two miles is great. 2000 miles is beautiful. As long as I&#39;m able to eat. They feed me because I feed them. But I don&#39;t like to be near them. When somebody even brushes against me with an elbow, in a crowd, I react. I do not like the human race. I don&#39;t like their heads. I don&#39;t like their faces. I don&#39;t like their feet. I don&#39;t like their conversations. I don&#39;t like their hairdos. I don&#39;t like their automobiles. I don&#39;t like their dogs or their cats or their roses.</blockquote><p>Charles Bukowski</p><h2>2023-09-13</h2><blockquote>While some desert areas are lifeless, in most communities of animals, birds, insects, bacteria and plants run, fly, crawl, spread and grow in lives unordered, undomesticated by civilisation. Wildness is in us and all around us. The battle to contain and control it is the constant labour of civilisation. When that battle is lost and the fields are deserted, wildness persists.</blockquote><p>From &quot;Desert&quot;.</p><ul><li><a href="../wiki/book.anonymous.desert.html">../wiki/book.anonymous.desert.html</a></li></ul><h2>2023-09-06</h2><blockquote>Oh, my good friend, how feeble is the imagination of men. They always think that people commit suicide for a reason. But one can very well commit suicide for two reasons.</blockquote><p>From &quot;The Fall&quot;, by Albert Camus.</p><ul><li><a href="../wiki/book.albert_camus.fall.html">../wiki/book.albert_camus.fall.html</a></li></ul><h2>2023-08-31</h2><blockquote>Oh, gentlemen, do you know, perhaps I consider myself an intelligent man, only because all my life I have been able neither to begin nor to finish anything.</blockquote><blockquote>You see, you gentlemen have, to the best of my knowledge, taken your whole register of human advantages from the averages of statistical figures and politico-economical formulas. Your advantages are prosperity, wealth, freedom, peace—and so on, and so on. So that the man who should, for instance, go openly and knowingly in opposition to all that list would to your thinking, and indeed mine, too, of course, be an obscurantist or an absolute madman: would not he?</blockquote><blockquote>While if you stick to consciousness, even though the same result is attained, you can at least flog yourself at times, and that will, at any rate, liven you up. Reactionary as it is, corporal punishment is better than nothing.</blockquote><blockquote>Come, try, give any one of us, for instance, a little more independence, untie our hands, widen the spheres of our activity, relax the control and we… yes, I assure you… we should be begging to be under control again at once.</blockquote><p>From &quot;Notes from Underground&quot;, by Fyodor Dostoevsky.</p><ul><li><a href="../wiki/book.fyodor_dostoyevsky.notes_from_underground.html">../wiki/book.fyodor_dostoyevsky.notes_from_underground.html</a></li></ul><h2>2023-05-10</h2><blockquote>We know that the train carries all loads, so after getting on it why should we carry our small luggage on our head to our discomfort, instead of putting it down in the train and feeling at ease?</blockquote><blockquote>Under the tree the shade is pleasant; out in the open the heat is scorching. A person who has been going about in the sun feels cool when he reaches the shade. Someone who keeps on going from the shade into the sun and then back into the shade is a fool. A wise man stays permanently in the shade.</blockquote><p>From &quot;Who Am I?&quot;, questions 18 and 24, respectively.</p><ul><li><a href="../wiki/book.bhagavan_sri_ramana_maharshi.who_am_i.html">../wiki/book.bhagavan_sri_ramana_maharshi.who_am_i.html</a></li></ul><h2>2023-02-01</h2><blockquote>Floki:<br></br> This is your fault, Ragnar.<br></br> Torstein has died fighting for a hill he did not want to own. For something which meant nothing to him. He has died a pointless death.<br></br> How many more of us must die for your Christians? Or have you, in your heart, already renounced our gods and turned to the Christ God? Is that what your friend Athelstan has persuaded you to do?</blockquote><blockquote>Ragnar:<br></br> [funny face: wtf are you talking about?]<br></br><br></br>Floki:<br></br> But look. Here we are. Under an English sky. Burying our dead. Those we have sacrificed for Jesus Christ.<br></br><br></br>Ragnar:<br></br> We&#39;re all fated to die on a certain day, yes? But it is our own choice to do as we please until that day comes.<br></br> I did not force Torstein, or any of you, to come, for that matter. You all chose to be here.<br></br> My heart is as heavy for Torstein as anyone&#39;s, but I am sure that I will bump into him again soon.<br></br> And in the meantime, Floki, shut your face.</blockquote><p>Floki and Ragnar, from Vikings S03E03.</p><p>After Ragnar was finished talking Floki looked convinced and trust restored.</p><ul><li><a href="https://en.wikipedia.org/wiki/Vikings_(TV_series)">Wikipedia</a></li><li><a href="https://www.imdb.com/title/tt2306299">IMDb</a></li></ul><h2>2021-12-27</h2><blockquote>If one desires to be happy, sir, one must never understand duty; for, as soon as one has comprehended it, it is implacable.</blockquote><p>Jean Valjean to Marius Pontmercy, from Les Misérables, by Victor Hugo</p><ul><li><a href="https://en.wikipedia.org/wiki/Les_Misérables">Wikipedia</a></li><li><a href="https://standardebooks.org/ebooks/victor-hugo/les-miserables/isabel-f-hapgood">Standard Ebooks</a></li><li><a href="../wiki/books.html">Books list</a></li></ul><h2>2021-06-08</h2><blockquote>6.371: At the basis of the whole modern view of the world lies the illusion that the so-called laws of nature are the explanations of natural phenomena.</blockquote><p>From Tractatus Logico-Philosophicus, by Ludwig Wittgenstein</p><ul><li><a href="https://en.wikipedia.org/wiki/Tractatus_Logico-Philosophicus">Wikipedia</a></li><li><a href="https://standardebooks.org/ebooks/ludwig-wittgenstein/tractatus-logico-philosophicus/c-k-ogden">Standard Ebooks</a></li><li><a href="../wiki/books.html">Books list</a></li></ul><h2>2021-04-08</h2><blockquote>God&#39;s power we allow is infinite: But neither man nor any other animal are happy: Therefore he does not will their happiness. His wisdom is infinite: He is never mistaken in choosing the means to any end: But the course of nature tends not to human or animal felicity: Therefore it is not established for that purpose. Through the whole compass of human knowledge, there are no inferences more certain and infallible than these. In what respect, then, do his benevolence and mercy resemble the benevolence and mercy of men?</blockquote><p>From Dialogues Concerning Natural Religion, by David Hume</p><ul><li><a href="https://en.wikipedia.org/wiki/Problem_of_evil#Atheistic_viewpoint">Wikipedia</a></li></ul><h2>2020-11-20</h2><blockquote>The creatures outside looked from pig to man, and from man to pig, and from pig to man again; but already it was impossible to say which was which.</blockquote><p>From Animal Farm, by George Orwell</p><ul><li><a href="https://en.wikipedia.org/wiki/Animal_Farm">Wikipedia</a></li><li><a href="https://gutenberg.net.au/plusfifty-n-z.html#orwell">Project Gutenberg Australia</a></li><li><a href="../wiki/books.html">Books list</a></li></ul><h2>2020-09-02</h2><p>This one is somewhat longer, and it&#39;s not someone&#39;s or some character&#39;s quote,<br></br>but it&#39;s a good paragraph from a good book.</p><blockquote>&quot;A New Theory of Biology&quot; was the title of the paper which Mustapha Mond had just finished reading. He sat for some time, meditatively frowning, then picked up his pen and wrote across the title-page. &quot;The author&#39;s mathematical treatment of the conception of purpose is novel and highly ingenious, but heretical and, so far as the present social order is concerned, dangerous and potentially subversive. _Not to be published_.&quot; He underlined the words. &quot;The author will be kept under supervision. His transference to the Marine Biological Station of St Helena may become necessary.&quot; A pity, he thought, as he signed his name. It was a masterly piece of work. But once you began admitting explanations in terms of purpose -- well, you didn&#39;t know what the result might be. It was the sort of idea that might easily recondition the more unsettled minds among the higher castes -- make them lose their faith in happiness as the Sovereign Good and take to believing, instead, that the goal was somewhere beyond, somewhere outside of the present human sphere; that the purpose of life was not the maintenance of well-being, but some intensification and refining of consciousness, some enlargement of knowledge. Which was, the Controller reflected, quite possibly true. But not, in the present circumstances, admissible. He picked up his pen again, and under the words _&quot;Not to be published&quot;_ drew a second line, thicker and blacker than the first; then sighed. &quot;What fun it would be,&quot; he thought, &quot;if one didn&#39;t have to think about happiness!&quot;</blockquote><p>From Brave New World, by Aldous Huxley</p><ul><li><a href="https://en.wikipedia.org/wiki/Brave_New_World">Wikipedia</a></li><li><a href="../wiki/books.html">Books list</a></li></ul><h2>2020-08-25</h2><blockquote>It&#39;s the triumph of superior reason to live with folks who don&#39;t have any.</blockquote><p>Socrates, from Socrates, by Voltaire</p><ul><li><a href="https://portal.mozz.us/gemini/gemi.dev/cgi-bin/wp.cgi/view?Socrates+(Voltaire)">Wikipedia</a></li><li><a href="https://www.gutenberg.org/ebooks/4683">Project Gutenberg</a></li><li><a href="../wiki/books.html">Books list</a></li></ul><h2>2020-08-24</h2><blockquote>Lenina shook her head. &quot;Was and will make me ill,&quot; she quoted, &quot;I take a gramme and only am.&quot;</blockquote><p>Lenina, from Brave New World, by Aldous Huxley</p><ul><li><a href="https://en.wikipedia.org/wiki/Brave_New_World">Wikipedia</a></li><li><a href="../wiki/books.html">Books list</a></li></ul><h2>2020-06-13</h2><blockquote>He who knows best best knows how little he knows.</blockquote><p>Thomas Jefferson</p><h2>2020-06-12</h2><blockquote>Everyone you will ever meet knows something you don&#39;t.</blockquote><p>Bill Nye</p><h2>2020-06-11</h2><p>My transcription, possibly wrong:</p><blockquote>おい、君は先、羊飼いの犬だと言ったな。犬でいいじゃないか。いい犬は羊を豊な牧草地へ導くことで、羊から多いに感謝されることもあるさ。</blockquote><p>影山、梶に、人間の條件 から</p><p>The subtitle&#39;s translation:</p><blockquote>Listen. So you think you&#39;d just be a shepherd&#39;s dog. What&#39;s wrong with that? A good dog can lead the sheep to greener pastures and earn their gratitude.</blockquote><p>Kageyama, to Kaji, from The Human Condition: No Greater Love</p><ul><li><a href="https://ja.wikipedia.org/wiki/人間の條件_(映画)">Wikipedia (JP)</a></li><li><a href="https://en.wikipedia.org/wiki/The_Human_Condition_(film_series)">Wikipedia (EN)</a></li><li><a href="https://www.imdb.com/title/tt0053114">IMDb</a></li></ul></body></html></content> <id>gemini://siiky.srht.site/words/quotes.gmi</id> <published>2023-11-10T00:00:00Z</published> <title type="text">just quotes</title> <updated>2020-05-26T00:00:00Z</updated> <link href="https://siiky.srht.site/words/quotes.html" rel="alternate" type="text/html" hreflang="en" title="just quotes" /> <link href="gemini://siiky.srht.site/words/quotes.gmi" rel="alternate" type="text/gemtext" hreflang="en" title="just quotes" /> </entry> <entry> <content type="html"><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"><html lang="en" xml:lang="en"><head><meta charset="utf-8"></meta></head><body><h1>A short tribute to Peergos and its maintainer</h1><p>siiky<br></br>2023/11/09<br></br>2023/11/09<br></br>en</p><p>If you haven&#39;t heard of Peergos yet, it can be described very briefly as a Google Drive/Dropbox/etc alternative: an online place to save your shit. Nowadays it already does a little bit more than that (e.g. file viewing/editing and a calendar). What sets it apart is that it&#39;s decentralized, offline-friendly, and you can self-host. Currently, the users&#39; DB (called PKI) is the one component that is managed centrally. Not quite as bad as it may sound: actually, the only operation that necessarily goes through the main instance (as of now) is creating an account[^0], to ensure unique usernames (and possibly changing passwords). And the PKI is replicated to all instances, so after creating an account you&#39;re completely independent of the main instance (unless it&#39;s your &quot;home instance&quot;, of course), as you can login through any instance (I don&#39;t know if there are plans to decentralize this). This also means that, when you self-host, you don&#39;t need to open your instance to the public internet.</p><p>Additionally, it&#39;s cryptographically impossible for anyone without your credentials to access your shit. On the one hand, no node has access to uncrypted content, everything is encrypted/decrypted on your browser. On the other, not even encrypted content is freely shared between nodes -- to request a certain piece of content (a block), a node needs a sort of &quot;proof of ownership&quot; of that block, which can only be generated from the login credentials.</p><ul><li><a href="https://peergos.org">Website</a></li><li><a href="https://peergos.net">Main instance</a></li><li><a href="https://github.com/peergos/peergos">Git repository (GitHub)</a></li><li><a href="https://peergos.org/security">https://peergos.org/security</a></li><li><a href="https://peergos.org/features">https://peergos.org/features</a></li><li><a href="https://peergos.org/pricing">https://peergos.org/pricing</a></li></ul><p>What do I mean by &quot;offline-friendly&quot;? If you use GDive/Dropbox/etc, when the internet connection goes down, the &quot;service&quot; goes down as well (for you). Not with Peergos. It&#39;s very simply architected: your &quot;home instance&quot; stores all your shit, that&#39;s exactly the same. However, content is cached in your browser so that, as long as you have a connection to an instance, you can access it. That by itself isn&#39;t so impressive or useful -- you&#39;re more likely to go offline than the instance. But because you can run an instance on localhost, you have basically an offline-first experience. Even better: you can set it up to mirror all your content from your home instance, thereby untying yourself from the browser&#39;s cache. Everything always available offline.</p><p>Under the hood, Peergos is built on top of IPFS, using its own network, not the public one. For at least two reasons: (1) you don&#39;t want private content, even if encrypted, floating around a public network where anyone can freely get their hands on what they will; (2) the &quot;proof of ownership&quot; feature I mentioned before is a Peergos extension, not supported and not compatible you upstream IPFS.</p><ul><li><a href="https://peergos.org/posts/bats">Release the BATs (block level access control in IPFS)</a></li></ul><p>One last cool feature: you can set a directory of yours to be published as a website at username.peergos.me, which can be accessed through the internet, or through a localhost instance without the need for DNS.</p><p>And now, a small homage to the main maintainer of this awesome project, Ian Preston. Without any shadow of a doubt, he is one of the (if not THE) most responsive, helpful, and attentive maintainers of ANY project I know! If you have any trouble getting Peergos to work for you, jump on #peergos-chat:matrix.org and he&#39;ll be sure to get you up on your feet!</p><p>[^0]: Yes, it&#39;s not good, I know that in the wrong hands it can act as a gatekeeper. In theory you can run your own Peergos network, using a central PKI server you trust. That comes with its own downsides, such as, not being able to log in through instances of the other networks.</p></body></html></content> <id>gemini://siiky.srht.site/kB45oC/peergos.gmi</id> <published>2023-11-09T00:00:00Z</published> <title type="text">A short tribute to Peergos and its maintainer</title> <updated>2023-11-09T00:00:00Z</updated> <link href="https://siiky.srht.site/kB45oC/peergos.html" rel="alternate" type="text/html" hreflang="en" title="A short tribute to Peergos and its maintainer" /> <link href="gemini://siiky.srht.site/kB45oC/peergos.gmi" rel="alternate" type="text/gemtext" hreflang="en" title="A short tribute to Peergos and its maintainer" /> </entry> <entry> <content type="html"><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"><html lang="en" xml:lang="en"><head><meta charset="utf-8"></meta></head><body><h1>Moments of light</h1><p>siiky<br></br>2023/11/03<br></br>2023/11/03<br></br>en</p><ul><li><a href="https://www.linkedin.com/posts/shabsey-gartner-24b292247_israel-is-experiencing-a-metamorphosis-ugcPost-7124849300114735105-WMju">https://www.linkedin.com/posts/shabsey-gartner-24b292247_israel-is-experiencing-a-metamorphosis-ugcPost-7124849300114735105-WMju</a></li></ul><blockquote>Israel is experiencing a metamorphosis!<br></br><br></br>Just a moment ago, Israeli TV anchor from Channel 14, Sharon Gal, asks a guest to borrow his kippah in order to recite a blessing to thank G-d for freeing a soldier that was held hostage in Gaza.<br></br><br></br>A few months ago, Israel was on the verge of a civil war, revolving around the religious identity of Israel (or the lack thereof).<br></br><br></br>Now, after 3 weeks of existential awakening, we’re seeing non-religious Jews all over Israel connect to their Jewish roots in the most profound and inspiring of ways.<br></br><br></br>Darkness creates space for beautiful moments of light!</blockquote><p>I don&#39;t see any moment of light. It could be explained, for example, by the fact that non-religious jews are still of a jewish family, and are, therefore, naturally against the &quot;bad side&quot; of the conflict. It could be because they&#39;ve been indoctrinated against the Palestinians. Or it could be something else, I&#39;m not very creative.</p><p>But in either of these, of the &quot;non-religious Jews all over Israel connect[ing] to their Jewish roots&quot;, I don&#39;t see how religion is without a doubt concerned, even when religious acts/signs/customs are shown. It&#39;s not unlikely to be just a sort of nationalism. They&#39;ve grown up in this context, they know the customs, the culture. It&#39;s second-nature to act according to them.</p><p>I should know, I was raised as a catholic. Though I want nothing to do with it now, during Easter I kiss Jesus&#39; feet. For my grandmas. I don&#39;t become religious for those brief 5 minutes of the year the cross comes inside. I avoid false religious signs, and try also to avoid going to church as as much as possible, but for serious events, I&#39;m there. I don&#39;t cross, I don&#39;t kneel, or anything else. But I behave, I know how to behave. Not out of my religious beliefs, but out of respect for my family (who, let&#39;s be fair, are also already largely &quot;because I was raised this way&quot;).</p><p>So if I was in their shoes, I would also naturally side with the &quot;good side&quot;, my family and friends. Not because I&#39;m against the &quot;bad side&quot;, but because the &quot;good side&quot; is closer to me, that&#39;s all.</p><p>I&#39;m not into the whole loop of the current conflict, but from the little history I&#39;ve learned from a couple of years ago (while working for an Israeli company), Israelis could stop pretending to be exclusively the victim.</p><p>The sad thing is, in the middle of the ongoing show, quem se fode é o zé-povinho[^1].</p><ul><li><a href="https://en.wikipedia.org/wiki/Zé_Povinho">https://en.wikipedia.org/wiki/Zé_Povinho</a></li></ul><p>[^1]: lit. &quot;who gets fucked is the pleb&quot;</p></body></html></content> <id>gemini://siiky.srht.site/philosophy/moments-of-light.gmi</id> <published>2023-11-03T00:00:00Z</published> <title type="text">Moments of light</title> <updated>2023-11-03T00:00:00Z</updated> <link href="https://siiky.srht.site/philosophy/moments-of-light.html" rel="alternate" type="text/html" hreflang="en" title="Moments of light" /> <link href="gemini://siiky.srht.site/philosophy/moments-of-light.gmi" rel="alternate" type="text/gemtext" hreflang="en" title="Moments of light" /> </entry> <entry> <content type="html"><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"><html lang="en" xml:lang="en"><head><meta charset="utf-8"></meta></head><body><h1>What is music? May be subjective</h1><p>siiky<br></br>2023/09/27<br></br>2023/09/27<br></br>en</p><p>Andrew Kania states a subjective approach to defining music leads to counterintuitive results. As an example, he says that if I&#39;m listening to a radio and I deem that the sounds it is playing are music, then they are music. However, if there&#39;s noone listening to the sounds the radio is playing, they cease to be music. This is indeed counterintuitive. But why do they cease to be music?</p><p>It may be that music is so as long as anyone would consider it to be so, whether they listen to it or not (even whether they ever existed, or no longer exist). From this perspective, the difficulty, I expect, would be greater at disproving that something is music, than at determining that it is music.</p><p>To me this seems analogous to other kinds of knowledge: if I heard somebody speak Kurdish on the street, I wouldn&#39;t recognize it as such (I don&#39;t know Kurdish, and don&#39;t have a &quot;good idea&quot; of what Kurdish is); but I would know it isn&#39;t English, Portuguese, Spanish, Japanese, German, Italian, French, ... and a few other languages I have SOME idea of. Nonetheless, the spoken words are still Kurdish -- its essence is not dependent on me, though it is on those who speak and understand it.</p><p>Another example Kania provides is that the Mona Lisa doesn&#39;t cease to be the Mona Lisa if I decide it&#39;s not the Mona Lisa -- a certain piece of music doesn&#39;t cease to be music just because I don&#39;t recognize it as music. Whether it is music or not to me, if somebody recognizes it as music, then it is music. And, on the other hand, something being music (i.e. somebody recognizing it as music) doesn&#39;t force me to recognize it as music!</p><p>Jerrold Levinson on his turn, believes that an individual chord played ephemerally quickly by itself, should not be considered music due to the short time interval. Ignoring for now the subjective definition above, and analyzing instead according to some criteria, methinks it&#39;s music. One of Levinson&#39;s criteria is that music is &quot;organized in time&quot;. Since time is not discrete, and sound would be inaudible if it occured through an empty interval of time, then it is trivially organized in time. Another one of the criteria is that it must have &quot;motion&quot;. At first hearing, a constant sound played through any interval of time seems motionless indeed, without going into technicalities.</p><p>Notwithstanding, I would probably consider it music. Going into technicalities, it seems obvious to me that there&#39;s motion: consider the starting and stopping of the sound -- it&#39;s not constant, it doesn&#39;t &quot;become&quot; or cease from one instant to the next. If not for that, consider the sound waves (feeble, this one, I know). And who&#39;s to say a certain sound is not actually a sequence of several even shorter sounds, such that we cannot tell them apart, nor the boundaries between them? Then they wouldn&#39;t even be individual.</p><ul><li><a href="../wiki/book.vitor_guerreiro.filosofia_da_musica.html">../wiki/book.vitor_guerreiro.filosofia_da_musica.html</a></li></ul></body></html></content> <id>gemini://siiky.srht.site/music/what_is_music-may_be_subjective.gmi</id> <published>2023-09-27T00:00:00Z</published> <title type="text">What is music? May be subjective</title> <updated>2023-09-27T00:00:00Z</updated> <link href="https://siiky.srht.site/music/what_is_music-may_be_subjective.html" rel="alternate" type="text/html" hreflang="en" title="What is music? May be subjective" /> <link href="gemini://siiky.srht.site/music/what_is_music-may_be_subjective.gmi" rel="alternate" type="text/gemtext" hreflang="en" title="What is music? May be subjective" /> </entry> <entry> <content type="html"><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"><html lang="en" xml:lang="en"><head><meta charset="utf-8"></meta></head><body><h1>Petri Nets Log #007</h1><p>siiky<br></br>2023/09/20<br></br>2023/09/20<br></br>en</p><p>As I&#39;ve mentioned on my tinylog, my master&#39;s thesis will revolve around Petri nets. More specifically, about the practical application of Petri nets, not only to model but to program concurrent/distributed programs. That&#39;s an area that doesn&#39;t seem to be as well explored as modeling with, and formal verification of, Petri nets -- formalists tend to work only in theory, never in practice[*].</p><ul><li><a href="../tinylog.html">§ 2023-09-11 17:50 +0100</a></li></ul><p>The things I&#39;d been reading before, especially Statebox, were very promising (theory-wise and intent-wise), but in practice they never got to anything people can get their hands dirty with. Statebox specifically seem to have abandoned the programming idea completely (very unfortunate), and turned to a documentation-oriented product (not yet out), as I&#39;ve mentioned in log #005. The fact that they never replied was also very disappointing... :/</p><ul><li><a href="../wiki/petri_nets.html">../wiki/petri_nets.html</a></li><li><a href="log005.html">log005.html</a></li><li><a href="log006.html">log006.html</a></li></ul><p>Some time ago I found gen_pnet, an Erlang library that defines a Petri net behaviour. I didn&#39;t understand the point at first, it seemed like a waste not to take advantage of Erlang&#39;s parallel computation abilities. Until I watched a related talk: the net is used to define the behaviour of each process, but they still communicate as normal Erlang processes through message passing! From there I found the related whitepaper, and then &quot;Understanding Petri Nets&quot;, by Wolfgang Reisig -- I&#39;m reading this now.</p><ul><li><a href="../wiki/v.jorgen_brandt.services_as_petri_nets.html">../wiki/v.jorgen_brandt.services_as_petri_nets.html</a></li><li><a href="../wiki/wp.jorgen_brandt.modeling_erlang_processes_petri_nets.html">../wiki/wp.jorgen_brandt.modeling_erlang_processes_petri_nets.html</a></li><li><a href="../wiki/book.wolfgang_reisig.understanding_petri_nets.html">../wiki/book.wolfgang_reisig.understanding_petri_nets.html</a></li></ul><p>&quot;Understanding Petri Nets&quot; is more pragmatic so far, there&#39;s less focus on the formal theory and more on getting shit done (modeling). Some of the questions I had sent to Statebox were kind of irrelevant (depending on how you implement/use Petri nets); others, after having started reading this book, seem like they didn&#39;t think about them at all. Or if they did, they didn&#39;t get to formalize mathematically (understandable, it&#39;s pretty fucking hard). Still, would have been useful to mention these details as future work.</p><p>Still haven&#39;t learned of any implementation other than gen_pnet, which limits experimentation. But before that, I&#39;d like to have a light process/pipeline to generate Petri net graphics based on a simple textual language, so that I can model and visualize more easily (drawing by hand is fine, but editing not so much). I hacked something together using GraphViz, but without any customizations the results are really fugly -- take a look at log #003 (the end result is the same, I just created a new &quot;front-end&quot;). After some searching I learned there&#39;s a Petri nets library for (in?) TikZ, that&#39;ll be my next attempt. To be clear, LaTeX is NOT a simple textual language! I&#39;ll first play with it to learn how it&#39;s used, and if it works well I&#39;ll create another Scheme DSL for it.</p><ul><li><a href="https://git.sr.ht/~siiky/experiments/tree/main/item/gvs-petri-nets">https://git.sr.ht/~siiky/experiments/tree/main/item/gvs-petri-nets</a></li><li><a href="../wiki/petri_nets.html">§ How to draw Petri nets?</a></li><li><a href="../wiki/pl.chicken.html">../wiki/pl.chicken.html</a></li></ul><p>[*]: Speaking as a Formal Methods major myself: If formal methods (i.e. theory) are not easy to use, or not usable at all, then they&#39;re basically useless.</p><ul><li><a href="index.html">index.html</a></li></ul></body></html></content> <id>gemini://siiky.srht.site/petri_nets/log007.gmi</id> <published>2023-09-20T00:00:00Z</published> <title type="text">Petri Nets Log #007</title> <updated>2023-09-20T00:00:00Z</updated> <link href="https://siiky.srht.site/petri_nets/log007.html" rel="alternate" type="text/html" hreflang="en" title="Petri Nets Log #007" /> <link href="gemini://siiky.srht.site/petri_nets/log007.gmi" rel="alternate" type="text/gemtext" hreflang="en" title="Petri Nets Log #007" /> </entry> <entry> <content type="html"><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"><html lang="en" xml:lang="en"><head><meta charset="utf-8"></meta></head><body><h1>RE: Human Rights</h1><p>siiky<br></br>2023/09/14<br></br>2023/09/14<br></br>en</p><ul><li><a href="https://portal.mozz.us/gemini/idiomdrottning.org/human-rights">https://portal.mozz.us/gemini/idiomdrottning.org/human-rights</a></li></ul><blockquote>If we assume the human rights argument is correct &amp; necessary as an unshakeable axiom, and that might well be the case, it’s challenging to see sustainable degrowth.</blockquote><p>The dissonance is real! It&#39;s like we randomly generated a game state but can&#39;t move from it according to the rules. Except, we did get here step by step, it&#39;s just starting to look like a dead-end -- WASTED.</p><ul><li><a href="https://gta.fandom.com/wiki/Wasted">https://gta.fandom.com/wiki/Wasted</a></li></ul><p>The well-being of a civilization&#39;s individuals should be their right, according to the abilities and resources of the civilization. I believe that. Therefore the (or at least a) goal of a civilization should be the well-being of its individuals. Alas, the purpose of civilization is not well-being but survival. If not of the individual, then of the group. And there&#39;s no lower limit to the shit scale... as long as survival is ensured.</p><ul><li><a href="https://plato.stanford.edu/entries/repugnant-conclusion/">Arrhenius, Gustaf, Jesper Ryberg, and Torbjörn Tännsjö, &quot;The Repugnant Conclusion&quot;, The Stanford Encyclopedia of Philosophy</a></li></ul><p>Nevertheless, I hate the brainless masses of people brainlessly ploughing through their shit lives, and/or being complete waste of human beings. I must admit I often feel like a complete waste of a human being myself -- I&#39;m just contributing to the general worsening of the environment, would be better if I wasn&#39;t here, etc, etc -- life is just peachy!</p><ul><li><a href="../words/quotes.html">§ 2021-12-27 Jean Valjean on duty</a></li><li><a href="../wiki/v.exurb1a.absurdism.html">../wiki/v.exurb1a.absurdism.html</a></li><li><a href="../wiki/books.html">&quot;Gorgias&quot;, by Plato</a></li></ul><blockquote>It’s not impossible—people can voluntarily give up what the declaration states is their inalienable property (...)</blockquote><p>Not certain what you mean by &quot;property&quot; here, but life is a right, right? and many give up on it, in some way due to the civilization they&#39;re in. Some because they don&#39;t have a hamster wheel to live on, others because of the hamster wheel itself. As if one reason wasn&#39;t enough!</p><ul><li><a href="../words/quotes.html">§ 2021-04-08 David Hume on happiness</a></li><li><a href="../words/quotes.html">§ 2023-09-06 &quot;The Fall&quot;, by Albert Camus</a></li><li><a href="societal-slavery.html">Societal slavery</a></li></ul></body></html></content> <id>gemini://siiky.srht.site/philosophy/re-human-rights.gmi</id> <published>2023-09-14T00:00:00Z</published> <title type="text">RE: Human Rights</title> <updated>2023-09-14T00:00:00Z</updated> <link href="https://siiky.srht.site/philosophy/re-human-rights.html" rel="alternate" type="text/html" hreflang="en" title="RE: Human Rights" /> <link href="gemini://siiky.srht.site/philosophy/re-human-rights.gmi" rel="alternate" type="text/gemtext" hreflang="en" title="RE: Human Rights" /> </entry> <entry> <content type="html"><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"><html lang="en" xml:lang="en"><head><meta charset="utf-8"></meta></head><body><h1>ROOPHLOCH 2023[*]</h1><p>siiky<br></br>2023/09/05<br></br>2023/09/05<br></br>en</p><ul><li><a href="https://portal.mozz.us/gemini/zaibatsu.circumlunar.space/~solderpunk/gemlog/announcing-roophloch-2023.gmi">Announcing ROOPHLOCH 2023</a></li></ul><p>I&#39;m writing this in the morning of Sept. 5th, with pen and paper, on the top of a big boulder next to the house I&#39;m staying at. On top of me is a small and sparse vine. I&#39;d rather be writing this in the woords, but I&#39;ve come unprepared for this weather. The boulder is wet, it was rainging not long ago, I&#39;m in natural squatting position.</p><p>I&#39;m on vacations in a remote-ish village (there are 3 neighboring houses still occupied; the rest is deserted and derelict) with my family. Yesterday, Sept. 4th, the power went out intermittently between 17h and 17h30, at which time it went out completely. I didn&#39;t notice it until around 19h, as I was watching a movie on my laptop.</p><ul><li><a href="../wiki/films.html">../wiki/films.html</a></li></ul><p>Everything in this house is electric: oven, stove, microwave, water boiler, fridge. And it came meal-time but still no power. There is no firewood around but no good place to use it either. Nothing we could do except prepare some cold snacks to eat together with bread and crackers. The power came back just as we finished, at 20h45~20h50. There was lots of concern, and we were generlly lost. We&#39;ve come to depend too much on infrastructure, technology, and electricity especially.</p><p>However, while there was still light (and power) I got a book on my ereader for my grandmother: O Mistério da Estrada de Sintra. She enjoys reading but of course, her sight is not what it used to be. We found comfortable settings for her eyes and she read for ~2h straight. I couldn&#39;t say why I never thought of having her try the ereader.</p><ul><li><a href="https://pt.wikipedia.org/wiki/O_Mistério_da_Estrada_de_Sintra">https://pt.wikipedia.org/wiki/O_Mistério_da_Estrada_de_Sintra</a></li><li><a href="https://en.wikipedia.org/wiki/The_Mystery_of_the_Sintra_Road">https://en.wikipedia.org/wiki/The_Mystery_of_the_Sintra_Road</a></li></ul><p>And as I&#39;m finishing this log it&#39;s starting to rain again. I&#39;ll take a moment to enjoy the rain while it&#39;s light and go back inside.</p><p>[*] I wrote this outside w/ pen&amp;paper but used my laptop (inside the house) to publish. Not sure it counts for ROOPHLOCH, but that is hardly the point anyway. Made almos no editting or fixing on the computer; transcribed as-is.</p></body></html></content> <id>gemini://siiky.srht.site/words/roophloch-2023.gmi</id> <published>2023-09-05T00:00:00Z</published> <title type="text">ROOPHLOCH 2023[*]</title> <updated>2023-09-05T00:00:00Z</updated> <link href="https://siiky.srht.site/words/roophloch-2023.html" rel="alternate" type="text/html" hreflang="en" title="ROOPHLOCH 2023[*]" /> <link href="gemini://siiky.srht.site/words/roophloch-2023.gmi" rel="alternate" type="text/gemtext" hreflang="en" title="ROOPHLOCH 2023[*]" /> </entry> <entry> <content type="html"><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"><html lang="en" xml:lang="en"><head><meta charset="utf-8"></meta></head><body><h1>FuckHub Actions (or: what even is privacy?)</h1><p>siiky<br></br>2023/08/31<br></br>2023/08/31<br></br>en</p><p>Following the recent deadline of my student plan on FuckHub, I updated the mirror repo of my capsule/website to have no history; added a simple index page pointing to the main website (where you&#39;re reading from, hopefully); and made the repo public.</p><ul><li><a href="fuckhub.html">fuckhub.html</a></li><li><a href="https://siiky.srht.site">https://siiky.srht.site</a></li></ul><p>GitHub Pages (GitHub&#39;s personal website offering) uses GitHub Actions under the hood (GitHub&#39;s CI offering?) to build the site and publish it. So far so good.</p><p>The Actions page, in addition to the currently running Actions, has a list of past Actions. Each of those has associated one commit, and clicking it you get to its commit page, such as this:</p><ul><li><a href="https://github.com/siiky/ipfs.scm/commit/e59f23f1ef6e479ad590517da6dcaa7044f36822">https://github.com/siiky/ipfs.scm/commit/e59f23f1ef6e479ad590517da6dcaa7044f36822</a></li></ul><p>At the top of the page you can read this banner:</p><blockquote>This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.</blockquote><p>I wiped everything out, after all. Nonetheless you can see the changes.</p><p>If that wasn&#39;t enough, hitting &quot;Browse files&quot; also works! You get the list of files of the repository at that commit, you can browse, open, and read them!</p><p>EVERYTHING is still somewhere in FuckHub&#39;s servers. I can actually browse all of the repo&#39;s history, up until some known commit (e.g., if I know commit abc123, I can read that and all parent commits on the website).</p><p>Thankfully, I think, I HOPE, it&#39;s not possible to git clone the repo.</p></body></html></content> <id>gemini://siiky.srht.site/programming/fuckhub-actions.gmi</id> <published>2023-08-31T00:00:00Z</published> <title type="text">FuckHub Actions (or: what even is privacy?)</title> <updated>2023-08-31T00:00:00Z</updated> <link href="https://siiky.srht.site/programming/fuckhub-actions.html" rel="alternate" type="text/html" hreflang="en" title="FuckHub Actions (or: what even is privacy?)" /> <link href="gemini://siiky.srht.site/programming/fuckhub-actions.gmi" rel="alternate" type="text/gemtext" hreflang="en" title="FuckHub Actions (or: what even is privacy?)" /> </entry> <entry> <content type="html"><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"><html lang="en" xml:lang="en"><head><meta charset="utf-8"></meta></head><body><h1>Go-C interop memory leak</h1><p>siiky<br></br>2023/08/29<br></br>2023/08/29<br></br>en</p><p>Wrote a program at $JOB that, for each frame obtained from a camera, tries to scan barcodes. The purpose was to replace a handful of libraries not compatible with Node.js v18[^0]. The Node.js controller program spawns this other program (camera-streamer), passing some static parameters as program arguments, and otherwise communicating through stdin/stdout. It&#39;s a simple solution and I&#39;m pretty happy with it[^1].</p><p>We wanted something compiled and relatively fast (though almost anything would be better than JS), and with good C interop because of the libs we used underneath. We chose Go. It&#39;s an annoying language, but I can&#39;t say it was a bad choice in the end. Message passing in Go is (almost) a gift from Joe Armstrong himself (if it wasn&#39;t so dumbbed down), and makes concurrency super easy (though not reliable)!</p><ul><li><a href="../wiki/pl.go.html">../wiki/pl.go.html</a></li><li><a href="../wiki/pl.erlang.html">../wiki/pl.erlang.html</a></li></ul><p>At some point I suspected a memory leak. The glue C code is very simple, simple enough I carefully analyzed, and covered all cases[^2]. Still, there were signs of a memory leak. I got valgrind out, and no matter what I did, no leaks detected. I searched around at the time and read comments saying that Go&#39;s GC likes to hang on to objects for longer than one would expect. Case closed!</p><p>Or is it? Yesterday I left it running for a good few minutes and memory usage climbed to over 1.6GB[^3]! This is a no-go (hah!) so I&#39;m back investigating today. I started by searching around for anything memory-related, with the GC idea in mind:</p><ul><li><a href="https://lwn.net/Articles/428100">https://lwn.net/Articles/428100</a></li><li><a href="https://groups.google.com/g/golang-dev/c/EpUlHQXWykg/m/LN2o9fV6R3wJ">https://groups.google.com/g/golang-dev/c/EpUlHQXWykg/m/LN2o9fV6R3wJ</a></li><li><a href="https://groups.google.com/g/linux.kernel/c/MDIzfQMT3zU">https://groups.google.com/g/linux.kernel/c/MDIzfQMT3zU</a></li><li><a href="https://golang.howtos.io/understanding-and-improving-go-memory-usage">https://golang.howtos.io/understanding-and-improving-go-memory-usage</a></li><li><a href="https://chris124567.github.io/2021-06-21-go-performance">https://chris124567.github.io/2021-06-21-go-performance</a></li></ul><p>Nothing useful. So I turned back on no-memleaks-for-sure and collected some stats:</p><pre>for formatid in 0 1 2 5; do for timeout in 5 10 20 30 60 90 120 160 200 240; do echo &quot;${formatid}&quot; | /usr/bin/time -f &quot;format:${formatid} timeout:${timeout}s %M&quot; timeout &quot;${timeout}s&quot; ./camera-streamer /dev/video0 zxing 10 QRCode; done; done 2&gt;&amp;1 | rg --color=never &#39;^format:\d+\ttimeout:\d+s\t\d+{body}amp;amp;#39; | sed &#39;s/^format://; s/timeout://; s/s//; s/kB$//;&#39; &gt; rss-memory-usage-raw.tsv; tput bel </pre><p>This thing starts up the camera-streamer with different configs (with the camera I&#39;m using, formatids 0, 1, 2, 5 are 2592x1944, 2048x1536, 1920x1080, 1280x720, respectively) and lets it run for a certain amount of time. Crude method (I know) and it takes a long time to run (I know) but it works well enough -- take a look at this graph:</p><img src="go-memory-before.png" alt="go-memory-before.png"></img><p>Clearly, frame resolution affects memory usage. Here&#39;s the relevant code. jpeg is the frame we get from the camera (GC&#39;d), and format is the name of the format we want to scan (e.g. &quot;QRCode&quot;).</p><pre>func ReadBarcode(jpeg []byte, format string) []byte { Cjpeg := C.CBytes(jpeg) Cjpeglen := C.uint(len(jpeg)) Cformat := C.CString(format) return newResultFromC(C.zxing_read_barcode(Cjpeg, Cjpeglen, Cformat)) } func newResultFromC(ptr unsafe.Pointer) []byte { defer C.zxing_Result_Destroy(ptr) if ptr != nil &amp;&amp; C.zxing_Result_isValid(ptr) != 0 { bytes := C.zxing_Result_Bytes(ptr) size := C.zxing_Bytes_size(bytes) data := C.zxing_Bytes_data(bytes) return C.GoBytes(data, size) } return nil } </pre><p>Looks harmless, but a couple of important details are hidden here. The cgo (Go&#39;s C interop) docs suck a lot, however, you can find this crucial piece of information there:</p><pre>// Go string to C string // The C string is allocated in the C heap using malloc. // It is the caller&#39;s responsibility to arrange for it to be // freed, such as by calling C.free (be sure to include stdlib.h // if C.free is needed). func C.CString(string) *C.char // Go []byte slice to C array // The C array is allocated in the C heap using malloc. // It is the caller&#39;s responsibility to arrange for it to be // freed, such as by calling C.free (be sure to include stdlib.h // if C.free is needed). func C.CBytes([]byte) unsafe.Pointer </pre><ul><li><a href="https://pkg.go.dev/cmd/cgo">https://pkg.go.dev/cmd/cgo</a></li></ul><p>I couldn&#39;t possibly remember now what happened when I wrote the code. I remember reading these docs, and I remember having a lot of difficulty finding anything to help using C/C++ in Go. So in the midst of confusion it&#39;s possible I glossed over or forgot about it.</p><p>format is a leak too, but it&#39;s tiny (6 bytes) when compared to the frame itself: ~20kB for 2592x1944, ~13kB for 2048x1536, ~8kB for 1920x1080, ~4kB for 1280x720. At 10 FPS, that&#39;s ~200kB/s at the highest resolution!</p><p>Here&#39;s the fixed code, and a new graph right after:</p><pre>func ReadBarcode(jpeg []byte, format *C.char) []byte { Cjpeg := C.CBytes(jpeg) defer C.free(unsafe.Pointer(Cjpeg)) Cjpeglen := C.uint(len(jpeg)) return newResultFromC(C.zxing_read_barcode(Cjpeg, Cjpeglen, format)) } </pre><img src="go-memory-after.png" alt="go-memory-after.png"></img><p>Much better! The fact that memory usage is more or less constant after ~60s suggests the leak is solved.</p><p>However, not all memory usage is explained... Assuming memory usage stabilizes at ~60s (as seen in this last graph), and knowing that maxrss was 554MB/338MB after 240s/60s: (554MB-338MB)/(240s-60s)=1.2MB/s -- ~6x more than I expected at the highest resolution (~200kB/s)!</p><p>I&#39;ll leave that for another day.</p><p>[^0]: I managed to port 2 of them, they seem to work fine. However, the more vital one crashes, no idea why.</p><p>[^1]: Unfortunately, due to Node.js/JavaScript bullshit, communicating through stdin/stdout is not as easy as it sounds... Nonetheless, with sufficient workarounds it all works reliably.</p><p>[^2]: There are only 2 &quot;main C entrypoints&quot;, one for each library (ZXing &amp; supyo). Internally, each of them allocates a temporary buffer that I free as soon as it&#39;s no longer necessary (this is easily done because the C code is sequential with no branching). There&#39;s also a destructor and a couple of accessors for ZXing, but those don&#39;t seem to allocate memory outside Go&#39;s realm.</p><p>[^3]: In a realistic scenario the program won&#39;t run for more than a couple of minutes, so I expect it&#39;d use at most ~500MB, which could maybe work but the smallest target hardware doesn&#39;t have so much memory to waste comfortably.</p></body></html></content> <id>gemini://siiky.srht.site/programming/go-memory.gmi</id> <published>2023-08-29T00:00:00Z</published> <title type="text">Go-C interop memory leak</title> <updated>2023-08-29T00:00:00Z</updated> <link href="https://siiky.srht.site/programming/go-memory.html" rel="alternate" type="text/html" hreflang="en" title="Go-C interop memory leak" /> <link href="gemini://siiky.srht.site/programming/go-memory.gmi" rel="alternate" type="text/gemtext" hreflang="en" title="Go-C interop memory leak" /> </entry> <entry> <content type="html"><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"><html lang="en" xml:lang="en"><head><meta charset="utf-8"></meta></head><body><h1>[H] Music [W] Music</h1><p>siiky<br></br>2023/08/27<br></br>2023/08/27<br></br>en</p><p>Listening to my music collection on shuffle, &quot;Paradigm&quot; by Their Dogs Were Astronauts came up. I already know most of my collection, TDWA especially (&lt;2017). Found them shortly after Animals as Leaders, many years ago, and have listened to them many times.</p><ul><li><a href="https://theirdogswereastronauts.bandcamp.com/track/paradigm">Their Dogs Were Astronauts, &quot;Earthkeeper&quot;, &quot;Paradigm&quot;</a></li></ul><p>I knew immediatly what was going on once it started playing -- and not because I&#39;ve listened so many times, it just happens; I can recognize most songs from the intro after two or three listenings. &quot;Af this one, boring&quot; -- 1-2 1-2 1-1-2 1-1-2 11-2 1-2 1-1-2 1-2 1231-2 ... It&#39;s been a long time I&#39;ve listened to something new that&#39;s exciting! So much so I mentioned it in my tinylog 3 months ago. Still, there are songs, albums, bands that for whatever reason don&#39;t seem to grow old in me.</p><ul><li><a href="../tinylog.html">§ 2023-05-21 23:41 +0100</a></li></ul><h2>The gold</h2><ul><li><a href="https://yewtu.be/watch?v=_bpS-cOBK6Q">Booker T. &amp; the M.G.&#39;s, &quot;Green Onions&quot;</a></li><li><a href="https://yewtu.be/watch?v=lyPvUIt_YWg">Morbid Angel, &quot;Covenant&quot;, &quot;God of Emptiness&quot;</a></li><li><a href="https://yewtu.be/watch?v=0MCCvY2oD2w">Jimi Hendrix, &quot;Axis: Bold as Love&quot;, &quot;Castles Made of Sand&quot;</a></li><li><a href="https://yewtu.be/playlist?list=PLc60gkdW0bcFbUwumMvBpxVrFbkeRzoPf">Marvin Gaye, &quot;What&#39;s Going On&quot;</a></li><li><a href="https://yewtu.be/watch?v=SUc8luH-I6c">King Crimson, &quot;Lizard&quot;, &quot;Lizard&quot;</a></li><li><a href="https://yewtu.be/watch?v=wPpQWyMjQ-s">Rush, &quot;2112&quot;</a></li><li><a href="https://audiotree.bandcamp.com/album/tricot-on-audiotree-live">tricot, &quot;On the Boom&quot;/&quot;18,19&quot;/&quot;Ochansensu-Su&quot;/&quot;Potage&quot;/&quot;Melon Soda&quot;</a></li><li><a href="https://yewtu.be/watch?v=5qH2A5UXSds">八十八ヶ所巡礼, &quot;金土日&quot; (&quot;Friday Saturday Sunday&quot;)</a></li><li><a href="https://yewtu.be/watch?v=33X7VrRy5d4">INU, &quot;メシ食うな!&quot; (&quot;Meshi Kuuna!&quot;)</a></li><li><a href="https://yewtu.be/watch?v=cQhxmFsuAbY">ターリン, &quot;虫&quot; (Stalin, &quot;Mushi&quot;)</a></li><li><a href="https://nyaa.si/view/1192434">Casiopea, &quot;Casiopea&quot;</a></li></ul><p>I expect the beginning of the list will be more widely known than the rest so I won&#39;t comment on those.</p><p>tricot, a math rock band from Japan. Originally a girls trio from Kyoto, now a girls trio from Kyoto + drummer guy. Not as wild, and definitely not as &quot;obscure&quot;, as the next band, but I just really like them. Wish I could buy all their albums! They&#39;re cool live too, very easy going.<br></br>I&#39;ve tried learning &quot;Melon Soda&quot; on the bass -- the intro is pretty cool -- but I&#39;m still not at that level (haven&#39;t practiced in ages tbh).</p><p>八十八ヶ所巡礼 -- smth like &quot;pilgrimage of 88 places&quot;, not translatable I think -- what can I say, an alt/math rock thing, I wish I could buy all their albums too! First heard of them from a Japanese girl I met through my Japanese classes. The song choice is a bit arbitrary, they have different styles across albums that it&#39;s hard to choose something &quot;representative&quot;.<br></br>The guitarist sounds like a monster. The drummer is an absolute beast, sick single bass pedal. And the bassist/vocalist is a god -- does he really only have 5 fingers?!<br></br>I think the drummer shows up shirtless in every video and live concert I&#39;ve watched -- if you&#39;re into that. Bassist/Vocalist plays live in flip-flops and a dress -- oh no, now I&#39;m confused -- über high-energy non-stop jumping around, must have 3 or 4 brains.</p><p>Impossible to choose any one song from &quot;メシ食うな!&quot; by INU, a &quot;classic&quot; punk album. Gotta listen to the whole thing from start to finish. I like that it&#39;s so happy-sounding but still sounds like a &quot;true&quot; punk album.</p><p>&quot;虫&quot; by Stalin is an awesome hardcode punk album. &quot;泥棒&quot; (Dorobou) is by far one of my favorite songs ever, likely my favorite by them, such a high-energy song, perfect to vent out. I sometimes wish I could sing it live but... you know, you need a band for that. I wish I could play it too, but I don&#39;t have the wrists :&#39;(</p><p>&quot;Casiopea&quot; is probably the album I listened to most often since first discovering it 4+ years ago, it&#39;s tight AF.</p><h2>Honorable mentions</h2><ul><li><a href="fecking_bahamas.html">PAUS</a></li><li><a href="https://americanfootball.bandcamp.com/track/silhouettes">American Football, &quot;American Football (LP3)&quot;, &quot;Silhouettes&quot;</a></li><li><a href="https://morningteleportation.bandcamp.com/album/expanding-anyway">Morning Teleportation, &quot;Expanding Anyway&quot;</a></li><li><a href="https://nyaa.si/view/712487">Sakamoto Maaya &amp; Cornelius, &quot;あなたを保つもの&quot;</a></li><li><a href="https://thistownneedsguns.bandcamp.com/track/cat-fantastic">This Town Needs Guns, &quot;13.0.0.0.0&quot;, &quot;Cat Fantastic&quot;</a></li><li><a href="https://vektor.bandcamp.com/track/tetrastructural-minds">Vektor, &quot;Outer Isolation&quot;, &quot;Tetrastructural Minds&quot;</a></li><li><a href="https://vulfpeck.bandcamp.com">Vulfpeck</a></li><li><a href="https://yewtu.be/playlist?list=PLMpG-PjHShWmyKRQGM3KJR4rgKSuDVSs2">Mastodon, &quot;Crack the Skye&quot;</a></li><li><a href="https://yewtu.be/playlist?list=PLwGe1l5pwo-4nhTf4iSySrcNc4BJ5UqP0">Flying Lotus, &quot;You&#39;re Dead&quot;</a></li><li><a href="https://yewtu.be/watch?v=GIuZUCpm9hc">TOOL, &quot;Forty Six &amp; 2&quot;</a></li><li><a href="https://yewtu.be/watch?v=SQNtGoM3FVU">Jinjer, &quot;Pisces&quot;</a></li><li><a href="https://yewtu.be/watch?v=Xx30nA_AWVU">José Cid, &quot;10000 Anos Depois Entre Vénus e Marte&quot;</a></li><li><a href="https://yewtu.be/watch?v=bAJ1WTGNISk">Meshuggah, &quot;Obzen&quot;, &quot;Bleed&quot;</a></li><li><a href="https://yewtu.be/watch?v=hqBjIolHUn4">Alan Sorrenti, &quot;Aria&quot;</a></li><li><a href="https://yewtu.be/watch?v=mpmtnLLZPcg">잠비나이, &quot;Différance&quot;, &quot;Connection&quot;</a></li><li><a href="https://yewtu.be/watch?v=tcWu8LWHr_0">ヒカシュー, &quot;20世紀の終わりに&quot;</a></li><li><a href="https://yewtu.be/watch?v=z70ch7cE8ak">Gojira, &quot;From Mars to Sirius&quot;</a></li></ul></body></html></content> <id>gemini://siiky.srht.site/music/h-music-w-music.gmi</id> <published>2023-08-27T00:00:00Z</published> <title type="text">[H] Music [W] Music</title> <updated>2023-08-27T00:00:00Z</updated> <link href="https://siiky.srht.site/music/h-music-w-music.html" rel="alternate" type="text/html" hreflang="en" title="[H] Music [W] Music" /> <link href="gemini://siiky.srht.site/music/h-music-w-music.gmi" rel="alternate" type="text/gemtext" hreflang="en" title="[H] Music [W] Music" /> </entry> <entry> <content type="html"><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"><html lang="en" xml:lang="en"><head><meta charset="utf-8"></meta></head><body><h1>ELP, The Only Way</h1><p>siiky<br></br>2023/08/26<br></br>2023/08/26<br></br>en</p><ul><li><a href="https://portal.mozz.us/gemini/gem.librehacker.com/gemlog/your-word/20230823-0.gmi">https://portal.mozz.us/gemini/gem.librehacker.com/gemlog/your-word/20230823-0.gmi</a></li></ul><p>lol funny and sad<br></br>not gonna bother about good writing apostrophes wtv</p><p>there is no god<br></br>neither me nor you nor anyone else has ever seen heard tasted felt smelled experienced this superhero</p><p>where do the rules come from<br></br>someone must have invented them<br></br>for reasons</p><ul><li><a href="../words/re-bueno_rezar.html">../words/re-bueno_rezar.html</a></li><li><a href="societal-slavery.html">societal-slavery.html</a></li></ul><p>smart but evil humans</p><p>others gobble it all down<br></br>think they came from a superhero</p><p>porque caralho</p><p>ELP already sang it in The Only Way so many years ago</p><blockquote>People are stirred<br></br>Moved by the word<br></br>Kneel at the shrine<br></br>Deceived by the wine<br></br><br></br>How was the earth conceived?<br></br>Infinite space<br></br>Is there such a place?<br></br>You must believe in the human race<br></br><br></br>Can you believe<br></br>God makes you breathe?<br></br>Why did he lose<br></br>Six million Jews?<br></br><br></br>Touched by the wings<br></br>Fierce angel brings<br></br>Sad winter storm<br></br>Grey autumn dawn<br></br><br></br>Who looks on life itself?<br></br>Who lights your way?<br></br>Only you can say<br></br>How can you just obey?<br></br><br></br>Don&#39;t need the word<br></br>Now that you&#39;ve heard<br></br>Don&#39;t be afraid<br></br>Man is man-made<br></br><br></br>And when the hour comes<br></br>Don&#39;t turn away<br></br>Face the light of day<br></br>And do it your way<br></br>It&#39;s the only way</blockquote><p>being deceived by the devil is a common christian theme<br></br>THE IRONY<br></br>the dogma is the devil yall</p><p>i couldnt fucking care less if you do believe a superhero creating all things you experience<br></br>really dont<br></br>mas se me pisas os calos tou me a cagar pra ti ta foder</p><p>if you think im offensive ask your superhero to stop me</p></body></html></content> <id>gemini://siiky.srht.site/philosophy/elp-the_only_way.gmi</id> <published>2023-08-26T00:00:00Z</published> <title type="text">ELP, The Only Way</title> <updated>2023-08-26T00:00:00Z</updated> <link href="https://siiky.srht.site/philosophy/elp-the_only_way.html" rel="alternate" type="text/html" hreflang="en" title="ELP, The Only Way" /> <link href="gemini://siiky.srht.site/philosophy/elp-the_only_way.gmi" rel="alternate" type="text/gemtext" hreflang="en" title="ELP, The Only Way" /> </entry> <entry> <content type="html"><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"><html lang="en" xml:lang="en"><head><meta charset="utf-8"></meta></head><body><h1>FuckHub</h1><p>siiky<br></br>2023/08/22<br></br>2023/08/22<br></br>en</p><p>Got a notification email last week because my GitHub &quot;education pack&quot; expires in 7 days. Decided now would be a good time to renew. Wasn&#39;t too difficult to find the new instructions -- you gotta change things every now and then, otherwise people get used to it or get bored or something. Picked my current student email, picked the University, wrote &quot;how I plan to use GitHub&quot;, because... I may have started using it differently? &#39;kay... Hit Continue and BAM:</p><blockquote>When you click &quot;Continue&quot; you will be prompted to share your location with us. Providing your current location helps us verify your affiliation with your chosen school.<br></br>To continue you must modify your browser settings to allow GitHub to use your location information.</blockquote><p>what?</p><p>This&#39;ll be the end of my private repos on GH, including the secondary web version (siiky.github.io) of my capsule -- the primary (siiky.srht.site) will, of course, stay up! I&#39;ll update it until the expiry date, and maybe put a notice up redirecting to the primary.</p><ul><li><a href="../alt.html">../alt.html</a></li></ul><p>One step closer to dropping the account. Unfortunately I still have to use it for work, and for a few repos I contribute to occasionally (Erlang, Elixir, IPFS, StandardEbooks, ...).</p></body></html></content> <id>gemini://siiky.srht.site/programming/fuckhub.gmi</id> <published>2023-08-22T00:00:00Z</published> <title type="text">FuckHub</title> <updated>2023-08-22T00:00:00Z</updated> <link href="https://siiky.srht.site/programming/fuckhub.html" rel="alternate" type="text/html" hreflang="en" title="FuckHub" /> <link href="gemini://siiky.srht.site/programming/fuckhub.gmi" rel="alternate" type="text/gemtext" hreflang="en" title="FuckHub" /> </entry> <entry> <content type="html"><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"><html lang="en" xml:lang="en"><head><meta charset="utf-8"></meta></head><body><h1>WILDER, an indie magazine about nature (in Portuguese)</h1><p>siiky<br></br>2023/08/21<br></br>2023/08/21<br></br>en</p><p>A couple of weeks ago I found this Portuguese[^0] indie magazine about nature called WILDER... and boy it&#39;s pretty fucking good!</p><p>They publish around two articles per day, about news or scientific studies. There&#39;s a section titled &quot;Que espécie é esta?&quot; (&quot;What species is this?&quot;) where readers send observations of their own, and specialists collaborating with the magazine try to determine the species (on a best effort basis) -- it&#39;s pretty cool to learn of so many different life forms living around here. And for some weeks now there&#39;s been a running series of interviews of those specialists, titled &quot;Embaixadores por Natureza&quot; (&quot;Ambassadors for Nature&quot;).</p><ul><li><a href="https://www.wilder.pt/especies/">https://www.wilder.pt/especies/</a></li><li><a href="https://www.wilder.pt/topico/embaixadores-por-natureza/">https://www.wilder.pt/topico/embaixadores-por-natureza/</a></li><li><a href="../wiki/by/created.html">You may have seen them in my wiki</a></li></ul><p>I found it by chance, after my interest renewal in biology and I started studying biology on Khan Academy (which you may also have seen in my wiki).</p><p>In this post I&#39;d like to bring attention to the four articles currently in the wiki, which I think will give a good glimpse into the content variation.</p><p>[^0]: Firefox 118 now has built-in full-page translation, it works well enough for Portuguese-English! And it works locally (according to the FAQ): &quot;Installing languages enables Firefox to perform translations locally within your browser&quot;</p><ul><li><a href="https://support.mozilla.org/en-US/kb/website-translation">§ &quot;Why do I need to install languages?&quot;</a></li></ul><h2>Lagostim-sinal: Um invasor que chegou a Portugal pelo Norte</h2><p>The first is about an invasive species in Portugal, the signal crayfish (Pacifastacus leniusculus). It&#39;s interesting because not long ago this summer vacation I think I&#39;ve seen many of these in two different rivers. I had never seen crayfish in the river before.</p><ul><li><a href="../wiki/p.wilder.lagostim-sinal.html">../wiki/p.wilder.lagostim-sinal.html</a></li><li><a href="https://en.wikipedia.org/wiki/Signal_crayfish">https://en.wikipedia.org/wiki/Signal_crayfish</a></li></ul><h2>Crónicas naturais: salta-pocinhas</h2><p>This one is about the story of a guy who went to the mountain one morning, and had a chance encounter with a fox, who made him company for a short while.</p><ul><li><a href="../wiki/p.wilder.salta-pocinhas.html">../wiki/p.wilder.salta-pocinhas.html</a></li></ul><h2>Acordo que regula comércio mundial deixa de fora 904 espécies em risco, alertam cientistas</h2><p>The third is about a study finding that CITES (something I&#39;d never heard of before) leaves more than 900 endangered species out of its trade/commerce protections. Methinks it&#39;s weird this is a blacklist instead of a whitelist... assuming the intention is to protect biodiversity, of course.</p><ul><li><a href="../wiki/p.wilder.acordo_regula_comercio_mundial_deixa_fora_904_especies_risco.html">../wiki/p.wilder.acordo_regula_comercio_mundial_deixa_fora_904_especies_risco.html</a></li><li><a href="https://cites.org">https://cites.org</a></li></ul><h2>Ratinho-ruivo aprende a identificar novos alimentos através do hálito de outros ratinhos</h2><p>And the last one tells of a behavioral study of Algerian mice (Mus spretus). These little guys learn of new edible foodstuffs by smelling the breaths of other fellows. Such smart cookies! They can determine the general health of another mouse by smell too.</p><ul><li><a href="../wiki/p.wilder.ratinho-ruivo_aprende_identificar_novos_alimentos_atraves_halito_outros_ratinhos.html">../wiki/p.wilder.ratinho-ruivo_aprende_identificar_novos_alimentos_atraves_halito_outros_ratinhos.html</a></li><li><a href="https://en.wikipedia.org/wiki/Algerian_mouse">https://en.wikipedia.org/wiki/Algerian_mouse</a></li></ul><h2>&quot;But I don&#39;t know Portuguese... ):&quot;</h2><p>Understandable, I&#39;d be more surprised if you did... But I&#39;m not recommending, or even suggesting, that you learn Portuguese -- it&#39;s hard and not so useful.</p><p>Instead, I&#39;d like to encourage you to find an indie magazine/newspaper/journal in any language you know, about any topic of your interest, and to share your findings with the rest of us!</p></body></html></content> <id>gemini://siiky.srht.site/nature/wilder.gmi</id> <published>2023-08-21T00:00:00Z</published> <title type="text">WILDER, an indie magazine about nature (in Portuguese)</title> <updated>2023-08-21T00:00:00Z</updated> <link href="https://siiky.srht.site/nature/wilder.html" rel="alternate" type="text/html" hreflang="en" title="WILDER, an indie magazine about nature (in Portuguese)" /> <link href="gemini://siiky.srht.site/nature/wilder.gmi" rel="alternate" type="text/gemtext" hreflang="en" title="WILDER, an indie magazine about nature (in Portuguese)" /> </entry> <entry> <content type="html"><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"><html lang="en" xml:lang="en"><head><meta charset="utf-8"></meta></head><body><h1>Booklet printing</h1><p>siiky<br></br>2023/08/20<br></br>2023/08/20<br></br>en</p><p>I found how to prepare a PDF into a printable booklet (aka brochure or pamphlet) PDF! (Again!) The booklet pages will be half the size of the print paper -- e.g. with an A4 paper printer the booklet will be A5.</p><p>For whatever reason I find it extremely hard to understand how to operate the printer... If I put the paper this way, how will it come out? Should I flip it to print the other side? Should I rotate? Who knows! It&#39;s not the first time I&#39;ve gone through the whole process of (re)learning these things, but, like a dumbass, I never documented it. All is about to change! Brace yourself!</p><p>The first hints, which I have later adapted to fit my setup, I&#39;ve found in various StackExchange questions, just search around for &quot;linux print booklet&quot;.</p><ul><li><a href="https://askubuntu.com/questions/214538">Printing in booklet format</a></li><li><a href="https://www.reddit.com/r/linux/comments/vhg01i/booklet_printing/">Booklet Printing</a></li></ul><p>One option that looks relly good is boomaga. Unfortunately it&#39;s starting to look like it&#39;ll be abandonware in a few years, that&#39;s why I&#39;ve tried the &quot;hard way&quot; first and will document that here.</p><ul><li><a href="https://www.boomaga.org">https://www.boomaga.org</a></li><li><a href="https://github.com/Boomaga/boomaga">https://github.com/Boomaga/boomaga</a></li><li><a href="https://github.com/Boomaga/boomaga/issues/117">https://github.com/Boomaga/boomaga/issues/117</a></li></ul><p>Everything here is specific to my printer, there&#39;s no guarantee it&#39;ll work on yours, &amp;c, &amp;c. I have a hard time understanding how to do it with my own printer, how would I know how to do it with yours?!</p><h2>Printer</h2><p>I have an HP LaserJet Pro M15a, a dead-simple A4 printer: you insert paper on the bottom, and it regurgitates paper out the top flipped on the short-edge[^0]. The paper&#39;s top side (when feeding) is the printed side (the bottom side when regurgitated).</p><p>The M15a can&#39;t print both sides in one go. If you want to print 2 pages on the front and back of a single sheet, simply print the first page, pull the sheet out, shove it back in without flipping or rotating, and print the second page. Don&#39;t mess this up like I have so many times!</p><p>My printer is connected by USB to my RBPi2, using CUPS, and is shared on the LAN so I can print from any computer/smartphone. No WiFi BS needed!</p><h2>pdfjam</h2><p>Let&#39;s call our original input PDF file original.pdf. If it has some unwanted pages, you can use pdfjam to fix that:</p><pre>pdfjam --a4paper --outfile wanted-pages.pdf -- original.pdf PAGE_SELECTION </pre><p>If you want all pages, then you should skip this step.</p><p>As an example, in this last document I wanted to print, I didn&#39;t need the first page. So as PAGE_SELECTION I used `2-` (2nd page till the end). `pdfjam --help` is pretty good.</p><h2>pdfbook2</h2><p>This is the program with the most useful part! Takes a sequential PDF (1, 2, 3, 4, ..., N-1, N) and creates a PDF with pages paired such that when printed and folded in half it forms a booklet (blank/1, 2/blank, 3/N, 4/N-1 ...). The output file is named after the input file, with &quot;-book&quot; appened to the basename (i.e. wanted-pages-book.pdf). `pdfbook2 --help` is not so good.</p><pre>pdfbook2 --short-edge --no-crop --paper=a4 --signature=0 -- wanted-pages.pdf </pre><p>wanted-pages-book.pdf has (asymptotically) half the number of pages (N/2 + 1, I think) of wanted-pages.pdf -- for example, this wanted-pages.pdf I just printed has 10 pages, but wanted-pages-book.pdf has 6.</p><p>The option `--signature=0` (I believe, can&#39;t be certain) is the signature size. E.g., if you have an 80 pages PDF, `--signature=0` would create a 41 page booklet PDF corresponding to a single 20 sheets signature (80 pages); and `--signature=40` would create a 41 page booklet PDF corresponding to two 10 sheets signatures (40 pages each). If I&#39;m doing the math right -- it&#39;s hard you know!</p><p>pdfjam is also capable of doing this step with a few options, see the StackExchange question I linked to at the top.</p><h2>All together now!</h2><p>There&#39;s one last important detail! The printer regurgitates paper in a stack, so the sheets will be in the reverse order they were inserted in. The only solution I know as of now (without boomaga) is to manually reverse the stack. Be sure not to flip or rotate any sheets or everything will be wrong!</p><ul><li>Print the odd-numbered pages of the wanted-pages-book.pdf</li><li>Reverse printed sheets as explained above</li><li>Print the even-numbered pages of the wanted-pages-book.pdf</li></ul><p>[^0]: Meaning: having the paper in portrait in front of you, hold the short edge closest to you, pick the sheet up, quickly extend your arm(s) and lay the sheet down with the previously-closest edge now farthest from you.</p></body></html></content> <id>gemini://siiky.srht.site/kB45oC/booklet_printing.gmi</id> <published>2023-08-20T00:00:00Z</published> <title type="text">Booklet printing</title> <updated>2023-08-20T00:00:00Z</updated> <link href="https://siiky.srht.site/kB45oC/booklet_printing.html" rel="alternate" type="text/html" hreflang="en" title="Booklet printing" /> <link href="gemini://siiky.srht.site/kB45oC/booklet_printing.gmi" rel="alternate" type="text/gemtext" hreflang="en" title="Booklet printing" /> </entry> <entry> <content type="html"><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"><html lang="en" xml:lang="en"><head><meta charset="utf-8"></meta></head><body><h1>The Pompous Dog</h1><p>siiky<br></br>2023/08/09<br></br>2023/08/09<br></br>en</p><p>I once knew a dog,<br></br> who would go out to the backyard,<br></br> and bark up at the sky,<br></br> for all to hear.</p></body></html></content> <id>gemini://siiky.srht.site/words/pompous_dog.gmi</id> <published>2023-08-09T00:00:00Z</published> <title type="text">The Pompous Dog</title> <updated>2023-08-09T00:00:00Z</updated> <link href="https://siiky.srht.site/words/pompous_dog.html" rel="alternate" type="text/html" hreflang="en" title="The Pompous Dog" /> <link href="gemini://siiky.srht.site/words/pompous_dog.gmi" rel="alternate" type="text/gemtext" hreflang="en" title="The Pompous Dog" /> </entry> <entry> <content type="html"><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"><html lang="en" xml:lang="en"><head><meta charset="utf-8"></meta></head><body><h1>RE: Division, remainder, mod ➗%❓</h1><p>siiky<br></br>2023/06/18<br></br>2023/06/18<br></br>en</p><ul><li><a href="https://portal.mozz.us/gemini/freeshell.de/gemlog/2023-06-18_Division__remainder__mod.gmi">Division, remainder, mod ➗%❓</a></li></ul><blockquote>I&#39;m not qualified to say if that&#39;s true (and I don&#39;t really care)</blockquote><p>Yes, you are qualified. You can tell whether -1 and 1 are the same number.</p><p>And yes, as a programmer, you should care. Integers are the most basic atomic data type in a computer. As programmers we have to deal with integers and do integer arithmetic all the time. Both remainder and modulo are useful (the latter more so than the former, in my experience), and knowing which one we have in hands can be the difference between the program we just wrote doing what we expected or crashing.</p><blockquote>Whitespace was originally implemented in Haskell, and I wrote an interpreter in Java. These two languages disagree on what the operator % means for negative inputs, so I read what Wikipedia has to say on the differrence.<br></br>Oh, wow! What a mess.</blockquote><p>There&#39;s no % operator in Haskell (AFAIK?), you usually either use rem or mod (an example of why you should care). And yeah, that Wikipedia page is not the friendliest...</p><blockquote>What integer do you round to if you can&#39;t divide exactly? Wikipedia lists FIVE ways to decide on the result, with graphs. Ouch.</blockquote><p>Right, again, that page is not the best... Those graphs are just confusing.</p><p>There&#39;s only one definition of &quot;remainder&quot;, the one based on Euclidean division. Both quotient and remainder are well defined functions, and easy to implement in any programming language too. The &quot;different ways&quot; are implementation details -- &quot;how&quot;, not &quot;what&quot;. However the integer division is implemented -- be it &quot;truncating&quot;, &quot;flooring&quot; or whatever else -- what matters is if the language implements the quotient, remainder, and modulo correctly.</p><blockquote>Once you&#39;ve decided how integer division works, then you can decide what % means. Good luck. You won&#39;t please everyone.</blockquote><p>There&#39;s only one integer division definition (see above), so you only need to set % to the remainder or the modulo. Which of the two you pick is largely unimportant and, as you say, won&#39;t please everyone -- hardly important either. And after that, only if you choose modulo do you have another decision to make.</p><p>(Fun fact: modulo is not a function, it&#39;s a relation. We talk as if it was a function to save our brains from melting.)</p><p>That&#39;s where the choice comes from. For example, -5 ≣ -2 ≣ 1 ≣ 4 ≣ 7 ≣ 10 (mod 3) -- which of the relation &quot;outputs&quot; do you pick as the function result? There&#39;s a single one sane option (which defines the &quot;set of residues&quot;).</p><ul><li><a href="https://en.wikipedia.org/wiki/Modular_arithmetic#Residue_systems">https://en.wikipedia.org/wiki/Modular_arithmetic#Residue_systems</a></li></ul><blockquote>Math.floorMod() (...) does [what] siiky wanted.</blockquote><p>Indeed, that looks like what I need, thanks! Here&#39;s a (probably less efficient) alternative in case you only have the remainder to work with:</p><pre>n `mod` m = ((n `rem` m) + m) `rem` m </pre><pre>(n % m + m) % m </pre><pre>(remainder (+ (remainder n m) m) m) </pre><blockquote>My practical advice is that remainder and mod are the same, except for negative numbers, where language implementers live in a wild, Bohemian, devil-may-care world, and do what they like.</blockquote><p>That&#39;s roughly correct, regarding remainder and modulo. The second part is largely correct too -- language implementers can do whatever the fuck they want... However, remember that there&#39;s only one remainder definition and an infinite number of modulo implementations, only one of which is sane. A serious language should use those.</p></body></html></content> <id>gemini://siiky.srht.site/algebra/re-division_remainder_mod.gmi</id> <published>2023-06-18T00:00:00Z</published> <title type="text">RE: Division, remainder, mod ➗%❓</title> <updated>2023-06-18T00:00:00Z</updated> <link href="https://siiky.srht.site/algebra/re-division_remainder_mod.html" rel="alternate" type="text/html" hreflang="en" title="RE: Division, remainder, mod ➗%❓" /> <link href="gemini://siiky.srht.site/algebra/re-division_remainder_mod.gmi" rel="alternate" type="text/gemtext" hreflang="en" title="RE: Division, remainder, mod ➗%❓" /> </entry> <entry> <content type="html"><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"><html lang="en" xml:lang="en"><head><meta charset="utf-8"></meta></head><body><h1>MODULO IS NOT REMAINDER</h1><p>siiky<br></br>2023/06/17<br></br>2023/06/17<br></br>en</p><p>Alright, you know what&#39;s coming you smart cookies. This is a rant.</p><h2>The % operator</h2><p>Before going further, if you&#39;re a programmer, try to remember whether % is the remainder or the modulo in the programming languages you know (obviously, only the ones that use %). No cheating! Don&#39;t check online or try it in a REPL before answering mentally!</p><p>I&#39;ll list these later: C, D, Go, JS, Lua, Python, Rust, Zig, Java.</p><ul><li><a href="../wiki/pl.c.html">../wiki/pl.c.html</a></li><li><a href="../wiki/pl.go.html">../wiki/pl.go.html</a></li><li><a href="../wiki/pl.lua.html">../wiki/pl.lua.html</a></li></ul><h2>What</h2><p>There are two related, though different, operations on integers called &quot;remainder&quot; and &quot;modulo&quot;. The &quot;remainder&quot; should need no introductions, it&#39;s the remainder of integer division. The &quot;modulo&quot; may be more &quot;obscure&quot; but is somewhat similar.</p><p>For natural numbers (N), the remainder is the same as the modulo. That is, when both dividend and divisor are positive, the result is equal. Here are some examples in CHICKEN.</p><pre>#;1&gt; (remainder 4 2) 0 #;2&gt; (modulo 4 2) 0 #;3&gt; (remainder 4 3) 1 #;4&gt; (modulo 4 3) 1 #;5&gt; (remainder 5 3) 2 #;6&gt; (modulo 5 3) 2 </pre><p>However, when the dividend is a non-natural integer (Z\N, i.e. negative), the result may differ:</p><pre>#;7&gt; (remainder -4 2) 0 #;8&gt; (modulo -4 2) 0 #;9&gt; (remainder -4 3) -1 #;10&gt; (modulo -4 3) 2 #;11&gt; (remainder -5 3) -2 #;12&gt; (modulo -5 3) 1 </pre><ul><li><a href="../wiki/pl.chicken.html">../wiki/pl.chicken.html</a></li></ul><p>That should be enough to convince you that remainder and modulo are different.</p><p>If you want to learn more about modular arithmetic, you can read an older post of mine:</p><ul><li><a href="groups.html">Groups</a></li></ul><h2>Why am I annoyed?</h2><p>Unbeknownst to me, some people use remainder/modulo almost interchangeably online: they call the remainder &quot;remainder&quot;. Or sometimes &quot;modulo&quot; -- you can choose whichever you prefer. :) *similing but crying screaming inside*</p><p>Given the above, when you read &quot;remainder&quot; online you can be pretty sure it is &quot;remainder&quot; the writer meant. But when you read &quot;modulo&quot; you have to take a look outside: what&#39;s the current phase of the moon?</p><p>Unfortunately, when one is looking for or reading documentation, one is not much in the mood to go outside, or in fact doesn&#39;t have the time -- one needs to know NOW is it the remainder or the modulo quick QuiCk QUICK!</p><p>While researching to write this I found the following blog post.</p><ul><li><a href="https://robconery.com/theory/mod-and-remainder-are-not-the-same">Mod and Remainder Are Not The Same</a></li></ul><p>&quot;Thank you!&quot; I thought after reading the title. Then it starts:</p><blockquote>Get ready, here comes some fringe pedantry (...)</blockquote><p>&quot;It&#39;s neither fringe nor pedantry!&quot; I thought now. And it continues:</p><blockquote>Anyway: last week I found out something weird that I thought I would share: mod and remainder are not the same thing.<br></br>(...)<br></br>I had to look this up too, just like the last time the subject came up. It&#39;s one of those things that I know, but don&#39;t retain.</blockquote><p>&quot;Oh no, just another person who doesn&#39;t know what the modulo is... :/&quot;</p><p>I also found these two Wikipedia pages refering to the % operator as the &quot;modulo operator&quot;.</p><ul><li><a href="https://en.wikipedia.org/wiki/Modulo">https://en.wikipedia.org/wiki/Modulo</a></li><li><a href="https://en.wikipedia.org/wiki/C_(programming_language)#Operators">https://en.wikipedia.org/wiki/C_(programming_language)#Operators</a></li></ul><p>Fuck me...</p><h2>The % operator (answers)</h2><pre>| C | remainder | | D | remainder(?) | | Go | remainder | | JS | remainder | | Lua | modulo | | Python | modulo | | Rust | remainder | | Zig | remainder | </pre><ul><li><a href="https://web.archive.org/web/20181230041359if_/http://www.open-std.org/jtc1/sc22/wg14/www/abq/c17_updated_proposed_fdis.pdf">C17 § 6.5.5 Multiplicative operators; point 5</a></li><li><a href="https://dlang.org/spec/expression.html#mul_expressions">D Language Reference § 10.15 Mul Expressions</a></li><li><a href="https://go.dev/ref/spec#Arithmetic_operators">The Go Programming Language Specification § Arithmetic operators</a></li><li><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Remainder">MDN JavaScript Reference § Remainder (%)</a></li><li><a href="https://www.lua.org/manual/5.4/manual.html">Lua 5.4 Reference Manual § 3.4.1 Arithmetic Operators</a></li><li><a href="https://docs.python.org/3/reference/expressions.html#binary-arithmetic-operations">The Python Language Reference § 6.7 Binary arithmetic operations</a></li><li><a href="https://doc.rust-lang.org/reference/expressions/operator-expr.html#arithmetic-and-logical-binary-operators">The Rust Reference § Arithmetic and Logical Binary Operators</a></li><li><a href="https://ziglang.org/documentation/0.10.1/#Table-of-Operators">Zig Language Reference § Table of Operators</a></li></ul><p>Of these, D is the one I&#39;m not sure about. Some parts of the docs say &quot;remainder&quot; others &quot;modulo&quot;. It&#39;s probably remainder.</p><p>Lua and Python seem to compute the modulo indeed (no extensive testing, a single example should be enough assuming a well-working implementation).</p><h2>Why is this bad?</h2><ul><li>(Not so) fun fact #1: in Java the % operator is the remainder</li><li>(Not so) fun fact #2: in Java String.hashCode() (I guess Object.hashCode() generally) may return a negative number</li><li>(Not so) fun fact #3: 1+2 = index OOB</li></ul><ul><li><a href="https://docs.oracle.com/javase/tutorial/java/nutsandbolts/op1.html">The Java Tutorials § The Arithmetic Operators</a></li></ul><h2>How?</h2><p>There&#39;re two more very important questions left for me.</p><p>How did I come to believe that the % operator in C/C++, Go, Java, and Rust was the modulo? I started studying/using C 8~9 years ago. How was I wrong about this so very important detail for so long?</p><p>And how was I never bit by this so very important detail until yesterday?!</p><p>To answer the first, I guess the most likely cause is the &quot;modulo is just another word remainder&quot; ill together with never having been bit by it.</p><p>To answer the second, my best guess is that C, Go, and Rust all have unsigned numbers, unlike some other languages (fucking Jaba). JS, Lua, and Python don&#39;t have unsigned integers either (or integers at all &lt;_&lt;) but I don&#39;t use them much.</p><h2>Why is % the remainder?</h2><p>I have no idea... The modulo seems to be the most useful operation of the two. That&#39;s good enough reason for % to be the modulo for me, but I&#39;ll leave these data points.</p><p>A colleague sent this ChatGPT reply, but I wouldn&#39;t trust it for anything:</p><blockquote>The reason why most programming languages chose to implement the % operator as a remainder operation rather than a modulo operation is largely historical and related to the way that division is typically implemented at the hardware level. In many hardware architectures, division is defined in such a way that it rounds towards zero, which naturally leads to a remainder operation when used with the % operator.</blockquote><p>In #chicken@libera.chat:</p><blockquote>&lt;Bunny351&gt; what is decisive is probably what the CPU does (e.g. &quot;idiv&quot;) as low level languages will use whatever the CPU does by default</blockquote><p>In #c@libera.chat:</p><blockquote>&lt;supakeen&gt; From what I recall it had to do with the implementation being allowed to pick what to do in the case `/` (round to -inf or round to 0)<br></br>&lt;supakeen&gt; So % automatically became its brother.<br></br>&lt;supakeen&gt; This was also defined at some point.<br></br>&lt;supakeen&gt; It likely has to do with / and % working together.<br></br>&lt;siiky&gt; so it&#39;s just an historical implementation detail?<br></br>&lt;supakeen&gt; No, it&#39;s that remainder plus integer division work well together.</blockquote><h2>Conclusion</h2><p>If you can take out of this post a single little thing, let it be this: REMAINDER IS NOT MODULO!</p><p>And please share the word!</p><h2>Replies</h2><ul><li><a href="https://portal.mozz.us/gemini/freeshell.de/gemlog/2023-06-18_Division__remainder__mod.gmi">Division, remainder, mod ➗%❓</a></li></ul></body></html></content> <id>gemini://siiky.srht.site/algebra/mod_not_rem.gmi</id> <published>2023-06-17T00:00:00Z</published> <title type="text">MODULO IS NOT REMAINDER</title> <updated>2023-06-17T00:00:00Z</updated> <link href="https://siiky.srht.site/algebra/mod_not_rem.html" rel="alternate" type="text/html" hreflang="en" title="MODULO IS NOT REMAINDER" /> <link href="gemini://siiky.srht.site/algebra/mod_not_rem.gmi" rel="alternate" type="text/gemtext" hreflang="en" title="MODULO IS NOT REMAINDER" /> </entry> <entry> <content type="html"><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"><html lang="en" xml:lang="en"><head><meta charset="utf-8"></meta></head><body><h1>Petri Nets Logs</h1><p>siiky<br></br>2023/05/16<br></br>2023/05/16<br></br>en</p><p>This is the list of logs I wrote about my journey studying Petri nets. I&#39;ll try to make this a sort of regular log with updates, my comments/opinions, and maybe notes. One of these days I should start combing through and arranging my notes to publish them.</p><ul><li><a href="log001.html">#001</a></li><li><a href="log002.html">#002</a></li><li><a href="log003.html">#003</a></li><li><a href="log004.html">#004</a></li><li><a href="log005.html">#005</a></li><li><a href="log006.html">#006</a></li><li><a href="log007.html">#007</a></li></ul></body></html></content> <id>gemini://siiky.srht.site/petri_nets/index.gmi</id> <published>2023-05-16T00:00:00Z</published> <title type="text">Petri Nets Logs</title> <updated>2023-05-16T00:00:00Z</updated> <link href="https://siiky.srht.site/petri_nets/index.html" rel="alternate" type="text/html" hreflang="en" title="Petri Nets Logs" /> <link href="gemini://siiky.srht.site/petri_nets/index.gmi" rel="alternate" type="text/gemtext" hreflang="en" title="Petri Nets Logs" /> </entry> <entry> <content type="html"><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"><html lang="en" xml:lang="en"><head><meta charset="utf-8"></meta></head><body><h1>(Un)free public service</h1><p>siiky<br></br>2023/05/15<br></br>2023/05/15<br></br>en</p><p>I was here reading this:</p><blockquote>Para solicitar cópia de um determinado conteúdo basta registar-se como utilizador e pressionar o botão LICENCIAR CONTEÚDO disponível na pagina de cada conteúdo, ou, caso o conteúdo que pretenda não esteja ainda disponível neste portal, aceder à área de Serviços e preencher e enviar o formulário de pedido de licenciamento.</blockquote><ul><li><a href="https://arquivos.rtp.pt/sobre-o-arquivo">https://arquivos.rtp.pt/sobre-o-arquivo</a></li></ul><p>In English (pretty direct translation):</p><blockquote>To request a copy of some content just register as a user and press the &quot;LICENSE CONTENT&quot; that&#39;s available on the page of each content, or, if the content you&#39;re looking for is not yet available in this portal, access the services area and fill and send a licensing request form.</blockquote><p>&quot;Awesome!&quot; I thought, &quot;maybe I can download things to watch offline!&quot; I had no account previously, so there I go create an account, add all my personal details[^0], and it even accepted my 30+ characters long randomly generated password[^1]!</p><p>I opened the EP01 page of &quot;Vidas Proibidas - Ballet Rose&quot; and hit the &quot;LICENCIAR CONTEÚDO&quot; button.</p><ul><li><a href="../wiki/cinema.ballet_rose.html">../wiki/cinema.ballet_rose.html</a></li></ul><p>There&#39;s a dropdown menu to specify usage (domestic/private, or education/research/cultural), three other dropdown menus with a single option each, and a radio button labeled &quot;Ficheiro para download&quot; (&quot;File for download&quot;). It&#39;s looking good, promising!</p><p>And then... &quot;Valor do licenciamento&quot; (&quot;Value of licensing&quot;): 25€! Excluding tax! For domestic/private use, prices are determined only by length: 8€, 15€, and 25€, for &lt;5min, &lt;45min, and &gt;45min, respectively.</p><ul><li><a href="https://arquivos.rtp.pt/servicos">https://arquivos.rtp.pt/servicos</a></li><li><a href="https://arquivos.rtp.pt/tabela-de-precos">https://arquivos.rtp.pt/tabela-de-precos</a></li></ul><p>RTP is supposed to be a public service, so, in theory, the taxes I pay serve, at least in part, to fund it. But if I want to download material (to watch, nothing else) from this official &quot;public service archive&quot; I still have to pay... Go figure.</p><ul><li><a href="https://pt.wikipedia.org/wiki/Rádio_e_Televisão_de_Portugal">https://pt.wikipedia.org/wiki/Rádio_e_Televisão_de_Portugal</a></li><li><a href="https://en.wikipedia.org/wiki/Rádio_e_Televisão_de_Portugal">https://en.wikipedia.org/wiki/Rádio_e_Televisão_de_Portugal</a></li></ul><p>[^0]: ID number, VAT number, and address -- weird, but ok...</p><p>[^1]: Unlike some government(!) sites that have a 13-character maximum lenght, and accept barely no symbol characters -- I&#39;m looking at you Social Security!</p></body></html></content> <id>gemini://siiky.srht.site/kB45oC/unfree-public-service.gmi</id> <published>2023-05-15T00:00:00Z</published> <title type="text">(Un)free public service</title> <updated>2023-05-15T00:00:00Z</updated> <link href="https://siiky.srht.site/kB45oC/unfree-public-service.html" rel="alternate" type="text/html" hreflang="en" title="(Un)free public service" /> <link href="gemini://siiky.srht.site/kB45oC/unfree-public-service.gmi" rel="alternate" type="text/gemtext" hreflang="en" title="(Un)free public service" /> </entry> <entry> <content type="html"><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"><html lang="en" xml:lang="en"><head><meta charset="utf-8"></meta></head><body><h1>RE: Two Energy Crises</h1><p>siiky<br></br>2023/05/12<br></br>2023/05/12<br></br>en</p><ul><li><a href="https://portal.mozz.us/gemini/jsreed5.org/log/2023/202305/20230510-two-energy-crises.gmi">https://portal.mozz.us/gemini/jsreed5.org/log/2023/202305/20230510-two-energy-crises.gmi</a></li><li><a href="https://portal.mozz.us/gemini/textmonger.pollux.casa/gemlog/2023-05-11-02-re-rob-s-two-energy-crises.gmi">https://portal.mozz.us/gemini/textmonger.pollux.casa/gemlog/2023-05-11-02-re-rob-s-two-energy-crises.gmi</a></li></ul><blockquote>The second crisis is a crisis of energy stored in our own bodies: the modern pandemic of obesity. Fat is stored metabolic energy, and the richness of food available to use in the West--and particularly in the United States--is such that we ingest far more metabolic energy than our ancestors did.</blockquote><blockquote>I suspect the reliance on machines factor is negligible compared to the too-bad-we-can-no-longer-bring-ourselves-to-say-it gluttony forbid.</blockquote><p>Yes and yes! It could maybe be explained by (1) the need to sell more to make more money, or (2) some sort of cross-generational memory of &quot;the harsher times&quot;[^0].</p><p>(1) implies each producer/seller must produce a ton to make some money, because producing less than there is demand for would mean profit &quot;loss&quot; -- obviously! Because there&#39;s so much stuff available, and because most people still have enough money to survive AND to spend on non-essential things, why spend a little more to get this small luxury/comfort? And after you buy it you won&#39;t let it spoil, right? That would be a waste, right? And by the way... if all this stuff that&#39;s for sale isn&#39;t bought, it&#39;ll spoil too! This way of living is a waste-producing machine.</p><ul><li><a href="../wiki/books.html">Books list § Sex at Dawn</a></li><li><a href="https://en.wikipedia.org/wiki/James_Suzman">https://en.wikipedia.org/wiki/James_Suzman</a></li></ul><p>(2) it really sucks not to have enough to get by. The most obvious way to try to avoid it is to hoard everything you can while you can. And again, after you have it, you won&#39;t let it spoil because (see above). On the other hand, most people in the city have so much at all times they won&#39;t ever know what it is to not have enough to get by, so this hoarding feeling isn&#39;t justified.</p><p>Small experiment: go to your fridge, cupboards, &amp;c, and realistically think how long it would take you (plus whoever lives with you) to consume all that. I happened to do that yesterday here (just chance); my conclusion was about 2 weeks. It&#39;s way too much for my circumstances (living in a city with shops, supermarkets, malls, &amp;c close by).</p><p>Added both posts to the reclog.</p><ul><li><a href="../reclog.html">../reclog.html</a></li></ul><p>[^0]: My grandma would often tell me when I was younger how &quot;in the old days&quot; (~40+ years ago) they sometimes didn&#39;t have anything to eat. Often they had only a single small piece of bread to split between 6 or more people.</p></body></html></content> <id>gemini://siiky.srht.site/kB45oC/re-two-energy-crises.gmi</id> <published>2023-05-12T00:00:00Z</published> <title type="text">RE: Two Energy Crises</title> <updated>2023-05-12T00:00:00Z</updated> <link href="https://siiky.srht.site/kB45oC/re-two-energy-crises.html" rel="alternate" type="text/html" hreflang="en" title="RE: Two Energy Crises" /> <link href="gemini://siiky.srht.site/kB45oC/re-two-energy-crises.gmi" rel="alternate" type="text/gemtext" hreflang="en" title="RE: Two Energy Crises" /> </entry> <entry> <content type="html"><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"><html lang="en" xml:lang="en"><head><meta charset="utf-8"></meta></head><body><h1>RE: The Trouble With IDEs</h1><p>siiky<br></br>2023/05/12<br></br>2023/05/12<br></br>en</p><ul><li><a href="https://portal.mozz.us/gemini/clanmorgan.org/gemlog/2023-05-12-the-trouble-with-ides.gmi">https://portal.mozz.us/gemini/clanmorgan.org/gemlog/2023-05-12-the-trouble-with-ides.gmi</a></li></ul><blockquote>IDEs aren’t exactly set up to succeed; the promise is right there in the name. They’re supposed to do everything—they are supposed to be the very environment in which you develop.</blockquote><p>That should be a hint to anyone that it&#39;s a lost battle. If your projects&#39; feature set includes everything under the sun and more... move on, go take a walk, much better use of your time.</p><blockquote>If you’ve ever tried an IDE then you’ve probably had an experience like Sean’s; you powered through irrelevant-seeming configuration, broken features and unreasonable hangs and slowdowns, then gave up.</blockquote><p>Yup, exactly my experience with the IDEs I&#39;ve tried (admittedly, not many: 4?). And add &quot;slow as molasses&quot; to this feature set.</p><p>The first time I tried one I was at a workshop[^0], and they said we needed Visual Studio -- wasn&#39;t announced beforehand, I guess they assumed everyone had it installed? And how was it, you ask? I spent half the workshop waiting for the 40GB download to end, a good few tens of minutes installing it, and a good few minutes waiting for it to start up. Finally I was ready to get shit done! Except the workshop was now at the end. Complete waste of my time. I uninstalled the fucking thing right away.</p><p>Why would anyone want to download an XXXGB program to do something an XMB program can do much better, faster, more reliably, ... ? Why would I have to suffer through all this just because some small % of users want(!) a feature I will NEVER need or want?</p><p>IMO it&#39;s vastly better to go the other way around: take the smallest thing you can start working with, and add the features you need(!) on top -- no more, no less. This is what I&#39;ve been doing since I started using (Neo)Vi(m), and it&#39;s never failed me once, no matter the environment, computer, or configurations. Wherever I go, as long as I have Vi, I can program -- minus the very real &quot;shit, I don&#39;t have hjkl, what do I do now?&quot;</p><blockquote>At that point you have a choice: you can give up and fall back to an editor that just works; or you can persevere and slowly build up the bag of tricks that you need in order to be productive with an IDE. Some things will make sense. Some things won’t. Sometimes there will be an update and it breaks under you and you have to figure out some new tricks.</blockquote><p>Except for the update breaking (which doesn&#39;t happen with Vi), the same is said about the &quot;classic&quot; editors (Vi &amp; Emacs)... Somehow the same arguments are a con for editors but a pro for IDEs?</p><blockquote>Be thankful that you had a choice.</blockquote><p>I certainly am enjoying it while I can! I&#39;d prefer not to get the funny-sideways-looks -- &quot;what do you use then, if not &lt;insert your IDE of choice&gt;?!&quot;, every time I tell a fellow programmer for the first time that I don&#39;t use any IDEs -- but at least I can still use whatever I want. At the end of the day, I feel for those who think they need an IDE to program, it&#39;s sad.</p><blockquote>IDEs have been around for decades, and disliked for almost as long;</blockquote><p>With good reason, I&#39;d say!</p><p>Start with an editor, a compiler/interpreter, maybe a build tool to automate compiling[^1]. This is strictly what a programmer ever needs to get shit done. Add to that a program for each smaller feature:</p><ul><li>text-based search&amp;replace</li><li>syntax highlighting</li><li>linting (usually already a standalone program)</li><li>compile errors/warnings in-editor</li><li>tags (where things are defined, used, &amp;c)</li><li>jump-to-definition</li><li>find-uses</li><li>search&amp;replace (not text-based)</li><li>Git integration or w.e. (if only people started by learning how to use the git command and that Git != GitHub...)</li><li>&amp;c</li><li>&amp;c</li><li>&amp;c</li></ul><p>Ideally, an IDE would be a collection of such composable, interoperable, and communicating programs, rather than a single program that tries but fails at all of these things.</p><p>I can live well without any of these features. Some are native to (Neo)Vim so I use them: text-based search&amp;replace (:help :s), syntax highlighting[^2] (:syn on), tags (:help tags), jump-to-definition (&lt;C-]&gt;), compile errors/warnings in-editor (:help :make), ... I have a few niceties plugins, not many. Linting and other more advanced features are available through plugins too. There are some niceties that I would like to have but don&#39;t because it&#39;s just tmw setting them up. And I will never replace a good and reliable editor with a slow and unreliable IDE for any of them.</p><p>[^0]: Xamarin IIRC, I clearly didn&#39;t know what I was getting myself into at the time. I know better now.</p><p>[^1]: Somehow, build tools is another one of those things trying to do everything under the sun and more... A couple weeks ago I had the misfortune of using Maven for a PA. I couldn&#39;t for the life of me get the tests to run with Maven even though they run on my coleagues&#39; IDEs (IntelliJ I think). AFAIU the IDE also used the Maven config files to determine how and which tests to run, but somehow, no no no, no tests here.</p><p>[^2]: Syntax highlighting is one of those that people strongly feel is necessary but, really, it isn&#39;t. Try it for a couple of hours. If you can&#39;t read your code without it, maybe your code needs more human-readability.</p></body></html></content> <id>gemini://siiky.srht.site/programming/re-the-trouble-with-ides.gmi</id> <published>2023-05-12T00:00:00Z</published> <title type="text">RE: The Trouble With IDEs</title> <updated>2023-05-12T00:00:00Z</updated> <link href="https://siiky.srht.site/programming/re-the-trouble-with-ides.html" rel="alternate" type="text/html" hreflang="en" title="RE: The Trouble With IDEs" /> <link href="gemini://siiky.srht.site/programming/re-the-trouble-with-ides.gmi" rel="alternate" type="text/gemtext" hreflang="en" title="RE: The Trouble With IDEs" /> </entry> <entry> <content type="html"><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"><html lang="en" xml:lang="en"><head><meta charset="utf-8"></meta></head><body><h1>Abstraction is great</h1><p>siiky<br></br>2023/04/22<br></br>2023/04/22<br></br>en</p><p>... but read the code!</p><p>Yesterday a colleague found a deadlock situation in my code. After I explained in broad terms the whole flow, they asked &quot;what if ...?&quot;</p><p>Indeed there was a possible deadlock. But afterwards they started trying to prove to me that the deadlock wasn&#39;t possible because &quot;we can see beforehand if we need to lock here&quot;, and I had to tell them that &quot;no, that&#39;s not how that goes, because before we can check if we need to lock, we have first to update some internal state for which we need the lock&quot;. They even made some message sequence diagrams to explain the circumstances.</p><p>Basically, they were thinking of a previous version of the program. And I had to tell them that that&#39;s not how the new program went, at least 3 times.</p><p>So, abstraction is great, but read the code!</p></body></html></content> <id>gemini://siiky.srht.site/programming/abstraction-is-great.gmi</id> <published>2023-04-22T00:00:00Z</published> <title type="text">Abstraction is great</title> <updated>2023-04-22T00:00:00Z</updated> <link href="https://siiky.srht.site/programming/abstraction-is-great.html" rel="alternate" type="text/html" hreflang="en" title="Abstraction is great" /> <link href="gemini://siiky.srht.site/programming/abstraction-is-great.gmi" rel="alternate" type="text/gemtext" hreflang="en" title="Abstraction is great" /> </entry> <entry> <content type="html"><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"><html lang="en" xml:lang="en"><head><meta charset="utf-8"></meta></head><body><h1>RE: Bitcoin Still 3x Better For Environment Than Cars</h1><p>siiky<br></br>2023/04/17<br></br>2023/04/17<br></br>en</p><ul><li><a href="https://portal.mozz.us/gemini/mediocregopher.com/posts/bitcoin-co2.gmi">https://portal.mozz.us/gemini/mediocregopher.com/posts/bitcoin-co2.gmi</a></li></ul><h2>Counter-arguments</h2><blockquote>If you own a car, you&#39;re doing 3x the damage that I am by owning Bitcoin, so watch out where you throw those stones.<br></br><br></br>(...)<br></br><br></br>This is the same shit as when we&#39;re told we should be recycling and turning off lights in order to save the world. It&#39;s just a distraction from the real culprits.</blockquote><p>Just no. Bitcoin is not 3x better for the environment than cars, it&#39;s at most just 3x less bad for the environment than cars. Entirely different things. If X and Y are both bad, X being less bad than Y doesn&#39;t somehow make it good, it&#39;s just less bad.</p><p>You could argue, or try to, that X is more or less worth the badness in comparison to Y (considering their badness and what is gained by either). But concluding that X is more worth than Y does not imply that X is better than Y, nor does it even imply that X is less bad than Y (because badness is absolute while worth is relative).</p><p>And then, someone throwing stones at cryptocurrency mining (figuratively) is likely to also throw stones at cars &amp;c (figuratively, but I wish also literally). That is allowed, one does not exclude the other.</p><p>Continuing from the second point, cars are actually pretty efficient at extracting/using the energy out of some given amount of dinosaur juice since we have some decades of research and engineering on that front. In contrast, PoW mining is just plain wasteful, like playing the lottery: 1M people spend 2€ so that maybe 1 person can earn 2M€[^0] -- completely unbalanced investment and return. And if nobody wins those sweet 2M€ this round, let&#39;s go again and see how it goes!</p><blockquote>If you own a car, (...)</blockquote><p>Let&#39;s nitpick this for a second.</p><p>My mom owns a car but uses it only 2 days a week (generally): to get to the volunteer firefighters headquarters and back home, and to commute to work and back home. That&#39;s because buses either don&#39;t operate or have shitty schedules on those days (it would take roughly the same amount of time to go by foot). The rest of the week she commutes by bus.</p><p>Now, does her owning a car do 3x the damage of your owning Bitcoin? What if she used it only once a month? Owning a car doesn&#39;t pollute (roughly speaking, since we&#39;re discussing fuel burning).</p><blockquote>(...) by owning Bitcoin, (...)</blockquote><p>And this.</p><p>What is meant by &quot;owning Bitcoin&quot;? If it doesn&#39;t include mining, then it doesn&#39;t pollute more than storing anything on a computer. We&#39;re all using computers to read, write, and share these thoughts, so we generally think the resulting pollution is acceptable (we shouldn&#39;t take that as a given).</p><p>If it does include the network maintenance, do you run your own node and mine with your own computers? Or are you &quot;shifting responsibility&quot; to this unknown group of miners?</p><p>If you don&#39;t run your own node I&#39;m not sure you truly believe in what Bitcoin was made for... If you do, then it could be that your &quot;3x better&quot; may be closer to &quot;1x better^Wthe same&quot;!</p><h2>Better arguments?</h2><p>Here&#39;s a few things I can think of that could be better arguments for cryptocurrencies vs cars:</p><p>Compare the energy efficiency of the banking system with that of a cryptocurrency network. Good luck finding data on the banking system as that goes against the banking system&#39;s interests.</p><p>Though Americans sometimes seem to believe so, the USA is not the world (a mere observation, no personal offense is meant towards any American)! There are more cars in world than in the USA alone (obviously), and there are more Bitcoin users in the world than in the USA alone (obviously, though users are probably more concentrated in the USA than outside). So compare the two. Because energy consumption and pollution of the Bitcoin network doesn&#39;t grow with the number of users but with the number of miners, while energy consumption and pollution of cars grows with car users, the worth (gained/badness ratio) of the Bitcoin network over cars in the world greatly increases.</p><p>There are actual alternatives to cars and some awesome countries already show how it&#39;s done (watch some NotJustBikes videos on YT if you don&#39;t know what I&#39;m talking about). You can&#39;t say the same about banks/money-things. If you think there&#39;s nothing wrong with banks and there&#39;s no need of an alternative, then send me all of your money, I will keep it safe just for you, trust me[^1]. Banks go to shit, people lose their hard-earned money, and those responsible don&#39;t give a shit because it wasn&#39;t their money they lost. It&#39;s happen once in PT during my (short-ish) lifetime (maybe twice, not certain), and it&#39;s happening again now in some countries.</p><p>[^0] Not 100% 1:1 with real-life lottery because in real-life ~1M€ &quot;vanish&quot; nobody knows where to, but it serves the point well enough.</p><p>[^1] Similar to &quot;Nothing to Hide&quot;: &quot;if you think you have nothing to hide, give me all your passwords, keys of your house, etc&quot;</p></body></html></content> <id>gemini://siiky.srht.site/kB45oC/re-bitcoin-co2.gmi</id> <published>2023-04-17T00:00:00Z</published> <title type="text">RE: Bitcoin Still 3x Better For Environment Than Cars</title> <updated>2023-04-17T00:00:00Z</updated> <link href="https://siiky.srht.site/kB45oC/re-bitcoin-co2.html" rel="alternate" type="text/html" hreflang="en" title="RE: Bitcoin Still 3x Better For Environment Than Cars" /> <link href="gemini://siiky.srht.site/kB45oC/re-bitcoin-co2.gmi" rel="alternate" type="text/gemtext" hreflang="en" title="RE: Bitcoin Still 3x Better For Environment Than Cars" /> </entry> <entry> <content type="html"><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"><html lang="en" xml:lang="en"><head><meta charset="utf-8"></meta></head><body><h1>Societal slavery</h1><p>siiky<br></br>2023/03/19<br></br>2023/04/16<br></br>en</p><p>Society seems to run as some kind of megaslavery system. Depending on the POV, it&#39;s not quite as bad as actual slavery some mere centuries ago: the majority of us don&#39;t work in back-breaking conditions, we&#39;re not (as) starved, we&#39;re not whipped, we have some sort of &quot;dignity&quot; (whatever this word means), and health is also mostly improved (apart from the usual suspects: cancer, sleep deprivation, obesity, diabetes, ... that I guess are kinda recent &quot;inventions&quot; but not sure).</p><p>The most obvious common aspect is the lack of freedom. Both now and then, &quot;you go to work for me right now or else...!&quot; The whip, as mentioned, is &quot;not real&quot;, not literal. We&#39;re more civilized now, after all. The whole scheme is slightly different. It works more like a carrot &amp; stick. The things you (think you) want are the carrot. And the stick is this magic thing that is extended as much as you don&#39;t have the means to obtain the carrot.</p><p>There are things that we geniunely need, obio: air, water, food, shelter, ... Air we mostly get for free (in varying quality). Depending on where you live, you can get drinkable (or not) water for free or not. Shelter and food is a different story. It is possible to grow your own food and be more independent thus. But that would go against the scheme this society[^0] is built on. For this society it&#39;s more beneficial if people are dumb and can&#39;t become independent. Because of it, no effort is spent instructing society members on this sort of skill.</p><p>Money, the &quot;silly paper&quot; (as my boss put it), is the language of this civilized society. Everyone understands money, all of the different dialects. So in this society, money is the carrot-obtainium and the carrot can be anything that you can exchange for money. Even the essential needs (such as food and shelter). In fact, you&#39;re mostly expected to get food and shelter in exchange for money.</p><p>We shorten the stick through work, you already know that. The thing is, the general population will never ever have a short enough stick that we can stop worrying about food, shelter, and the other necessities. Everyone is kept at that &quot;just enough&quot; level, so that we don&#39;t have to worry about it at all times, but not enough so that we can go for any extended periods of time without worrying. And this is how &quot;work or else&quot; is enforced. Nobody (generally, I expect) is explicitly told that, true. But saying that you&#39;re not forced to work is a sort of sick joke and in bad taste.</p><p>One resulting problem is that we&#39;ve lived in this state for so long that work has become one of the &quot;necessities&quot; -- &quot;of course you have to work!&quot; If you say &quot;oh I wish I didn&#39;t have work&quot; (in fact, you don&#39;t), it&#39;s likely you&#39;ll hear someone next to say &quot;I know, but is one to do?&quot; That&#39;s if you&#39;re lucky, otherwise you&#39;ll hear &quot;get over it, everone has to work, how are you gonna get food, a house, ...?&quot; Don&#39;t listen. It&#39;s not that they&#39;re irremediable idiots or anything like that. It&#39;s more like they don&#39;t believe any other way of life is possible, and they&#39;ll only kill your mood and any resemblance of hope with their replies. And it&#39;s not even that they mean you ill: given what they believe in, it&#39;s the only reply they can reasonably give!</p><p>And the other problem is that almost everyone is in a figurative hamster wheel -- the majority not even aware of it. We get a carrot in exchange for a more extended stick. We want a new carrot now, so we work to shorten the stick. Loop. Some are in a worse situation than others: they work so that they can work more, they can never shorten the stick enough to rest a little. And worse of all are those in that situation and aware of it. I can&#39;t help but think that this meaningless loop is part of the reason some commit suicide.</p><ul><li><a href="../psychology/fagots.html">../psychology/fagots.html</a></li></ul><p>It follows almost directly: if freedom was a measurable property of the physical Universe, money would be its SI unit[^1]. And from that it most naturally follows that good monetary practices are an indispensable skill for the free(-to-be) citizen of this society. It isn&#39;t an easily acquired skill, and there are inumerous traps layed out across the land waiting for you to fall into, just like a pack of hunters each patiently waiting for prey. But you can practice and with some effort improve your situation.</p><p>At the heart of it I believe is frugality. I truly believe this is the single most important objective of all, not only for monetary freedom. And after that, recognizing traps and practicing their avoidance as much as feasible. Being anti-social is a must (I&#39;ll try to explain).</p><p>First, some of the traps. At some point in time, it became generally socially acceptable to con every citizen (as many and as much as possible), as long as it&#39;s within the &quot;Law&quot;[^2]. For example, everyone knows &quot;teleshopping&quot; is a bad idea. Even though it&#39;s legal, &quot;the first 10 to call get this amazing discombobulator for free with their Samurai Plus[^3]&quot; is a trap and you know it. Everyone knows it. Why? We&#39;ve learned it with time: if it sounds too good to be true, it probably is! And we&#39;ve learned to avoid this one too (I hope you have). Personally, I can&#39;t help but laugh at and mock those ridiculous ads.</p><p>Probably the largest kind of trap operation we&#39;ve set ourselves into is &quot;special occasions&quot;: You played your first concert, let&#39;s celebrate! You &quot;earned&quot; your first job, let&#39;s celebrate! You got your first paycheck, let&#39;s celebrate! It&#39;s my/your/our Nth X anniversary, ...! We&#39;re having a baby, ...! We&#39;re getting married, ...! We got married, ...! You passed the exam, ...! You graduated, ...! It&#39;s Easter, ...! It&#39;s Christmas, ...! It&#39;s New Year&#39;s, ...! It&#39;s father&#39;s day, ...! It&#39;s mother&#39;s day, ...! It&#39;s women&#39;s day, ...! It&#39;s Valentine&#39;s day, ...!</p><p>Give me a break! Some day we&#39;ll be celebrating waking up, breathing, and taking a shit...</p><p>I have absolutely nothing against celebrating any of these occasions. I&#39;ve celebrated many more minor events than these. It&#39;s how we&#39;re supposed to celebrate, according to norm and convention of this society (which necessarily involves extending the stick as much as possible), that&#39;s the problem. My advice is to be as anti-social[^4] as you feasibly can. You DO NOT need to spend money to show an appreciation to your dad/mom/significant other, or your family during Christmas -- scientists say. Believe me, it&#39;s true -- I have the authority of a scientist, and next year of an engineer too!</p><p>Another large set of traps is the necessities. Everyone needs a car, good and very varied clothes and shoes, a shitton of creams/lotions and other shit to pollute your body with, the best iShit phone of today (can&#39;t be yesterday&#39;s, nonono), a house (so motherfucking big you could lodge a whole small village some couple hundred years ago), and of course I wouldn&#39;t forget, to travel and to be cultured. I say you don&#39;t need any of these. None.</p><p>If you can avoid these traps you&#39;re well on your way to be free. Really free. With some effort, striving to be more independent and self-reliant, you&#39;ll be able one day to stop turning and to step off the wheel and catch your breath; not just to hear but to listen to the birds chirping and the still water moving; not just to look up at the sky but to see it, and to see the flowers blooming, the wagtails wagging their tails, the swallows gliding, the blackbirds hopping, and the eagles spying; to smell the pine trees, the eucalyptuses, ...; not just to hold and touch with your hands but to feel your dog&#39;s and/or cat&#39;s fluffy hair, the bark of the trees, and the soft humid moss.</p><p>And then you&#39;ll know you&#39;re free.</p><p>[^0] I explicitly say &quot;this society&quot; (several times) to get this very important point across: this society is NOT the only way that humans can live, or have lived, in community.</p><p>[^1] Implicit is the fact that SI units are an invention of this society.</p><p>[^2] It&#39;s almost like &quot;Law&quot; was the (in)formal codification of the norms and conventions of this society.</p><p>[^3] I couldn&#39;t find a video of the scene I was thinking of in Spanish, only in English but ew, gross! If you haven&#39;t yet, I recommend watching the 2019 film &quot;El hoyo&quot;, it&#39;s great.</p><ul><li><a href="https://www.imdb.com/title/tt8228288">https://www.imdb.com/title/tt8228288</a></li><li><a href="https://en.wikipedia.org/wiki/The_Platform_(film)">https://en.wikipedia.org/wiki/The_Platform_(film)</a></li></ul><p>[^4] Being &quot;anti-social&quot; does not mean to not socialize with others; it means to go against norm and convention of this society, or at the very least, to not go along it.</p><h2>Inspirations of this post</h2><p>These are the books I feel have a stronger/more obvious connection (alphabetically):</p><ul><li>&quot;Brave New World&quot; -- meaningless loop of life and how twisted this society is (see quotes);</li><li>&quot;Budgeting 101&quot; -- frugality and getting (financially) off the wheel;</li><li>&quot;Gorgias&quot; -- there is a difference between right and wrong, between good and bad, between being and appearing to be, between a physician and a cook (the best possible example of the &quot;need&quot; vs &quot;want&quot; distinction), and that each person has the (natural rather than legal) right and duty to choose between the two;</li><li>&quot;Les Misérables&quot; -- duty and how it&#39;s like (see quote next);</li><li>&quot;Sex at Dawn&quot; -- opening my eyes to different kinds of liberties that were taken from us, how, and why, and for exposing me to different kinds of societies;</li><li>&quot;Tao Te Ching&quot; -- what really matters, what&#39;s natural, and how to behave naturally, i.e., according to nature;</li><li>&quot;Walden&quot; -- expresses in words what I think, feel, and like about &quot;the outdoors&quot; (the fact that this expression exists is a sign to me that this society is fucked).</li></ul><ul><li><a href="../wiki/books.html">../wiki/books.html</a></li></ul><p>This quote from &quot;Les Misérables&quot;:</p><blockquote>If one desires to be happy, sir, one must never understand duty; for, as soon as one has comprehended it, it is implacable.</blockquote><ul><li><a href="../words/quotes.html">../words/quotes.html</a></li></ul><p>This video I watched in December with a &quot;quote&quot; from &quot;Zhuangzi&quot;:</p><blockquote>The ideal life is this: you live in a small village, you live around family and friends, and you have everything you need, you have everything you want. And then sometimes, if you go on a stroll, you can walk out at the edge of the village, and if you listen really hard you can hear the chickens from the village next to you, but never in your life do you actually feel like you ever need to go to that village, and you might forever be in the village you came up in.</blockquote><ul><li><a href="https://yewtu.be/watch?v=VcHW0mpi9y8&amp;t=28m30s">Luke Smith, &quot;The Return to Normalcy&quot;</a></li><li><a href="https://en.wikipedia.org/wiki/Zhuangzi_(book)">&quot;Zhuangzi&quot;</a></li></ul><p>Some chats with a friend about &quot;Early Retirement Extreme&quot; (they&#39;ve read the book, I haven&#39;t yet).</p><ul><li><a href="https://en.wikipedia.org/wiki/Jacob_Lund_Fisker">https://en.wikipedia.org/wiki/Jacob_Lund_Fisker</a></li><li><a href="https://earlyretirementextreme.com">https://earlyretirementextreme.com</a></li></ul><p>And of course, my own life experience. I&#39;m getting sick of having to work... even though I started only ~4 years ago!</p><ul><li><a href="../philosophy/flexibility-life.html">Flexibility &amp; Life</a></li><li><a href="../psychology/fagots.html">Fagots</a></li><li><a href="../books/bill_gates.how_to_avoid_a_climate_disaster.html">Bill Gates, &quot;How to Avoid a Climate Disaster&quot;</a></li></ul><ul><li><a href="../wiki/notrelated.html">&quot;Not Related!&quot; S02E06</a></li><li><a href="../wiki/v.raphael_treza.borneo_death_blow.html">&quot;Borneo Death Blow&quot;</a></li></ul><ul><li><a href="../words/quotes.html">§ 2023-05-10, &quot;Who Am I?&quot;</a></li></ul><h2>Post scriptum</h2><p>With this above text alone I really can&#39;t express my true disgust for a lot of this society. There&#39;s so much more to it that I can&#39;t begin to explain even to myself, let alone to someone else in spoken or written words...</p><p>And when I try (e.g. this post) I invariably think it turned out cheesy... hurgh!</p></body></html></content> <id>gemini://siiky.srht.site/philosophy/societal-slavery.gmi</id> <published>2023-04-16T00:00:00Z</published> <title type="text">Societal slavery</title> <updated>2023-03-19T00:00:00Z</updated> <link href="https://siiky.srht.site/philosophy/societal-slavery.html" rel="alternate" type="text/html" hreflang="en" title="Societal slavery" /> <link href="gemini://siiky.srht.site/philosophy/societal-slavery.gmi" rel="alternate" type="text/gemtext" hreflang="en" title="Societal slavery" /> </entry> <entry> <content type="html"><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"><html lang="en" xml:lang="en"><head><meta charset="utf-8"></meta></head><body><h1>WTF ASM</h1><p>siiky<br></br>2023/04/08<br></br>2023/04/08<br></br>en</p><p>I was working yesterday on sbn and accidentally fixed digit subtraction (and consequently sbn subtraction).</p><ul><li><a href="../wiki/pl.c.html">../wiki/pl.c.html</a></li><li><a href="https://git.sr.ht/~siiky/c-utils/commit/070d452f67f63868137233dcecfd820f991e36d0">https://git.sr.ht/~siiky/c-utils/commit/070d452f67f63868137233dcecfd820f991e36d0</a></li></ul><p>Definitions needed to understand these excerpts: `sbn_digit` is `uint32_t`; `sbn_double_digit` is `uint64_t`; `sbn_double_digit_lower_half` is a macro that takes the 32 least-significant bits of a `sbn_double_digit`.</p><p>Here&#39;s the old (wrong) version:</p><pre>static sbn_digit _sbn_sub_digits (sbn_digit _a, sbn_digit _b, sbn_digit * _carry) { sbn_double_digit carry = *_carry; sbn_double_digit a = _a; sbn_double_digit b = _b; b += carry; return (a &gt;= b) ? (*_carry = 0), sbn_double_digit_lower_half(a - b): (*_carry = 1), sbn_double_digit_lower_half(b - a); } </pre><p>Here&#39;s the new (fixed) version:</p><pre>static sbn_digit _sbn_sub_digits (sbn_digit _a, sbn_digit _b, sbn_digit * _carry) { sbn_double_digit carry = *_carry; sbn_double_digit a = _a; sbn_double_digit b = _b; b += carry; sbn_double_digit r = (a &gt;= b) ? ((*_carry = 0), (a - b)): ((*_carry = 1), (b - a)); return sbn_double_digit_lower_half(r); } </pre><p>What&#39;s the difference? Why does one work correctly but the other doesn&#39;t? I have no clue... Obviously I expected both to be the same.</p><p>It didn&#39;t occur to me but a friend suggested taking a look at the assembly -- good idea! For some reason `gcc -S` generated a huge file like this:</p><pre>// ... .LASF151: .string &quot;_sbn_sub_digits&quot; // ... .long .LASF151 .byte 0x5 .value 0x186 .byte 0x12 .long 0x9e .long 0x1216 .uleb128 0x1 .string &quot;_a&quot; .byte 0x5 .value 0x186 .byte 0x2d .long 0x9e .uleb128 0x1 .string &quot;_b&quot; .byte 0x5 .value 0x186 .byte 0x3b .long 0x9e .uleb128 0x2 // ... </pre><p>No clue what this is either... So I turned to `objdump`, which was more helpful.</p><p>Here&#39;s the old (wrong) version:</p><pre>0000000000401834 &lt;_sbn_sub_digits&gt;: 401834: 8b 02 mov (%rdx),%eax 401836: 89 ff mov %edi,%edi 401838: 89 f6 mov %esi,%esi 40183a: 48 01 f0 add %rsi,%rax 40183d: 48 39 c7 cmp %rax,%rdi 401840: 72 09 jb 40184b &lt;_sbn_sub_digits+0x17&gt; 401842: c7 02 00 00 00 00 movl $0x0,(%rdx) 401848: 29 f8 sub %edi,%eax 40184a: c3 ret 40184b: c7 02 01 00 00 00 movl $0x1,(%rdx) 401851: eb f5 jmp 401848 &lt;_sbn_sub_digits+0x14&gt; </pre><p>Here&#39;s the new (fixed) version:</p><pre>0000000000401834 &lt;_sbn_sub_digits&gt;: 401834: 8b 0a mov (%rdx),%ecx 401836: 89 ff mov %edi,%edi 401838: 89 f6 mov %esi,%esi 40183a: 48 01 f1 add %rsi,%rcx 40183d: 48 39 cf cmp %rcx,%rdi 401840: 72 0d jb 40184f &lt;_sbn_sub_digits+0x1b&gt; 401842: c7 02 00 00 00 00 movl $0x0,(%rdx) 401848: 48 89 f8 mov %rdi,%rax 40184b: 48 29 c8 sub %rcx,%rax 40184e: c3 ret 40184f: c7 02 01 00 00 00 movl $0x1,(%rdx) 401855: 48 89 c8 mov %rcx,%rax 401858: 48 29 f8 sub %rdi,%rax 40185b: c3 ret </pre><p>My ASM-fu was never very good but by now it&#39;s non-existent. One thing I noticed though is that on the wrong version it&#39;s using edi/eax (the 32bit registers right?), while the fixed version is using the rdi/rcx/rax (the 64bit registers right?). Is that it? But why? I can&#39;t even remember what&#39;s the arguments order: `sub X,Y` is `X-Y` or `Y-X`? `mov X,Y` is `X&lt;-Y` or `X-&gt;Y`?</p></body></html></content> <id>gemini://siiky.srht.site/programming/wtf-asm.gmi</id> <published>2023-04-08T00:00:00Z</published> <title type="text">WTF ASM</title> <updated>2023-04-08T00:00:00Z</updated> <link href="https://siiky.srht.site/programming/wtf-asm.html" rel="alternate" type="text/html" hreflang="en" title="WTF ASM" /> <link href="gemini://siiky.srht.site/programming/wtf-asm.gmi" rel="alternate" type="text/gemtext" hreflang="en" title="WTF ASM" /> </entry> <entry> <content type="html"><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"><html lang="en" xml:lang="en"><head><meta charset="utf-8"></meta></head><body><h1>Transitive reduction</h1><p>siiky<br></br>2023/03/04<br></br>2023/03/04<br></br>en</p><p>There&#39;s this operation on graphs/relations called &quot;transitive reduction&quot; (I didn&#39;t learn its name until very recently). It can be used on a graph/relation to compute another (possibly smaller) graph/relation that has no redundant edges (assuming transitivity). And I&#39;ve been thinking about how to do it for about two years (dam), because I needed it for some POSet things (Scheme § poset). Some weeks ago I was walking home, not thinking about anything in particular, and an algorithm just popped into my brain out of nowhere!</p><ul><li><a href="https://en.wikipedia.org/wiki/Transitive_reduction">https://en.wikipedia.org/wiki/Transitive_reduction</a></li><li><a href="../wiki/transitive_reduction.html">../wiki/transitive_reduction.html</a></li><li><a href="https://git.sr.ht/~siiky/experiments/tree/main/item/transitive-reduction.scm">https://git.sr.ht/~siiky/experiments/tree/main/item/transitive-reduction.scm</a></li><li><a href="../wiki/pl.scheme.html">Scheme (§ poset)</a></li></ul><p>The idea is so simple that I&#39;m flabbergasted I didn&#39;t come up with it two years ago, when I was kinda obsessed. (Though I haven&#39;t proven it works, intuitively I think it does).</p><p>Let&#39;s say `a → b` means that node &#39;b&#39; is directly reachable from node &#39;a&#39; (&quot;directly&quot; means there are no intermediate nodes); and let&#39;s say `a →* b` means that node &#39;b&#39; is reachable from node &#39;a&#39;, possibly through intermediate nodes (e.g. if `a → b → c`, we could say `a →* c`).</p><p>We&#39;ll call our graph G=(V, E), where V is the set of all nodes, and E is the relation `a →* b` (a, b ∈ V). We&#39;re looking to compute an E&#39; from E that is the relation `a → b`.</p><p>And here it is at last: ∀a, c ∈ V: (a →* c ∧ ∃b ∈ V: b≠c ∧ `a → b` ∧ `b →* c`) ⇒ remove `a →* c` from E.</p><p>There&#39;s one caveat with this algorithm: it only works for acyclic graphs (aka DAGs, graphs with no cycles). That&#39;s not a problem for me (I wanted it for POSets after all; see § &quot;Alternative definitions&quot;) so I didn&#39;t bother to think about the matter further, but beware.</p><ul><li><a href="https://en.wikipedia.org/wiki/Directed_acyclic_graph">https://en.wikipedia.org/wiki/Directed_acyclic_graph</a></li></ul><p>The implementation is also simple enough (see the ~siiky/experiments for previous versions):</p><pre>(import (srfi 42)) (define (reachable? E s d) (memq d (alist-ref s E))) (define (transitive-reduction E) (list-ec (:list s*sE E) (:let s (car s*sE)) (:let sE (cdr s*sE)) (cons s (list-ec (:list d sE) (if (not (any?-ec (:list c sE) (and (not (eq? c d)) (reachable? E c d))))) d)))) </pre><p>Very important note: this implementation assumes that E is the transitive closure! It may not compute the correct result otherwise. I just made this choice to KISS: this way I don&#39;t have to recursively check reachability. When I apply it to the posets experiment I&#39;ll be sure to change that.</p><p>I like how it turned out. SRFI 42 made it pretty.</p><ul><li><a href="https://srfi.schemers.org/srfi-42/srfi-42.html">SRFI 42</a></li></ul><p>A recursive `reachable?` could be something like this:</p><pre>(define (reachable? E s d) (let ((sE (alist-ref s E))) (or (memq d sE) (any?-ec (:list c sE) (reachable? E c d))))) </pre></body></html></content> <id>gemini://siiky.srht.site/programming/transitive-reduction.gmi</id> <published>2023-03-04T00:00:00Z</published> <title type="text">Transitive reduction</title> <updated>2023-03-04T00:00:00Z</updated> <link href="https://siiky.srht.site/programming/transitive-reduction.html" rel="alternate" type="text/html" hreflang="en" title="Transitive reduction" /> <link href="gemini://siiky.srht.site/programming/transitive-reduction.gmi" rel="alternate" type="text/gemtext" hreflang="en" title="Transitive reduction" /> </entry> <entry> <content type="html"><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"><html lang="en" xml:lang="en"><head><meta charset="utf-8"></meta></head><body><h1>Why we throw rice at weddings</h1><p>siiky<br></br>2023/02/26<br></br>2023/02/26<br></br>en</p><p>So here I was transcribing the excerpts I highlighted from &quot;The Second Thoughts of an Idle Fellow&quot; when this bit showed up:</p><blockquote>Our young men and women marry, and we kiss them and congratulate them; and, standing on the doorstep, throw rice and old slippers, (...)</blockquote><ul><li><a href="../wiki/book.jerome_klapka_jerome.seconds_thoughts_idle_fellow.html">../wiki/book.jerome_klapka_jerome.seconds_thoughts_idle_fellow.html</a></li></ul><p>I highlighted this excerpt, for sure, because I don&#39;t know why, and because I was surprised they did it too in 1898. Here&#39;s the answer (maybe):</p><ul><li><a href="https://www.brides.com/why-do-people-throw-rice-at-weddings-5073735">Michelle M. Winner, &quot;Why Do People Throw Rice at Weddings?&quot;</a></li></ul><blockquote>The rice toss is a symbolic wish to the just-married couple for a life of prosperity and fruitfulness, which to the ancients meant many children. As a blessing, guests shower the couple with rice as they exit the ceremony.</blockquote><p>So it&#39;s not new, here&#39;s more:</p><blockquote>The history and the tradition of showering newlyweds at a wedding with rice, seed, and grains predate Christianity. The Celts, mighty warriors, were also an agronomist culture who tossed rice, millet, and other grains to appease spirits and ask for blessing and fertility for the couple. Ancient Romans used wheat. Italians toss candies or sugared nuts. The Polish use rice but also place coins at the couple&#39;s feet to ensure prosperity. In Morocco, it&#39;s dried dates or figs and Eastern India&#39;s tradition is a rain of flower petals.</blockquote><p>The rest of the page is a bit of bull so you can ignore it... But I checked another couple of pages and both said kind of the same thing (hopefully the authors didn&#39;t just copy from each other to pass their pages as fact-checked).</p></body></html></content> <id>gemini://siiky.srht.site/kB45oC/why-throw-rice-at-weddings.gmi</id> <published>2023-02-26T00:00:00Z</published> <title type="text">Why we throw rice at weddings</title> <updated>2023-02-26T00:00:00Z</updated> <link href="https://siiky.srht.site/kB45oC/why-throw-rice-at-weddings.html" rel="alternate" type="text/html" hreflang="en" title="Why we throw rice at weddings" /> <link href="gemini://siiky.srht.site/kB45oC/why-throw-rice-at-weddings.gmi" rel="alternate" type="text/gemtext" hreflang="en" title="Why we throw rice at weddings" /> </entry> <entry> <content type="html"><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"><html lang="en" xml:lang="en"><head><meta charset="utf-8"></meta></head><body><h1>Am I fucked in the head?</h1><p>siiky<br></br>2023/02/10<br></br>2023/02/10<br></br>en</p><p>I saw this by chance in the Midnigh Pub.</p><ul><li><a href="https://portal.mozz.us/gemini/midnight.pub/posts/1263">A Death in the Family</a></li></ul><p>It reminded me of something I&#39;ve thought about but kinda tried not to too much.</p><p>My paternal granddad died a few years back -- I&#39;m the worst with dates, I&#39;m gonna guess 4~5 years? But the thing is, it didn&#39;t affect me much. It might not even be an understatement to say that it didn&#39;t affect me at all. I remember one of my cousins asking me how I was doing and thinking to myself that I was just fine.</p><p>That bugged me. That, concerned me more than the fact that my granddad had died. Then and now still. And it goes meta: it concerns me more that, it concerns me more that it didn&#39;t affect me than the fact he&#39;s died, than the fact he&#39;s died.</p><p>My paternal grandma died last year too. I know it was last year only because this was the first year I remember not celebrating her birthday (I did say I&#39;m the worst with dates). Getting the news that she&#39;d died was weird, totally unexpected to me. She was like this vigorous force, fierceness itself, nothing stopped her from doing whatever she wanted. Yes, she was over 90 and had some health issues, but she was also one of those old folks who don&#39;t stand down in the face of anything -- &quot;&#39;tis but a scratch&quot;. And again it barely affected me. More than my granddad, but only slightly.</p><ul><li><a href="https://yewtu.be/watch?v=ZmInkxbvlCs">&#39;Tis but a scratch</a></li></ul><p>Why is that? Am I an emotionless fuck? I&#39;d say no, knowing what I know. Could it be I just wasn&#39;t emotionally attached to either of them? That could be it... At least with my granddad; I have very few memories of him. In fact, I&#39;ve almost exclusively memories of visiting him at the home (&quot;lar&quot; in PT, which means &quot;lair&quot; and only makes me think of Mayhem&#39;s &quot;Wolf&#39;s Lair Abyss&quot;). With my grandma, I wasn&#39;t the most attached ever, not as much as most of my cousins (I&#39;m one of the youngest), but I spent time with her. I remember doing things with her. So... what then?</p><p>There&#39;s this other thing. Many springs ago I had a dog. He was a Pyrenean Mountain dog and he was the best, just the fucking best (&quot;do caralho&quot; in PT, or &quot;de puta madre&quot; in ES; you may have heard it in La Casa de Papel)! And there came a time around highschool when the vet diagnosed him with Alzheimer, which meant he sometimes didn&#39;t remember us. That was dangerous because, being such a burly dog and naturally wary of strangers, he could very easily attack one of us puny humans seriously in an &quot;episode&quot;. He did threaten my dad once -- or probably more but I don&#39;t remember well, maybe I didn&#39;t or don&#39;t want to believe it. So he &quot;had&quot; to be put down.</p><ul><li><a href="https://en.wikipedia.org/wiki/Pyrenean_Mountain_Dog">https://en.wikipedia.org/wiki/Pyrenean_Mountain_Dog</a></li></ul><p>I semi-frequently think about him and that time, and I feel like the worst, I feel really guilty about it. Among other things, because if only I&#39;d pushed back harder, maybe he could&#39;ve stayed with us for longer. Maybe it would&#39;ve turned out well, maybe not. We just don&#39;t know, we didn&#39;t know, we couldn&#39;t know, and we&#39;ll never know.</p><p>But that&#39;s kinda besides the point. What I think is the point, is that it was so much harder to deal with losing my dog than my paternal grandparents -- combined! So much so that I still haven&#39;t resolved the former... (real oof, had to take some breaks writing the two previous paragraphs)</p><p>Now, is that bad? Is it bad that losing my grandparents didn&#39;t affect me? Should one be unconditionally affected by the loss of one&#39;s close family member? And is it bad that losing one of my dogs was worse an experience to me? Am I just more human scum? Am I fucked in the head?</p></body></html></content> <id>gemini://siiky.srht.site/psychology/head-fucked.gmi</id> <published>2023-02-10T00:00:00Z</published> <title type="text">Am I fucked in the head?</title> <updated>2023-02-10T00:00:00Z</updated> <link href="https://siiky.srht.site/psychology/head-fucked.html" rel="alternate" type="text/html" hreflang="en" title="Am I fucked in the head?" /> <link href="gemini://siiky.srht.site/psychology/head-fucked.gmi" rel="alternate" type="text/gemtext" hreflang="en" title="Am I fucked in the head?" /> </entry> <entry> <content type="html"><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"><html lang="en" xml:lang="en"><head><meta charset="utf-8"></meta></head><body><h1>Fecking Bahamas</h1><p>siiky<br></br>2023/01/31<br></br>2023/01/31<br></br>en</p><p>Just today Fecking Bahamas released their 8th compilation! Like the previous ones, it&#39;s pay-what-you-want with no lower limit.</p><ul><li><a href="https://feckingbahamas.com">Fecking Bahamas</a></li><li><a href="https://feckingbahamas.bandcamp.com/album/viii-u-s-west-coast-pacific-northwest">VIII. U.S. West Coast // Pacific Northwest</a></li></ul><p>It&#39;s been a really long time since I last was this excited about an album! I&#39;m about halfway and it&#39;s pretty good. But there&#39;s this little something in Ireland and Australasia, even in France, missing here...</p><p>At first I was planning only a quick mention in the tinylog, but that doesn&#39;t make justice to how much I appreciate these compilations. So let&#39;s make a short summary of my favorite compilations and songs.</p><h2>IV. France</h2><ul><li><a href="https://feckingbahamas.bandcamp.com/album/iv-france">IV. France</a></li></ul><p>It&#39;s almost unfair to say this, but there&#39;s not one song from VIII that beats the opening for France, Chevalier Bulltoe by Totorro. That PHAT BASS! HM HM HM! Pneu makes an appearance in track 6, nice. Didn&#39;t know any of the other bands.</p><ul><li><a href="https://feckingbahamas.bandcamp.com/track/totorro-chevalier-bulltoe">1. Totorro - Chevalier Bulltoe</a></li><li><a href="https://feckingbahamas.bandcamp.com/track/deer-belling-caf-abstract-dynamics">10. Deer Belling Café - Abstract Dynamics</a></li><li><a href="https://feckingbahamas.bandcamp.com/track/pneu-municipal-geographic">6. Pneu - Municipal Geographic</a></li><li><a href="https://feckingbahamas.bandcamp.com/track/papier-tigre-im-someone-who-dies">21. Papier Tigre - I&#39;m Someone Who Dies</a></li></ul><h2>III. Australasia</h2><ul><li><a href="https://feckingbahamas.bandcamp.com/album/iii-australasia">III. Australasia</a></li></ul><p>III is an obvious good contender, closing with Plini -- anything with Plini is a good contender out of the bat. But that opening by Sparkspitter? Perfect. Didn&#39;t know any of the bands other than Plini.</p><ul><li><a href="https://feckingbahamas.bandcamp.com/track/sparkspitter-sunrise-above-clouds-im-all-yours">1. Sparkspitter - Sunrise Above Clouds (I&#39;m All Yours)</a></li><li><a href="https://feckingbahamas.bandcamp.com/track/skinny-jean-scales">19. Skinny Jean - Scales</a></li><li><a href="https://feckingbahamas.bandcamp.com/track/plini-atlas">22. Plini - Atlas</a></li><li><a href="https://feckingbahamas.bandcamp.com/track/seims-covet">2. SEIMS - COVET</a></li></ul><h2>VII. Portugal</h2><ul><li><a href="https://feckingbahamas.bandcamp.com/album/vii-portugal">VII. Portugal</a></li></ul><p>What was most impressive to me about the Portugal (VII) was that I didn&#39;t know most of the bands! It has the mandatory Memória de Peixe and PAUS, of course! Although there&#39;s no way to make the wrong choice when it comes to these two bands -- easily two of my favorite Portuguese bands -- that wasn&#39;t the best choice for PAUS in my opinion. Quelle Dead Gazelle also makes an unexpected, though pleasant, appearance. And those are the three bands that I knew.</p><p>Otherwise, not that great a contender, sadly; there were no REALLY memorable tracks... To make it clear, VII is not one of my favorites, I enjoyed Japan (I) and Russia (II) more, and even those are probably behind Argentina (VI)! (short way of saying that VII is probably my least favorite)</p><ul><li><a href="https://feckingbahamas.bandcamp.com/track/supercollider">1. Memória de Peixe - Supercollider</a></li><li><a href="https://feckingbahamas.bandcamp.com/track/mi-ah-ha">2. Don Pie Pie - Mi-Ah-Ha</a></li><li><a href="https://feckingbahamas.bandcamp.com/track/pelo-pulso">6. PAUS - Pelo Pulso</a></li><li><a href="https://feckingbahamas.bandcamp.com/track/abismo">7. Quelle Dead Gazelle - Abismo</a></li></ul><h2>V. Ireland</h2><ul><li><a href="https://feckingbahamas.bandcamp.com/album/v-ireland">V. Ireland</a></li></ul><p>And so we reach my favorite: Ireland! I knew none of the bands before. The opening is not as punchy as Australasia or even Portugal, but still a plusgood track. And what I think differs from this compilation to the others is that it&#39;s so consistent. This compilation isn&#39;t my favorite because of two or three fucking awesome tracks; it&#39;s my favorite because all the tracks are fucking great! You don&#39;t feel like in a rollercoaster -- now we&#39;re at the top, next we&#39;re at the bottom. Instead, the tracks fluctuate in a children-safe rollercoaster up there around the clouds!</p><ul><li><a href="https://feckingbahamas.bandcamp.com/track/adebisi-shank-world-in-harmony">18. Adebisi Shank - World In Harmony</a></li><li><a href="https://feckingbahamas.bandcamp.com/track/enemies-indian-summer">20. Enemies - Indian Summer</a></li><li><a href="https://feckingbahamas.bandcamp.com/track/ganglions-chindogu">15. Ganglions - Chindogu</a></li><li><a href="https://feckingbahamas.bandcamp.com/track/alarmist-morning-kepler">5. Alarmist - Morning Kepler</a></li><li><a href="https://feckingbahamas.bandcamp.com/track/leo-drezden-green-fire-magic">4. Leo Drezden - Green Fire Magic</a></li><li><a href="https://feckingbahamas.bandcamp.com/track/philharmongrel-100th-monkey">17. Philharmongrel - 100th Monkey</a></li></ul><p>It was hard not to list the whole thing here...</p><h2>Next compilation?</h2><p>It would be awesome if the next compilation was from somewhere more &quot;exoctic&quot;! I&#39;d love to see Turkey or Greece, or just about any country from Africa, Asia or the middle east.</p></body></html></content> <id>gemini://siiky.srht.site/music/fecking_bahamas.gmi</id> <published>2023-01-31T00:00:00Z</published> <title type="text">Fecking Bahamas</title> <updated>2023-01-31T00:00:00Z</updated> <link href="https://siiky.srht.site/music/fecking_bahamas.html" rel="alternate" type="text/html" hreflang="en" title="Fecking Bahamas" /> <link href="gemini://siiky.srht.site/music/fecking_bahamas.gmi" rel="alternate" type="text/gemtext" hreflang="en" title="Fecking Bahamas" /> </entry> <entry> <content type="html"><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"><html lang="en" xml:lang="en"><head><meta charset="utf-8"></meta></head><body><h1>No problem there</h1><p>siiky<br></br>2023/01/20<br></br>2023/01/20<br></br>en</p><ul><li><a href="https://nitter.net/ErikVoorhees/status/1616160532150775808">Someone just sent me this:</a></li></ul><blockquote>Behind the scenes, ShapeShift DAO has been building something called Arkeo.<br></br><br></br>It&#39;s a decentralized backend for nodes.<br></br><br></br>If you&#39;ve ever thought, &quot;sucks that everyone uses centralized node infrastructure like Infura...&quot; then you&#39;ll understand what Arkeo is solving.</blockquote><blockquote>ShapeShift decided to build this because it ran into this very problem: how can we be a *truly* decentralized app when we&#39;re calling blockchain data from centralized node companies?<br></br><br></br>If your node provider can shut off your access, it ain&#39;t permissionless. Arkeo is.</blockquote><blockquote>Arkeo works by incentivizing independent node operators to run arbitrary nodes on whatever chains they wish. Someone could run a Bitcoin node only, or a suite of nodes across multiple chains.</blockquote><blockquote>Services that consume node data pay for that data (@infura_io is great... but they can censor you: they&#39;re centralized).<br></br><br></br>With Arkeo, all such services now have a permissionless alternative.</blockquote><blockquote>The entire project has been DAO organized and funded.<br></br><br></br>No VCs own it<br></br>No corporate entities control it<br></br>It ain&#39;t &quot;based&quot; anywhere<br></br><br></br>The revolution will not be centralized. Enjoy!</blockquote><img src="https://upload.wikimedia.org/wikipedia/commons/a/a5/Mus%C3%A9e_Rodin_1.jpg" alt="The Thinker"></img><p>Gee, wouldn&#39;t it be fuckin&#39; A if we didn&#39;t need to trust any one single entity to interact with a distributed network?!</p></body></html></content> <id>gemini://siiky.srht.site/kB45oC/no-problem.gmi</id> <published>2023-01-20T00:00:00Z</published> <title type="text">No problem there</title> <updated>2023-01-20T00:00:00Z</updated> <link href="https://siiky.srht.site/kB45oC/no-problem.html" rel="alternate" type="text/html" hreflang="en" title="No problem there" /> <link href="gemini://siiky.srht.site/kB45oC/no-problem.gmi" rel="alternate" type="text/gemtext" hreflang="en" title="No problem there" /> </entry> <entry> <content type="html"><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"><html lang="pt" xml:lang="pt"><head><meta charset="utf-8"></meta></head><body><h1>Faz bem rezar (RE: Es bueno rezar)</h1><p>siiky<br></br>2023/01/15<br></br>2023/01/15<br></br>pt</p><p>(Para os não falantes de Português: os tradutores (tanto o G quanto o DeepL) traduzem surpreendentemente bem este texto, mesmo não sendo em Português bem escrito.)</p><p>Este é o meu primeiro post em Português (de Portugal!) desde que comecei a escrever aqui há cerca d&#39;um quarto de dúzia d&#39;anos. Em geral escrevo em Inglês porque m&#39;é mais natural (dado&#39;s tópicos que m&#39;interessam e o que costumo ler). Até já escrevi em Japonês antes de escrever na minha língua materna! Porquê este post em Português? Primeiro, p&#39;ra mostrar que não há só Inglês e outras línguas germânicas aqui no Gemini. Segundo, acho que faz sentido e vai ficar bem ao lado do Espanhol (Castelhano?). E terceiro, p&#39;r&#39;experimentar esta escrita falada!</p><p>(Já&#39;gora, não sei Espanhol e não usei nenhum tradutor, é bem possível que tenha entendido mal algum(ns) detalhe(s) lol)</p><p>---</p><p>Ao começar a ler este post, quem me conhece dev&#39;achar que só vou dizer merda da religião, &amp;c. Tenho ideias/opiniões/pontos de vista que se podem dizer um tanto extremistas no que toca à religião. Mas este não é esse post, surpreendam-se!</p><ul><li><a href="https://portal.mozz.us/gemini/yretek.com/articulos/2023-01-15_bueno_rezar.gmi">Yretek, &quot;Es bueno rezar&quot;</a></li><li><a href="../reclog.html">Reclog</a></li></ul><p>O Yretek escreveu:</p><blockquote>Da aprensión volver por al camino que todos han abandonado. Exagero, pero la convención social parece reducir la religión a la ceremonia y cuentos del pasado. Hablo desde España; quizás en otros lugares tendréis otra experiencia.</blockquote><p>Iss&#39;é exactamente o que noto em Portugal também. Falando por mim, que não sou religioso nem apoio a instituição religiosa do país, acho q&#39;é uma boa tendência mas ao mesmo tempo uma faca de dois gumes: por um lado, é bom que tenhamos deixado as superstições e crenças injustificadas associadas à religião; por outro, a população geral na verdade só trocou de conjunto de superstições e crenças injustificadas.[^0] :/</p><p>O que parece que vejo é q&#39;as pessoas em geral usam a religião p&#39;ra parecer que são religiosas e portanto boas pessoas[^1] -- fazem tatuagens de cruzes, de terços, do rosto de Jesus co&#39;a coroa de espinhos, de Jesus na cruz, ... -- mas n&#39;hora d&#39;agir e mostrar que são boas pessoas, nem vê-los![^2] Se tiverem de berrar e insultar alguém só porque lhes passaram à frente na fila berram e insultam; ou s&#39;um mendigo lhes pedir dinheiro p&#39;ra comer ignoram-no[^3] (sorte a dele) ou até o insultam (&quot;vai trabalhar que te faz bem&quot;); &amp;c, &amp;c... E deixemos a pedofilia p&#39;r&#39;outro dia também...</p><ul><li><a href="https://pt.wikipedia.org/wiki/Rosário_(catolicismo)">Terço</a></li><li><a href="https://pt.wikipedia.org/wiki/Abuso_sexual_de_menores_na_Igreja_Católica#Portugal">Abuso sexual de menores por membros da Igreja Católica</a></li></ul><p>A primeira parte (tentar mostrar que são religiosos) acredito que tenh&#39;a ver co&#39;a cultura popular e desportista de cá: p&#39;ra melhor ou pior, futebol é de facto O DESPORTO do país. E o que se vê mais num jogo de futebol são os jogadores a dar graças a Deus ou quê... Sim, deveras, se marcast&#39;um golo foi porque Deus te deu&#39;ma mão... Ah não, não se podem usar as mãos no futebol! Um pé, deu-t&#39;um pé!</p><p>A segunda parte (não mostrarem co&#39;acções que são boas pessoas) talvez porque ninguém quer saber de nada? Tud&#39;é normal e trivializado. Mas não posso falar muito sobre isto...</p><p>Resumindo, deitámos fora&#39;s partes estúpidas mas também as partes menos más.</p><p>O Yretek escreveu:</p><blockquote>Las preces son el momento donde predomina la oración de petición, son parecidas a las de la Misa, y acaban con el «Escucha Señor, nuestra oración» --o algo de ese estilo. En los demás momentos predomina la meditación y la alabanza. Se quiere estar con Dios y escucharle. Solo eso.</blockquote><p>S&#39;é p&#39;ra fazer que se faça bem![^4] Especialmente a meditação e tentar &quot;estar com Deus&quot;. Não basta ir à missa ouvir o padre, há que ter empenho e levar os rituais a sério. Pensar sobr&#39;a vida, sobr&#39;o que fizemos e fazemos no dia-a-dia, como nos podemos melhorar, ...</p><p>O Yretek escreveu:</p><blockquote>Se tarda un tiempo, pero mucho menos del que se malgasta en otras cosas peores.</blockquote><p>Acredito e bem. Mesmo não sendo religioso e não acreditando num&#39;entidade superior, acredito q&#39;esta prática empenhada traga bem-estar a longo prazo. E isso acreditando ou não em Deus, tendo ou não fé. E o tempo q&#39;uma pessoa desperdiça no telemóvel ou a ver &quot;notícias&quot; que não interessam nem ao menino Jesus[^5]... Não há desculpa.</p><p>O Tolstoy (em &quot;A Confession&quot;) tentou recorrer à religião (Ortodoxa Cristã, se não m&#39;engano) mas não foi a &quot;solução&quot; p&#39;r&#39;ele. Talvez não se tenha empenhado a sério, ou então só não tinha a fé necessária, dado q&#39;era um realista. De facto, no fim o que lhe &quot;faltou&quot; foi conseguir justificar a existência de Deus. (Pessoalmente, a justificação do Descartes não me convence...)</p><ul><li><a href="https://pt.wikipedia.org/wiki/Liev_Tolstói">Leo Tolstoy</a></li><li><a href="https://pt.wikipedia.org/wiki/Igreja_Ortodoxa_Russa">Igreja Ortodoxa Russa</a></li><li><a href="https://pt.wikipedia.org/wiki/Meditações_sobre_Filosofia_Primeira">Descartes, &quot;Meditações sobre Filosofia Primeira&quot;</a></li><li><a href="../wiki/books.html">Lista de livros</a></li></ul><p>[^0]: Em vez d&#39;acreditar em Deus e no Diabo, no Céu e no Inferno, que São Pedro é que controla a chuva e os portões do Céu, &amp;c, acreditam noutras merdas estúpidas que vêem online. O juízo que deviam ter cultivado mal deitaram fora&#39;s crenças estúpidas da religião foi logo deitado fora junto co&#39;as crenças.</p><p>[^1]: Vamos aproveitar este (não tão breve) momento p&#39;r&#39;uma boa gargalhada hahaha... Ok agora que já recuperámos o fôlego podemos continuar.</p><p>[^2]: Para não falantes de Português, &quot;nem vê-los&quot; é uma expressão que significa que &quot;não existem&quot;, semelhante a &quot;nowhere to be found&quot;.</p><p>[^3]: Claro, &quot;quem nunca pecou que atire a primeira pedra&quot;, mas não é p&#39;ra me justificar aqui q&#39;isto por si só dava um post.</p><p>[^4]: Esta enganou bem o tradutor! A ideia é de &quot;If you&#39;re gonna do something, do it well&quot;.</p><p>[^5]: Tenho q&#39;aproveitar p&#39;ra mandar todas as piadas religiosas de que me lembro enquanto posso, não é todos os dias q&#39;escrevo sobre religião, e muito menos em Português!</p></body></html></content> <id>gemini://siiky.srht.site/words/re-bueno_rezar.gmi</id> <published>2023-01-15T00:00:00Z</published> <title type="text">Faz bem rezar (RE: Es bueno rezar)</title> <updated>2023-01-15T00:00:00Z</updated> <link href="https://siiky.srht.site/words/re-bueno_rezar.html" rel="alternate" type="text/html" hreflang="pt" title="Faz bem rezar (RE: Es bueno rezar)" /> <link href="gemini://siiky.srht.site/words/re-bueno_rezar.gmi" rel="alternate" type="text/gemtext" hreflang="pt" title="Faz bem rezar (RE: Es bueno rezar)" /> </entry> <entry> <content type="html"><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"><html lang="ja" xml:lang="ja"><head><meta charset="utf-8"></meta></head><body><h1>村上 春樹、「夜中の汽笛について、あるいは物語の効用について」</h1><p>siiky<br></br>2023/01/06<br></br>2023/01/15<br></br>ja</p><p>何月か前に「New Penguin Parallel Text: Short Stories in Japanese」という本を買った。昨日やっと最初の話を読んだ。</p><p>意味はわかったと思う。英語の翻訳の一つ二つの細かい点にすれ違うが、大体いい。日本語の書写は全部で次に書いてある。その次は英語。</p><h2>日本語</h2><blockquote>女の子が男の子に質問する。「あなたはどれくらい私のことを好き?」<br></br><br></br>少年はしばらく考えてから、静かな声で、「夜中の汽笛くらい」と答える。<br></br><br></br>少女は黙って話の続きを待つ。そこにはきっと何かお話があるに違いない。<br></br><br></br>「あるとき、夜中にふと目が覚める」と彼は話し始める。「正確な時刻はわからない。だぶん二時か三時か、そんなものだと思う。でも何時かというのはそれほど重要なことじゃない。とにかくそれは真夜中で、僕はまったくのひとりぼっちで、まわりには誰もいない。いいかい、想像してみてほしい。あたりは真っ暗で、なにも見えないな。そして僕は突然、自分が知っている誰からも、自分が知っているどこの場所からも、信じられないくらい遠く隔てられ、引き離されているんだと感じる。自分がこの広い世界の中で誰からも愛されず、誰からも声をかけられず、誰にも思い出してももらえない存在になってしまっていることがわかる。たとえ僕がそのまま消えてしまったとしても誰も気付かないだろう。それはまるで厚い鉄の箱に詰められて、深い海の底に沈められたような気持ちなんだよ。気圧のせいで心臓が痛くて、そのままふたつにびりびりと張り裂けてしまいそうなーーそういう気持ちってわかるかな?」<br></br><br></br>少女はうなずく。たぶんわかると思う。<br></br><br></br>少年は続ける。「それはおそらく人間が生きている中で経験するいちばん辛いことのひとつなんだ。ほんとうにそのまま死んでしまいたいくらい悲しくて辛い気持ちだ。いや、そうじゃない、『死んでしまいたい』というようなことじゃなくて、そのまま放っておけば、箱の中の空気薄くなって『実際に』死んでしまうはずだ。それは『たとえ』なんかじゃない。ほんとうのことなんだよ。それが真夜中にひとりぼっちで、目が覚ますことの意味なんだ。それもわかる?」<br></br><br></br>少女はまた黙ってうなずく。少年は少し間を置く。<br></br><br></br>「でもそのときすっと遠くで汽笛の音が聞こえる。それはほんとうにほんとうに遠い汽笛なんだ。いったいどこに鉄道の線路なんかがあるのか、僕にもわからない。それくらい遠くなんだ。聞こえたか聞こえないかというくらいの音だ。でもそれが汽車の汽笛であることは僕にはわかる。間違いない。僕は暗闇の中でじっと耳を澄ます。そしてもう一度、その汽笛を耳にする。それから僕の心臓は痛むことことをやめる。時計の針は動き始める。鉄の箱は海面へ向けてゆっくり浮かび上がっていく。それはみんなその小さな汽笛のせいなんだね。聞こえるか聞こえないか、それくらい微かな汽笛のせいなんだ。そして僕はその汽笛と同じくらい君のことを愛している」<br></br><br></br>そこで少年の短い物語は終わる。今度は少女が自分の物語を語り始める。</blockquote><h2>英語</h2><p>翻訳者はMichael Emmerichで、タイトルは「Concerning the Sound of a Train Whistle in the Night, or On the Efficacy of Fiction」。</p><blockquote>The girl has a question for the boy: &quot;How much do you love me?&quot;<br></br><br></br>He thinks for a moment, then quietly replies, &quot;As much as a train whistle in the night.&quot;<br></br><br></br>She waits in silence for him to go on. Obviously there has to be a story there.<br></br><br></br>&quot;Sometimes, just like that, in the dead of night, I wake up,&quot; he begins. &quot;I don&#39;t know what time it is, exactly. Maybe two or three, around then, I&#39;d say. The time doesn&#39;t actually matter. The point is that it&#39;s the dead of night, and I&#39;m totally alone, not a sould around. I want you to imagine that for me, okay? It&#39;s completely dark, you can&#39;t see anything. And there&#39;s not a sound to be heard. You don&#39;t even hear the hands of the clock, ticking out the time -- for all I know, the clock could well have stopped. And then all of a sudden, it hits me that I&#39;ve become isolated, that I&#39;m separated some unbelievable distance from everyone I know, from every familiar place. I realize that no one in this whole wide world loves me anymore, no one will talk to me, that I&#39;ve become the kind of person no one even wants to remember. I could just disappear and no one would even notice. I feel like I&#39;ve been pushed into a box with thick iron sides and sunk way down to the very bottom of the ocean. The pressure is so intense it makes my heart ache, I feel like I&#39;m going to explode, to be torn in two -- you know that feeling?&quot;<br></br><br></br>The girl nodes. She thinks she knows what he means.<br></br><br></br>The boy continues. &quot;I think that&#39;s one of the most painful expereiences a person can have in life. I feel so sad and it hurts so much that I wish I could just go ahead and die, seriously. Actually I take that back, it&#39;s not that /I wish I could die/: I can tell that if things go on in this way, the air in the box is going to get so thin that I really /will/ die. It&#39;s not just a /metaphor/. It&#39;s reality. That&#39;s what it means to wake up all alone in the dead of night. You still following me?&quot;<br></br><br></br>The girl nods again, saying nothing. The boy lets a moment go by.<br></br><br></br>&quot;And then, way off in the distance, I hear a train whistle. It&#39;s really incredibly far off, this whistle. I don&#39;t even know where the train tracks could be. That&#39;s how far away the sound is. And it&#39;s so faint that it&#39;s right on the edge of being inaudible. Only I&#39;m certain it&#39;s a train whistle. There&#39;s no doubt about that. So I lie perfectly still, in the darkness, listening as hard as I can. And then I heart it again. And my heart stops aching. The hands on the clock start moving. The iron box begins to rise up, nice and slow, toward the surface of the sea. And it&#39;s all thanks to that little whistle, you see. A whistle so faint I could barely hear it. And the point is, I love you as deeply as that whistle.&quot;<br></br><br></br>With that, the boy&#39;s brief story is over. And the girl begins telling her own.</blockquote><p>もう言ったけどまた言う。大体いい翻訳だと思う。</p><p>だが!「少女」と「少年」の「好き」って、本当に「love」と言う言葉なのか?少年は「愛している」と最後に言うが、それなのに「好き」はそんなきつい気持ちではないと思う。だから「love」より「like」にすればよかったんだろう。</p><p>それより、ちょっとダサい気分するな。。。原作はこんな気楽な恋物語じゃないだろう?</p><p>なのに、鉄の箱の部分は最初はよくわからなかった。でも英語で読んだら「あ、そっか」と。</p><ul><li><a href="https://ja.wikipedia.org/wiki/村上春樹">村上 春樹</a></li><li><a href="https://www.penguin.co.uk/books/183166/short-stories-in-japanese-by-micahel-emmerich/9780143118336">Penguinのウェブサイト</a></li><li><a href="https://www.tofugu.com/reviews/short-stories-in-japanese">Tofuguのブックレビュー</a></li><li><a href="../wiki/books.html">読んだ本</a></li></ul></body></html></content> <id>gemini://siiky.srht.site/nihongo/murakami_hiroki.yonaka_no_kiteki.gmi</id> <published>2023-01-15T00:00:00Z</published> <title type="text">村上 春樹、「夜中の汽笛について、あるいは物語の効用について」</title> <updated>2023-01-06T00:00:00Z</updated> <link href="https://siiky.srht.site/nihongo/murakami_hiroki.yonaka_no_kiteki.html" rel="alternate" type="text/html" hreflang="ja" title="村上 春樹、「夜中の汽笛について、あるいは物語の効用について」" /> <link href="gemini://siiky.srht.site/nihongo/murakami_hiroki.yonaka_no_kiteki.gmi" rel="alternate" type="text/gemtext" hreflang="ja" title="村上 春樹、「夜中の汽笛について、あるいは物語の効用について」" /> </entry> <entry> <content type="html"><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"><html lang="en" xml:lang="en"><head><meta charset="utf-8"></meta></head><body><h1>So you do like beer after all</h1><p>siiky<br></br>2023/01/09<br></br>2023/01/09<br></br>en</p><p>I had a dream that continued the timeline of another dream I had some days ago, like consecutive episodes of a series. This is the first time it happened to me I think.</p><p>I was in an open space, at night, palm trees around and many lights, some kind of event, many people were around, almost like a festival or something of the sort. The place was somewhere in Asia (not because there were specific features I can point out to, but because it was a dream, I just know alright?). A guy crossed paths with me and asked if I didn&#39;t like beer, or why I wasn&#39;t drinking beer, or something like that. I replied that I don&#39;t much appreciate beer. He gave me a dark, almost black, beer bottle, the label was black, and it was in Thai or similar (so I assume I was in Thailand). I gave it a sip and indeed not that bad, nothing like the crap I tasted in real life...</p><p>That was the other day. Today I was again at that same place, again at night, decoration was much the same -- palm trees and lights, very tropical-like -- and a multitude of people too. And I happened to cross that guy again. But this time I had one of those beer bottles in hand and he just rhetorically asked &quot;so you do like beer after all?&quot;</p><p>And then the dream quickly de-railed into weird shit: pepper shakers have wholes not only at the top but also on the sides of the metal head so that mosquitoes can get inside, while salt shakers don&#39;t so mosquitoes don&#39;t get inside those. Why that would be relevant or interesting I couldn&#39;t possibly know.</p><ul><li><a href="https://en.wikipedia.org/wiki/Salt_and_pepper_shakers">Salt and pepper shakers</a></li></ul><p>Curious question: while reading the above, what ethnicity did you mentally assign to The Guy?</p></body></html></content> <id>gemini://siiky.srht.site/psychology/so_you_like_beer.gmi</id> <published>2023-01-09T00:00:00Z</published> <title type="text">So you do like beer after all</title> <updated>2023-01-09T00:00:00Z</updated> <link href="https://siiky.srht.site/psychology/so_you_like_beer.html" rel="alternate" type="text/html" hreflang="en" title="So you do like beer after all" /> <link href="gemini://siiky.srht.site/psychology/so_you_like_beer.gmi" rel="alternate" type="text/gemtext" hreflang="en" title="So you do like beer after all" /> </entry> <entry> <content type="html"><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"><html lang="en" xml:lang="en"><head><meta charset="utf-8"></meta></head><body><h1>On Gemini mentions</h1><p>siiky<br></br>2023/01/09<br></br>2023/01/09<br></br>en</p><p>I don&#39;t know all the context because I&#39;ven&#39;t been following Geminispace life but I noticed this thing about &quot;mentions&quot; today. Some of the relevant posts roughly in chronological order:</p><ul><li><a href="https://portal.mozz.us/gemini/gmi.bacardi55.io/gemlog/2022/02/27/my-take-on-gemlog-replies">My take on gemlog responses</a></li><li><a href="https://portal.mozz.us/gemini/pn.id.lv/20220227.gmi">Why Though? (seems to be offline)</a></li><li><a href="https://portal.mozz.us/gemini/skyjake.fi/gemlog/2022-02_re-gemlog-responses.gmi">Re: Gemlog responses</a></li><li><a href="https://portal.mozz.us/gemini/szczezuja.flounder.online/gemlog/2022-02-27-Have-ones-cake-and-eat-it-likes-comments-backlinks.gmi">Have one&#39;s cake and eat it - likes, comments, backlinks and so on</a></li><li><a href="https://portal.mozz.us/gemini/gmi.bacardi55.io/gemlog/2022/02/28/why-did-i-work-on-gemini-mention">Why did I work on gemini mention</a></li><li><a href="https://portal.mozz.us/gemini/idiomdrottning.org/gem-mentions">In which I slag on the Gemini mentions proposal for half an hour</a></li><li><a href="https://portal.mozz.us/gemini/gemini.conman.org/boston/2023/01/06.1">&quot;The street finds its own uses for things.&quot;</a></li></ul><p>I didn&#39;t take too much time reading everything in detail, but &quot;Why though?&quot; is also my thought.</p><p>I certainly won&#39;t be using it. For one, my capsule is hosted on SourceHut, so I couldn&#39;t use it even if I wanted. But most of all, I don&#39;t see the point. I know that if I had something like that, something others could use to let me know they&#39;d linked to a post of mine, I would get FOMO and that&#39;s not cool. I understand this is very individual, maybe you get peace of mind by having this system giving you the latest mentions and whatnot, that&#39;s alright. For me, &quot;what if someone replied but didn&#39;t let me know?&quot; would be at the back of my mind too frequently, I can smell it. And that&#39;s another reason to ask &quot;why though?&quot; If your RFC, that you wrote for yourself, requires others to adopt it to be useful to you, then it&#39;s not much use, I don&#39;t think.</p><p>If anyone replied to, or wrote about, any of my posts in these (not so) recent times that I&#39;ve been away from Gemini, I missed those. If such a mentions/notifications systems existed it&#39;s likely that I would have seen them. I would get the notification and feel the urge to read and reply. But there&#39;s a reason I&#39;ve been away from Gemini -- time&#39;s been scarce around here and, unfortunately for me, it&#39;s not because I&#39;m so very cool and have a life :&#39;( With those notifications in place, I would either not resist the urge to read and reply, or, worse, resist the urge but feel bad about it. &quot;Preso por ter cão, preso por não ter&quot;[^1]...</p><p>(Sorry to anyone who wrote about/replied to any of my posts expecting a reply back; I have at least one email to reply to about my Overpass page; you know who you are, sorry...)</p><p>bacardi55 wrote:</p><blockquote>Because I feel like it is painful to go and search for someone email on a capsule, or find a pseudo in an IRC channel. Many capsules don&#39;t show any contact info at all. Maybe some don&#39;t want to be contacted, maybe some other prefer not to put these type of data online and would prefer a more &quot;discreet&quot; type of solution.</blockquote><p>If you want to be reachable, cool! I do too btw, that&#39;s why I set up a contacts page and a public ML. Though as you say, maybe some don&#39;t want to be reached through those other means. Maybe they use Gemini so they don&#39;t have to use those other means?</p><p>&quot;Setting up&quot; a contact means, even something as simple as a contacts page, is a conscious effort. Let&#39;s assume for a second that everyone in Geminispace wants to be contacted directly through some medium outside Gemini about their Gemini content. If they didn&#39;t take the effort of setting up something as simple as that contacts page, what makes you think they&#39;ll start adhering to your RFC, which is much more involved?</p><p>A possible counter-argument is that they don&#39;t want to be contacted outside Gemini but would still like to be contacted through Gemini (or at least learn of what others are writing about their own writings). That&#39;s fair. But how hard is it to scrape a handful of pages? That&#39;s a non-question, it&#39;s not that hard. With a wget/curl-like Gemini client, pretty easy[^2]; and you don&#39;t even need to do that yourself, see e.g. the gemrefinder CHICKEN egg by snan (different kind of approach). But hey, it&#39;s even simpler than that: Cosmos, an aggregator-like capsule that organizes pages in threads.</p><ul><li><a href="https://wiki.call-cc.org/eggref/5/gemrefinder">https://wiki.call-cc.org/eggref/5/gemrefinder</a></li><li><a href="https://portal.mozz.us/gemini/skyjake.fi/~Cosmos/">https://portal.mozz.us/gemini/skyjake.fi/~Cosmos/</a></li></ul><p>Szczeżuja wrote:</p><blockquote>Some other aspect of this thoughts is also centralization. I like Antenna and Cosmos projects, and I&#39;m using them on everyday basis. But I realised that they slowly go beyond being a content aggregate. The scattering of content, which was the initial state, also had some effect on all of Geminispace. The content were like that &quot;capsules in the space&quot;, not distorted by any strong center. If you are interested in some topic, you will finally found it. Now content start to orbiting around that projects, which start to have some impact on it with a promise that this place gives the most appropriate / relevant / full content.</blockquote><p>A good argument against relying too much (or exclusively, one could say) on aggregators, but this RFC doesn&#39;t seem to me to be the best approach around them -- indeed, it doesn&#39;t seem to be &quot;around them&quot; at all -- let alone the simplest. Something simpler has floated around in the past I believe: we use word-of-mouth, we each of us keep our own lists of feeds and interesting capsules, we share our lists with each other publicly, we encourage browsing the Geminispace and chance encounters. With these lists I doubt it would be hard to keep a personal aggregator with better &quot;coverage&quot; than the centralized aggregators we have. Having said that, of course I won&#39;t stop using Antenna, Cosmos, Callum&#39;s gmisub, etc, I sometimes find new capsules through these aggretors. But I don&#39;t rely on them, I keep my own list of feeds (that I don&#39;t currently share publicly, shame on me).</p><p>Another thing I think would be cool is if more people kept a reclog (&quot;recommendations log&quot;). That way, not only can we &quot;follow&quot; what others are reading, we can find interesting capsules we didn&#39;t know about before and read interesting posts. And it&#39;s really simple to keep, too.</p><ul><li><a href="../reclog.html">This is mine</a></li></ul><p>Conman wrote:</p><blockquote>If others find it useful, so be it.</blockquote><p>In the end, this is basically it for me.</p><p>Reading back what I wrote it may give the impression I&#39;m bashing on bacardi55 or others supporting their RFC, but that is not the intention at all! I&#39;m trying to argue that we don&#39;t need such a system, that&#39;s all.</p><p>[^1]: lit. &quot;arrested for having [a] dog, arrested for not having [a dog]&quot;, meaning roughly that no matter what I do the result is unwanted. One of these days I should start a dictionary page of PT idioms and expressions... There&#39;s a good idea for others of other countries! :) I know there are French, Swedes, Germans, Spanish, Swiss, Americans, Finnish, Russians, Serbs(?), etc around here! (sorry I can&#39;t tell Cyrillic languages apart)</p><p>[^2]:</p><pre>gemget gemini://aggregator.com/ \ | egrep &#39;^=&gt;\s*[^\s]*\s.*{body}amp;amp;#39; \ | sed &#39;s|^=&gt;\s*||; s|\s.*$||;&#39; \ | sort -u \ | while read url; do gemget &quot;${url}&quot; \ | egrep &#39;^=&gt;\s*[^\s]*\s.*{body}amp;amp;#39; \ | grep &#39;you-own-urls-here&#39; &amp;&amp; echo &quot;${url}&quot; done </pre><p>But you probably already know that, your mentions bash script is already more complicated than I can understand.</p></body></html></content> <id>gemini://siiky.srht.site/meta/gemini-mentions.gmi</id> <published>2023-01-09T00:00:00Z</published> <title type="text">On Gemini mentions</title> <updated>2023-01-09T00:00:00Z</updated> <link href="https://siiky.srht.site/meta/gemini-mentions.html" rel="alternate" type="text/html" hreflang="en" title="On Gemini mentions" /> <link href="gemini://siiky.srht.site/meta/gemini-mentions.gmi" rel="alternate" type="text/gemtext" hreflang="en" title="On Gemini mentions" /> </entry> <entry> <content type="html"><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"><html lang="en" xml:lang="en"><head><meta charset="utf-8"></meta></head><body><h1>All is fucked</h1><p>siiky<br></br>2023/01/09<br></br>2023/01/09<br></br>en</p><p>All is fucked.</p><p>I should be studying for this shit exam of this shit class I have tomorrow. &quot;Requirements and Software Architecture&quot; is the class, if you must know. Can you think of anything that&#39;s more boring than this? I&#39;m going through past exams to prepare (because we rarely did any such exercises during classes; grading is mostly based on a PA) and I&#39;m wondering if it makes any difference. The (theory) lectures were so damn boring and uninteresting I couldn&#39;t bear to be there, I couldn&#39;t concentrate on what the professor said, I couldn&#39;t not think to myself &quot;what a bunch of bull!&quot; So instead I stopped attending, naturally.</p><p>The exam I&#39;m going through is mostly T/F. Example questions:</p><ul><li>The Observer pattern statically specifies the observer objects.</li><li>An architectural pattern improves the coherency of the modules of a system.</li><li>In a risk oriented approach, risk is defined as the probability of failure divided by the impact of that failure.</li></ul><p>Just lol... I tried reading the slides the prof used in the lectures before this but jesus, could they have been less interesting? If I did the exam, studied, and re-did the exam, I wonder if my grade would at all improve.</p><p>So here I am being more productive instead.</p><p>University is sucking ass because, even though I&#39;m now on my master&#39;s, I&#39;m stuck with shit courses I couldn&#39;t care less about -- another one is &quot;Applications and Computation Services in the Cloud&quot;... what the fuck is this? Getting Employed at Scale? Corporate Programming 101? StackOverflow for Dummies? I can&#39;t wait for the second semester to finally have the classes I&#39;m interested in again, those that I picked, why I applied to the damn degree...</p><p>And I started thinking about the tuition money. Not a trivial amount. Still, almost only half of what I used to pay while on my bachelor&#39;s, that&#39;s good! But then... wait a second. I pay monthly (we pay, it&#39;s a shared expense) 82.496% of the YEARLY University tuition in rent! I&#39;m fucked! We&#39;re fucked! All&#39;s fucked!</p></body></html></content> <id>gemini://siiky.srht.site/kB45oC/all_is_fucked.gmi</id> <published>2023-01-09T00:00:00Z</published> <title type="text">All is fucked</title> <updated>2023-01-09T00:00:00Z</updated> <link href="https://siiky.srht.site/kB45oC/all_is_fucked.html" rel="alternate" type="text/html" hreflang="en" title="All is fucked" /> <link href="gemini://siiky.srht.site/kB45oC/all_is_fucked.gmi" rel="alternate" type="text/gemtext" hreflang="en" title="All is fucked" /> </entry> <entry> <content type="html"><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"><html lang="en" xml:lang="en"><head><meta charset="utf-8"></meta></head><body><h1>Overpass</h1><p>siiky<br></br>2022/03/26<br></br>2022/12/28<br></br>en</p><p>Overpass is an interface used to query OSM data. Overpass Turbo is an Overpass web client you can use to query OSM data, export it, &amp;c.</p><ul><li><a href="https://overpass-turbo.eu">Overpass Turbo</a></li><li><a href="https://wiki.openstreetmap.org/wiki/Overpass_turbo">Overpass Turbo (OSM Wiki)</a></li><li><a href="https://wiki.openstreetmap.org/wiki/Overpass_API/Overpass_QL">Overpass Query Language</a></li><li><a href="https://wiki.openstreetmap.org/wiki/Overpass_API">Overpass API</a></li></ul><h2>Useful Queries</h2><p>This is a list of useful queries I&#39;ve learned over time.</p><h3>Features last modified by an user</h3><p>Nodes, ways, or relations last modified by &quot;user name&quot;:</p><pre>nwr(user:&quot;user name&quot;)({{bbox}}); out body; </pre><h3>Features modified between two dates</h3><p>Node, way, or relation amenities modified between 2022-02-04T00:00:00Z and &quot;to-date&quot;:</p><pre>// to-date is optional and defaults to now [diff:&quot;2022-02-04T00:00:00Z&quot;,&quot;to-date&quot;]; nwr[&quot;amenity&quot;]({{bbox}}); out body; </pre><h3>Features around other features</h3><p>Picnic sites within a 1km radius of restaurants with takeaway:</p><pre>node[amenity=restaurant][takeaway=yes]({{bbox}}); node(around:1000)[tourism=picnic_site]; out body; </pre><h3>Features inside some area object</h3><p>Libraries in Portugal:</p><pre>nwr[&quot;amenity&quot;=&quot;library&quot;](area:3600295480); out body; // Or: area(3600295480)-&gt;.searchArea; (nwr[&quot;amenity&quot;=&quot;library&quot;](area.searchArea);); out body; &gt;; out skel qt; </pre><p>I don&#39;t understand the difference between the two yet, but the latter is supposed to be more correct. All I know is that &gt;; makes the query recursive (whatever that means).</p><p>Found on StackOverflow an explanation of the area:XXX:</p><blockquote>If the polygon you want to query inside of is an OSM feature, you can also query using an area ID.<br></br><br></br>Area IDs are generated by the Overpass server to make querying data within existing polygons easier. You can determine the area ID for a way by adding 2400000000 to the way ID and the area ID for a relation by adding 3600000000 to the relation ID (assuming that the way or relation is a valid area feature).</blockquote><ul><li><a href="https://stackoverflow.com/a/65982945">https://stackoverflow.com/a/65982945</a></li></ul><p>I found Portugal&#39;s relation object, which is the relation 295480, and 3600000000+295480=3600295480.</p><ul><li><a href="https://www.openstreetmap.org/relation/295480">https://www.openstreetmap.org/relation/295480</a></li></ul><h3>Color-coding OSM data by age</h3><p>Based on this diary entry by SK53:</p><ul><li><a href="https://www.openstreetmap.org/user/SK53/diary/400570">Colour-coding OSM data by age in OverpassTurbo</a></li></ul><pre>[out:json][timeout:2500]; ( nwr[&quot;highway&quot;]({{bbox}}); nwr[&quot;building&quot;]({{bbox}}); ); (._;&gt;;); out meta; {{style: node { color: #00000000; fill-color: #00000000; } way[@timestamp=~/2022.*/] { color: #313695; fill-color: #313695; } way[@timestamp=~/2021.*/] { color: #4575B4; fill-color: #4575B4; } way[@timestamp=~/2020.*/] { color: #74ADD1; fill-color: #74ADD1; } way[@timestamp=~/2019.*/] { color: #ABD9E9; fill-color: #ABD9E9; } way[@timestamp=~/2018.*/] { color: #E0F3F8; fill-color #E0F3F8; } way[@timestamp=~/2017.*/] { color: #FFFFBF; fill-color: #FFFFBF; } way[@timestamp=~/2016.*/] { color: #FEE090; fill-color: #FEE090; } way[@timestamp=~/2015.*/] { color: #FDAE61; fill-color: #FDAE61; } way[@timestamp=~/2014.*/] { color: #F46D43; fill-color: #F46D43; } way[@timestamp=~/2013.*/] { color: #D73027; fill-color: #D73027; } way[@timestamp=~/2012.*/] { color: #A50026; fill-color: #A50026; } way[@timestamp=~/2011.*/] { color: #A50026; fill-color: #A50026; } way[@timestamp=~/2010.*/] { color: #A50026; fill-color: #A50026; } way[@timestamp=~/200.*/] { color: #A50026; fill-color: #A50026; } }} </pre></body></html></content> <id>gemini://siiky.srht.site/osm/overpass.gmi</id> <published>2022-12-28T00:00:00Z</published> <title type="text">Overpass</title> <updated>2022-03-26T00:00:00Z</updated> <link href="https://siiky.srht.site/osm/overpass.html" rel="alternate" type="text/html" hreflang="en" title="Overpass" /> <link href="gemini://siiky.srht.site/osm/overpass.gmi" rel="alternate" type="text/gemtext" hreflang="en" title="Overpass" /> </entry> <entry> <content type="html"><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"><html lang="en" xml:lang="en"><head><meta charset="utf-8"></meta></head><body><h1>Trolley problem</h1><p>siiky<br></br>2022/11/20<br></br>2022/11/20<br></br>en</p><p>Today I watched S02E01 of Mind Field, &quot;The Greater Good&quot;. It&#39;s about people&#39;s ability to act on a real situation where they have to choose between two groups of people which should be sacrificed over the other, and it&#39;s based on a thought experiment: the trolley problem.</p><p>This post is in part about the thought experiment itself, and in part about the Mind Field episode.</p><ul><li><a href="https://en.wikipedia.org/wiki/Mind_Field">Mind Field</a></li><li><a href="https://en.wikipedia.org/wiki/Trolley_problem">Trolley problem</a></li></ul><p>It seems there&#39;s been no previous empirical research on it, and Michael (the host aka Vsauce) intends on making it happen. As preparation, he interviewed Dr. Aaron Blaisdell (~4:10), a psychology professor of the UCLA Psychology Department, according to whom research shows that &quot;most people say they would pull the switch&quot;. However, Dr. Aaron believed most people would freeze instead of pulling the switch in a real situation.</p><ul><li><a href="https://pigeonrat.psych.ucla.edu">https://pigeonrat.psych.ucla.edu</a></li><li><a href="https://www.psych.ucla.edu/faculty-page/aaron-blaisdell">https://www.psych.ucla.edu/faculty-page/aaron-blaisdell</a></li></ul><h1>The thought experiment</h1><p>Before I go into the episode I want to comment on this section on the Wikipedia page with criticism to the thought experiment.</p><ul><li><a href="https://en.wikipedia.org/w/index.php?title=Trolley_problem&amp;oldid=1120792086#Criticism">Trolley problem criticism</a></li></ul><blockquote>In a 2014 paper published in the Social and Personality Psychology Compass, researchers criticized the use of the trolley problem, arguing, among other things, that the scenario it presents is too extreme and unconnected to real-life moral situations to be useful or educational.</blockquote><p>Imagine a person being forced to go to war and kill &quot;enemies&quot; because such is the way of the world -- is that scenario also &quot;too extreme and unconnected to real-life moral situations to be useful or educational&quot;?</p><blockquote>Brianna Rennix and Nathan J. Robinson of Current Affairs go even further and assert that the thought experiment is not only useless, but also downright detrimental to human psychology. The authors opine that to make cold calculations about hypothetical situations in which every alternative will result in one or more gruesome deaths is to encourage a type of thinking that is devoid of human empathy and assumes a mandate to decide who lives or dies.</blockquote><p>How does it encourage anything? It&#39;s only a thought experiment. Different theories/philosophies have different methods of deciding which is the right action to take, but the thought experiment itself is only used to &quot;exercise&quot; these methods. Add some details here or there and you get several different scenarios to think about. A popular variation is that of the baby: instead of a single person on the other track, there&#39;s a baby. Another possible variation would be to assume that the people on the tracks are family/friends; or to assume that the five people are family/friends and the other a stranger; or to assume that the five people are strangers and the other family/a friend; ... If you don&#39;t like the original &quot;plain&quot; scenario then think of something else. However, each variation exercises slightly differently your theory/philosophy.</p><p>And what if it assumes? That&#39;s a pre-requisite of a thought experiment: you assume a certain situation, and you think about it.</p><blockquote>If I am forced against my will into a situation where people will die, and I have no ability to stop it, how is my choice a &quot;moral&quot; choice between meaningfully different options, as opposed to a horror show I&#39;ve just been thrust into, in which I have no meaningful agency at all?</blockquote><p>The &quot;meaningful agency&quot; is choosing who to let live. Being forced or not has nothing to do with your role. Surely, if there are two possible future situations, and one may be considered through some criteria to be better than the other, then acting towards the better situation is the moral choice.</p><h1>The experiment</h1><p>Michael&#39;s intention was to put people in an actually credible situation where they believe they have to choose between two groups of people which is to be saved and which is to be sacrificed.</p><p>Since the intention was not to traumatize any participants, they (I assume Michael, Dr. Aaron, and Dr. Greg Cason who shows up some minutes later) developed a screening process to filter out more psychologically &quot;fragile&quot; persons (my wording). For example, they would exclude people more prone to depression, or people already suffering from some sort of trauma, &amp;c. Only people that can reasonably go through the traumatizing situation and recover from it, given that it wasn&#39;t real, are accepted.</p><ul><li><a href="https://www.drgregcason.com">https://www.drgregcason.com</a></li></ul><p>My comment is on this point alone: doesn&#39;t this segregation create a bias in the experiment? It&#39;s possible that, in average, people of the different &quot;groups&quot; would act differently in the same situations. Thus running the experiment only on the &quot;non-fragile&quot; means getting biased results.</p><p>This is criticism in the sense of being critical, not in the sense of being &quot;wrong&quot;. I understand that they don&#39;t want to intentionally put random people they find on the street in traumatizing situations For Science. It&#39;s definitely a grey area and I can&#39;t say I&#39;m for one way or the other. Personally I think it would be awesome to be a part of this experiment, I&#39;d like to know what I would actually do in that scenario.</p><p>It was very interesting to see how the subjects reacted and what their final action (or non-action) was.</p><p>If you don&#39;t intend on watching and/or don&#39;t mind spoilers, keep reading.</p><h1>Technical details &amp; Results</h1><p>They recorded workers on the tracks, just standing there looking distracted. They also recorded a train going through both tracks, one and then the other. With some video editing they merged the recordings of the workers and of the train, so that it looked like the train was really going in the workers&#39; direction. The subjects had a few screens playing those recordings of the tracks and after a short while with nothing happening the train appeared.</p><p>But the group was so small... Seven people! This is my only other criticism of the experiment. Seven people is not a large enough sample to be significant.</p><p>All of them without exception were very clearly and visibly perturbed by the experience.</p><p>And these were the results: two switched and five didn&#39;t. The two that did switch were even more perturbed while and right after switching. The first had their hands shaking. And the second started crying while reflecting on it, after they&#39;d already been told it was only an experiment!</p><p>The most affected of all was the second to switch, the one who started crying. They said they thought of the families of both groups of people and all. Must have been their trigger.</p><p>The ones that didn&#39;t switch gave reasons such as that they expected the workers to eventually notice the train; they expected the train to have sensors and that the train would eventually stop before hitting anyone; they were really terrified and couldn&#39;t act.</p></body></html></content> <id>gemini://siiky.srht.site/philosophy/trolley-problem.gmi</id> <published>2022-11-20T00:00:00Z</published> <title type="text">Trolley problem</title> <updated>2022-11-20T00:00:00Z</updated> <link href="https://siiky.srht.site/philosophy/trolley-problem.html" rel="alternate" type="text/html" hreflang="en" title="Trolley problem" /> <link href="gemini://siiky.srht.site/philosophy/trolley-problem.gmi" rel="alternate" type="text/gemtext" hreflang="en" title="Trolley problem" /> </entry> <entry> <content type="html"><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"><html lang="en" xml:lang="en"><head><meta charset="utf-8"></meta></head><body><h1>Pagat Archive</h1><p>siiky<br></br>2022/11/09<br></br>2022/11/09<br></br>en</p><p>Sent an email asking for permission to make a mirror/archive. This time it was for Pagat, a site with tons and tons of card games. And like last time, permission was given provided that I don&#39;t make any archives/mirrors public. Fair enough!</p><ul><li><a href="https://www.pagat.com">Pagat</a></li><li><a href="mirrors.html">Content-based Mirrors</a></li></ul><p>My Raspberry Pi has been busy downloading the whole thing:</p><pre>wget -o download.log -w 30 --random-wait --mirror -k -K -p -i links.txt </pre><p>The links.txt file was generated from the sitemap.xml with this CHICKEN script:</p><pre>(import srfi-1 ssax) (let* ((sitemap (ssax:xml-&gt;sxml (current-input-port) &#39;())) (entries (cdaddr sitemap)) (urls (map (o car (cute alist-ref &#39;http://www.sitemaps.org/schemas/sitemap/0.9:loc &lt;&gt;) cdr) entries))) (for-each print urls)) </pre><ul><li><a href="https://www.pagat.com/sitemap.xml">https://www.pagat.com/sitemap.xml</a></li></ul><p>Some details so far:</p><pre>$ find www.pagat.com/ -type f | wc -l 2941 $ find www.pagat.com/ -type f -iname &#39;*.html&#39; | wc -l 1812 $ du -bchs www.pagat.com/ 66M www.pagat.com/ 66M total </pre></body></html></content> <id>gemini://siiky.srht.site/kB45oC/pagat-archive.gmi</id> <published>2022-11-09T00:00:00Z</published> <title type="text">Pagat Archive</title> <updated>2022-11-09T00:00:00Z</updated> <link href="https://siiky.srht.site/kB45oC/pagat-archive.html" rel="alternate" type="text/html" hreflang="en" title="Pagat Archive" /> <link href="gemini://siiky.srht.site/kB45oC/pagat-archive.gmi" rel="alternate" type="text/gemtext" hreflang="en" title="Pagat Archive" /> </entry> <entry> <content type="html"><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"><html lang="en" xml:lang="en"><head><meta charset="utf-8"></meta></head><body><h1>Exceptions (aka Conditions) in Scheme</h1><p>siiky<br></br>2019/08/13<br></br>2022/10/15<br></br>en</p><p>DISCLAIMER: I&#39;m not a very advanced Schemer, and conditions in Scheme are especially confusing to me. Please excuse any possibly wrong terminology or claims. If you have any comments, shoot me a message.</p><p>Exceptions are (in general) very weird things, but even more so in Scheme. I have little (close to none) experience with them, and the little that I have was attained from need (i.e., &quot;works? great!&quot;).</p><h2>Conditions</h2><p>Conditions are objects that represent an exception (like instances of a subclass of Exception in Java, maybe?), and in Scheme you can use them just like any other object. You can create one, pass it around, and not even throw it. It&#39;s also possible to throw non-condition objects (maybe for non-local or early return?).</p><h2>Exception Handling</h2><h3>Catching</h3><p>A neat way to catch exceptions is with condition-case.</p><ul><li><a href="https://api.call-cc.org/5/doc/chicken/condition/condition-case">condition-case</a></li></ul><p>You give it an expression that may throw, give it the kinds of exceptions you are expecting and how to deal with each of them, and voila:</p><pre>; General usage (condition-case expression ((kind1 kind2) (print &quot;kind1 kind2&quot;) ...) ((kind) (print &quot;kind&quot;) ...) ; con needn&#39;t be a condition (con () (print &quot;some other kind: &quot; con) ...)) ; Concrete example (condition-case (begin (print &quot;This is part of the expression&quot;) (car (/ 42 0))) ((exn type) (print &quot;Wrong type&quot;) #f) ((exn arithmetic) (print &quot;Some arithmetic error&quot;) 0) (con () (print con &quot; ¯\\_(ツ)_/¯&quot;) con)) ;; prints: ;; This is part of the expression ;; Some arithmetic error ;; =&gt; 0 </pre><p>If no exception is thrown when evaluating the expression, the value of the condition-case block is that of the expression. If an exception is thrown, then the value is that of the last of the expressions associated with the first matching branch. If there is no matching branch, the exception is propagated, until a handler for it is found (or none, in which case the program crashes).</p><p>The condition cases should be ordered from more specific to less specific, because the first one to match is picked. For example, a condition of kind (exn type) is also of kind (exn), so the former should be above the latter.</p><pre>(condition-case (car &#39;some-val) ((exn) (print &quot;Wrong type&quot;)) ((exn type) (print &quot;This will never happen&quot;))) </pre><h3>Throwing</h3><p>If you want to throw something, use signal. There are also abort and raise, but I don&#39;t know why/when one should use them. In CHICKEN, SRFI-18&#39;s raise is just signal, but this may change in the future and might not even be the case in other implementations.</p><p>UPDATE:</p><blockquote>The only thing I would change is that raise is more portable/standard than signal.</blockquote><p>-- jcowan on #chicken@libera.chat, 2022/10/15</p><ul><li><a href="https://api.call-cc.org/5/doc/chicken/condition/signal">signal</a></li><li><a href="https://api.call-cc.org/5/doc/chicken/condition/abort">abort</a></li><li><a href="https://api.call-cc.org/5/doc/srfi-18/raise">raise</a></li><li><a href="https://srfi.schemers.org/srfi-18/srfi-18.html">SRFI-18</a></li></ul><h2>Related Topics of Interest</h2><ul><li>Continuable and non-continuable exceptions;</li><li>How is all this implemented?</li><li>How to make a condition and how to get things out of a condition object.</li></ul></body></html></content> <id>gemini://siiky.srht.site/scheme/exceptions.gmi</id> <published>2022-10-15T00:00:00Z</published> <title type="text">Exceptions (aka Conditions) in Scheme</title> <updated>2019-08-13T00:00:00Z</updated> <link href="https://siiky.srht.site/scheme/exceptions.html" rel="alternate" type="text/html" hreflang="en" title="Exceptions (aka Conditions) in Scheme" /> <link href="gemini://siiky.srht.site/scheme/exceptions.gmi" rel="alternate" type="text/gemtext" hreflang="en" title="Exceptions (aka Conditions) in Scheme" /> </entry> <entry> <content type="html"><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"><html lang="en" xml:lang="en"><head><meta charset="utf-8"></meta></head><body><h1>Far vs Around Games</h1><p>siiky<br></br>2022/09/20<br></br>2022/09/20<br></br>en</p><p>It occurred to me the other day that while multiplayer games in the past were made to play/interact with people close to and around you, more and more games nowadays assume internet connectivity at all times and encourage you to play with strangers around the globe. This by itself isn&#39;t bad, but you already know what follows... I myself met many cool people playing games online, from all over Europe, the US, and even as far as Japan! These connections were in many ways the types of connections we build over Gemini and other similar networks.</p><p>Being able to play with someone next to you (e.g. on the same phone, through Bluetooth, ...) is something so much into the remote past by now that it would probably be revolutionary again today. I wonder if anyone would notice that it wasn&#39;t anything actually new, that this was the way to play games with others before the internet became ubiquitous.</p><p>In my (not that distant) past, I remember playing Worms World Party on my N-Gage with my cousins. We&#39;d drain the battery in a couple of hours, charge the battery, rinse and repeat. Worms is one of my favorite games because of these times.</p><p>For last year&#39;s xmas I bought a controller and Worms WMD on Steam. It was the first time re-playing Worms in many years! I liked it a lot. Everything is still funky, everything was pretty much as I remembered it from my N-Gage, just as fun! Maybe except for the vehicles and stationary weapons -- kinda cool, but not as fun as a good old bat to the face or a Holy Grenade. We also bought Carcassonne (our first real boardgame (except for Monopoly, but please...)) and it was awesome.</p><p>Nowadays, the only games I have on my phone are lichess -- that I use mostly offline to play with others -- and Soko++ -- still haven&#39;t beaten all Microban levels!</p></body></html></content> <id>gemini://siiky.srht.site/kB45oC/far-vs-around-games.gmi</id> <published>2022-09-20T00:00:00Z</published> <title type="text">Far vs Around Games</title> <updated>2022-09-20T00:00:00Z</updated> <link href="https://siiky.srht.site/kB45oC/far-vs-around-games.html" rel="alternate" type="text/html" hreflang="en" title="Far vs Around Games" /> <link href="gemini://siiky.srht.site/kB45oC/far-vs-around-games.gmi" rel="alternate" type="text/gemtext" hreflang="en" title="Far vs Around Games" /> </entry> <entry> <content type="html"><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"><html lang="ja" xml:lang="ja"><head><meta charset="utf-8"></meta></head><body><h1>NHK Easy News</h1><p>siiky<br></br>2022/09/19<br></br>2022/09/20<br></br>ja</p><p>今度のポストを書いてからまた毎日NHK Easy Newsの記事を読み始めた。</p><ul><li><a href="jikoshoukai.html">自己紹介</a></li></ul><p>で、例えば、イギリスのエリザベス女王が死んだことはNHKで初耳。</p><ul><li><a href="https://www3.nhk.or.jp/news/easy/k10013810241000/k10013810241000.html">イギリス エリザベス女王が96歳で亡くなる</a></li><li><a href="https://www3.nhk.or.jp/news/easy/k10013826991000/k10013826991000.html">イギリスでエリザベス女王のお葬式 天皇陛下も出席</a></li></ul><p>リモコンでゴキブリを動かせることもNHKで分かった。</p><ul><li><a href="https://www3.nhk.or.jp/news/easy/k10013804421000/k10013804421000.html">「サイボーグ昆虫」 離れた所から昆虫を動かす研究</a></li></ul><p>面白い記事もあった:一番安い寿司ざらの値段は110円から115円にするって。</p><ul><li><a href="https://www3.nhk.or.jp/news/easy/k10013807081000/k10013807081000.html">「くら寿司」 1皿110円から115円に値段を上げる</a></li></ul></body></html></content> <id>gemini://siiky.srht.site/nihongo/nhk-easy-news.gmi</id> <published>2022-09-20T00:00:00Z</published> <title type="text">NHK Easy News</title> <updated>2022-09-19T00:00:00Z</updated> <link href="https://siiky.srht.site/nihongo/nhk-easy-news.html" rel="alternate" type="text/html" hreflang="ja" title="NHK Easy News" /> <link href="gemini://siiky.srht.site/nihongo/nhk-easy-news.gmi" rel="alternate" type="text/gemtext" hreflang="ja" title="NHK Easy News" /> </entry> <entry> <content type="html"><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"><html lang="en" xml:lang="en"><head><meta charset="utf-8"></meta></head><body><h1>RE: Technology and Conscience</h1><p>siiky<br></br>2022/09/19<br></br>2022/09/19<br></br>en</p><ul><li><a href="https://portal.mozz.us/gemini/the-brannons.com/tech-and-conscience">Technology and Conscience</a></li></ul><blockquote>I suppose the counterpoint would be made with nuclear weapons, which as of now have no use other than causing massive loss of life. (...) I don&#39;t believe that technology and tools are always value-neutral, though this is frequently the case. Mustard gas and atomic bombs are my counter-propositions.</blockquote><p>Technology does seem to me to be neutral -- it doesn&#39;t know right or wrong and doesn&#39;t care whether it&#39;s nailing a nail or hammering a fly. On the other hand, users aren&#39;t neutral, because they can choose what to do with the tools at hand. And even such technologies as nuclear weapons may have their good uses (maybe nuclear weapons specifically is debatable, but hold on).</p><p>Porcupines and hedgehogs have spines on their backs that could very well be used for bad rather than good, but they use the spines only for protection.</p><p>Or, if I&#39;m walking down the street next to my rottweiler, pit bull, or German shepherd, I&#39;m VERY unlikely to get attacked/robbed/w.e. and that&#39;s a good thing (for me, at least)! Having my dogs with me doesn&#39;t imply me telling them to attack randos on the street either. (Pretending for a second that dogs are vicious biting machines... It&#39;s a damn shame these dogs are conditioned and trained to be very aggressive -- a topic for another day)</p><p>Related:</p><ul><li><a href="knives.html">On knives and their uses</a></li></ul></body></html></content> <id>gemini://siiky.srht.site/philosophy/re-tech-and-conscience.gmi</id> <published>2022-09-19T00:00:00Z</published> <title type="text">RE: Technology and Conscience</title> <updated>2022-09-19T00:00:00Z</updated> <link href="https://siiky.srht.site/philosophy/re-tech-and-conscience.html" rel="alternate" type="text/html" hreflang="en" title="RE: Technology and Conscience" /> <link href="gemini://siiky.srht.site/philosophy/re-tech-and-conscience.gmi" rel="alternate" type="text/gemtext" hreflang="en" title="RE: Technology and Conscience" /> </entry> <entry> <content type="html"><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"><html lang="en" xml:lang="en"><head><meta charset="utf-8"></meta></head><body><h1>On knives and their uses</h1><p>siiky<br></br>2022/09/18<br></br>2022/09/18<br></br>en</p><p>Anyone here against knives because they are/can be used to harm other beings raise your hands!</p><p>I can&#39;t believe many will be raised, even knowing that it is true that knives can be used to kill other beings, human or otherwise, because they are very useful tools. They can be used for cooking, eating, cutting paper, or pealing fruit. They can also be used for stabbing, cutting up, killing, and skinning people and animals. That doesn&#39;t make them undesirable or less appealing in any way. It&#39;s not why/how most would use them, and I wonder how we&#39;d go about our lives without knives!</p><p>A similar point could be made about other tools -- screwdrivers, hammers, crowbars, rope, syringes, ... I&#39;m not of a very creative mind but I could probably go on.</p><p>This post was triggered by a post by @hyperreal, who doesn&#39;t want to be associated with Web3/NFT/crypto crap. I can totally understand it as I try to steer away from such connections myself -- and sometimes I&#39;m repulsed away, e.g. when I find a possibly cool project but learn that it&#39;s written in fucking JS/TS/BullshitScript-of-the-day, or that it&#39;s &quot;AI/ML/blockchain-powered&quot;... give me a fucking break please!</p><ul><li><a href="https://portal.mozz.us/gemini/hyperreal.coffee/gemlog/2022-09-17-considering-using-ipfs-for-content-hosting.gmi">Considering using IPFS for content hosting</a></li></ul><blockquote>I&#39;m just not sure about its adjacency to the NFT/Web3 scene.<br></br>(...)<br></br>Still, though, I don&#39;t like the idea of being complicit in the NFT/Web3 hype. Aside from the environmental hazards involved in minting NFTs and mining cryptocurrency, it&#39;s a Ponzi scheme that deceives people into investing monetary value into something that is inherently valueless and thrives off the delusion that they own the thing.</blockquote><p>By simply using IPFS you wouldn&#39;t be as complicit in anything to do with the NFT/Web3 bullshittery any more than you&#39;d be complicit in someone using a crowbar to bash another person&#39;s head in, or someone using a rope to hang themselves -- if you don&#39;t take part in any of the bullshittery then you&#39;re not complicit in said bullshittery!</p><p>My intention was not to pick or call out on you in the least so please don&#39;t take it personally!</p><p>DISCLAIMER: I like IPFS!</p><ul><li><a href="../alt.html">Alternative ways to access this capsule</a></li><li><a href="../projects/ipfs.html">ipfs.scm</a></li><li><a href="../projects/gemini-ipfs-gateway.html">Gemini IPFS gateway</a></li><li><a href="../care/list.html">Care list</a></li><li><a href="../kB45oC/mirrors.html">Content-based Mirrors</a></li></ul><p>Related:</p><ul><li><a href="re-tech-and-conscience.html">RE: Technology and Conscience</a></li></ul></body></html></content> <id>gemini://siiky.srht.site/philosophy/knives.gmi</id> <published>2022-09-18T00:00:00Z</published> <title type="text">On knives and their uses</title> <updated>2022-09-18T00:00:00Z</updated> <link href="https://siiky.srht.site/philosophy/knives.html" rel="alternate" type="text/html" hreflang="en" title="On knives and their uses" /> <link href="gemini://siiky.srht.site/philosophy/knives.gmi" rel="alternate" type="text/gemtext" hreflang="en" title="On knives and their uses" /> </entry> <entry> <content type="html"><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"><html lang="en" xml:lang="en"><head><meta charset="utf-8"></meta></head><body><h1>The Toothpaste Argument</h1><p>siiky<br></br>2022/09/15<br></br>2022/09/16<br></br>en</p><ul><li><a href="https://www.scottsantens.com/the-toothpaste-argument-for-universal-basic-income-ubi-gotz-werner">The Toothpaste Argument for Universal Basic Income</a></li></ul><p>I read this post that was mentioned on some other post I read on Gemini, but I don&#39;t remember which and can&#39;t find it anymore.</p><ul><li><a href="../contact.html">Send me a message if you know!</a></li></ul><p>The author seems to be too much into it to be thinking/expressing ideas clearly. There&#39;s too much fluff and rainbows and &quot;if only UBI was here&quot;. I&#39;m not into the subject and I barely know left from right, so ignore the sarcasm and bits of pedantry if you will, and enlighten me if you&#39;ll please!</p><h2>Toothpaste</h2><blockquote>If you go shopping, and take a tube of toothpaste from a shelf then you all think, when you go to the checkout, that you are paying for this toothpaste. That is an error. Because the tube of toothpaste that you are taking from the shelf is already paid for, is already paid, else it couldn&#39;t be on the shelf. What you are paying at the checkout, is that you are enabling the creation of another tube of toothpaste. That&#39;s how you have to see it. Payment is never backwards-oriented. Payment is always forward-oriented. Payment doesn&#39;t balance out, but when you are buying something, you are ordering its continued production and sale.</blockquote><p>This is a chicken &amp; egg problem: no money means no toothpaste; no toothpaste means no money. It&#39;s easy to think that someone must have paid for the first toothpaste ever produced (&quot;payment is always forward-oriented&quot;), but there are two problems:</p><ul><li>Some people make things (for free before any sort of payment) hoping they&#39;ll be able to sell them for money in the future (e.g. Leatherman&#39;s multitool).</li><li>Where did the first money come from?</li></ul><ul><li><a href="https://yewtu.be/watch?v=QJwyIF4VBTk">The Tim Leatherman Multitool Story</a></li></ul><h2>Developing</h2><blockquote>if one wants to live in this world, one needs an income. Or else you can&#39;t live... Human beings want to develop. For developing, I need work. For existing I need income.</blockquote><p>A few fallacies here too:</p><ul><li>&quot;This world&quot; seemingly meaning &quot;today&#39;s society&quot;.</li><li>&quot;Humans want to develop&quot; -- what does it mean &quot;to develop&quot;? Do all humans want to &quot;develop&quot;, really?</li><li>Depending on what it means &quot;to develop&quot;, does one really need work?</li></ul><h2>Work</h2><blockquote>And then I realized, after doing hundreds of job interviews, inevitably, that income isn&#39;t the payment for the work, but the prerequisite. That is our mistake in thinking. Our error in reasoning is, that we think, through the work, the income is generated. The reverse is true. Because we have the income, we can work.<br></br>(...)<br></br>income is not the fruit born from the seed of work, but instead work is the fruit born of the seed of income</blockquote><p>Using &quot;work&quot; in the context of today&#39;s society, i.e., a &quot;job&quot; or &quot;employment&quot;, this just isn&#39;t true. I don&#39;t want to work for someone else -- in truth, I don&#39;t want to &quot;work&quot; at all! -- especially not for a company that doesn&#39;t value my values. If your only motivation to work is to get money and you already have the money, then why would you work? Therefore, we don&#39;t work because we have to money to be able to work, it&#39;s the other way around!</p><p>That doesn&#39;t mean I wouldn&#39;t contribute back. Indeed, I already try to contribute here and there (OSM, FLOSS projects, iNaturalist, Wikipedia, ...), but I wouldn&#39;t ever call that work.</p><h2>Unpaid work</h2><blockquote>But when you recognize that income is the fuel that makes work possible, it&#39;s easier to see that basic income will enable far more work for multiple reasons. For one, having basic income means that people can choose unpaid or paid work.</blockquote><p>Amen to that (still wouldn&#39;t call it &quot;work&quot;)! And it seems you don&#39;t need to recognize that &quot;because we have the income, we can work&quot; to believe volunteering would in fact increase.</p><h2>Local voting</h2><blockquote>Second, basic income also means that there are a greater number of people with a greater amount of money that they are able to spend at the businesses in their local communities. That money is essentially a form of voting on what work the community wants local businesses to continue doing.<br></br>(...)<br></br>Werner&#39;s realization was that people with basic income could choose to shop at his stores and vote on which products they wanted his chain of stores to keep buying and selling to customers, (...)</blockquote><p>This seems reasonable to me, and a good thing too! Nowadays basically only the big supermarket chains make it. The small greengrocers around the corner hardly make enough to stay open, because everyone goes to the big guys. I would like to see more of this.</p><p>It goes well in hand with my interest in decentralized/distributed networks. Let&#39;s not concentrate power in the hands of a select few, please, and instead distribute it over the network participants.</p><h2>Today&#39;s resources</h2><blockquote>Realizing that income is forward-oriented instead of backward-oriented also enabled Werner to realize that of course we can afford basic income, because all of the basic needs it would secure already exist. They are already produced.</blockquote><p>It may very well be that the resources to meet today&#39;s needs already exist today. But given the above, if nobody is willing to work given UBI, how will the resources to meet tomorrow&#39;s needs be created? They won&#39;t fall from the sky.</p><h2>No resources shortage</h2><blockquote>There isn&#39;t a shortage of food. There&#39;s just a shortage of ability to buy food. So just create the money people need to buy food, and provide it to them so they can tell businesses to keep making the food they prefer to eat.</blockquote><p>Yeah, tell that to anyone who can&#39;t actually get the food, I&#39;m sure it&#39;ll be an easy sell.</p><blockquote>Dear Sir/Ma&#39;m,<br></br><br></br>The reason you do not have any food is not that there is no food to be had, but that you do not have the money to acquire it. Therefore, if you wish to acquire some food you must first acquire some money.<br></br><br></br>In order to acquire some money you may proceed to your closest money-making facilities and/or engage in any of several money-making activities.<br></br><br></br>We&#39;re so very sorry for the inconvenience and thank you for your understanding.<br></br><br></br>Sincerely,<br></br>Your most sympathetic government</blockquote><p>Again, specifically for food, if there&#39;s nobody to work at food-making-businesses, then there are no food-making-businesses to make food, and therefore there&#39;s no food. And how could there still be food-making-businesses? A tiny fraction of people, from the goodness of their heart, with no obligation whatsoever, and with barely any reward (money they don&#39;t need), would work in these food-making-businesses to produce food for the rest of the world? Doesn&#39;t make any sense to me.</p><p>I don&#39;t actually believe we&#39;d be out of food if UBI came into existence. Just, let&#39;s not pretend everything would still be all the same except better. Even if there were no food-making-businesses (among other kinds of businesses), since individuals need food they would have to make food themselves, or organize amongst themselves in small groups to distribute tasks -- e.g., if I&#39;m good at planting and keeping fruit trees, then I can give the fruits of my trees to my neighbors, if they share in return some of their labor; if I&#39;m good at making some sweet cocktails, I can make cocktails for my neighbors if they provide me with some fruits and spirits; &amp;c.</p><blockquote>(...) ask, where are the goods, then you will see that we have never been as rich as today. We have never been as rich as today. We have enough goods and services for each person in our society to live a humble but dignified life. (...) So, when we have these goods and services, we have to ask ourselves, then why are we affording ourselves poverty?</blockquote><p>In a way, I have to agree. So much shit goes to waste just because it was made and nobody consumed it... In a way, it really is like we have a shortage of money and not of resources.</p><p>But in actuality, it&#39;s probably more like we have resource shortages AND, on top of that, a shit resource management system. Such that, not only do we make more than we consume, leading to waste, but at the same time, some people cannot get access to resources they need.</p><p>It reminds me of an interview of James Suzman (I&#39;ll maybe try to find it someday...)</p><ul><li><a href="https://en.wikipedia.org/wiki/James_Suzman">James Suzman</a></li></ul><h2>Conclusion?</h2><p>There&#39;s nothing resembling one, really. This post is kind of a mess and if anything it just shows how little I know about this shit... For the opinions of someone who understands this better than me read for example some of snan&#39;s posts.</p><ul><li><a href="https://portal.mozz.us/gemini/idiomdrottning.org/ubi">Unconditional Basic Income</a></li></ul></body></html></content> <id>gemini://siiky.srht.site/kB45oC/toothpaste-argument.gmi</id> <published>2022-09-16T00:00:00Z</published> <title type="text">The Toothpaste Argument</title> <updated>2022-09-15T00:00:00Z</updated> <link href="https://siiky.srht.site/kB45oC/toothpaste-argument.html" rel="alternate" type="text/html" hreflang="en" title="The Toothpaste Argument" /> <link href="gemini://siiky.srht.site/kB45oC/toothpaste-argument.gmi" rel="alternate" type="text/gemtext" hreflang="en" title="The Toothpaste Argument" /> </entry> <entry> <content type="html"><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"><html lang="en" xml:lang="en"><head><meta charset="utf-8"></meta></head><body><h1>No bookbinding for you</h1><p>siiky<br></br>2022/09/15<br></br>2022/09/15<br></br>en</p><p>I went to a bookbinding shop today asking if they would teach me some of their craft but the owner, an old guy, was so harsh... Almost rude.</p><p>After a flat out &quot;No&quot;, he said something along the lines of:</p><blockquote>This is not a school, it&#39;s a bookbinding shop, I can&#39;t teach you. If I spend my time teaching just about anybody who comes around with interest I won&#39;t have the time to do what my customers ask me, and then where does the money come from?</blockquote><p>I mean, sure, but, I didn&#39;t expect anyone to be teaching me anything full-time, I have shit to do too!</p><p>At the end he asked me why I wanted to learn about it, what kinds of books I read and am interested in, what I do &quot;for a living&quot;, how I found them, ... Very weird, almost as if testing me or something. And would you ever believe me if I told you he started pulling out his massive book knowledge phallus? At least I got some new contacts and places to check out.</p><p>It was very disheartening TBH...</p></body></html></content> <id>gemini://siiky.srht.site/kB45oC/no-bookbinding.gmi</id> <published>2022-09-15T00:00:00Z</published> <title type="text">No bookbinding for you</title> <updated>2022-09-15T00:00:00Z</updated> <link href="https://siiky.srht.site/kB45oC/no-bookbinding.html" rel="alternate" type="text/html" hreflang="en" title="No bookbinding for you" /> <link href="gemini://siiky.srht.site/kB45oC/no-bookbinding.gmi" rel="alternate" type="text/gemtext" hreflang="en" title="No bookbinding for you" /> </entry> <entry> <content type="html"><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"><html lang="en" xml:lang="en"><head><meta charset="utf-8"></meta></head><body><h1>Moving tons</h1><p>siiky<br></br>2022/09/12<br></br>2022/09/12<br></br>en</p><p>How stupid is it to move around by (mainstream) motorized vehicles? Can we make up a scale?</p><p>Sorry in advance to physicists: I used weight and mass interchangeably. If it helps make up for it, I do know the difference!</p><p>I found online some numbers that I&#39;ll present next. I didn&#39;t include any trains because the weights I found varied too much to be reliable to me since I don&#39;t understand much about them (e.g. one page said between 4t and 20t). For the coach bus, since they didn&#39;t vary that much (relatively), I even picked the lightest. Some pages showed weights in pounds, which I assumed to be avoirdupois pounds and converted to kg with the unitconv CHICKEN egg:</p><pre>(exact-&gt;inexact (unit-convert lb kg 2935)) ; 1331.29360595 </pre><ul><li><a href="https://en.wikipedia.org/wiki/Pound_(mass)">https://en.wikipedia.org/wiki/Pound_(mass)</a></li><li><a href="https://wiki.call-cc.org/eggref/5/unitconv">https://wiki.call-cc.org/eggref/5/unitconv</a></li></ul><p>Now some of the weights I&#39;ve found:</p><pre>+----------------+-----------------+---------------+ | Vehicle | Weight (pounds) | Weight (tons) | +----------------+-----------------+---------------+ | Smart Fortwo | 1808lb | 0.82t | | Ford Fiesta | 2600lb | 1.18t | | Ford Focus | 2935lb | 1.33t | | Jeep Wrangler | 3941lb | 1.79t | | Some coach bus | 49400lb | 22.41t | +----------------+-----------------+---------------+ </pre><ul><li><a href="https://gogocharters.com/charter-bus-comparison-chart">Coach bus weights &amp; number of seats</a></li><li><a href="https://cars.lovetoknow.com/List_of_Car_Weights">Some car weights by make&amp;model</a></li><li><a href="https://www.bankrate.com/insurance/car/average-car-weight">More car weights (guestimates)</a></li></ul><p>Let&#39;s assume that the average person weighs around 80kg (which apparently is really the average in the USA?).</p><ul><li><a href="https://en.wikipedia.org/wiki/Human_body_weight">https://en.wikipedia.org/wiki/Human_body_weight</a></li></ul><p>For an average person driving a Smart Fortwo (being generous here) to work/shopping/w.e., a total mass of 900kg has to be moved to move the 80kg meatbag that actually has/wants to be moved. That&#39;s only 8.89% of the moved weight! Even if two people share that car, it&#39;s only marginally improved to 16.32%! And you can&#39;t get any better unless you put more people in the trunk or something... Does it even have a trunk? That thing is tiny...</p><p>For a smallish 5 seat car, like the Fiesta, 6.35% for a single person, 11.95% for two, and 25.33% for the full five.</p><p>For a wrangler, also 5 seat, it&#39;s 4.28%, 8.22% and 18.28%, for one, two and five people, respectively.</p><p>Now for a coach bus, assuming 57 seats (driver + passengers). At half capacity (28 passengers) it&#39;s 9.38%, and at full capacity (56 passengers) it&#39;s 16.91%. To be honest, this was way less than I expected... If you add up some luggage (let&#39;s be generous and say everyone carries 10kg), that&#39;s 10.43% at half-capacity and 18.63% at full capacity.</p><p>Just WOW! I never realized how grossly inefficient it is in numbers. Think about that: on the most efficient of these 4 examples (in terms of the &quot;want to move&quot; over &quot;have to move&quot; mass ratio) ONLY A QUARTER of the moved mass is what effectively has to be moved!</p></body></html></content> <id>gemini://siiky.srht.site/kB45oC/moving-tons.gmi</id> <published>2022-09-12T00:00:00Z</published> <title type="text">Moving tons</title> <updated>2022-09-12T00:00:00Z</updated> <link href="https://siiky.srht.site/kB45oC/moving-tons.html" rel="alternate" type="text/html" hreflang="en" title="Moving tons" /> <link href="gemini://siiky.srht.site/kB45oC/moving-tons.gmi" rel="alternate" type="text/gemtext" hreflang="en" title="Moving tons" /> </entry> <entry> <content type="html"><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"><html lang="ja" xml:lang="ja"><head><meta charset="utf-8"></meta></head><body><h1>自己紹介</h1><p>siiky<br></br>2022/08/27<br></br>2022/08/28<br></br>ja</p><p>いや、うそ。。。</p><ul><li><a href="../about.html">もう知ってるはずだ。</a></li></ul><ul><li><a href="../kB45oC/re-brain_fart.html">何も日本語で読んでも喋ってもないと最近書いた。</a></li></ul><p>今日起きたら「日本語で何かを書く!」と決めたんだ。それでは。</p><p>2016から2019まで、三年間ぐらい日本語を授業で勉強してた。大体「みんなの日本語」だけ使ってた。その間自分でTae KimのA Guide to Japanese Grammarも時々読んでた。</p><p>JPLTはまだしてない(先生はN3が出来るって言うが、俺はそんなに自信がないな)。が、オフィシャル的にCEFのB1レベルになってきた!本当にB1レベルだか知らないけど、別に上手じゃないのに、下手でもないと思う。</p><p>知ってるのは語彙力(ただ今辞書に調べてきた)全然足りない!マンガを読むといい気分になる。小説を読むと悲しみ。今まで��うマンガの何冊も読んだのに、小説まだ一冊しか読んでない。いつも語彙力が足りないんだから。。。何回かAnkiも手で書くのもやってみたも。。。ちなみに、読めた小説は奥田英朗の「サウスバウンド」。</p><p>今更このまま。</p><ul><li><a href="https://guidetojapanese.org/learn">Tae Kim, &quot;A Guide to Japanese Grammar&quot;</a></li><li><a href="https://en.wikipedia.org/wiki/Common_European_Framework_of_Reference_for_Languages">CEF</a></li><li><a href="https://ja.wikipedia.org/wiki/サウスバウンド">奥田 英朗、「サウスバウンド」</a></li></ul></body></html></content> <id>gemini://siiky.srht.site/nihongo/jikoshoukai.gmi</id> <published>2022-08-28T00:00:00Z</published> <title type="text">自己紹介</title> <updated>2022-08-27T00:00:00Z</updated> <link href="https://siiky.srht.site/nihongo/jikoshoukai.html" rel="alternate" type="text/html" hreflang="ja" title="自己紹介" /> <link href="gemini://siiky.srht.site/nihongo/jikoshoukai.gmi" rel="alternate" type="text/gemtext" hreflang="ja" title="自己紹介" /> </entry> <entry> <content type="html"><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"><html lang="en" xml:lang="en"><head><meta charset="utf-8"></meta></head><body><h1>RE: Open content that you can contribute to</h1><p>siiky<br></br>2022/08/25<br></br>2022/08/25<br></br>en</p><ul><li><a href="https://portal.mozz.us/gemini/gemini.bunburya.eu/gemlog/posts/2022-08-22-open-content.gmi">@bunburya shared several open crowdsourcing projects.</a></li></ul><p>I didn&#39;t know some of them, while others I knew only the name. Here I&#39;d like to add that OpenFoodFacts has a couple of sister projects:</p><ul><li><a href="https://world.openpetfoodfacts.org">Open Pet Food Facts</a></li><li><a href="https://world.openbeautyfacts.org">Open Beauty Facts</a></li></ul><p>And would also like to mention iNaturalist, where people can contribute observations of animals, plants, fungi, &amp;c. Photos are shared under user-chosen terms, but they recommend using some CC licenses compatible with Wikimedia Commons.</p><ul><li><a href="https://www.inaturalist.org">iNaturalist</a></li><li><a href="https://www.inaturalist.org/pages/developers">Datasets (end of the page)</a></li><li><a href="https://commons.wikimedia.org">Wikimedia Commons</a></li></ul><p>I can&#39;t find now the &quot;official documentation&quot; regarding the recommended license but I found these related pages instead:</p><ul><li><a href="https://www.inaturalist.org/blog/48165-we-want-you-to-license-your-inaturalist-photos-before-april-15th">https://www.inaturalist.org/blog/48165-we-want-you-to-license-your-inaturalist-photos-before-april-15th</a></li><li><a href="https://www.inaturalist.org/blog/49564-inaturalist-licensed-observation-images-in-the-amazon-open-data-sponsorship-program">https://www.inaturalist.org/blog/49564-inaturalist-licensed-observation-images-in-the-amazon-open-data-sponsorship-program</a></li><li><a href="https://www.gbif.org/news/82812/licensing-milestone-for-data-access-in-gbiforg">https://www.gbif.org/news/82812/licensing-milestone-for-data-access-in-gbiforg</a></li></ul><ul><li><a href="../reclog.html">Added to the reclog.</a></li></ul></body></html></content> <id>gemini://siiky.srht.site/kB45oC/re-open-content.gmi</id> <published>2022-08-25T00:00:00Z</published> <title type="text">RE: Open content that you can contribute to</title> <updated>2022-08-25T00:00:00Z</updated> <link href="https://siiky.srht.site/kB45oC/re-open-content.html" rel="alternate" type="text/html" hreflang="en" title="RE: Open content that you can contribute to" /> <link href="gemini://siiky.srht.site/kB45oC/re-open-content.gmi" rel="alternate" type="text/gemtext" hreflang="en" title="RE: Open content that you can contribute to" /> </entry> <entry> <content type="html"><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"><html lang="en" xml:lang="en"><head><meta charset="utf-8"></meta></head><body><h1>RFC: alist-let</h1><p>siiky<br></br>2022/08/22<br></br>2022/08/23<br></br>en</p><p>(Reply (and an example) at the end)</p><p>If you&#39;re a Lisper, even if you&#39;re not a Schemer, please don&#39;t skip this post! :)</p><h2>History</h2><p>Almost two years ago I wrote a macro to make it easier to work with values of an alist (&quot;association list&quot; i.e. list of key/value pairs; Scheme&#39;s &quot;default&quot; dictionary-like structure). It was called let-aref at first and it could be used to introduce a single variable with the value associated with a key of an alist -- sort of like let but for alists and for a single variable. Soon I realized I could use it for several variables if I changed it only slightly, which became alist-let.</p><ul><li><a href="https://git.sr.ht/~siiky/transmission.scm/commit/fe13fe48e7cf9f0045c1aaa4a3e6f0b54cd2f4d7#tests/run.scm">First version of let-aref</a></li><li><a href="https://git.sr.ht/~siiky/transmission.scm/commit/688f9d996b00d834a8e7dfd94947b46862fa962b#tests/run.scm">First version of alist-let</a></li></ul><p>At the time I didn&#39;t think much about it, just another tiny macro to make my life easier. But much later (only a few months ago) I needed something like it again. I went searching instead of copying it over and found nothing. Why the heck doesn&#39;t something like this exist? The only pattern matcher I know of doesn&#39;t seem to support it either.</p><ul><li><a href="https://wiki.call-cc.org/eggref/5/matchable">matchable</a></li></ul><p>A bit over a month ago I started thinking of making it more general, because there were lots of assumptions in the original alist-let (most relevant: keys were &quot;simple&quot; symbols, that is, the unquoted key was a valid variable identifier); and also of introducing it to the broader Scheme community.</p><ul><li><a href="https://git.sr.ht/~siiky/transmission.scm/tree/master/item/transmission.utils.scm">Latest (original) alist-let (and variants)</a></li></ul><h2>Now</h2><p>I first tested the waters on #scheme and some people acknowledged such syntax would be useful, and nobody came up with readily available alternatives. A few days later I sent an RFC to srfi-discuss:</p><ul><li><a href="https://srfi-email.schemers.org/srfi-discuss/msg/19986652/">alist-let: let-like alist destructuring syntax</a></li></ul><p>The goal (even though the &quot;project&quot; is for now still called alist-let) is to define some common pattern/syntax for the different dictionary-like types. You can find the latest (new) alist-let in this repo:</p><ul><li><a href="https://git.sr.ht/~siiky/alist-let">https://git.sr.ht/~siiky/alist-let</a></li></ul><p>If you&#39;re a Schemer, what do you think? Send your comments to the list (preferably) or to me directly. If you&#39;re a Lisper, even if you&#39;re not a Schemer, I would also appreciate your comments. Does your Lisp of choice have something like this? How is it? Let me know!</p><ul><li><a href="../contact.html">Contact</a></li></ul><h2>Reply</h2><ul><li><a href="https://portal.mozz.us/gemini/gemini.ctrl-c.club/~stack/gemlog/2022-08-22.alists.gmi">@stack replied with lots of confusion.</a></li></ul><p>Reading back what I wrote I can understand why...</p><blockquote>Not very useful, as it is a tautology for the let macro in the first place!</blockquote><p>Indeed but that&#39;s not it. :p</p><blockquote>First question: what is the purpose of alist-let?</blockquote><p>It seems you&#39;re thinking it&#39;s supposed to destructure alists at macro-expansion time? But that&#39;s not it, it&#39;s for destructuring alists at runtime.</p><p>In case you know JavaScript, alist-let is more like the following destructuring syntax:</p><pre>const obj = { a: 1, b: 2, c: 3 } const { a, c } = obj // Do something with a and c console.log(&quot;a=&quot;, a, &quot; b=&quot;, b) </pre><p>If you don&#39;t know JavaScript, and because I don&#39;t like JavaScript and &quot;an example is worth a thousand words&quot; or something: if you&#39;re writing a CLI program you&#39;re likely to need to parse the command line arguments into (positional) arguments, flags and options. Let&#39;s say the program has the flags &quot;--recursive&quot;, &quot;--raw-leaves&quot; and &quot;--trickle&quot;, and the options &quot;--cid-version&quot; and &quot;--hash&quot;.</p><pre>;(defun main (opts) ...) (define (main opts) (alist-let string=? opts ; VAR KEY DEFAULT (optional) ((recursive &quot;recursive&quot; #f) (cid-version &quot;cid-version&quot; 1) (raw-leaves &quot;raw-leaves&quot; ) ; #f is implicitly used as the default (trickle &quot;trickle&quot; ) (hash &quot;hash&quot; &quot;sha2-256&quot;)) (print &quot;recursive=&quot; recursive #\n ; recursive=#t &quot;cid-version=&quot; cid-version #\n ; cid-version=42 &quot;raw-leaves=&quot; raw-leaves #\n ; raw-leaves=#t &quot;trickle=&quot; trickle #\n ; trickle=#f &quot;hash=&quot; hash #\n ; hash=&quot;sha2-256&quot; ))) ; parse-arguments turns something like this: &#39;(&quot;--recursive&quot; &quot;--raw-leaves&quot; &quot;--cid-version&quot; &quot;42&quot;) ; Into this: &#39;((&quot;recursive&quot; . #t) (&quot;raw-leaves&quot; . #t) (&quot;cid-version&quot; . 42)) (main (parse-arguments (command-line-arguments))) </pre><p>The only (current) alternative I know of is to manually alist-ref each key (mentioned at the top of the email):</p><pre>; VAR KEY DEFAULT (optional) (let ((recursive (alist-ref &quot;recursive&quot; opts string=? #t)) (cid-version (alist-ref &quot;cid-version&quot; opts string=? 1)) (raw-leaves (alist-ref &quot;raw-leaves&quot; opts string=? #f)) (trickle (alist-ref &quot;trickle&quot; opts string=? )) (hash (alist-ref &quot;hash&quot; opts string=? &quot;sha2-256&quot;))) ; Do something with recursive, cid-version, raw-leaves, trickle, hash (print &quot;recursive=&quot; recursive #\n &quot;cid-version=&quot; cid-version #\n &quot;raw-leaves=&quot; raw-leaves #\n &quot;trickle=&quot; trickle #\n &quot;hash=&quot; hash #\n)) </pre><p>(alist-ref key alist) is more or less (cdr (assoc key alist))</p><ul><li><a href="https://api.call-cc.org/5/doc/chicken/base/alist-ref">alist-ref</a></li></ul><p>Hope this helps.</p><p>BTW I thought plists were flat alists: (k1 v1 k2 v2 ...) ?</p></body></html></content> <id>gemini://siiky.srht.site/scheme/alist-let.gmi</id> <published>2022-08-23T00:00:00Z</published> <title type="text">RFC: alist-let</title> <updated>2022-08-22T00:00:00Z</updated> <link href="https://siiky.srht.site/scheme/alist-let.html" rel="alternate" type="text/html" hreflang="en" title="RFC: alist-let" /> <link href="gemini://siiky.srht.site/scheme/alist-let.gmi" rel="alternate" type="text/gemtext" hreflang="en" title="RFC: alist-let" /> </entry> <entry> <content type="html"><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"><html lang="en" xml:lang="en"><head><meta charset="utf-8"></meta></head><body><h1>RE: Brain Fart</h1><p>siiky<br></br>2022/08/21<br></br>2022/08/21<br></br>en</p><p>I just read these posts by ew0k and really they hit the spot... Added to the reclog of today.</p><ul><li><a href="https://portal.mozz.us/gemini/warmedal.se/~bjorn/posts/2022-08-18-brain-fart.gmi">Brain Fart</a></li><li><a href="https://portal.mozz.us/gemini/warmedal.se/~bjorn/posts/2021-12-17-do-you-ever-feel-stuck-in-a-loop.gmi">Do You Ever Feel Stuck in a Loop?</a></li><li><a href="https://portal.mozz.us/gemini/warmedal.se/~bjorn/posts/2022-04-28-no-you-don-t-have-time-for-another-project.gmi">No, You Don&#39;t Have Time For Another Project</a></li><li><a href="../reclog.html">Reclog</a></li></ul><blockquote>It&#39;s just that I have all these ideas that I&#39;d like to deliver on.<br></br><br></br>But at the same time I have neither the time nor the energy to take any of them on, frankly.<br></br><br></br>You&#39;d think I&#39;d learned by now, but no.</blockquote><blockquote>Stuck in a loop, having a hard time breaking out.</blockquote><blockquote>There&#39;s never time. Maybe you feel like you&#39;ll have time, so you start something today. It&#39;ll just be a few hours this week and then it&#39;s done.</blockquote><p>I could quote almost the whole thing verbatim in here and just say &quot;this ^&quot;.</p><p>I can relate 100% with them. I&#39;m like a squirrel chasing new nuts every 5 seconds, almost as if the nuts I catch rot by the touch. It&#39;s completely irrational to take on so many things simultaneously, and yet, here we are. I have more than 4 ongoing books for some reason. I haven&#39;t read a single word of any of them for the past... 2 weeks? Maybe more? Shiet...</p><ul><li><a href="../wiki/books.html">Books list</a></li></ul><p>I&#39;m honestly surprised I&#39;ve been able to keep at it on the Petri nets. Fingers crossed it continues that way because I think they&#39;ll be key to getting some new doors open.</p><ul><li><a href="../petri_nets/index.html">Petri nets logs</a></li></ul><p>And the cherry on top: all the while I feel bad for putting other things to the side (in no particular order):</p><ul><li>OSM editing</li><li>ARM64 Salmonella machine for CHICKEN</li><li>alist-let</li><li>save-for-later (a project I really would like to get done but feels daunting)</li><li>Books I still haven&#39;t finished</li><li>Books I still haven&#39;t started</li><li>Learning some basic survival skills</li><li>Topics I still haven&#39;t read about</li><li>(Natural) languages: haven&#39;t practiced my Japanese in a long while and I&#39;ve stopped the Language Transfer Greek course at least 3 times now</li><li>(Programming) languages: Erlang, Elixir, Rust, Go, Common Lisp, Idris, FORTH, ...</li></ul><p>The list could go on and on for a really long time. I have literally hundreds of tabs open on Firefox of things that I at some point wanted to read but didn&#39;t have the time at the time. To put it in scale: I use one of those sidetabs plugins; the scrollbar is about the size of a tab; one screenful of tabs is 29 tabs; so I have roughly 29²=841 open tabs.</p><ul><li><a href="zettelkasten_utility.html">As I&#39;ve said before, I may be a hoarder...</a></li></ul><p>(BTW ew0k, in case you read this, some of the links in those pages seem to be broken)</p></body></html></content> <id>gemini://siiky.srht.site/kB45oC/re-brain_fart.gmi</id> <published>2022-08-21T00:00:00Z</published> <title type="text">RE: Brain Fart</title> <updated>2022-08-21T00:00:00Z</updated> <link href="https://siiky.srht.site/kB45oC/re-brain_fart.html" rel="alternate" type="text/html" hreflang="en" title="RE: Brain Fart" /> <link href="gemini://siiky.srht.site/kB45oC/re-brain_fart.gmi" rel="alternate" type="text/gemtext" hreflang="en" title="RE: Brain Fart" /> </entry> <entry> <content type="html"><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"><html lang="en" xml:lang="en"><head><meta charset="utf-8"></meta></head><body><h1>gemini:// to Gemini Portal</h1><p>siiky<br></br>2022/08/21<br></br>2022/08/21<br></br>en</p><p>I just modified my gmi-&gt;md script to rewrite gemini:// links to the Gemini Portal. With only 8 new (readable) lines the HTTPS/HTML version of the capsule became that much user friendlier. A handful of links are now broken in the process (gemini://localhost links from the gemini-ipfs-gateway) but no problem, they weren&#39;t valid anyway.</p><p>Pretty happy with the results and with how easy it was. Good thing Gemtext is so simple.</p><p>Here&#39;s the diff:</p><pre>--- a/gmi2md.scm +++ b/gmi2md.scm @@ -4,15 +4,30 @@ (chicken io) (chicken pathname) (chicken process-context) + (srfi 13) (srfi 197) gmi) (define-constant source-extensions &#39;(&quot;gmi&quot; &quot;md&quot; &quot;org&quot;)) (define-constant image-extensions &#39;(&quot;svg&quot; &quot;png&quot; &quot;jpg&quot; &quot;jpeg&quot; &quot;webp&quot;)) +(define-constant gemini:// &quot;gemini://&quot;) (define ((? p? f g) x) ((if (p? x) f g) x)) (define phi (cute ? &lt;&gt; &lt;&gt; identity)) +(define (gemini-link? l) + (and (gmi:link? l) + (string-prefix? gemini:// (gmi:link:uri l)))) + + +(define (gemini-&gt;portal l) + (gmi:link (chain (gmi:link:uri l) + (substring/shared _ (string-length gemini://)) + (string-append &quot;https://portal.mozz.us/gemini/&quot; _)) + ((phi (o not string-null?) + (cute string-append &quot;(Gemini Portal) &quot; &lt;&gt;)) + (gmi:link:text l)))) + (define ((convert? gemini-root) l) (and (gmi:link? l) @@ -98,11 +113,14 @@ &quot;&quot;)) )) +(define (rewrite-links gemini-root) + (o (phi gemini-link? gemini-&gt;portal) + (phi (convert? gemini-root) extension/gmi-&gt;html))) (define (main args) (let ((gemini-root (make-absolute-pathname (current-directory) (car args)))) (chain (gmi:read) - (map (phi (convert? gemini-root) extension/gmi-&gt;html) _) + (map (rewrite-links gemini-root) _) (group-links _) (map grouped-gmi-element-&gt;md-element _) (concatenate _) </pre><ul><li><a href="https://portal.mozz.us">Gemini Portal</a></li><li><a href="../projects/gemini-ipfs-gateway.html">Gemini IPFS gateway</a></li><li><a href="../projects/gemtext.html">Scheme Gemtext Reader</a></li></ul></body></html></content> <id>gemini://siiky.srht.site/meta/portal.gmi</id> <published>2022-08-21T00:00:00Z</published> <title type="text">gemini:// to Gemini Portal</title> <updated>2022-08-21T00:00:00Z</updated> <link href="https://siiky.srht.site/meta/portal.html" rel="alternate" type="text/html" hreflang="en" title="gemini:// to Gemini Portal" /> <link href="gemini://siiky.srht.site/meta/portal.gmi" rel="alternate" type="text/gemtext" hreflang="en" title="gemini:// to Gemini Portal" /> </entry> <entry> <content type="html"><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"><html lang="en" xml:lang="en"><head><meta charset="utf-8"></meta></head><body><h1>Petri Nets Log #006</h1><p>siiky<br></br>2022/08/19<br></br>2022/08/19<br></br>en</p><p>Following the call with Statebox from last week I sent an email with some questions. One of them was if/how they&#39;re thinking of (formally &amp; technically) dealing with &quot;OR transitions&quot;.</p><p>I first read about &quot;OR transitions&quot; in the paper &quot;The Application of Petri Nets to Workflow Management&quot; (#004; &quot;conditional routing&quot;). In more detail (including the places between transitions), an &quot;OR transition&quot; is a transition that produces tokens to only one of its output places. I think this is useful to model computations that may fail (e.g. non-total functions) or that produce values from distinct subsets (&quot;good&quot;/&quot;bad&quot;). For example: subtracting in the naturals; dividing; making a web request (HTTP 4xx/5xx, timeouts, ...); determining if a value satisfies a property or not (x &gt;= 42); ...</p><p>In the end, OR transitions aren&#39;t necessary -- we&#39;re used to doing these things in code already. It may not even make sense or be worth the effort sometimes to model the alternatives, but there are certainly cases where it would be useful. I talked about it with my TL and we got a workaround, like a boilerplate pattern.</p><p>Some names: let&#39;s say the OR transition is called R, the &quot;good case&quot; place &amp; transition are result &amp; T, and the &quot;bad case&quot; are error &amp; C. T and C produce a token in f, which is to be consumed by a single transition F.</p><img src="example_or.svg" alt="Example (SVG)"></img><br></br><img src="example_or.png" alt="Example (PNG)"></img><p>First, R must be modified to produce an Either Error Result token, duplicated in each of the output places (result &amp; error). The good and bad places remain the same. T and C must be modified to produce a token in a single (common) place (let&#39;s call it m, for middleman), and their types must change from:</p><pre>T :: Result -&gt; Result&#39; C :: Error -&gt; Error&#39; </pre><p>To:</p><pre>T :: Either Error Result -&gt; Maybe (Either Error Result) C :: Either Error Result -&gt; Maybe (Either Error&#39; Result&#39;) </pre><p>T and C must do nothing (i.e. return Nothing) for the cases they aren&#39;t supposed to handle. So T should return Nothing if the value is an Error, and C should return Nothing if the value is a Result. In the case they&#39;re supposed to handle they work as before these boilerplate changes, except they must rewrap it in the Either and in a Just (more details in code shortly).</p><p>Finally, an extra transition (let&#39;s call it M, for merge) must be added with m as its input place of multiplicity 2 (the number of the output places of R). M should filter out the Nothings, pick the only Just, and produce it (unwrapped) in f. In theory, F doesn&#39;t need to know about this dance.</p><img src="example_or_em.svg" alt="Example using this pattern (SVG)"></img><br></br><img src="example_or_em.png" alt="Example using this pattern (PNG)"></img><p>Generally, the pattern goes like this:</p><img src="general_or.svg" alt="Generalized pattern (SVG)"></img><br></br><img src="general_or.png" alt="Generalized pattern (PNG)"></img><p>Algebraically, in pseudo-Haskell (note on notation afterwards):</p><pre>R : () -&gt; (A1 + A2 + ... + An)^n ak : (A1 + A2 + ... + An) T&#39;k : (A1 + A2 + ... + An) -&gt; Maybe (A&#39;1 + A&#39;2 + ... + A&#39;n) M : Maybe (A&#39;1 + A&#39;2 + ... + A&#39;n)^n -&gt; () unSingle [a] = a M = fromJust . unSingle . filter isJust N = const Nothing J = Just Tk : Ak -&gt; A&#39;k hk = J . ik . Tk T&#39;k = [N, N, ..., hk, ..., N, N] </pre><p>(NOTE: The A + B notation is coproduct of A and B; ik is coproduct injection; and [f, g, ...] is not the usual list notation but the coproduct &quot;either&quot;, e.g. [f, g] (i1 x) = f x; [f, g] (i2 x) = g x)</p><p>For the simpler success/failure case, if R produces tokens of type Either Error Result:</p><pre>handleResult&#39; = [J . Right . handleResult, N] handleError&#39; = [N, J . Left . handleError] </pre><p>And thus I will end this log. Let&#39;s see what Statebox replies.</p><ul><li><a href="log004.html">#004</a></li><li><a href="index.html">index.html</a></li></ul></body></html></content> <id>gemini://siiky.srht.site/petri_nets/log006.gmi</id> <published>2022-08-19T00:00:00Z</published> <title type="text">Petri Nets Log #006</title> <updated>2022-08-19T00:00:00Z</updated> <link href="https://siiky.srht.site/petri_nets/log006.html" rel="alternate" type="text/html" hreflang="en" title="Petri Nets Log #006" /> <link href="gemini://siiky.srht.site/petri_nets/log006.gmi" rel="alternate" type="text/gemtext" hreflang="en" title="Petri Nets Log #006" /> </entry> <entry> <content type="html"><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"><html lang="en" xml:lang="en"><head><meta charset="utf-8"></meta></head><body><h1>Reclog</h1><p>siiky<br></br>2022/08/17<br></br>2022/08/17<br></br>en</p><p>Sometimes I read posts that I find interesting and that I would like to share with others but that I don&#39;t have anything particularly good to say about. Following a recent post introducing Re:logs, I just had the idea of starting a &quot;recommendations log&quot;.</p><ul><li><a href="https://portal.mozz.us/gemini/warp.geminispace.club/~freezr/gemlog/2022-08-04-relog.gmi">Introducing the Re:log concept</a></li><li><a href="../reclog.html">Reclog</a></li></ul></body></html></content> <id>gemini://siiky.srht.site/meta/reclog.gmi</id> <published>2022-08-17T00:00:00Z</published> <title type="text">Reclog</title> <updated>2022-08-17T00:00:00Z</updated> <link href="https://siiky.srht.site/meta/reclog.html" rel="alternate" type="text/html" hreflang="en" title="Reclog" /> <link href="gemini://siiky.srht.site/meta/reclog.gmi" rel="alternate" type="text/gemtext" hreflang="en" title="Reclog" /> </entry> <entry> <content type="html"><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"><html lang="en" xml:lang="en"><head><meta charset="utf-8"></meta></head><body><h1>Petri Nets Log #005</h1><p>siiky<br></br>2022/08/15<br></br>2022/08/15<br></br>en</p><p>I had a call with Statebox last week! \o/ Unfortunately one of the main devs couldn&#39;t attend so there was no technical discussion... But it was good to get a point of contact (now I have &quot;permission&quot; to ask them questions), and they gave us accounts to use the platform they&#39;re working on. It looks really neat, but I still haven&#39;t gotten around to try it out for real.</p><ul><li><a href="https://statebox.tv/act2022/tutorial">To get an idea check out Statebox TV</a></li></ul><p>If I understood correctly they still don&#39;t have an actual programming language for people to use. But several people can work on the same document simultaneously like in Overleaf, CoCalc, Google Colab, Google Docs, &amp;c.</p><ul><li><a href="index.html">index.html</a></li></ul></body></html></content> <id>gemini://siiky.srht.site/petri_nets/log005.gmi</id> <published>2022-08-15T00:00:00Z</published> <title type="text">Petri Nets Log #005</title> <updated>2022-08-15T00:00:00Z</updated> <link href="https://siiky.srht.site/petri_nets/log005.html" rel="alternate" type="text/html" hreflang="en" title="Petri Nets Log #005" /> <link href="gemini://siiky.srht.site/petri_nets/log005.gmi" rel="alternate" type="text/gemtext" hreflang="en" title="Petri Nets Log #005" /> </entry> <entry> <content type="html"><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"><html lang="en" xml:lang="en"><head><meta charset="utf-8"></meta></head><body><h1>RE: Zettelkasten Utility</h1><p>siiky<br></br>2022/08/10<br></br>2022/08/11<br></br>en</p><p>I started almost a year ago (damn!) using Org Roam to finally try and organize my notes and random things I write. I heard about zettelkasten I don&#39;t even remember whence anymore, but it stuck with me. I spent a couple of weeks learning more about it, searching for (software) systems, &amp;c, until I finally settled on Org Roam. As a Vim user this was a very... interesting experience! But let&#39;s leave that for another day.</p><ul><li><a href="https://portal.mozz.us/gemini/blog.schmidhuberj.de/2022/08/07/when-does-a-zettelkasten-become-useful">When does a Zettelkasten become useful?</a></li></ul><blockquote>Here, my notes are basically a structure-note for every big topic linking to structure-notes of every sub-topic linking to the actual information that sometimes links back to already learned information, but not from other subjects. The problem here is, that this is easily converted to a linear note structure, (...)<br></br>(...)<br></br>To basically summarize what I (believe) am doing differently in my Zettelkasten, I emphasize on collecting the information in a way I understand and is easy to search instead of linking the notes to create new ideas. Maybe the word &quot;wiki&quot; might be closer to what I am doing, but as I was starting off with the idea of creating a Zettelkasten, this word has stuck for now.</blockquote><p>After reading both posts, I guess what I&#39;m doing is more like a wiki too. I have a page/file for a topic usually, where I write about it and how it relates to other topics. I tried opening some random notes just now (in Doom: SPC n r a) and like 5 in a row were pretty much useless. Some of these were created during the first few days, when I was kind of filling it up with whatever came to mind, kind of trying things out. Reflecting on how I use it too (more next) in retrospect it makes sense now that opening random notes doesn&#39;t prove too informative or interesting.</p><ul><li><a href="https://portal.mozz.us/gemini/rawtext.club/~mieum/relog/2022-08-08-zettelkasten_utility.gmi">Zettelkasten Utility</a></li></ul><blockquote>So much thought and energy went into organizing and maintaining a sensible structure that it became kind of unwieldy and was ultimately not very flexible.</blockquote><p>I sometimes feel this too, especially for larger pages it can become a yak shaving activity -- &quot;would it be better if I laid things out this way or that way?&quot; And whichever way I choose I lose, it&#39;s never the right one, because every time I come back to the page I get that same feeling, that maybe it&#39;s still not just right...</p><blockquote>It seems to me that one reason people will tend to impose structure in a zettelkasten-like system is that they are digesting information that is already structured. It seems like it would make sense to replicate that structure---that it would be useful---especially, as Schmiddi suggests, if the point of the lecture you are attending is for students to replicate its contents.</blockquote><p>Some of my most comprehensive and useful files are on Petri nets, and they exactly fit the description of this paragraph. I wrote these notes while reading the papers. Sometimes I would pause reading to take note or transcribe something directly on the computer, other times I would take note somewhere (a notebook or the paper itself) and later transcribe to the appropriate file. In general, the material wasn&#39;t adapted very much from the original text.</p><p>mieum clearly knows their zettelkasten shit better than I do. After reading their post it became apparent to me that my &quot;zettelkasten&quot; isn&#39;t that great quality. Even so! Not all is lost! I&#39;m using Org mode after all. This took me a long while to get familiar with but damn, all the praise people throw at it is well deserved.</p><p>I use it for pretty much everything I want to document for myself now. Pages I want to read/write about, books/videos/movies/series I want to read/watch, events with notes available right there, &amp;c, &amp;c. Everything that isn&#39;t in this capsule, or paper notebooks that I&#39;ll never pick up again, is in there. I have a significant collection of Org Roam files now. When I want to search for something I can, and I usually find what I&#39;m looking for. Things are tagged liberally (I had this insight early on luckily). I have URLs to external sources, associated files (PDFs, images, audio files, &amp;c), my own notes, quotes, code sometimes, ... Everything!</p><p>I may be a hoarder, but I think this is great! It&#39;s a lot better than my previous approach of writing random things in whichever random paper notebook is closest (I have 4 or 5 of these spread all over the place) and never getting around to re-read and transcribe it into some more organized notes system.</p><p>(BTW I have 714 files as of now, the first created on 2021/08/28 22:42:02 and the latest on 2022/08/09 17:13:50 according to their filenames)</p><blockquote>The other reason I find is that people don&#39;t fully trust their tools, or their tools are cumbersome enough to inhibit a freer interaction with the zettelkasten, so it feels like structure is necessary to access or retrieve all the information it contains.</blockquote><p>This is an interesting thought. Yeah, it may be that I don&#39;t trust the zettelkasten system and that leads me to try and organize monolithic notes from the start. But if that&#39;s the case (me not trusting it) I think it&#39;s more likely because I haven&#39;t used it correctly, rather than because I don&#39;t believe it works. I&#39;ve thought about this in the past, even before and after settling on Org Roam: maybe I&#39;m losing something for trying to use the zettelkasten system in a computer. It&#39;s so easy to put anything in (SPC n r f); I&#39;m not forced to think about what I&#39;m putting in; and I can always edit it later!</p><p>I wonder if I should start one with pen&amp;paper.</p><ul><li><a href="../petri_nets/index.html">Petri Nets Logs</a></li></ul></body></html></content> <id>gemini://siiky.srht.site/kB45oC/zettelkasten_utility.gmi</id> <published>2022-08-11T00:00:00Z</published> <title type="text">RE: Zettelkasten Utility</title> <updated>2022-08-10T00:00:00Z</updated> <link href="https://siiky.srht.site/kB45oC/zettelkasten_utility.html" rel="alternate" type="text/html" hreflang="en" title="RE: Zettelkasten Utility" /> <link href="gemini://siiky.srht.site/kB45oC/zettelkasten_utility.gmi" rel="alternate" type="text/gemtext" hreflang="en" title="RE: Zettelkasten Utility" /> </entry> <entry> <content type="html"><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"><html lang="en" xml:lang="en"><head><meta charset="utf-8"></meta></head><body><h1>Gemini IPFS gateway</h1><p>siiky<br></br>2022/08/07<br></br>2022/08/08<br></br>en</p><p>I&#39;ve been slowly working on a read-only Gemini IPFS gateway -- or is it an IPFS Gemini gateway? I still don&#39;t know... It&#39;s a Gemini server you can use to access the IPFS network, like the Kubo&#39;s HTTP gateway.</p><p>There&#39;s a similar project by hsanjuan (who is one of the IPFS devs I think), but for one I didn&#39;t want to mess with Go, and for another it starts up a new lite IPFS node instead of using the local node -- why not? It&#39;s already running anyway.</p><p>There were lots of tiny details here and there that made things go wrong, but I think I got the Good Case a&#39;workin&#39;! I can browse my own capsule through it just fine. I don&#39;t have anything else to try for now, and my plans for the gateway are still vague, but hopefully this&#39;ll be interesting enough to people into both Gemini and IPFS that they give it a go.</p><p>It supports both IPFS and IPNS, but no CIDv0s (because it uses only the &quot;subdomain trick&quot;; see Usage). It&#39;s based on Kooda&#39;s geminid (with small changes from me), ipfs.scm, and ttltbl.scm (something I hacked together tonight).</p><ul><li><a href="https://portal.mozz.us/gemini/rawtext.club/~sloum/geminilist/005449.gmi">hsanjuan, &quot;[ANN] Gemini-IPFS gateway&quot;</a></li><li><a href="https://www.upyum.com/cgit.cgi/geminid">Kooda, geminid</a></li><li><a href="ipfs.html">ipfs.scm</a></li><li><a href="https://git.sr.ht/~siiky/geminid/tree/experiments">geminid (IPFS branch)</a></li><li><a href="https://git.sr.ht/~siiky/ttltbl.scm">ttltbl.scm</a></li></ul><h2>Usage</h2><p>How do you actually use it? The URLs are similar to those you&#39;d see with the HTTP gateway.</p><p>Pick a CID (this capsule&#39;s for example), and go here:</p><ul><li><a href="../ipfs.txt">Capsule CID</a></li><li><a href="https://portal.mozz.us/gemini/cid.ipfs.localhost/">https://portal.mozz.us/gemini/cid.ipfs.localhost/</a></li></ul><p>There&#39;s also an example page:</p><ul><li><a href="https://portal.mozz.us/gemini/bafkreie5eda6jkhtxi5c3pcpaqqlwl2xfkgasqk555vtljcdrfy3uyio4a.ipfs.localhost/">https://portal.mozz.us/gemini/bafkreie5eda6jkhtxi5c3pcpaqqlwl2xfkgasqk555vtljcdrfy3uyio4a.ipfs.localhost/</a></li><li><a href="../hello.html">../hello.html</a></li></ul><p>As long as links are relative (link/to/some/../file.txt) or absolute but without scheme://hostname/ (/link/to/file.txt), everything just works inside the IPFS network.</p><p>Note that the server doesn&#39;t list directories -- a little bit of intentionally and a little bit out of laziness. When you try to access a directory you&#39;re redirected to /index.gmi (this is a Gemini server after all). If there&#39;s no index.gmi then it borks. But it doesn&#39;t work only with Gemini capsules either, ofc! It should serve any files the HTTP gateway would too.</p><p>To access IPNS, pick a CID or name, and go here:</p><ul><li><a href="https://portal.mozz.us/gemini/cid.ipns.localhost/">https://portal.mozz.us/gemini/cid.ipns.localhost/</a></li><li><a href="https://portal.mozz.us/gemini/name.ipns.localhost/">https://portal.mozz.us/gemini/name.ipns.localhost/</a></li></ul><p>For example the IPFS site (apparently they changed domains from .io to .tech?):</p><ul><li><a href="https://portal.mozz.us/gemini/ipfs.io.ipns.localhost/index.html">https://portal.mozz.us/gemini/ipfs.io.ipns.localhost/index.html</a></li><li><a href="https://portal.mozz.us/gemini/ipfs.tech.ipns.localhost/index.html">https://portal.mozz.us/gemini/ipfs.tech.ipns.localhost/index.html</a></li></ul><p>Your Gemini client won&#39;t render the HTML page probably, but you&#39;ll get the content!</p><p>For some reason Lagrange doesn&#39;t like one of these two, doesn&#39;t even send a request to the gateway, instead saying &quot;failed to look up hostname&quot;. The other works fine, I have no idea why, but it really didn&#39;t look like a problem with the gateway.</p><h2>Setup</h2><p>Install and run the Kubo node.</p><ul><li><a href="https://ipfs.tech/#install">https://ipfs.tech/#install</a></li></ul><p>Install CHICKEN 5.</p><ul><li><a href="https://code.call-cc.org">https://code.call-cc.org</a></li></ul><p>Install the ipfs egg:</p><pre>chicken-install ipfs </pre><p>Install ttltbl:</p><pre>git clone --depth=1 https://git.sr.ht/~siiky/ttltbl.scm cd ttltbl.scm chicken-install cd .. </pre><p>Install the WIP IPFS branch of my geminid fork:</p><pre>git clone --depth=1 --branch experiments https://git.sr.ht/~siiky/geminid cd geminid chicken-install </pre><p>Generate a cert (suggestions welcome, I don&#39;t understand any of this shit):</p><pre>openssl req -new -subj &#39;/CN=localhost&#39; -addext &#39;subjectAltName = DNS:*.localhost&#39; -x509 -newkey ec -pkeyopt ec_paramgen_curve:prime256v1 -days 1825 -nodes -out wild-cert.pem -keyout wild-key.pem </pre><p>Run the gateway:</p><pre>csi -s ipfs-server.scm </pre><h2>Architecture</h2><p>Not much to say about it. The gateway accepts Gemini requests, interacts with the Kubo node through its RPC API (resolve IPNS CIDs/names if necessary, ask the type of a UnixFS object, and read the actual content), and sends back results.</p><p>The post so far described how the gateway works with the ipfs-request-handler, which dynamically accepts an IPFS/IPNS CID/Name and serves content the user asks for. There&#39;s also constant-scheme/root-cid which, when given the scheme (ipfs/ipns) and CID/Name, works like any other Gemini server, serving content from that CID/Name tree only! This latter would be a pretty cool way to publish content. Similar to SourceHut pages but instead of sending a tarball with the content you send the CID/Name of the content.</p></body></html></content> <id>gemini://siiky.srht.site/projects/gemini-ipfs-gateway.gmi</id> <published>2022-08-08T00:00:00Z</published> <title type="text">Gemini IPFS gateway</title> <updated>2022-08-07T00:00:00Z</updated> <link href="https://siiky.srht.site/projects/gemini-ipfs-gateway.html" rel="alternate" type="text/html" hreflang="en" title="Gemini IPFS gateway" /> <link href="gemini://siiky.srht.site/projects/gemini-ipfs-gateway.gmi" rel="alternate" type="text/gemtext" hreflang="en" title="Gemini IPFS gateway" /> </entry> <entry> <content type="html"><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"><html lang="en" xml:lang="en"><head><meta charset="utf-8"></meta></head><body><h1>Naturally Ungood</h1><p>siiky<br></br>2022/08/07<br></br>2022/08/07<br></br>en</p><p>I had this thought like 2 days ago, that people aren&#39;t naturally ungood and selfish, but instead do what seems to them to be the best way to minimize their own misery. Obviously it doesn&#39;t lead to the globally optimal results (both intuitively and empirically), but what is one to do? What is one to do when everything around is so out of one&#39;s control and in general so misery inducing?</p><p>I don&#39;t know why it popped into my head while in the shower, but the thought was surely in part inspired by the recent &quot;Human Un-nature&quot;, and an interview with Aaron Swartz where he mentioned the book &quot;Moral Mazes&quot;. If memory serves me right (it&#39;s been several months) his own description of the book was something like, the decisions people make in companies are rational and even morally good decisions, possibly the best, but somehow the results are what we see all around us. It&#39;s in my reading list.</p><p>I think it&#39;ll help me internally. I fail as much as anybody. It&#39;ll help me tolerate the actions of others but also my own, hopefully.</p><ul><li><a href="https://portal.mozz.us/gemini/beyondneolithic.life/posts/human_un-nature.gmi">Beyond Neolithic Life, &quot;Human Un-nature&quot;</a></li><li><a href="https://portal.mozz.us/gemini/degrowther.smol.pub/20220804_human_nature">degrowther, &quot;Re: Human Un-nature&quot;</a></li><li><a href="https://yewtu.be/watch?v=JUt5gjqNI1w">Aaron Swartz, &quot;We Can Change The World&quot;</a></li><li><a href="https://en.wikipedia.org/wiki/Moral_Mazes">Robert Jackall, &quot;Moral Mazes&quot;</a></li><li><a href="https://en.wikipedia.org/wiki/Aaron_Swartz">Aaron Swartz</a></li></ul></body></html></content> <id>gemini://siiky.srht.site/psychology/naturally-ungood.gmi</id> <published>2022-08-07T00:00:00Z</published> <title type="text">Naturally Ungood</title> <updated>2022-08-07T00:00:00Z</updated> <link href="https://siiky.srht.site/psychology/naturally-ungood.html" rel="alternate" type="text/html" hreflang="en" title="Naturally Ungood" /> <link href="gemini://siiky.srht.site/psychology/naturally-ungood.gmi" rel="alternate" type="text/gemtext" hreflang="en" title="Naturally Ungood" /> </entry> <entry> <content type="html"><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"><html lang="en" xml:lang="en"><head><meta charset="utf-8"></meta></head><body><h1>Custom Gemini Handlers</h1><p>siiky<br></br>2022/08/06<br></br>2022/08/06<br></br>en</p><p>Just learned how to setup custom handlers for the gemini scheme in Firefox and XDG.</p><p>For Firefox, go to about:config, create a new boolean variable named network.protocol-handler.expose.gemini and set it to false. Open a gemini URL, choose your Gemini client and you&#39;re good to go.</p><p>For XDG, create a desktop file in ~/.local/share/applications/ (or your equivalent) with the following content, replacing Lagrange with your client of choice:</p><pre>[Desktop Entry] Type=Application Name=Lagrange Gemini Client Exec=lagrange %u StartupNotify=false MimeType=x-scheme-handler/gemini; </pre><p>And you&#39;re good to go, opening gemini URLs with xdg-open or clicking things should work now. It seemed to take effect immediately here.</p><p>Reference:</p><ul><li><a href="https://stackoverflow.com/questions/22729686/set-custom-protocol-handler-in-firefox">https://stackoverflow.com/questions/22729686/set-custom-protocol-handler-in-firefox</a></li><li><a href="https://kb.mozillazine.org/Register_protocol#Firefox_3.5_and_above">https://kb.mozillazine.org/Register_protocol#Firefox_3.5_and_above</a></li><li><a href="https://unix.stackexchange.com/questions/497146/create-a-custom-url-protocol-handler">https://unix.stackexchange.com/questions/497146/create-a-custom-url-protocol-handler</a></li></ul></body></html></content> <id>gemini://siiky.srht.site/kB45oC/gemini-handlers.gmi</id> <published>2022-08-06T00:00:00Z</published> <title type="text">Custom Gemini Handlers</title> <updated>2022-08-06T00:00:00Z</updated> <link href="https://siiky.srht.site/kB45oC/gemini-handlers.html" rel="alternate" type="text/html" hreflang="en" title="Custom Gemini Handlers" /> <link href="gemini://siiky.srht.site/kB45oC/gemini-handlers.gmi" rel="alternate" type="text/gemtext" hreflang="en" title="Custom Gemini Handlers" /> </entry> <entry> <content type="html"><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"><html lang="en" xml:lang="en"><head><meta charset="utf-8"></meta></head><body><h1>Petri Nets Log #004</h1><p>siiky<br></br>2022/08/04<br></br>2022/08/04<br></br>en</p><p>Started reading &quot;The Application of Petri Nets to Workflow Management&quot;, by W.M.P. van der Aalst last Friday and finished today. You need paid access to download the PDF but I can send it to you in case you&#39;re interested, just contact me.</p><p>As the title suggests the paper is not about programming but workflow management. Specifically, it&#39;s about how the processes executed in a company&#39;s context can be modeled by Petri nets, and reasons why that is a good thing. A recurrent example was that of an insurance/complaints company, where customers may submit complaints and the company processes them to decide whether the customer is right or not.</p><p>The definition wasn&#39;t too different from the Statebox one (see log #001), but lots of interesting little things are discussed in the paper that can also be applied to programming, and specifically a Petri nets programming language implementation (that I&#39;m gonna call &quot;execution environment&quot;).</p><h2>Resources</h2><p>Resources are the entities that execute an enabled transition. In the context of the insurance company, a transition may be &quot;reviewing a complaint form&quot;, and the person that does the review is the resource (don&#39;t squint too hard on the terminology). In the context of programming, a transition is a piece of code, and the resource that executes it may be a number of different things! In a strictly sequential execution environment, the resource is some CPU time of the process; in a parallel execution environment it could be some CPU time of an OS thread; but it could also be a whole green thread (read: Erlang (BEAM) process).</p><p>In the last case, I can think of at least two alternatives (using BEAM to make things more concrete): either there is a specific process for each transition, which executes only that specific transition when it is enabled; or a process is spawned each time a transition is fired, letting even the same transition execute concurrently (as long as both can fire, of course; e.g., they fire sequentially but execute in parallel).</p><p>Thus, an execution environment must either make decisions about the execution semantics and force these semantics down the throats of the programmers; or it must give the programmers the tools to choose the semantics they think fit their problems best.</p><p>The former is basically the case for ALL programming languages, which I can easily understand. It&#39;s difficult enough to write a good implementation let alone several good implementations that may be used based on configurations or whatnot, possibly changed at runtime.</p><h2>Routing</h2><p>Something that isn&#39;t mentioned in the Statebox monograph is different &quot;routing&quot; types. The WF-nets paper mentions four distinct types but I believe there are technically only two of them.</p><p>The four types are (a) sequential, (b) parallel, (c) conditional, and (d) iterative. Next follow my own representations of Fig. 3, as close to the real ones as I can (they don&#39;t indeed have places represented, only transitions).</p><img src="seq_routing.png" alt="Sequential routing"></img><br></br><img src="par_routing.png" alt="Parallel routing"></img><br></br><img src="cond_routing.png" alt="Conditional routing"></img><br></br><img src="iter_routing.png" alt="Iterative routing"></img><p>There&#39;s nothing to say about sequential routing. There&#39;s nothing much to say about parallel routing (the output of a transition is fed into two other transitions). And there&#39;s nothing to say about iterative routing either -- the image didn&#39;t come so well but notice that the result of B is fed back into B. All three of these are essentially the parallel routing, and there&#39;s nothing in the Statebox definition preventing any of these cases.</p><p>Conditional routing is the new guy here. In conditional routing either B or C fire after A firing, but not both! Unless I completely missed it in the Statebox monograph, there&#39;s no concept of conditionally sending tokens to this or that place. All transitions must always put their multiplicity of tokens in the destination places. In retrospect, I remember seeing some example model (the smart contract gambling one) where a transition could either succeed or fail, which had two &quot;success&quot; and &quot;failure&quot; transitions after it, and wondering why that choice wasn&#39;t represented. See the &quot;Fail&quot; and &quot;Pass&quot; coming after &quot;OracleCallback&quot; in the following image.</p><img src="gambling.png" alt="gambling.png"></img><p>Now I&#39;m wondering how/if Statebox plan to tackle this.</p><p>Additionally two different kinds of conditional routing are presented in the WF-nets paper, but I haven&#39;t transcribed and compiled all of my notes yet so this is it for now.</p><ul><li><a href="https://doi.org/10.1142/S0218126698000043">https://doi.org/10.1142/S0218126698000043</a></li><li><a href="https://blog.statebox.org/behavioral-programming-with-petri-nets-%C3%A0-la-functional-way-smart-contracts-96d801cef8cc">&quot;Behavioral Programming with Petri Nets à la Functional Way -- Smart Contracts&quot;, Fabrizio Romano Genovese</a></li><li><a href="log001.html">Log #001</a></li><li><a href="../contact.html">Contact</a></li></ul><ul><li><a href="index.html">index.html</a></li></ul></body></html></content> <id>gemini://siiky.srht.site/petri_nets/log004.gmi</id> <published>2022-08-04T00:00:00Z</published> <title type="text">Petri Nets Log #004</title> <updated>2022-08-04T00:00:00Z</updated> <link href="https://siiky.srht.site/petri_nets/log004.html" rel="alternate" type="text/html" hreflang="en" title="Petri Nets Log #004" /> <link href="gemini://siiky.srht.site/petri_nets/log004.gmi" rel="alternate" type="text/gemtext" hreflang="en" title="Petri Nets Log #004" /> </entry> <entry> <content type="html"><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"><html lang="en" xml:lang="en"><head><meta charset="utf-8"></meta></head><body><h1>Post dates</h1><p>siiky<br></br>2022/06/23<br></br>2022/08/03<br></br>en</p><p>Until now, I&#39;d never &quot;standardized&quot; what the dates on my site mean, even though I&#39;ve been consistent with them everywhere (not much to screw up anyway): both on the index and the posts themselves, the dates are always when I started writing the post (or created the file, at least). So there are unfinished (unstarted, even) posts that, were I to finish and publish, would get the date I first created them on the index. This isn&#39;t great. And something similarly ungreat happens with posts that I take a long time to write (actually actively writing), sometimes across a few days of a week -- the post has a certain date, but in reality it&#39;s published only some days later -- usually leading to interleaving of posts: start post A, start post B, publish post B, publish post A.</p><p>I started thinking about this because I&#39;ve been lurking Geminispace for a bit now, and liking it a lot! So I&#39;m planning on writing in Gemtext from now on, instead of Markdown or Org, and convert my site to a Gemini capsule (still making HTML available through HTTPS for anyone not with it &lt;insert Dr. Evil reference here&gt;). Turning the index, which is one of the most complex parts of my site, into a simple Gemtext page, is just... hmhmhm! And, other than the index being the front-page, serving at the same time as the &quot;feed&quot; that people can subscribe to is also just... hmhmhm!</p><p>But with that comes a problem, because I update posts, some more than others, some days more than others, but, posts don&#39;t necessarily remain as they were first published. Because of it, and of the interleaving I mentioned above, I&#39;ll start using a new convention -- slightly harder to maintain, but if I don&#39;t screw up should be worth it:</p><p>Posts themselves will have the date of when I first started writing or first created the file, while the index (feed) will have the date of the last update instead. This way should give no jumps to the past when I publish new posts, and at the same time works as an updates notifier (though I still have to test how clients behave).</p></body></html></content> <id>gemini://siiky.srht.site/meta/dates.gmi</id> <published>2022-08-03T00:00:00Z</published> <title type="text">Post dates</title> <updated>2022-06-23T00:00:00Z</updated> <link href="https://siiky.srht.site/meta/dates.html" rel="alternate" type="text/html" hreflang="en" title="Post dates" /> <link href="gemini://siiky.srht.site/meta/dates.gmi" rel="alternate" type="text/gemtext" hreflang="en" title="Post dates" /> </entry> <entry> <content type="html"><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"><html lang="en" xml:lang="en"><head><meta charset="utf-8"></meta></head><body><h1>RE: Misadventures with bash shell</h1><p>siiky<br></br>2022/08/01<br></br>2022/08/02<br></br>en</p><p>As StackSmith prompted:</p><blockquote>In the meantime, if you have a few minutes, write about why you love your shell. I really want to know.</blockquote><ul><li><a href="https://portal.mozz.us/gemini/gemini.ctrl-c.club/~stack/gemlog/2022-08-01.bash.gmi">Misadventures with bash shell</a></li></ul><p>I don&#39;t love it, I even agree with some of the points raised, but after learning it one has to admit: most tasks are damn terse. And I can&#39;t imagine any Lisp-like syntax that could come even close -- BTW it&#39;s been tried at least once, that I know of:</p><ul><li><a href="https://scsh.net">Scsh</a></li><li><a href="https://en.wikipedia.org/wiki/Scsh">Scsh (Wikipedia)</a></li></ul><p>Maybe interesting, maybe not, but here are some of the features I use most often. I never know what&#39;s the right if/then syntax either, so when I want this:</p><pre>(when (file-exists? &quot;...&quot;) (do-this) (and-that)) (unless (file-exists? &quot;...&quot;) (do-this) (and-that)) </pre><p>I write this instead:</p><pre>[ -f &quot;...&quot; ] &amp;&amp; (do-this; do-that) [ -f &quot;...&quot; ] || (do-this; do-that) </pre><p>No more guessing where the hell the bang should go.</p><p>Loops all follow the same pattern:</p><pre>for/while/until ...; do ...; done </pre><p>You can put the body of the loop in the background too, but obviously be careful not to forkbomb yourself.</p><pre>for/while/until ...; do ... &amp; done </pre><p>Something I do often to start multiple terminals in the same Nix shell:</p><pre>exec nix-shell --run &#39;sh -c &quot;for i in {1..4}; do terminal &amp; done&quot;&#39; &amp; </pre><p>The `exec ... &amp;` makes the nix-shell and child processes &quot;independent&quot;, so that I can continue to use the current terminal and/or close it without affecting the others. `for i in {1..4}` is equivalent to `for i in 1 2 3 4`. I think this syntax is relatively &quot;new&quot;; if you don&#39;t have it, you can use seq instead:</p><pre>for i in `seq 1 4`; do ...; done </pre><p>Doing something for each line of input:</p><pre>some-command | while read line; do ...; done </pre><p>read alone is a can of worms. It&#39;s very useful for simple things so worth knowing.</p><p>And some of the most important stuff: strings! There are 3 &quot;types&quot;: single quote, double quote, and backtick (plus $(...)). If you&#39;re unsure what type of string you need, go with single quotes because they&#39;re the safest and least surprising. If you need to interpolate values into your string, use double quote strings. If you need the result of a command as a string, use backticks (like the seq above). Backticks can be embedded in other string types.</p><pre>test=hello echo &#39;hello world&#39; # &quot;hello world&quot; echo &#39;$test world&#39; # &quot;$test world&quot; echo &quot;$test world&quot; # &quot;hello world&quot; echo `echo &quot;$test world&quot;` # &quot;hello world&quot; echo $(echo &quot;$test world&quot;) # &quot;hello world&quot; </pre><p>(I got some examples wrong as I was writing this haha)</p><p>In extreme cases, even though it&#39;s a mess to read, you can take advantage of automatic string concatenation to mix string types.</p><pre>echo &#39;a string with a single quote (&#39;&quot;&#39;&quot;&#39;)&#39; echo &quot;a string with a double quote (&quot;&#39;&quot;&#39;&quot;)&quot; </pre><p>I&#39;ve tried escaping in the past and failed too many times. This has never failed me once.</p><p>As a sort of conclusion: for some reason bash is one of the most, if not the most, popular interactive shell. Probably because it&#39;s the default in many Linux distros, especially the biggest ones. The default effect certainly worked with me because I&#39;m still &quot;stuck&quot; with it. But bash isn&#39;t the only one out there, so if you don&#39;t like it, do yourself a favor and try a different one! Some shells I can think of: fish, zsh, ksh, ion (of RedoxOS), csh.</p><p>As for me, I&#39;ve read my share of shit-throwing at bash, but it&#39;s been working OK. I don&#39;t need the fancy features offered by fish or zsh. If I tried any new interactive shell, it&#39;d probably by zsh or ion.</p></body></html></content> <id>gemini://siiky.srht.site/programming/shell.gmi</id> <published>2022-08-02T00:00:00Z</published> <title type="text">RE: Misadventures with bash shell</title> <updated>2022-08-01T00:00:00Z</updated> <link href="https://siiky.srht.site/programming/shell.html" rel="alternate" type="text/html" hreflang="en" title="RE: Misadventures with bash shell" /> <link href="gemini://siiky.srht.site/programming/shell.gmi" rel="alternate" type="text/gemtext" hreflang="en" title="RE: Misadventures with bash shell" /> </entry> <entry> <content type="html"><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"><html lang="en" xml:lang="en"><head><meta charset="utf-8"></meta></head><body><h1>Offline Code Reviews</h1><p>siiky<br></br>2022/07/30<br></br>2022/07/31<br></br>en</p><p>I&#39;m looking for a simple offline code review tool/workflow. I&#39;m used to the GitHub PR workflow, but I&#39;d like to be able to do CRs offline too. Since I&#39;m moving away to SourceHut I want to learn something different, maybe the email workflow. However, two things:</p><p>I want to change mail clients (Thunderbird needs too much mousework) but setting up terminal email clients looks like rocket science to me (looking at you (neo)mutt). Aerc was actually REALLY easy to setup! (except for my uni account) But unfortunately it doesn&#39;t work offline. Conclusion: getting contributions by email is OK as long as I don&#39;t need it for anything else.</p><p>At work I use GH PRs still. Other than being online, the problem with the GH PR review interface for me is that it&#39;s slow for large PRs on my laptop. Having a tiny screen doesn&#39;t help either. Plus, I already have all of the necessary code on my PC all the time because I add my teammates&#39; forks as remotes.</p><p>When someone makes a PR, I should be able to make the code review completely offline without relying on the GH interface. And why should I have to use an interface to review code different from the one I use to program, anyway? On the browser I have some font I&#39;m not used to, syntax highlighting I&#39;m not used to, colors I&#39;m not used to, keybindings (and lack thereof) I&#39;m not used to, ... Some of this is probably partially fixable but... meh, I don&#39;t want to have to muck with yet more browser settings that I have to replicate manually from setup to setup never to get it exactly the same anywhere.</p><p>There&#39;s a vim diff mode and a helper alias vimdiff, which is actually pretty good. Vim also recognizes the Git diff format and highlights everything correctly. So using vim to do CRs I think would be pretty dope.</p><h2>Email workflow</h2><p>An aside on the email workflow: as I understand it, contributors are supposed to send patchsets to some mailing list, and reviewers make the review right there in the email itself? Sending comments and whatnot as replies.</p><p>How do people deal with big patchsets? What if you&#39;re reviewing file A that uses some functions from file B but file B is in another email? You jump between emails to check both? That sounds so hurgh but maybe because I&#39;m thinking in Thunderbird terms...</p><h2>webrev</h2><p>Searched a bit around and found webrev, a script developed and maintained by the illumos project. Downloaded and managed to get it running after some modifications. It needs another script, which_scm, but since I won&#39;t use any VCS other than Git I removed all unnecessary code I could find.</p><ul><li><a href="https://src.illumos.org/source/xref/illumos-gate/usr/src/tools/scripts/webrev.sh">webrev (latest by illumos)</a></li><li><a href="https://src.illumos.org/source/xref/illumos-gate/usr/src/tools/scripts/which_scm.sh">which_scm (latest by illumos)</a></li></ul><p>The usage is simple enough though not clearly stated in the help message. It uses ksh which I don&#39;t have installed, but Nix makes this easy. On the directory of the repo you want to review: checkout the branch you want to merge and then you run webrev.</p><pre>git checkout fix-bug-123 nix-shell -p ksh --run &#39;webrev -p target-branch&#39; </pre><p>It creates a webrev directory with a bunch of files, one of which is index.html. This page has all the {add,chang,remov}ed files plus, for each: stats (total lines changed, additions, deletions, modified, unchanged); links to cdiff, udiff, sdiff; frames (not sure yet what this is); the before and the after; the patch; and the raw. Pretty neat.</p><p>One thing that I didn&#39;t expect but should have: it&#39;s not a plebian git diff target-branch...fix-bug-1234 (the best I know)! It&#39;s actually the list of new commits created on the fix-bug-123 branch. How it does this I would like to know. Have to read the code some day.</p><p>It has a couple of quirks though, like, why the heck does it say that the arguments -p target-branch are unused if the result is different when I don&#39;t provide them? And why the heck doesn&#39;t the -? flag present the full help message?</p><ul><li><a href="https://src.illumos.org/source/xref/illumos-gate/usr/src/tools/scripts/webrev.sh?r=bbf21555">webrev@bbf21555</a></li><li><a href="webrev.patch">My Git only patch for webrev@bbf21555</a></li></ul><p>It&#39;s neat that it creates a self contained set of files to review a specific PR, but it&#39;s still not quite there. :/ First of all, obviously it still uses the browser. And second, there&#39;s no way to mark a file as (un)reviewed, which is something I like from the GH and GitLab interfaces because it relieves me of the burden of wondering if I&#39;ve already reviewed a certain file or not.</p><h2>The solution?</h2><p>I&#39;m thinking if writing some helper scripts to make this flow easier would be doable or tmw.</p><p>I have to learn how webrev gets the list of commits introduced in a certain branch because it&#39;s the most useful starting point. Then, having the state in a file or w.e. is probably the best way to go (with the feature/target branches &amp; (un)reviewed files). Marking files as reviewed, and viewing the diff of a certain file (either with vimdiff or a git-diff in vim) should be easy enough.</p><p>Two harder problems to solve: review comments and branch (PR) updates.</p><p>How/Where to write and save review comments? Saving the git-diff somewhere and writing the comments there directly is the easiest way maybe, and maybe it&#39;s good enough. I can&#39;t think of any other way right now. AFAIK the email workflow works similarly (but in an email)?</p><p>That leaves only the updates problem. How to deal with new commits, rewritten branch history, &amp;c? For this I still don&#39;t have any good ideas. Re-reviewing the whole thing from scratch is not ideal... It should be possible to unmark the reviewed files if they&#39;ve changed between the old and the new branch tips. But I don&#39;t see any automatic way to reuse the old comments. In some cases they&#39;ll certainly be obsolete, but in others they&#39;ll still be valid. Making this step manual could be good enough...</p><h2>Conclusion</h2><p>I can&#39;t imagine I&#39;m the only one wanting to do code reviews offline. And I can&#39;t imagine nobody before has wanted this either. After searching online almost all suggestions/ideas are complete overkill, like Gerrit, WTH! I just want to compare a bunch of files that I already have on my PC dammit! I shouln&#39;t&#39;ve to set up some full-blown server for this...</p><p>Hopefully I&#39;ve missed something so obvious that everyone knows of. If you think that&#39;s the case, dear reader, please! Send me an email!</p><ul><li><a href="../contact.html">Contact</a></li></ul></body></html></content> <id>gemini://siiky.srht.site/programming/ocr.gmi</id> <published>2022-07-31T00:00:00Z</published> <title type="text">Offline Code Reviews</title> <updated>2022-07-30T00:00:00Z</updated> <link href="https://siiky.srht.site/programming/ocr.html" rel="alternate" type="text/html" hreflang="en" title="Offline Code Reviews" /> <link href="gemini://siiky.srht.site/programming/ocr.gmi" rel="alternate" type="text/gemtext" hreflang="en" title="Offline Code Reviews" /> </entry> <entry> <content type="html"><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"><html lang="en" xml:lang="en"><head><meta charset="utf-8"></meta></head><body><h1>Flexibility &amp; Relations</h1><p>siiky<br></br>2022/06/07<br></br>2022/07/28<br></br>en</p><p>I recently wrote about how flexibility may be beneficial in your course of life.</p><ul><li><a href="../philosophy/flexibility-life.html">Flexibility &amp; Life</a></li></ul><p>I&#39;ve thought some times in the past how after I present myself in some way, I can no longer present myself some other (conflicting) way in the future to the same person(s). At least not with some friction.</p><p>In this post I&#39;d like to write about that, yet another aspect of life where flexibility can be useful (and possibly a hindrance!): human relations.</p><p>I first came across a similar idea (maybe when I first thought about this, in fact) reading one of Descartes&#39; books -- either &quot;Discourse on the Method&quot; or &quot;Selections from the Principles of Philosophy&quot;, I can&#39;t remember. In that book he wrote that there were works he didn&#39;t want to publish during his lifetime.¹ &quot;Wut? why?&quot; He explains that his works were often controversial due to the nature of their content -- religion and God were particularly controversial² -- and by not publishing them he could continue with his life and work without any impediments (read: being imprisoned and/or killed).</p><p>If you tell a friend one day that you like a nice and hot churro (or fartura, the inferior alternative), you can&#39;t then tell them the next day that you don&#39;t like it, right? It doesn&#39;t make sense! It can look like you lied or are lying now.</p><p>Think of knowledge as a (consistent i.e. non-contradictory) set of propositions. From this point of view, acquiring knowledge is performing the set-union of the current propositions with the new. If a person knows that you like churros (P), and learns later that you /don&#39;t/ like churros (¬P), their knowledge becomes inconsistent: { P, ¬P } is inconsistent, because (P ∧ ¬P) is a contradiction!</p><p>Of course, people can change their opinions, tastes, and whatnot but it&#39;s a slow process, slow enough not to be flexible, the point of this post and the previous one.</p><p>&quot;So what&#39;s it mean?&quot; If you&#39;re of an opinion now that (you think) you&#39;re likely to change in the future, then... maybe you&#39;re better off not sharing it with others right now?</p><p>Because, if you change opinion in the future, it&#39;ll take time for people to adjust their knowledge set to your newly changed opinion; people will judge you hard if said opinion is controversial or doesn&#39;t go down their throats well; and, if you change opinion in the future, whatever negative side-effects came of your sharing it were most likely a net loss -- waste of time and energy, at best.</p><p>There&#39;s a caveat, though. I&#39;m here advocating that it may be a good idea to refrain from sharing details about yourself with other people, and I don&#39;t make any distinctions between close or not. But if you do it too much, especially with a close relation, the other person won&#39;t know that much about you, which may mean the relation isn&#39;t that great, and it may end because of it.</p><p>And a possible alternative to the all-or-nothing: very clearly stating that this opinion of yours is something prone to change, something you are thinking of/working on right now, but are not quite sure about just yet.</p><p>I think this might be kinda hard to pull off. People may think you&#39;re saying that just as an escape route in case shit hits the fan, for example. But I couldn&#39;t possibly guess all the weird ways people might think, the same way I couldn&#39;t possibly guess all the ways shit might hit the fan.</p><p>Just another tool in the toolbox... Maybe. Or not. ¯\__(ツ)_/¯</p><p>¹ There are cons to this, such as not discussing with as many people, but he was a pretty good thinker -- he had a strict method for reasoning, which was the subject of one of the two books (probably &quot;Discourse on the Method&quot; judging by the title). On top of that (IIRC) he had a few close relations with whom to discuss the more controversial topics.</p><p>² Not that they somehow went against the state of affairs of the time. He believed in God, (one of them is supposed to be a proof it exists) and was religious (even supported the church IIRC).</p><ul><li><a href="https://en.wikipedia.org/wiki/Descartes">Descartes</a></li><li><a href="https://en.wikipedia.org/wiki/Churro">Churro</a></li><li><a href="https://en.wikipedia.org/wiki/Fartura_(food)">Fartura</a></li><li><a href="https://en.wikipedia.org/wiki/Consistent">Consistent</a></li><li><a href="https://en.wikipedia.org/wiki/Contradiction">Contradiction</a></li><li><a href="https://en.wikipedia.org/wiki/Proposition">Proposition</a></li><li><a href="../wiki/books.html">Books list</a></li></ul></body></html></content> <id>gemini://siiky.srht.site/philosophy/flexibility-relations.gmi</id> <published>2022-07-28T00:00:00Z</published> <title type="text">Flexibility & Relations</title> <updated>2022-06-07T00:00:00Z</updated> <link href="https://siiky.srht.site/philosophy/flexibility-relations.html" rel="alternate" type="text/html" hreflang="en" title="Flexibility & Relations" /> <link href="gemini://siiky.srht.site/philosophy/flexibility-relations.gmi" rel="alternate" type="text/gemtext" hreflang="en" title="Flexibility & Relations" /> </entry> <entry> <content type="html"><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"><html lang="en" xml:lang="en"><head><meta charset="utf-8"></meta></head><body><h1>Flexibility &amp; Life</h1><p>siiky<br></br>2022/06/01<br></br>2022/07/28<br></br>en</p><p>To be able to withstand the punches life throws at you, being flexible is helpful, methinks. It allows you to focus on what matters to you, overlook what doesn&#39;t, and dodge them punches like a pro. Not only that, but you can more easily experiment with things and try to find what works best. &quot;If you don&#39;t have the room to fail, you only have the room to remain&quot; (if it almost rhymes it&#39;s true, amirite?)</p><ul><li><a href="../psychology/fagots.html">Fagots</a></li></ul><p>Let me try to explain what I mean.</p><p>From my very limited knowledge of Chinese philosophy and martial arts philosophy, before anything else, what you need most is flexibility (DISCLAIMER: I&#39;m neither student nor practitioner).</p><p>From the Tao Te Ching, the main takeaway I got is that you&#39;ll have a hard time if you go against nature -- certainly harder than if you go along it. If you&#39;re lucky (or maybe strong enough?) that&#39;s all it will be, harder; more likely, however, you&#39;ll simply lose.</p><p>Thus, from my (very likely wrong and/or incomplete) understanding, the Tao is to go with nature, accept nature, go with the flow, accept things as they are and that they&#39;re rarely as you&#39;d prefer them to be, that what happens through your course of life will happen whether you like it or not, and that often you have no say in it -- what will be, will be (this isn&#39;t some &quot;fate&quot; BS or hard determinism, though it may sound like it the way I put it; more at the end).</p><p>A similar idea exists in Tai Chi boxing, where you don&#39;t fight your opponent with force, but by trying to deflect their attacks, using their nature against them.</p><p>And what better way is there to &quot;go with the flow&quot; than by being flexible in your moves and in your mind?</p><p>More practically (but not necessarily by the Tao) I think of it as avoiding unnecessary (unnatural) imposed limits or goals; or as distilling what I really enjoy from what I don&#39;t (as much). So that I may focus on what matters to me most without getting overly lost on &quot;trivialities&quot;.</p><p>For example, some decades ago someone declared that &quot;one must eat every 3h~4h and must not go many hours without eating&quot; (I can&#39;t remember who nor why; have to research). Similarly, someone once declared that &quot;breakfast is the most important meal of the day and therefore must also be the heaviest/fullest&quot; (this one I do remember: Kellogg&#39;s and some bacon company). I purposefully say &quot;declared&quot; because this wasn&#39;t the result of a scientific study or some other method.</p><p>Saying a bunch of bullshit nobody pays heed to is quite alright -- no harm done, right? The problem is that these &quot;truths&quot; are actually accepted as truths in (at least some of) today&#39;s western society!</p><p>Let&#39;s imagine some scenarios:</p><ul><li>(1) You feel hungry, but you don&#39;t eat (let&#39;s say because you can&#39;t)</li><li>(2) You don&#39;t feel hungry, and you don&#39;t eat (no matter why)</li><li>(3) You don&#39;t feel hungry, but you eat anyway</li></ul><p>I&#39;m not talking here about people that starve. I&#39;m assuming you&#39;re skipping only one, maybe two meals at most. Actually starving is serious, and I&#39;m not trying in any way to downplay its seriousness!</p><p>If you don&#39;t believe in any of the declared crap, all&#39;s fine, you just go on with your day, in any of the 3 scenarios. But what if you do believe it?</p><p>In (1) and (2), what&#39;s actually worse for your health: the fact that you haven&#39;t eaten, or that you&#39;re stressing because you believe it&#39;s bad you haven&#39;t eaten (whether you feel hungry or not)?</p><p>In (1), what&#39;s worse: the fact that you haven&#39;t eaten, or that you&#39;re stressing because you feel hungry?</p><p>In (3) whatever food you have is arguably unnecessary -- your body didn&#39;t feel it necessary, at least. It may simply be extra food to make you fatter.</p><p>And particulars matter, of course. If you do hard physical work, skipping a meal may be enough to have you pass out after a while. But many people nowadays don&#39;t. And many (me included) eat tons of food. Food that they don&#39;t need. For them, skipping a meal or even two, as long as they don&#39;t feel ill/weak because of it, is very likely OK.</p><p>This deviated a bit... To get back on track: in these scenarios, is the food what really matters? This is possibly the most important question. I argue that it isn&#39;t: you can survive the scenarios after all, and easily at that! On top of it, there&#39;s nothing you can do right now to improve the situation.</p><p>So what do you think the better use of your energy is: worrying about something you can easily survive, or worrying about or enjoying something else that matters to you, something you like, something you want?</p><p>I also realize that it may not feel easy, especially when you&#39;re feeling hungry; and that worrying more &quot;productively&quot; may not come naturally to you -- the opposite may be the case. But it is possible to train yourself. It is possible to condition yourself, distract yourself from that (easily survivable) unpleasant feeling. We weren&#39;t raised up thus. In western society we learn that splurging is the way. And so we do. Then it feels uneasy when we can&#39;t, like it shouldn&#39;t be possible. We simply haven&#39;t learned how to deal with it.</p><p>To try to exemplify how being free of these self-restrains gives you the needed freedom to experiment, I&#39;ll go with food again (I don&#39;t know why, it&#39;s just what&#39;s popping into my head).</p><p>If you go traveling, you should try to enjoy the place as much as possible while you&#39;re still there -- this should be obvious?</p><p>Let&#39;s say that you plan a walk at this place that may be completely unknown to you. You found some guides or whatever, you decided to go here and there, and you marked possible food stops (like restaurants or cafes).</p><p>Alas! The guides were outdated and the food places are closed! Quick! What do you do?</p><p>Should have been easy if you read it all thus far: ¯\__(ツ)_/¯ go with it, no big deal, it&#39;s not a showstopper! Carry on with your plan, visit what other places you planned to visit. Enjoy them as much as you would weren&#39;t the food places closed. After the walk you can be sure you&#39;ll enjoy the food even more.</p><p>The alternatives I can think of are, to continue with the rest of the plan but be stuck with &quot;oh no, I have no food!&quot;, thus not enjoying the walk; or to abort the rest of the plan to go for food instead. Shit alternatives if you ask me...</p><p>This is getting long enough, but finally: no, the Tao isn&#39;t an excuse to sit back and watch the time go by, and indeed, I&#39;m in favor of the opposite. So why do I think it&#39;s, as I described it at the top, not just some &quot;fate&quot; BS or hard determinism?</p><p>Because it isn&#39;t about what&#39;s gonna happen in the future. In no way does the Tao say that nature is the determining force of the future; or that if you do this thing that thing will happen. Only that things have an innate nature, a pre-disposition, a way of behaving and acting that feels right, if you will, for both animate and inanimate entities; and that you should try to learn of that way, both yours and your environment&#39;s, and how best they can coexist and/or cooperate.</p><p>The best practical example I can think of is physics. It certainly is easier to let gravity do its thing than to go against it -- ever tried jumping and remaining in the air? Not that easy, right? But if you don&#39;t go against it, ever, you&#39;ll go nowhere. On the flip side of the coin, if you feel so strongly against it that you can only brood over it, you&#39;ll also go nowhere, it&#39;ll be miserable. Thus, the way (Tao means &quot;way&quot; or &quot;path&quot;, by the way) is through the middle ground, where you and your surroundings can meet.</p><p>Little side-note: in my view, this is one of the ideas that lead me to believe the best way of life is the one that ruffles leaves the least (in number and ruffled-ness). With regards to the planet specifically, I think that we should be striving to the best of our abilities not to screw it.</p><p>And that&#39;s that. I spent a good workday of time on this, totally worth it! Feels like I beat a dead horse a bit, though... :/</p><ul><li><a href="https://en.wikipedia.org/wiki/Chinese_philosophy">Chinese Philosophy</a></li><li><a href="https://en.wikipedia.org/wiki/Chinese_martial_arts">Chinese Martial Arts</a></li><li><a href="https://en.wikipedia.org/wiki/Tao_Te_Ching">Tao Te Ching</a></li><li><a href="https://en.wikipedia.org/wiki/Tao">Tao</a></li><li><a href="https://en.wikipedia.org/wiki/Fate">Fate</a></li><li><a href="https://en.wikipedia.org/wiki/Hard_determinism">Hard Determinism</a></li><li><a href="https://en.wikipedia.org/wiki/Tai_chi">Tai Chi</a></li><li><a href="https://www.theguardian.com/lifeandstyle/2016/nov/28/breakfast-health-america-kellog-food-lifestyle">Breakfast (Kellogg&#39;s and some bacon company)</a></li><li><a href="../wiki/books.html">Books list</a></li></ul></body></html></content> <id>gemini://siiky.srht.site/philosophy/flexibility-life.gmi</id> <published>2022-07-28T00:00:00Z</published> <title type="text">Flexibility & Life</title> <updated>2022-06-01T00:00:00Z</updated> <link href="https://siiky.srht.site/philosophy/flexibility-life.html" rel="alternate" type="text/html" hreflang="en" title="Flexibility & Life" /> <link href="gemini://siiky.srht.site/philosophy/flexibility-life.gmi" rel="alternate" type="text/gemtext" hreflang="en" title="Flexibility & Life" /> </entry> <entry> <content type="html"><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"><html lang="en" xml:lang="en"><head><meta charset="utf-8"></meta></head><body><h1>Fagots</h1><p>siiky<br></br>2022/05/05<br></br>2022/07/28<br></br>en</p><p>After some recent events in my personal life 乱 (Ran) came to mind: what if our &quot;mental strength&quot;, or ability to withstand stress, is like a fagot of arrows?</p><ul><li><a href="https://en.wikipedia.org/wiki/Ran_(film)">Akira Kurosawa, &quot;Ran&quot;</a></li><li><a href="https://ja.wikipedia.org/wiki/乱_(映画)">黒澤 明、「乱」</a></li><li><a href="https://www.merriam-webster.com/dictionary/fagot">Fagot (Merriam-Webster)</a></li></ul><p>I think the analogy works well enough.</p><p>DISCLAIMER: I haven&#39;t the faintest fucking clue what I&#39;m talking about. All that I &quot;know&quot; about psychology is from Psych 101 by Paul Kleinman (maybe others meanwhile, check my book list), random Wikipedia pages, and a few random posts here and there (check my psychology links). I just had this thought after the already mentioned events and decided to meditate on it.</p><ul><li><a href="../wiki/books.html">Books list</a></li><li><a href="links.html">Psychology links</a></li></ul><h2>The Analogy</h2><p>One arrow corresponds to one &quot;unit&quot; of &quot;mental strength&quot;.</p><p>Greater number of arrows translates to increased ability to withstand stress, and vice versa: lesser number, decreased ability.</p><p>Repeated or continuous stress on the fagot eventually results in breakdown, assuming that the stress actually strains at least some of the arrows.</p><p>And rest, that is, lack of stress or strain, has some sort of &quot;healing&quot; effect. Immediately after you&#39;ve gone through some stressful event you&#39;re more likely to breakdown with another stressful event. However, give it some time and the second event is more manageable. This is possibly the case that translates worse. If an arrow starts to crack it won&#39;t magically uncrack. But maybe that&#39;s the wrong scale to think about -- arrows can be very flexible, so they can withstand a lot of stress in a very short interval with no damage (their &quot;stress capacity&quot; depletes as fast as it regenerates). On the other hand, if they are cracked, they have to be replaced -- like sharks replace their teeth? Or maybe the analogy plays perfectly right, and there&#39;s no way to fix a broken fagot... shit, fingers crossed!</p><p>And lastly: two fagots are indistinguishable if not under stress. 20 arrows suspended in the air, or simply resting in your hands, don&#39;t break by themselves -- you have a literal emergency in your hands if they do. But the same is true for one single arrow, it will comfortably withstand the atmospheric pressure. However, try to bend them or hang something at their tips, and the difference will be noticeable. This means that unless you&#39;re under stress you couldn&#39;t possibly know how much stress you can really handle. And also that you can&#39;t compare two different people in terms of their &quot;mental strength&quot; without putting them under stress.</p><h2>Fagots Fagot</h2><p>Now, how does this fit into the mind of some person?</p><p>The way I see it, there isn&#39;t one single fagot to take it all. It seems more natural to me that there are several fagots, each with a different &quot;purpose&quot;, or for a different kind of aspect of life or relationship.</p><p>Why I think that&#39;s the case: if I have a shit day at work, I won&#39;t feel stressed with University because of it, or vice versa. Another example, probably more obviously: if I have a fight with someone, let&#39;s say a really ugly one, I won&#39;t feel stressed/angry when talking with someone else because of it; nor will I feel any ill will towards that someone else. SG(e)TM (Sounds Good enough To Me)!</p><p>So there&#39;s at least some fagot of fagots. Maybe it&#39;s really an hierarchy: there&#39;s the main fagot, composed of the society/work fagot, the learning/University fagot, the personal life fagot, the general life fagot, ...</p><p>The society/work fagot may be split into the &quot;social status&quot; fagot, money fagot, career fagot (maybe tied to &quot;social status&quot;), ...</p><p>The learning/University fagot may be split into the self-learning fagot (the shit you like/want to learn), the research fagot (the shit the scientific community thinks is dope), the grades fagot (the shit grades you get at classes), ...</p><p>The personal life fagot may be split into a fagot for each relationship with a person, including the self-fagot.</p><h2>Main Fagot Breakdown</h2><p>There&#39;s just this something I still can&#39;t explain, and that doesn&#39;t seem to translate well through the &quot;Fagot Hierarchy Theory&quot; I described above: what would bring one to the point of suicide?</p><p>From the theory it seems that suicide shouldn&#39;t even be considered unless the main fagot breaks -- all the fagots under it break? But I don&#39;t think that one would bring oneself to this point because of just one fagot either.</p><p>So what&#39;s it take?</p><h2>How One Fagot Affects Another</h2><p>Could it be that different fagots have different strengths/capacities? Such that, for example, the main fagot&#39;s main source of strength comes from, let&#39;s say, the work fagot. In this case, if the work fagot goes to shit, the littlest strain on the other fagots could be enough to break them, and thus break the main fagot as well.</p><p>Almost as if the strain &quot;leaked&quot; from one fagot to the other.</p><h2>How Better Fagots Become</h2><p>How fagots get weakened it&#39;s already been discussed. But how do we get to withstand higher levels of strain with time? Dunno...</p><p>Do we really become stronger and capable of taking more stress, or do we become &quot;numb&quot; and stop feeling that we&#39;re under stress?</p><p>If the latter, is it really that we can take more stress? Maybe it&#39;s like sleep and caffeine, in that we think we&#39;re fine until the lack of sleep starts to hit?</p></body></html></content> <id>gemini://siiky.srht.site/psychology/fagots.gmi</id> <published>2022-07-28T00:00:00Z</published> <title type="text">Fagots</title> <updated>2022-05-05T00:00:00Z</updated> <link href="https://siiky.srht.site/psychology/fagots.html" rel="alternate" type="text/html" hreflang="en" title="Fagots" /> <link href="gemini://siiky.srht.site/psychology/fagots.gmi" rel="alternate" type="text/gemtext" hreflang="en" title="Fagots" /> </entry> <entry> <content type="html"><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"><html lang="en" xml:lang="en"><head><meta charset="utf-8"></meta></head><body><h1>Bill Gates, &quot;How to Avoid a Climate Disaster&quot;</h1><p>siiky<br></br>2022/04/09<br></br>2022/07/28<br></br>en</p><p>Finished reading this book recently (ISBN 978-0-241-44830-4) and in this post I want to share my opinions/critique, and try to compile all the notes I took while and after reading.</p><ul><li><a href="../wiki/books.html">Books list</a></li><li><a href="https://en.wikipedia.org/wiki/How_to_Avoid_a_Climate_Disaster">Wikipedia</a></li></ul><p>I&#39;ll put down page numbers in this post. If you have the same edition, cool, if not: the &quot;Introduction&quot; starts on p3, and &quot;Climate Change and COVID-19&quot; ends on p230. Hopefully that will help getting around. For figures and tables you can try the &quot;Notes&quot; where you can find the sources and corresponding page.</p><p>Because Gemtext is so limited, here are some notes to disambiguate formatting: titles of things will be surrounded by quotes &quot;Like This&quot;. ALL CAPS mean either italics or bold. Page numbers will be shown as p123, figures and tables as &quot;fig p123&quot; and &quot;tbl p123&quot; respectively, and sources as &quot;src&quot;. Tables will be formatted in code blocks, and will additionally have their page and source in the block&#39;s alt text. The page numbers of other things (quotes, figures, &amp;c) will always come afterwards, never before. Likewise, comments about quotes/figures/tables/&amp;c should in general come afterwards, not before.</p><h1>Overview</h1><p>Here are some of my thoughts on the book in general, or the things I got out of it. Maybe you won&#39;t agree with them, but that&#39;s life (insert Frank Sinatra reference here).</p><h2>Tone</h2><p>First off, this is kinda personal preference, what makes me tick or makes me cringe, but I didn&#39;t like the overall tone and his unquestionably stating that &quot;progress&quot; is good.</p><p>My impression, from reading this book alone, is that he REALLY believes that the increasing consumerism of resources -- be they electricity, water, minerals/metals, &amp;c -- is a good thing, especially by &quot;the poor&quot;, as he puts it.</p><p>The exact thing that got us into this, he thinks should be liberally given to and used by &quot;the poor&quot;. So that they can wreck their own countries/land/habitat? Is this rational?</p><p>The acknowledgments chapter even has a huge list of people that supposedly contributed to the inception of the book in some way or another, including several researchers, professors, and renowned authors in the matter. Is it just me thinking about this? Or am I missing something that everyone else knows about?</p><p>It&#39;s almost funny after he mentioned David Foster Wallace&#39;s &quot;This Is Water&quot; (more later).</p><p>This is related to some of the themes discussed in &quot;Sex at Dawn&quot; from my point of view.</p><ul><li><a href="https://en.wikipedia.org/wiki/Sex_at_Dawn">Christopher Ryan, Cacilda Jethá, &quot;Sex at Dawn&quot;</a></li></ul><h2>Pollution of &quot;greener&quot; alternatives</h2><p>Throughout the whole book he continuously advocates for green energies (like solar and wind) and alternatives (like electric vehicles) but fails to mention even once the pollution involved in their production, and the fact that the current products/methods are not recyclable (see &quot;The Dark Side of Green Energies&quot;). Other actually greener production methods may exists, even if not as efficient as the currently in use -- as an example, see &quot;How to Build a Low-tech Solar Panel?&quot;. But for some reason there&#39;s no interest in these other methods.</p><ul><li><a href="https://en.wikipedia.org/wiki/Guillaume_Pitron">Guillaume Pitron, &quot;The Dark Side of Green Energies&quot;</a></li><li><a href="https://solar.lowtechmagazine.com/2021/10/how-to-build-a-low-tech-solar-panel.html">Low-Tech Magazine, &quot;How to Build a Low-tech Solar Panel?&quot; (solar powered site)</a></li><li><a href="https://www.lowtechmagazine.com/2021/10/how-to-build-a-low-tech-solar-panel.html">Low-Tech Magazine, &quot;How to Build a Low-tech Solar Panel?&quot; (conventional always-on site)</a></li></ul><h2>Green premium</h2><p>Didn&#39;t know the &quot;green premium&quot; term -- the extra price paid for greener alternatives. (I was familiar with the concept of course, just not the term)</p><h2>Reflect cost in price</h2><p>I like the idea of raising/lowering the price of something based on its environmental impact, thus better reflecting the true cost of something, and simultaneously discouraging &quot;bad&quot; alternatives over &quot;good&quot; alternatives.</p><p>The difficulty would be convincing people that this is a good thing. During the transition, the average Joe probably won&#39;t be interested in the fact the new thing is better for the environment but rather that what they&#39;re using currently became more expensive. In my view, this is of course irrational -- negative effects on the environment negatively affect everyone in the long run. But it&#39;s not something easy to convince someone of, and I for sure commit the same mistake occasionally.</p><p>The &quot;true cost&quot; of something is what snan calls &quot;externalities&quot;.</p><ul><li><a href="https://portal.mozz.us/gemini/idiomdrottning.org/externalities">Idiomdrottning, &quot;Externalities&quot;</a></li></ul><h2>Sources &amp; lack thereof</h2><p>Some of his statements are not backed by any sources, you&#39;re supposed (I guess?) to just believe in his authority on the matter and go with it. Examples:</p><ul><li>money spent/saved over some period of time when comparing alternatives -- e.g. planting mangrove trees rather than not saves the world $80B/year;</li><li>amount of energy provided per amount of energy consumed by produced chickens, pigs, and cows -- 1/2, 1/3, 1/6, respectively; don&#39;t even know if that&#39;s the meat alone, or if it includes eggs, milk, &amp;c;</li><li>the amount of CO2 absorbed by a tree during its lifetime -- &quot;a good rule of thumb is 4 tons over the course 40 years.&quot;</li></ul><p>At least graphs and the like usually have sources.</p><h1>Chapters</h1><p>Didn&#39;t take notes on some of the chapters, so obviously those aren&#39;t here. But just because it may be of interest, here&#39;s the whole index:</p><ul><li>Introduction: 51 Billion to Zero</li><li>1. Why Zero?</li><li>2. This Will Be Hard</li><li>3. Five Questions to Ask in Every Climate Conversation</li><li>4. How We Plug In</li><li>5. How We Make Things</li><li>6. How We Grow Things</li><li>7. How We Get Around</li><li>8. How We Keep Cool and Stay Warm</li><li>9. Adapting to a Warmer World</li><li>10. Why Government Policies Matter</li><li>11. A Plan for Getting to Zero</li><li>12. What Each of Us Can Do</li><li>Afterword: Climate Change and COVID-19</li></ul><h2>1. Why Zero?</h2><p>We went from almost 0 (in 1850) to almost 40 billion (in 2018) tons of CO2 (emitted per year, I suppose). (fig p24) The figure includes also the rise of the average temperature over the years.</p><h2>2. This Will Be Hard</h2><p>From David Foster Wallace&#39;s speech &quot;This Is Water&quot; (p37-38):</p><blockquote>There are these two young fish swimming along, and they happen to meet an older fish swimming the other way, who nods at them and says, &quot;Morning, boys, how&#39;s the water?&quot; And the two young fish swim on for a bit, and then eventually one of them looks over at the other and goes, &quot;What the hell is water?&quot;</blockquote><p>David&#39;s explanation (p38):</p><blockquote>The immediate point of the fish story is that the most obvious, ubiquitous, important realities are often the ones that are the hardest to see and talk about.</blockquote><ul><li><a href="https://en.wikipedia.org/wiki/This_Is_Water">David Foster Wallace, &quot;This Is Water&quot;</a></li><li><a href="https://en.wikipedia.org/wiki/David_Foster_Wallace">David Foster Wallace</a></li></ul><blockquote>Many farmers still have to use ancient techniques, which is one of the reasons they&#39;re trapped in poverty. They deserve modern equipment and approaches, but right now using those tools means producing more greenhouse gases.</blockquote><p>(fig p43) Why assume that WE are the superior ones and that THEY have to &quot;progress&quot;? Until 1850 (according to fig p24) we barely made a dent to the climate. How can you assume that &quot;progressing&quot; was a good thing? Even agriculture may have been a mistake (&quot;Sex at Dawn&quot;)!</p><h2>3. Five Questions to Ask in Every Climate Conversation</h2><pre>|-----------------------+------------+------------------------------------------------| | Activity | Percentage | Description | |-----------------------+------------+------------------------------------------------| | Making things | 31% | Producing materials (cement, metals, plastics) | | Plugging in | 27% | Producing electricity | | Growing things | 19% | For food (plants &amp; animals) | | Getting around | 16% | Cars, planes, ships, trains, trucks, ... | | Keeping warm and cool | 7% | Heating &amp; cooling, refrigeration | |-----------------------+------------+------------------------------------------------| </pre><p>Human activities and their percentage of greenhouse gases emitted. He gives a definition of what goes where in a footnote:</p><blockquote>These percentages represent global greenhouse gas emissions. When you&#39;re categorizing emissions from various sources, one of the questions you have to decide is how to count products that cause emissions both when you make them and when you use them. For example, we produce greenhouse gases when we refine oil into gasoline and again when we burn the gasoline. In this book, I&#39;ve included all the emissions from making things in &quot;How we make things&quot; and all the emissions from using them in their respective categories. So oil refining goes under &quot;How we make things,&quot; and burning gasoline is included in &quot;How we get around.&quot; The same goes for things like cars, planes, and ships. The steel that they&#39;re made of is counted under &quot;How we make things,&quot; and the emissions from the fuels they burn go under &quot;How we get around.&quot;</blockquote><p>This (tbl p55) was possibly the most unexpected thing I learned from the book. I didn&#39;t expect at all for production of materials to be at the top and electricity next. Even more for food (mainly animals) being worse than transport. Just shows how well (un)informed I am (or was)...</p><pre>|------------------------+--------------| | Place | Energy | |------------------------+--------------| | world | 5k gigawatts | | US | 1k gigawatts | | mid-size city | 1 gigawatt | | small town | 1 megawatt | | average American house | 1 kilowatt | |------------------------+--------------| </pre><p>&quot;How much power does it take?&quot; -- Gates&#39; cheatsheet on energy quantities.</p><blockquote>Whenever you hear &quot;kilowatt&quot;, think &quot;house.&quot; &quot;Gigawatt&quot;, think &quot;city.&quot; A hundred or more gigawatts, think &quot;big country.&quot;</blockquote><p>(p57)</p><pre>|----------------------+-----------| | Energy source | W/m^2 | |----------------------+-----------| | Fossil fuels | 500-10000 | | Nuclear | 500-1000 | | Solar | 5-20 | | Hydropower | 5-50 | | Wind | 1-2 | | Wood &amp; other biomass | &lt;1 | |----------------------+-----------| </pre><p>&quot;How much power can we generate per square meter?&quot;. Has this note about solar:</p><blockquote>The power density of solar could theoretically reach 100 W/m^2, though no one has accomplished this yet.</blockquote><h2>4. How We Plug In</h2><p>Again suggesting it&#39;s a good thing to increase energy usage. (p74)</p><pre>|-------------------+----------| | Source | Tons/TWh | |-------------------+----------| | Solar | 16.4 | | Hydropower | 13.9 | | Wind | 9.9 | | Geothermal | 5.3 | | Coal | 1.39 | | Nuclear (fission) | 0.99 | | Natural gas | 0.79 | |-------------------+----------| </pre><p>Histogram showing the amount of resources needed to build and run a power plant of different types, measured in tons of material per TWh, ordered from most to least material hungry. The numbers here are approximate, measured with a ruler.</p><pre>|-------------------+------------| | Energy Source | Deaths/TWh | |-------------------+------------| | Coal | 24.6 | | Oil | 18.4 | | Biomass | 4.6 | | Gas | 2.8 | | Nuclear (fission) | 0.07 | |-------------------+------------| </pre><p>Histogram showing number of deaths per unit of electricity generated. The numbers here are exact, each column had a label.</p><blockquote>Imagine if everyone had gotten together one day and said, &quot;Hey, cars are killing people. They&#39;re dangerous. Let&#39;s stop driving and give up these automobiles.&quot;</blockquote><p>Analogy with cars about how we stopped using and researching nuclear energy because of the past accidents. (p86)</p><p>It goes both ways too. We stopped using nuclear because of the accidents, but even though the other energy sources result in more deaths per unit of energy (tbl p85), we prefer using those.</p><p>Mentions TerraPower (p86). Some marketing words (mainly for me to read about later): traveling wave reactor, capable of running off of the waste of other reactors (that is, used up Uranium, Plutonium, &amp;c). (p87)</p><ul><li><a href="https://en.wikipedia.org/wiki/TerraPower">TerraPower</a></li><li><a href="https://en.wikipedia.org/wiki/Traveling_wave_reactor">Traveling wave reactor</a></li></ul><p>Direct Air Capture: taking CO2 right off the air. (p95) The alternative, which seems to be more practicable nowadays, is point carbon capture.</p><ul><li><a href="https://en.wikipedia.org/wiki/Direct_air_capture">Direct Air Capture (DAC)</a></li><li><a href="https://en.wikipedia.org/wiki/Carbon_capture_and_storage">Point Carbon Capture</a></li></ul><blockquote>I used to scoff at the idea that using power more efficiently would make a dent in climate change. My rationale: If you have limited resources to reduce emissions (and we do), then you&#39;d get the biggest impact by moving to zero emissions rather than by spending a lot trying to reduce the demand for energy.</blockquote><p>A comment about using less energy. (p95) Is it dumb or what? The following paragraph:</p><blockquote>Anything that reduces the scale we need to reach is helpful.</blockquote><p>(p96) Whouldathunkit! Finally he says something more sensible:</p><blockquote>There&#39;s also a related approach called load shifting or demand shifting, which involves using power more consistently throughout the day.</blockquote><p>(p96) This sounds like a VERY good idea, for the reason he states afterwards:</p><blockquote>Right now, we tend to generate power when we use it -- for example, cranking up electric plants to run a city&#39;s light at night. With load shifting, though, we do the opposite: we use more electricity when it&#39;s cheapest to generate.</blockquote><p>(p96) And he goes on giving some examples of changes of thinking and habits.</p><p>This relates to a habit that I have to break... I tend to stay up late and wake up late.</p><h2>6. How We Grow Things</h2><ul><li><a href="https://en.wikipedia.org/wiki/Norman_Borlaug">Normam Borlaug</a></li></ul><p>Discoverer/inventor of &quot;super crops&quot;. (p115)</p><p>A grown chicken gives 1 calorie for every 2 calories that it consumes; a pig 1 for every 3 calories; cows 1 for every 6. That is, we get only 1/2, 1/3, and 1/6, respectively, of the energy &quot;we put in&quot; or &quot;invest&quot;. (p115; src: none)</p><p>Graph of the trend of meat consumption on some countries over the years, from 2000 to 2020, with predictions until 2028. (fig p116; src: OECD-FAO Agricultural Outlook 2020) In 2020, million tons of meat consumed (approximate numbers, measured with a ruler): Mexico, 9.6; Brazil, 19.2; EU, 40; USA, 42; China, 80.</p><p>After exposing how &quot;growing&quot; animals significantly contributes to global warming and how greenhouse gases come to be from this practice, and of ways to work around that or improve the situation (such as bioengineering animals to not produce greenhouse gases), this comes along:</p><blockquote>A hard-core vegan might propose another solution: /Instead of trying all these ways of reducing emissions, we should just stop raising livestock./ I can see the appeal of that argument, but I don&#39;t think it&#39;s realistic. For one thing, meat plays too important a role in human culture. In many parts of the world, even where it&#39;s scarce, eating meat is a crucial part of festivals and celebrations. In France, the gastronomic meal -- including started, meat or fish, cheese, and dessert -- is officially listed as part of the country&#39;s Intangible Cultural Heritage of Humanity. According to the listing on the UNESCO website, &quot;The gastronomic meal emphasizes togetherness, the pleasure of taste, and the balance between human beings and the products of nature&quot;</blockquote><p>Gates on &quot;hard-core veganism&quot;. (p118-119)</p><p>WHAT THE FUCK?</p><p>1st WTF: &quot;hard-core vegan&quot;? I&#39;m pretty sure a vegan doesn&#39;t have to be hardcore to be of that opinion.</p><p>2nd WTF: &quot;Cultural Heritage&quot;? My brain goes &quot;computer says no&quot; with this... The culture we&#39;re leaving behind -- possibly literally -- is to destroy what made it possible to exist in the first place?</p><ul><li><a href="https://en.wikipedia.org/wiki/Cultural_heritage">Cultural Heritage</a></li><li><a href="https://en.wikipedia.org/wiki/Computer_says_no">Computer says no</a></li></ul><p>3rd WTF: UNESCO? Aren&#39;t these the guys behind the SDGs (&quot;Sustainable Development Goals&quot;, quotes super apropes)?</p><p>The same guys that put &quot;Climate action&quot;, &quot;Life below water&quot;, and &quot;Life on land&quot; as ALMOST the least important goals (13, 14, and 15, respectively, out of 17 -- pic below)? So much for sustainable...</p><p>The same guys that put water (6) as less important than poverty (1), food (2), health &amp; well being (3), quality education (4), and gender equality (5)? Yes, everybody knows you all your thirsts with knowledge quench! And what not...</p><p>And what the hell are &quot;No poverty&quot; (1), &quot;Responsible consumption and production&quot; (12) and &quot;Partnerships for the goals&quot; (17), anyway? Couldn&#39;t they have been any vaguer?</p><p>(To be fair, I haven&#39;t read each of the goals&#39; descriptions yet)</p><ul><li><a href="https://en.wikipedia.org/wiki/Unesco">UNESCO</a></li><li><a href="https://en.wikipedia.org/wiki/Sustainable_Development_Goals">SDGs</a></li><li><a href="https://en.wikipedia.org/wiki/List_of_Sustainable_Development_Goal_targets_and_indicators">SDGs descriptions</a></li><img src="https://upload.wikimedia.org/wikipedia/commons/a/a7/Sustainable_Development_Goals.svg" alt="SDGs diagram"></img></ul><p>4th WTF: &quot;togetherness&quot;? You have to eat an animal (or animal product) to feel close to other people, like your friends and family? Reminds me of an episode of FlashForward where a listener/commenter(?) said &quot;a Sunday isn&#39;t a Sunday without my chicken wings&quot; or something of the sort. Ok, then... Maybe I&#39;m really so very abnormally undemanding, but I&#39;m good with a (literal) walk in the park.</p><ul><li><a href="https://www.flashforwardpod.com/2016/08/10/episode-19-wheres-the-beef">FlashForward, &quot;Where&#39;s the Beef?&quot;</a></li></ul><p>5th WTF: &quot;pleasure of taste&quot;? Hmmm... Let&#39;s see. How do you season your meat or fish? Salt (lit. some rock out of sea water)? Spices (plants, seeds, roots, ...)? Butter (or, more likely, margarine -- plant)? Some garlic (plant) and/or onion (plant)? Maybe some alcoholic beverage (wine -- grapes; beer -- cereals; vodka -- cereals/potatoes; rum -- sugarcanes)? Why use so many non-animal products if the said &quot;pleasure of taste&quot; comes from the meat? Admittedly, nowhere does it say that the &quot;pleasure of taste&quot; does come from the meat, but why would it be mentioned otherwise?</p><p>6th WTF: &quot;balance between human beings and the products of nature&quot;? Must have been a typo for sure: &quot;imbalance&quot;. And yes, good thing we, the good, well intentioned humans, are here to consume all the products of nature, otherwise, what a waste! And y&#39;all know that waste is a sin!</p><p>This must be the most stupidestest paragraph of the entire book... He does say he enjoys a good burger, but it would be only an assumption, of course, to think that this is his opinion or that he&#39;s just sharing something he&#39;s heard. Plus, he says he has invested in two companies working on &quot;plant-based meat&quot;: Beyond Meat and Impossible Foods. (I think calling it &quot;plant-based meat&quot; is stupid -- if it&#39;s plant-based then it&#39;s not meat -- but whatever, after that paragraph...)</p><ul><li><a href="https://en.wikipedia.org/wiki/Meat_substitutes">Plant-based meat</a></li><li><a href="https://en.wikipedia.org/wiki/Beyond_meat">Beyond Meat</a></li><li><a href="https://en.wikipedia.org/wiki/Impossible_Foods">Impossible Foods</a></li></ul><p>And yes, some of my comments above may be a bit exaggerated, but... WHAT THE FUCK?</p><h3>Planting trees</h3><p>Raises a few good questions about the idea of planting trees. (p128-129)</p><p>That bit mentioned at the top of the post:</p><blockquote>How much carbon dioxide can a tree absorb in its lifetime?<br></br>(...)<br></br>(...) a good rule of thumb is 4 tons over the course 40 years.</blockquote><blockquote>How long will the tree survive?<br></br>(...)<br></br>If it burns down, all the carbon dioxide it was storing will be released into the atmosphere.</blockquote><blockquote>What would&#39;ve happened if you hadn&#39;t planted that tree?<br></br>(...)<br></br>If a tree would&#39;ve grown there naturally, you haven&#39;t added any extra carbon absorption.</blockquote><blockquote>In what part of the world will you plant the tree?<br></br>(...)<br></br>(...) trees in snowy areas cause more warming than cooling, because they&#39;re darker than the snow and ice (...). (...) trees in tropical forests cause more cooling than warming, because they release a lot of moisture, which becomes clouds, which reflect sunlight. Trees in the midlatitudes -- between the tropics and the polar circles -- are more or less a wash.</blockquote><blockquote>Was anything else growing in that spot?<br></br>(...)<br></br>If, for example, you eliminate a soybean farm and replace it with a fores, you&#39;ve reduced the total amount of soybeans available, which will drive up their price, making it more likely that someone will cut down trees somewhere else to grow soybeans. This will offset at least some of the good you do by planting your trees.</blockquote><h2>8. How We Keep Cool and Stay Warm</h2><p>Mentions the Bullit Center, a supposedly uber environment friendly building in Seattle. (p157-158)</p><p>Mentions ACs a few times and how they&#39;re oh so cool, but darn it they pollute...</p><p>Would have been a better use of paper talking about some alternatives not based on electricity. For heating, a rocket mass heater sounds like a very good idea (some people also call it a rocket stove, even though they seem to be different things). The Wikipedia page about ACs also presents some alternatives.</p><ul><li><a href="https://en.wikipedia.org/wiki/Bullitt_Center">Bullit Center</a></li><li><a href="https://en.wikipedia.org/wiki/Air_conditioning">ACs</a></li><li><a href="https://en.wikipedia.org/wiki/Rocket_mass_heater">Rocket mass heater</a></li><li><a href="https://en.wikipedia.org/wiki/Rocket_stove">Rocket stove</a></li></ul><h2>9. Adapting to a Warmer World</h2><blockquote>All told, mangroves help the world avoid some $80 billion a year in losses from floods, and they save billions more in other ways. Planting mangroves is much cheaper than building breakwaters, and the trees also improve the water quality.</blockquote><p>Pros of planting mangrove trees. (p172-173; src: none)</p><ul><li><a href="https://en.wikipedia.org/wiki/Mangrove">Mangrove trees</a></li></ul><h1>Mentioned books</h1><p>Books mentioned throughout the book -- may have missed some.</p><ul><li>p43, Vaclav Smil, &quot;Energy Transitions&quot;</li><li>p43, Vaclav Smil, &quot;Energy Myths and Realities&quot;</li><li>&quot;Earth&#39;s Changing Climate&quot; -- can&#39;t find much info on this one, but I believe the ISBN is 978-0-7166-2765-4</li><li>&quot;Weather for Dummies&quot;</li><li>Acknowledgments, David MacKay, &quot;Sustainable Energy -- Without the Hot Air&quot;</li><li>p113-114, Paul Ehrlich, &quot;The Population Bomb&quot; -- a best selling flop; predicted tons of people dying from hunger in the 1970s and 1980s, which didn&#39;t happen</li></ul><ul><li><a href="https://en.wikipedia.org/wiki/Vaclav_Smil">Vaclav Smil</a></li><li><a href="https://en.wikipedia.org/wiki/David_J._C._MacKay">David MacKay</a></li><li><a href="https://en.wikipedia.org/wiki/Paul_R._Ehrlich">Paul Ehrlich</a></li><li><a href="https://en.wikipedia.org/wiki/The_Population_Bomb">Paul Ehrlich, &quot;The Population Bomb&quot;</a></li></ul><p>Didn&#39;t take note of the page of some of the books and I can&#39;t find them now... If you&#39;d like to help complete this list, contact me (see the bottom of the page).</p><h1>Conclusion</h1><p>It&#39;s likely that there are sources out there to learn about the problem better than this book, but I learned some things from it. So to me it was worth reading even though there were a few negative points and where I</p><pre>- [ ] Strongly agree - [ ] Agree - [ ] Slightly agree - [ ] Neither agree nor disagree - [ ] Slightly disagree - [ ] Disagree - [X] Strongly disagree </pre><p>The tone of the book really did turn me off a bit... But that&#39;s probably just me. Other than that, a really big omission is that of the pollution of &quot;greener&quot; alternatives. However, to give him some credit, he seems to really be invested in the problem and to be investing some phat $$ into it.</p><p>Whether it&#39;s worth reading for you depends on you, however. If you&#39;re well into the topic, you probably learned nothing from this post, and in that case maybe you won&#39;t learn nothing from the book that&#39;s significantly worth it either. On the other hand, if you&#39;re leaving this post more informed than you were before, you may want to give the book a try.</p><p>If you have a different view on points I&#39;ve raised, contact me, I&#39;m interested in what other people have to say about the topic. If you know your stuff and have reading suggestions, do contact me!</p><ul><li><a href="../contact.html">Contact</a></li></ul></body></html></content> <id>gemini://siiky.srht.site/books/bill_gates.how_to_avoid_a_climate_disaster.gmi</id> <published>2022-07-28T00:00:00Z</published> <title type="text">Bill Gates, "How to Avoid a Climate Disaster"</title> <updated>2022-04-09T00:00:00Z</updated> <link href="https://siiky.srht.site/books/bill_gates.how_to_avoid_a_climate_disaster.html" rel="alternate" type="text/html" hreflang="en" title="Bill Gates, "How to Avoid a Climate Disaster"" /> <link href="gemini://siiky.srht.site/books/bill_gates.how_to_avoid_a_climate_disaster.gmi" rel="alternate" type="text/gemtext" hreflang="en" title="Bill Gates, "How to Avoid a Climate Disaster"" /> </entry> <entry> <content type="html"><!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml" lang="" xml:lang=""> <head><meta charset="utf-8"/></head> <body> <h1>OpenStreetMap Cheat Sheet</h1> <p>siiky 2021/07/12 2022/07/28 en</p> <p>Here you'll find some personal notes I've gathered, or am still gathering, to ease and quicken creating and correctly tagging common features on OpenStreetMap.</p> <p>If you can't find what you want to map here, have a look at <a href="https://wiki.openstreetmap.org/wiki/How_to_map_a"><em>How to map a</em></a>.</p> <h1>Water Source</h1> <p>For sources of water to be used (mainly) by humans. Water sources to used by animals require a different tag (<a href="https://wiki.openstreetmap.org/wiki/Tag:amenity=watering_place"><code>amenity=watering_place</code></a>). Likewise for water to be used to refill RV's deposits and the like (<a href="https://wiki.openstreetmap.org/wiki/Tag:amenity=water_point"><code>amenity=water_point</code></a>).</p> <ul> <li> <p><a href="https://wiki.openstreetmap.org/wiki/Key:drinking_water"><code>drinking_water=*</code></a>: after defining the type of water source, you may specify whether the water is drinkable. Apart from the obvious <code>yes</code> and <code>no</code>, <code>conditional</code> means &quot;don't know&quot; or &quot;drink at your own risk&quot;.</p></li> <li> <p><a href="https://wiki.openstreetmap.org/wiki/Key:drinking_water:legal"><code>drinking_water:legal=*</code></a> (optional): additionally, you may use to specify whether the water source is officially (un)safe to drink.</p></li></ul> <p>Other possibly interesting tags to take a look at are <a href="https://wiki.openstreetmap.org/wiki/Tag:natural=water"><code>natural=water</code></a> and <a href="https://wiki.openstreetmap.org/wiki/Tag:natural=spring"><code>natural=spring</code></a>.</p> <h2>Simple Water Source</h2> <ul> <li> <p><a href="https://wiki.openstreetmap.org/wiki/Tag:amenity=drinking_water"><code>amenity=drinking_water</code></a>: specifies the feature is a simple source of water. Check the documentation for examples.</p></li> <li> <p><a href="https://wiki.openstreetmap.org/wiki/Key:drinking_water"><code>drinking_water=*</code></a> (optional; <code>yes</code>): specifies whether the water is drinkable. From my understanding, together with <a href="https://wiki.openstreetmap.org/wiki/Tag:amenity=drinking_water"><code>amenity=drinking_water</code></a>, not using this tag is the same as using <code>drinking_water=yes</code>.</p></li></ul> <h2>Ornamented Water Source</h2> <ul> <li> <p><a href="https://wiki.openstreetmap.org/wiki/Tag:amenity=fountain"><code>amenity=fountain</code></a> (<a href="https://wiki.openstreetmap.org/wiki/Pt:Tag:amenity=fountain">PT</a>): specifies the feature is a fountain. Check the documentation for examples.</p></li> <li> <p><a href="https://wiki.openstreetmap.org/wiki/Tag:natural=water"><code>natural=water</code></a> (optional): commonly used together to specify bodies of water next, around, under, etc the fountain.</p></li></ul> <h1>Waste</h1> <p>Features related to <a href="https://wiki.openstreetmap.org/wiki/Waste_Processing">waste processing</a>, such as of trash and recyclables.</p> <h2>Recycling Container</h2> <ul> <li> <p><a href="https://wiki.openstreetmap.org/wiki/Tag:amenity=recycling"><code>amenity=recycling</code></a>: specifies the feature is of some sort of recycling type.</p></li> <li> <p><a href="https://wiki.openstreetmap.org/wiki/Tag:recycling_type=container"><code>recycling_type=container</code></a>: specifies the feature is a recycling container, similar to <a href="https://wiki.openstreetmap.org/wiki/File:Altglas.jpg">this one</a> or <a href="https://wiki.openstreetmap.org/wiki/File:Jt_osm_recycling_underfloor.jpg">this one</a>.</p></li> <li> <p><a href="https://wiki.openstreetmap.org/wiki/Key:location"><code>location=*</code></a> (optional): specifies where the feature is located, i.e., on the surface, under the surface, etc. Two common ones are <a href="https://wiki.openstreetmap.org/wiki/Tag:location=overground"><code>location=overground</code></a> (<a href="https://wiki.openstreetmap.org/wiki/File:Altglas.jpg">pic</a>) and <a href="https://wiki.openstreetmap.org/wiki/Tag:location=underground"><code>location=underground</code></a> (<a href="https://wiki.openstreetmap.org/wiki/File:Jt_osm_recycling_underfloor.jpg">pic</a>). It seems to be optional in the case of <a href="https://wiki.openstreetmap.org/wiki/Tag:location=overground"><code>location=overground</code></a>, as it seems to me to be implied by <a href="https://wiki.openstreetmap.org/wiki/Tag:amenity=recycling"><code>amenity=recycling</code></a>.</p></li> <li> <p><code>recycling:&lt;material&gt;=yes/no</code>: a list of materials can be found on <a href="https://wiki.openstreetmap.org/wiki/Tag:amenity=recycling"><code>amenity=recycling</code></a>, and as is mentioned on that page, if <code>recycling:X=*</code> is omitted, then it is assumed to be <code>no</code>, as if <code>recycling:X=no</code> was present; <em>unless</em> a tag of a supergroup of <code>X</code> is present and <code>yes</code>, in which case it's as if <code>recycling:X=yes</code> was present.</p></li></ul> <h3>The Big Three</h3> <p>By &quot;big three&quot; I mean paper, plastic, and glass:</p> <ul> <li> <p>Paper container (&quot;papelão&quot;): alongside paper itself, all kinds of paper-related and paper-derived materials, like cardboard, can be deposited.</p></li> <li> <p>Plastic container (&quot;embalão&quot;): all kinds of plastic and metal materials can be deposited. These include plastic bottles, plastic bags, tin cans, milk cartons, ...</p></li> <li> <p>Glass container (&quot;vidrão&quot;): all kinds of glass objects, like glass bottles, glass cups, etc, can be deposited.</p></li></ul> <p>Some of these containers also have batteries containers (&quot;pilhão&quot;) next to them, where you can deposit used batteries.</p> <p>The correct <code>recycling:&lt;material&gt;=yes/no</code> tags, based on <a href="https://wiki.openstreetmap.org/wiki/Pt:Tag:amenity=recycling"><code>amenity=recycling</code> (PT)</a>, are the following:</p> <pre><code>recycling:plastic=yes recycling:plastic_bags=yes recycling:plastic_bottles=yes recycling:plastic_packaging=yes recycling:cans=yes recycling:PET=yes recycling:paper=yes recycling:paper_packaging=yes recycling:beverage_cartons=yes recycling:cardboard=yes recycling:cartons=yes recycling:magazines=yes recycling:newspaper=yes recycling:glass=yes recycling:glass_bottles=yes </code></pre> <p><strong>NOTE</strong>: I think styrofoam is allowed in the plastic container. However, I'm not sure it actually is, nor if it's implied by the tags above.</p> <p>And in case there's a batteries basket, include also the following:</p> <pre><code>recycling:batteries=yes recycling:car_batteries=no </code></pre> <h3>Clothes &amp; Footwear</h3> <p>The correct <code>recycling:&lt;material&gt;=yes/no</code> tags, based on <a href="https://wiki.openstreetmap.org/wiki/Pt:Tag:amenity=recycling"><code>amenity=recycling</code> (PT)</a>, are the following:</p> <pre><code>recycling:belts=yes recycling:clothes=yes </code></pre> <p><strong>NOTE</strong>: Footwear is accepted, according to the comments, even though there's no <code>recycling:footwear=yes</code> or similar. I guess it's implied by <code>recycling:clothes=yes</code>.</p> <h2>Trash</h2> <p>Use <a href="https://wiki.openstreetmap.org/wiki/Tag:amenity=waste_disposal"><code>amenity=waste_disposal</code></a> if the feature is a container, or <a href="https://wiki.openstreetmap.org/wiki/Tag:amenity=waste_basket"><code>amenity=waste_basket</code></a> if it is a basket.</p> <p>Additionally, specify the accepted kind of waste with <a href="https://wiki.openstreetmap.org/wiki/Key:waste"><code>waste=*</code></a>:</p> <pre><code>waste=trash;organic;dog_excrement </code></pre> <p>If there's an ashtray attached, you can include <code>cigarettes</code>:</p> <pre><code>waste=trash;organic;dog_excrement;cigarettes </code></pre> <p>You may also include <a href="https://wiki.openstreetmap.org/wiki/Key:location"><code>location=*</code></a>.</p> <h1>Leisure</h1> <h2>Picnic Table</h2> <ul> <li> <p><a href="https://wiki.openstreetmap.org/wiki/Tag:leisure=picnic_table"><code>leisure=picnic_table</code></a>: specifies the feature is picnic table.</p></li> <li> <p><a href="https://wiki.openstreetmap.org/wiki/Key:covered"><code>covered=*</code></a> (optional): you may include this if it's covered, either completely or partially.</p></li> <li> <p><a href="https://wiki.openstreetmap.org/wiki/Key:material"><code>material=*</code></a> (optional): specifies the material it's made of.</p></li></ul> <h2>Bench</h2> <ul> <li> <p><a href="https://wiki.openstreetmap.org/wiki/Tag:amenity=bench"><code>amenity=bench</code></a>: specifies the feature is a bench.</p></li> <li> <p><a href="https://wiki.openstreetmap.org/wiki/Key:backrest"><code>backrest=*</code></a> (optional): specifies whether the bench has or not a backrest.</p></li> <li> <p><a href="https://wiki.openstreetmap.org/wiki/Key:material"><code>material=*</code></a> (optional): specifies the material it's made of.</p></li></ul> <h2>BBQ Grill</h2> <ul> <li> <p><a href="https://wiki.openstreetmap.org/wiki/Tag:amenity=bbq"><code>amenity=bbq</code></a>: specifies the feature is a BBQ grill.</p></li> <li> <p><a href="https://wiki.openstreetmap.org/wiki/Key:fuel"><code>fuel=*</code></a> (optional): the type of material you can use as fuel.</p></li> <li> <p><a href="https://wiki.openstreetmap.org/wiki/Key:covered"><code>covered=*</code></a> (optional; <code>no</code>): whether it's covered, either partially or completely.</p></li></ul> <h1>Tourism</h1> <h2>Viewpoint (Miradouro)</h2> <ul> <li> <p><a href="https://wiki.openstreetmap.org/wiki/Tag:tourism=viewpoint"><code>tourism=viewpoint</code></a>: specifies the feature is a viewpoint.</p></li> <li> <p><a href="https://wiki.openstreetmap.org/wiki/Key:name"><code>name=*</code></a> (optional?): specifies the name of the viewpoint.</p></li> <li> <p><a href="https://wiki.openstreetmap.org/wiki/Key:direction"><code>direction=*</code></a> (optional): the direction of the view; e.g., <code>0-360</code> is &quot;all-round&quot;.</p></li></ul> <h1>Education</h1> <h2>Study Center</h2> <p><a href="https://wiki.openstreetmap.org/wiki/Tag:amenity=prep_school"><code>amenity=prep_school</code></a> seems to be the most appropriate, but for more info see also <a href="https://wiki.openstreetmap.org/wiki/Education_features"><em>Education features</em></a>.</p> <p>Some other possible options:</p> <ul> <li><a href="https://wiki.openstreetmap.org/wiki/Tag:education=centre"><code>education=centre</code></a>: used for specialized areas.</li> <li><a href="https://wiki.openstreetmap.org/wiki/Tag:office=tutoring"><code>office=tutoring</code></a>: looks like it's used for an office itself, not where students go to study?</li></ul> <h1>Popular Restaurant/Cafe/etc chains</h1> <h2>McDonald's</h2> <p>Tags common to all, from <a href="https://wiki.openstreetmap.org/wiki/Tag:name=McDonald's">McDonald's</a>:</p> <pre><code>amenity=fast_food brand:wikidata=Q38076 brand=McDonald's cuisine=burger name=McDonald's </code></pre> <p>I believe all McDonald's have takeaway, so:</p> <pre><code>takeaway=yes </code></pre> <p>Some common tags that vary:</p> <pre><code>outdoor_seating=yes/no smoking=outside drive_through=yes/no opening_hours=* wheelchair=yes/no/... </code></pre> <p>Don't forget to add <code>addr:*=*</code> and <code>payment:*=*</code>.</p> <hr /> <p>Overpass query to find McDonald's restaurants with no <code>brand</code>:</p> <pre><code>[out:json][timeout:300]; ( nwr[&quot;name&quot;~&quot;^mcdonald.?s&quot;, i]({{bbox}}); nwr[&quot;brand&quot;~&quot;^mcdonald.?s&quot;, i]({{bbox}}); nwr[&quot;operator&quot;~&quot;^mcdonald.?s&quot;, i]({{bbox}}); ); out body; &gt;; out skel qt; </code></pre> <h2>Montalegrense</h2> <p><strong>TODO</strong>: <code>amenity=cafe</code>, <code>amenity=bakery</code>, <code>shop=confectionery</code>, or something else?</p> <h2>Mixpão</h2> <p><strong>TODO</strong>: <code>amenity=cafe</code>, <code>amenity=bakery</code>, <code>shop=confectionery</code>, or something else?</p> <h1>NIF/VAT number</h1> <p>Use <a href="https://wiki.openstreetmap.org/wiki/Key:ref:vatin"><code>ref:vatin</code></a>, e.g. <code>ref:vatin=PT123456789</code>.</p> <h1>Adding turn restrictions</h1> <p>First, in this order, select the &quot;from&quot; way, the intersecting (&quot;via&quot;) node, and the &quot;to&quot; way. Then, &quot;Presets&quot;>&quot;Relations&quot;>&quot;Turn restriction&quot;. Select the correct restriction (e.g. <code>no_u_turn</code>) and hit &quot;New relation&quot;. On the lower left list of objects, select the &quot;from&quot; way and change its role to &quot;from&quot; (and similarly to the &quot;via&quot; node and the &quot;to&quot; way). Hit &quot;Ok&quot; and you're done.</p> </body> </html> </content> <id>gemini://siiky.srht.site/osm/cheatsheet.md</id> <published>2022-07-28T00:00:00Z</published> <title type="text">OpenStreetMap Cheat Sheet</title> <updated>2021-07-12T00:00:00Z</updated> <link href="https://siiky.srht.site/osm/cheatsheet.html" rel="alternate" type="text/html" hreflang="en" title="OpenStreetMap Cheat Sheet" /> <link href="gemini://siiky.srht.site/osm/cheatsheet.md" rel="alternate" type="text/gemtext" hreflang="en" title="OpenStreetMap Cheat Sheet" /> </entry> <entry> <content type="html"><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"><html lang="en" xml:lang="en"><head><meta charset="utf-8"></meta></head><body><h1>Hard Determinism</h1><p>siiky<br></br>2020/12/30<br></br>2022/07/27<br></br>en</p><p>Thoughts on Hard Determinism, as described in Philosophy 101, by Paul Kleinman.</p><ul><li><a href="../wiki/books.html">Books list</a></li></ul><p>Hard determinism, as described in the book, states that everything is determined by past events. It is not clear from the book if it&#39;s meant to be applied only to the physical world, beings&#39; behavior, or both, but it treats only human behavior.</p><p>Applied to human behavior, the idea holds that we have no effect in future events, because we cannot do anything other than what we&#39;re predetermined to do, essentially meaning that we have no free will.</p><p>This doesn&#39;t sit right with me. How can we believe to have free will, believe to be able to make a choice, but not actually be able to make a choice? How can it be that when I choose to eat this instead of that, or listen to this song instead of that one, I&#39;m not actually choosing, but it had been predetermined beforehand, since the beginning of time, that I would &quot;choose&quot; so?</p><p>As I write this, I wonder if I could have not written it. And, hadn&#39;t I written this, had I merely thought of writing and chosen not to, I wonder if I could have actually written it.</p><p>It&#39;s really depressing to think that we have no saying in the course of our lives; that whatever we think we do to improve them, or whatever luck or misfortune befalls us, happens simply because it must.</p><p>All the counter arguments listed on the book base themselves in the fact that making choices constitutes free will, and assume, in some way or another, that we can make choices. This boils down to &quot;hard determinism is false, therefore hard determinism is false&quot;.</p><p>However, the real problem is, I think, that we don&#39;t know if this assumption is right.</p><p>On a positive note, this idea implies that, theoretically, one could predict the future after having witnessed the present. This is true, to a certain extent, in the physical world. But what would it mean to be able to know what our &quot;choices&quot; would be in the future? What would happen? On a less positive note, again, it would certainly not be a pleasant experience in certain scenarios, similar to being diagnosed with a terminal disease.</p><ul><li><a href="https://en.wikipedia.org/wiki/Hard_determinism">Hard determinism</a></li><li><a href="https://en.wikipedia.org/wiki/Free_will">Free will</a></li><li><a href="https://plato.stanford.edu/entries/freewill">Free will (SEP)</a></li></ul><p>(haven&#39;t read this SEP entry yet)</p></body></html></content> <id>gemini://siiky.srht.site/philosophy/hard_determinism.gmi</id> <published>2022-07-27T00:00:00Z</published> <title type="text">Hard Determinism</title> <updated>2020-12-30T00:00:00Z</updated> <link href="https://siiky.srht.site/philosophy/hard_determinism.html" rel="alternate" type="text/html" hreflang="en" title="Hard Determinism" /> <link href="gemini://siiky.srht.site/philosophy/hard_determinism.gmi" rel="alternate" type="text/gemtext" hreflang="en" title="Hard Determinism" /> </entry> <entry> <content type="html"><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"><html lang="en" xml:lang="en"><head><meta charset="utf-8"></meta></head><body><h1>Petri Nets Log #003</h1><p>siiky<br></br>2022/07/23<br></br>2022/07/24<br></br>en</p><h2>Language</h2><p>Following up with the idea of a Petri nets programming language, I now have some goals I want it to meet:</p><ul><li>It has to be a real programming language, not a modeling one!</li><li>Must be textual, human-friendly, and text-editor-friendly -- I don&#39;t want to have to muck with a shitty, slow, and subpar GUI editor (as a bonus: this should be enough to make it VCS-friendly too)</li><li>In line with the first point: transitions are written in the &quot;host&quot; programming language, and the user must be able to reuse existing code of that language</li><li>Also in line with the first point: a program in this language must be runnable (even better if compiled) like any other program</li><li>It must be easy to convert to a graphical representation of places, transitions, and edges between them</li><li>It would be fucking great if transitions and nets were reusable and composable! This is possibly one of the hardest goals, so as a start I&#39;m OK with supporting only monolithic nets</li></ul><p>Here&#39;s a starting point: places can be identified, or referenced, in a Petri net by integers:</p><pre>(define-constant p0 0) (define-constant p1 1) (define-constant p2 2) (define-constant p3 3) </pre><p>There&#39;s a DSL that makes it easy to define transitions. Transitions have the associated input and output places, and a transition procedure. This procedure is user code in the host language, and is how the net model ties with &quot;normal&quot; code.</p><pre>; Consumes two tokens from p0: x and y (define-transition (t1 (x p0) (y p0)) (p1 p2) ; Produces (+ x y) to p1, and #t to p2 (values (+ x y) #t)) ; Consumes res from p1 and succ? from p2 (define-transition (t2 (res p1) (succ? p2)) (p3) ; The value of this expression isn&#39;t used because p3 is a &quot;terminal&quot; place (when succ? (print &quot;Successfully sumed: &quot; a))) </pre><p>Finally, a Petri net is simply the set of its transitions:</p><pre>(define-petri-net some-net t1 t2) </pre><img src="somenet.png" alt="Some net"></img><p>With two different macro implementations of define-transition and define-petri-net it&#39;s easy to have the same source file expand to compilable code and to some graphical representation (such as GVS, which can be converted to GraphViz, which can be converted to PNG, SVG, &amp;c, with a couple of commands).</p><ul><li><a href="../scheme/gv-dsl.html">GVS</a></li></ul><p>The detail I was most indecisive about was how to &quot;present&quot; input values to the transition procedure. Some of the alternatives I thought of were naming a single argument list to contain all of the values from all of the places; and, naming the input places and their multiplicities. Examples:</p><pre>(define-transition (t1 args (p1 2) (p2 3) ...) ((p3 1) (p4 2) ...) ; Alternatively, use matchable (let ((p1-1 (car args)) (p1-2 (cadr args)) (p2-1 (caddr args)) (p2-2 (cadddr args)) ...) ...)) (define-transition (t1 (p1-args p1 2) (p2-args p2 3) ...) ((p3 1) (p4 2) ...) ; Alternatively, use matchable (let ((p1-1 (car p1-args)) (p1-2 (cadr p1-args)) (p2-1 (car p2-args)) (p2-2 (cadr p2-args)) ...) ...)) </pre><p>My reasoning was: what if you need a ton of tokens from a single place? Are you gonna enumerate them all? But then... there&#39;s this definition in the Statebox monograph of a k-bounded net, which is a net that never has more than k tokens in any place in any execution ever. And also the definition of a &quot;safe net&quot;, which is a 1-bounded net. So it&#39;s a pretty big deal to have a very limitted number of tokens in a given place.</p><p>Because of that, and to get the most ergonomic bang for the typing buck, I think the syntax presented before is a good compromise.</p><p>There was also the question of representing the tokens produced. For that I quickly convinced myself that using Scheme&#39;s values is a good choice: producing several tokens needs values, producing a single token needs no extra bureaucracy. Using the language&#39;s native features is surely the way to go.</p><h2>Fold Recursive Model</h2><p>(Not the fold concept described in the last chapter of the Statebox monograph)</p><p>Tried modeling a fold (such as a sum), which is a recursive process, as a Petri net, basically the first on my own. Here&#39;s a rough graphic (haven&#39;t played with GraphViz settings yet):</p><img src="folder1.png" alt="Folder w/ inspection"></img><p>Think of kons as add. The net must start execution with the initial value already in acc. The kons transition consumes the value from input and the value from acc, does its thing and produces the result into acc again. And peek consumes the value from acc and duplicates it into output and acc again. This transition could be a user-fired one, for example, to see the current state of the accumulator.</p><p>Alternatively it could consume the value from acc and not put it back. But that would need having a transition to produce a default value for acc. Example:</p><img src="folder2.png" alt="Folder w/ default acc"></img><p>In this net acc may start empty, but bound must have a single token. When a token is produced to input, either kons or default-acc is enabled. If there&#39;s no token in acc, then there must be a token in bound, and in that case default-acc is enabled; if there&#39;s a token in ac, then there&#39;s no token in bound, and in that case kons is enabled. kons behaves as before. On the other hand, peek may consume the token from acc at any time, but does not put it back, and instead puts a dummy token in bound. This place bound is only used to &quot;signal&quot; that acc has no tokens, so that default-acc may move one there. default-acc simply moves an input token to acc to initialize the accumulator.</p><ul><li><a href="index.html">index.html</a></li></ul></body></html></content> <id>gemini://siiky.srht.site/petri_nets/log003.gmi</id> <published>2022-07-24T00:00:00Z</published> <title type="text">Petri Nets Log #003</title> <updated>2022-07-23T00:00:00Z</updated> <link href="https://siiky.srht.site/petri_nets/log003.html" rel="alternate" type="text/html" hreflang="en" title="Petri Nets Log #003" /> <link href="gemini://siiky.srht.site/petri_nets/log003.gmi" rel="alternate" type="text/gemtext" hreflang="en" title="Petri Nets Log #003" /> </entry> <entry> <content type="html"><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"><html lang="en" xml:lang="en"><head><meta charset="utf-8"></meta></head><body><h1>ipfs.scm</h1><p>siiky<br></br>2022/07/23<br></br>2022/07/24<br></br>en</p><p>I wrote a CHICKEN Scheme egg to control a Kubo node through its RPC API.</p><ul><li><a href="https://git.sr.ht/~siiky/ipfs.scm">Repository</a></li><li><a href="https://wiki.call-cc.org/eggref/5/ipfs">Documentation</a></li></ul><p>I&#39;m really glad how it turned out. I think the list of endpoints along with their arguments is very easy to maintain (easily the most tedious job of such a library), and more importantly I think it&#39;s very easy to use also.</p><p>A new version of Kubo was released some day of this past week, and today I spent a few hours updating the egg. I received nice comments from teiresias and a couple of improvements. That and the fact that they&#39;re using the egg made today that much better.</p><ul><li><a href="https://github.com/ipfs/kubo/releases/tag/v0.14.0">Kubo v0.14.0 release notes</a></li><li><a href="https://git.sr.ht/~siiky/ipfs.scm/commit/0.0.4">ipfs.scm v0.0.4</a></li><li><a href="https://portal.mozz.us/gemini/the-brannons.com">teiresias</a></li></ul><p>What prompted me to write this was Petri nets log #003, where I write about languages convertible to other target languages. The idea didn&#39;t come to me while writing that log but because of this egg. After writing it and getting something already usable I thought of using IPFS where CHICKEN didn&#39;t fit: some mpv hacks with its Lua interface. &quot;Why not write an ipfs.lua?&quot;, thought I. And so I did, the following couple of hours. I progressed along well, until I reached the point where only the endpoints were missing. Of course, I didn&#39;t want to write them by hand yet again, screw that! Instead, I wrote a different version of export-rpc-call and voila: a Lua file with all the endpoints defined, ready to be used!</p><ul><li><a href="../petri_nets/log003.html">Petri Nets Log #003</a></li><li><a href="https://git.sr.ht/~siiky/ipfs.lua">ipfs.lua</a></li></ul><p>Have to think what to do about the recent rename someday...</p></body></html></content> <id>gemini://siiky.srht.site/projects/ipfs.gmi</id> <published>2022-07-24T00:00:00Z</published> <title type="text">ipfs.scm</title> <updated>2022-07-23T00:00:00Z</updated> <link href="https://siiky.srht.site/projects/ipfs.html" rel="alternate" type="text/html" hreflang="en" title="ipfs.scm" /> <link href="gemini://siiky.srht.site/projects/ipfs.gmi" rel="alternate" type="text/gemtext" hreflang="en" title="ipfs.scm" /> </entry> <entry> <content type="html"><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"><html lang="en" xml:lang="en"><head><meta charset="utf-8"></meta></head><body><h1>IPFS Quickstart</h1><p>siiky<br></br>2022/04/05<br></br>2022/07/24<br></br>en</p><p>This is just a short pointer on how to use IPFS to access the care list, for anyone who doesn&#39;t know and/or isn&#39;t interested in learning more about it right now. To learn more you should go to the official website or search around.</p><ul><li><a href="list.html">Care list</a></li><li><a href="https://ipfs.io">https://ipfs.io</a></li></ul><p>If you don&#39;t want to install an IPFS node on your own computer(s) (I would highly recommend it) the way to access the network with just an HTTP browser is to use a public gateway.</p><p>If you install the IPFS browser companion, accessing IPFS URIs is just a matter of copy-pasting ipfs://XYZ or ipns://XYZ into your browser&#39;s bar, the plugin does the rest. I would recommend it if you&#39;re going to use IPFS semi-regularly.</p><ul><li><a href="https://docs.ipfs.io/install/ipfs-companion">https://docs.ipfs.io/install/ipfs-companion</a></li></ul><p>Otherwise, this is how you do it manually: from ipfs://XYZ you copy the XYZ and go to https://XYZ.ipfs.dweb.link. If the URI has a ?filename=smth.txt query string, you should append it to the URI too: https://XYZ.ipfs.dweb.link?filename=smth.txt.</p><p>Last note: dweb.link is only one of the several public HTTP gateways available (and I believe it&#39;s operated by Protocol Labs, the company behind IPFS). For others check this list:</p><ul><li><a href="https://ipfs.github.io/public-gateway-checker">https://ipfs.github.io/public-gateway-checker</a></li></ul></body></html></content> <id>gemini://siiky.srht.site/care/ipfs.gmi</id> <published>2022-07-24T00:00:00Z</published> <title type="text">IPFS Quickstart</title> <updated>2022-04-05T00:00:00Z</updated> <link href="https://siiky.srht.site/care/ipfs.html" rel="alternate" type="text/html" hreflang="en" title="IPFS Quickstart" /> <link href="gemini://siiky.srht.site/care/ipfs.gmi" rel="alternate" type="text/gemtext" hreflang="en" title="IPFS Quickstart" /> </entry> <entry> <content type="html"><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"><html lang="en" xml:lang="en"><head><meta charset="utf-8"></meta></head><body><h1>Petri Nets Log #002</h1><p>siiky<br></br>2022/06/23<br></br>2022/07/23<br></br>en</p><p>Unfortunately there are no uppercase subscript letters? When you see &quot;_N&quot; imagine &quot;N&quot; is in subscript. And I&#39;m actually finishing writing this almost exactly one month later... :/ Some details of what I thought at the time escape me.</p><p>Finished reading Ch. 3 &amp; 4 some weeks ago.</p><p>On Ch. 3 there wasn&#39;t that much new to me -- notation was slightly different from what I was used to, but in general it wasn&#39;t complicated to follow. There was terminology I didn&#39;t remember too, but mostly just had to go back and read my notes from University.</p><p>Ch. 4, however, was an interesting one. They define two categories: one of Petri nets (called Petri), and another of Petri net executions.</p><p>with nets as objects; and another of Petri net executions of a given net (called F(N), with some Petri net N, and a fancy calligraphic F), with markings as objects, and transitions as morphisms.</p><h2>Petri</h2><p>The category of Petri nets as nets as objects (obviously), and morphisms are... weird.</p><p>A morphism N → M of the category Petri is a pair 〈f, g〉 where:</p><ul><li>f is a function between the transitions of N and those of M</li><li>g is a multiset homomorphism between the markings(?) of both nets</li></ul><p>Additionally, these morphisms must preserve a couple of properties:</p><ul><li>°(-)_M · f = g · °(-)_N</li><li>(-)°_M · f = g · (-)°_N</li></ul><p>I can&#39;t explain these in words right now, so... exercise for the reader!</p><p>But I&#39;ll try anyway with an example: suppose that f transforms transitions in such a way that they consume and produce double the amount of tokens, and that g doubles the amount of tokens of each place; then, if a particular place p of the net N has 2 tokens, and a transition t of the net N that consumes 2 tokens from p, there&#39;s an &quot;equivalent&quot; place p in the net M with 4 tokens, and an &quot;equivalent&quot; transition t in the net M that consumes 4 tokens from p.</p><p>Altogether, I think these form a sort of super/subnet relation between nets, that visually looks a lot like super/subgraphs.</p><p>The category Petri can be restricted to a subcategory (Petri_G), which is the one used in practice, but I think the details aren&#39;t relevant for this post (it has to do with the g, if you wish to know).</p><h2>Executions</h2><p>The possible executions of a given net form also a category if you take the markings as objects and the transitions as morphisms.</p><p>Markings are represented as products of places. For example, if your net has places p1 and p2, a marking of 3 tokens in p1 and 2 tokens in p2 could be represented as p1·p1·p1·p2·p2. This representation isn&#39;t unique (and cannot be unique due to math reasons), since · is commutative -- p2·p1·p2·p1·p1 is another possible representation of the same marking.</p><p>In the formal definition of Petri nets, a token is a token, no matter if it was produced before or after another token in the same place. In other words, tokens of a place are indistinguishable from each other. However, when programming, it usually matters what the value of a thing is. In general, a function applied to two different values will compute two different values as well.</p><p>Magics of mathematics to the rescue! You can visualize the evolution of a net as a string diagram! Really cool.</p><ul><li><a href="https://en.wikipedia.org/wiki/String_diagram">String diagrams</a></li><li><a href="https://yewtu.be/watch?v=LY5H9uY7Gns">ACT 2020 Tutorial: Introduction to string diagrams (Fabrizio Genovese)</a></li></ul><p>And even cooler because it brings an important detail in. Tokens in this graphical representation are not confused with each other: there&#39;s clearly a string (hence the name) connecting a certain value in a certain point in time to all its &quot;ancestors&quot;, i.e., the order of firings and which tokens were consumed and produced to result in that value.</p><p>And even cooler cooler is that, while you can now tell tokens apart, nobody tells you what order they have to be consumed in! This may or may not be something useful, but I think it&#39;s a neat detail to keep in mind. An implementation may provide different &quot;token choosing&quot; abilities: queues, stacks, sets (random), with or without priorities (e.g. you may want to always consume the smallest integer of a place), &amp;c.</p><h2>Implementation</h2><p>About this time I started wondering... Are there Petri net implementations? What are they used for, modeling or programming? Strictly graphical or textual? Easy to work with? VCS-friendly?</p><p>Statebox supposedly had a prototype implementation that is no more. At least I can&#39;t find it anymore and the people that I know knew about it don&#39;t know about it no more either. I think they&#39;re working on something new, but not publicly.</p><p>So wondering I continued, thinking of a possible language. I don&#39;t have anything concrete yet</p><ul><li><a href="https://xkcd.com/297">but you can be sure there&#39;ll be parens...</a></li></ul><ul><li><a href="index.html">index.html</a></li></ul></body></html></content> <id>gemini://siiky.srht.site/petri_nets/log002.gmi</id> <published>2022-07-23T00:00:00Z</published> <title type="text">Petri Nets Log #002</title> <updated>2022-06-23T00:00:00Z</updated> <link href="https://siiky.srht.site/petri_nets/log002.html" rel="alternate" type="text/html" hreflang="en" title="Petri Nets Log #002" /> <link href="gemini://siiky.srht.site/petri_nets/log002.gmi" rel="alternate" type="text/gemtext" hreflang="en" title="Petri Nets Log #002" /> </entry> <entry> <content type="html"><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"><html lang="en" xml:lang="en"><head><meta charset="utf-8"></meta></head><body><h1>Petri Nets Log #001</h1><p>siiky<br></br>2022/05/16<br></br>2022/07/23<br></br>en</p><p>I started studying Petri nets a few weeks ago, reading the Statebox monograph, and just finished today reading Ch. 2, the formalization of Petri nets and useful definitions.</p><ul><li><a href="https://en.wikipedia.org/wiki/Petri_net">Petri nets</a></li><li><a href="https://statebox.org">Statebox site</a></li><li><a href="https://statebox.org/research/publications/monograph">Statebox monograph</a></li><li><a href="https://arxiv.org/abs/1906.07629">Statebox monograph (ArXiv)</a></li></ul><p>At first I didn&#39;t understand the point of having places (seemingly analogous to &quot;states&quot; in more common automata theories) and transitions (analogous to arrows in more common automata theories) as disjunctive sets of nodes of a graph -- other than the obvious advantage of it being easier to specify several inputs/outputs of a transition. Plus, there&#39;s no current &quot;state&quot; (the mentioned places), very different from other more common automata theories! Not only that, but what they call a &quot;state&quot; is the number of tokens in each place -- what?</p><p>Once I saw Fig. 2.8 and 2.9, however, it clicked: a transition is enabled (can fire, &quot;execute&quot;) if its input tokens can be satisfied by all its input places. So what&#39;s currently a valid &quot;step&quot; in the system is determined by the number of tokens in each place, just like the &quot;current state&quot; of other automata determines the valid next transitions. And, several transitions may execute simultaneously (as long as their executions don&#39;t prevent each other)!</p><p>Yesterday and today were good days in this regard. I now understand how Petri nets can represent concurrent/parallel behavior, because transitions are like independent &quot;processes&quot; (a la Erlang); and that places are more like variables, or resources, possibly shared between many transitions (processes).</p><p>There&#39;s a site referenced right at the end of Ch. 2 where you can read the basics of the basics and play with some simple nets. Unfortunately you can only play with already defined ones, you can&#39;t define new ones or change those of the website.</p><ul><li><a href="https://petrinet.org">https://petrinet.org</a></li></ul><ul><li><a href="index.html">index.html</a></li></ul></body></html></content> <id>gemini://siiky.srht.site/petri_nets/log001.gmi</id> <published>2022-07-23T00:00:00Z</published> <title type="text">Petri Nets Log #001</title> <updated>2022-05-16T00:00:00Z</updated> <link href="https://siiky.srht.site/petri_nets/log001.html" rel="alternate" type="text/html" hreflang="en" title="Petri Nets Log #001" /> <link href="gemini://siiky.srht.site/petri_nets/log001.gmi" rel="alternate" type="text/gemtext" hreflang="en" title="Petri Nets Log #001" /> </entry> <entry> <content type="html"><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"><html lang="en" xml:lang="en"><head><meta charset="utf-8"></meta></head><body><h1>Psychology Links</h1><p>siiky<br></br>2020/02/20<br></br>2022/07/15<br></br>en</p><h2>Terapia de Divã (Portuguese)</h2><p>Interviews to Portuguese psychologists on various subjects.</p><ul><li><a href="https://www.comunidadeculturaearte.com/tag/terapia-de-diva">https://www.comunidadeculturaearte.com/tag/terapia-de-diva</a></li><li><a href="https://www.comunidadeculturaearte.com/tag/terapia-do-diva">https://www.comunidadeculturaearte.com/tag/terapia-do-diva</a></li></ul><h2>Wikipedia</h2><p>Wikipedia, of course!</p><ul><li><a href="https://en.wikipedia.org/wiki/Psychology">https://en.wikipedia.org/wiki/Psychology</a></li></ul></body></html></content> <id>gemini://siiky.srht.site/psychology/links.gmi</id> <published>2022-07-15T00:00:00Z</published> <title type="text">Psychology Links</title> <updated>2020-02-20T00:00:00Z</updated> <link href="https://siiky.srht.site/psychology/links.html" rel="alternate" type="text/html" hreflang="en" title="Psychology Links" /> <link href="gemini://siiky.srht.site/psychology/links.gmi" rel="alternate" type="text/gemtext" hreflang="en" title="Psychology Links" /> </entry> <entry> <content type="html"><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"><html lang="en" xml:lang="en"><head><meta charset="utf-8"></meta></head><body><h1>Philosophy Links</h1><p>siiky<br></br>2020/02/20<br></br>2022/07/15<br></br>en</p><h2>Stanford Encyclopedia of Philosophy (SEP)</h2><p>Lots of detailed and in-depth articles about all sorts of topics. The RSS feed is for updates to articles.</p><ul><li><a href="https://plato.stanford.edu/contents.html">https://plato.stanford.edu/contents.html</a></li><li><a href="https://plato.stanford.edu/rss/sep.xml">https://plato.stanford.edu/rss/sep.xml</a></li></ul><h2>Internet Encyclopedia of Philosophy (IEP)</h2><p>Another site full of in-depth articles, similar to SEP.</p><ul><li><a href="https://iep.utm.edu">https://iep.utm.edu</a></li></ul><h2>Wikipedia</h2><p>Wikipedia, of course!</p><ul><li><a href="https://en.wikipedia.org/wiki/Philosophy">https://en.wikipedia.org/wiki/Philosophy</a></li></ul><h2>Wikiversity School of Philosophy</h2><p>Wikiversity pages on philosophy. The main page has a sizable list of books. The resources page has links to some big philosophy sites, such as SEP, IEP, &amp;c, and to some freely available works.</p><ul><li><a href="https://en.wikiversity.org/wiki/School:Philosophy">https://en.wikiversity.org/wiki/School:Philosophy</a></li><li><a href="https://en.wikiversity.org/wiki/Philosophy/Resources">https://en.wikiversity.org/wiki/Philosophy/Resources</a></li></ul></body></html></content> <id>gemini://siiky.srht.site/philosophy/links.gmi</id> <published>2022-07-15T00:00:00Z</published> <title type="text">Philosophy Links</title> <updated>2020-02-20T00:00:00Z</updated> <link href="https://siiky.srht.site/philosophy/links.html" rel="alternate" type="text/html" hreflang="en" title="Philosophy Links" /> <link href="gemini://siiky.srht.site/philosophy/links.gmi" rel="alternate" type="text/gemtext" hreflang="en" title="Philosophy Links" /> </entry> <entry> <content type="html"><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"><html lang="en" xml:lang="en"><head><meta charset="utf-8"></meta></head><body><h1>Groups</h1><p>siiky<br></br>2020/02/20<br></br>2022/07/15<br></br>en</p><p>This post is about groups (whouldathunkit).</p><ul><li><a href="https://en.wikipedia.org/wiki/Group_(mathematics)">https://en.wikipedia.org/wiki/Group_(mathematics)</a></li></ul><h1>Conventions/Notation</h1><ul><li>∀ v: P means P is true for all possible v</li><li>∃ v: P means P is true for at least one v</li><li>∃¹ v: P means P is true for exactly one v</li><li>∀ v1: ∀ v2: P will be abbreviated as ∀ v1, v2: P</li></ul><p>Sets are written as its elements surrounded by brackets. For example, ∅ is the empty set and { a, b, c } is a set with the elements a, b and c. Sets comprehension will be written as { expr : vars, restrictions } and the cardinal of a set will be written as #S.</p><p>N is the set of natural numbers (w/o zero), N₀ the set of natural numbers (w/ zero), Z the set of integers, and R the set of real numbers.</p><p>The modulo operator will be recurrent throughout this post. A couple of examples:</p><ul><li>4 mod 5 ≣ 9 mod 5 ≣ 4</li><li>5 mod 2 ≣ 1</li></ul><p>This operator is called % in C, modulo in Scheme and mod in Haskell.</p><p>A useful definition: p ≣ q (mod n) ⇔ p mod n ≣ q mod n.</p><p>&quot;|&quot; will be used to mean &quot;divides&quot;: &quot;a | b&quot; means &quot;a divides b&quot;, &quot;b is a multiple of a&quot;, or, with modulo, &quot;a | b ⇔ b ≣ 0 (mod a)&quot;.</p><p>We will be needing the concept of a &quot;Congruential Equivalence Class&quot; later on. They are written as [m]ₙ (∀ n ∈ N, m ∈ Z) and are defined as [m]ₙ = { x ∈ Z : x ≣ m (mod n) }.</p><p>Depending on context, + and ∗ will either be the usual addition and multiplication of numbers, or addition and multiplication of classes.</p><p>Addition and multiplication of classes are defined as [p]ₙ + [q]ₙ = [p+q]ₙ and [p]ₙ ∗ [q]ₙ = [p∗q]ₙ. Example: 2+2=4, [2]₃ + [1]₃ = [2+1]₃ = [0]₃.</p><h1>What is a Group?!</h1><h2>In general</h2><p>A group is just a pair (S, O), where S is a set and O is a binary operation on S (i.e., O : S ∗ S → S) with the following required properties:</p><ul><li>(R1) Associativity: ∀ a, b, c ∈ S: O(a, O(b, c)) = O(O(a, b), c)</li><li>(R2) Identity: ∃¹ id ∈ S: ∀ a ∈ S: O(a, id) = O(id, a) = a</li><li>(R3) Inverse: ∀ a ∈ S: ∃¹ a&#39; ∈ S: O(a, a&#39;) = O(a&#39;, a) = id</li></ul><p>From (R2) and (R3) we can conclude that id always has inverse, itself.</p><p>There is one extra optional property:</p><ul><li>(R4) Commutativity: ∀ a, b ∈ S: O(a, b) = O(b, a)</li></ul><p>A group with a commutative operation is called a commutative group or an abelian group.</p><p>Given G = (G, O) a group, G will be used to refer both to the group itself and its associated set.</p><p>A group G is said to be infinite if #G is infinite, and finite if #G is finite.</p><p>That is the generic definition. We will focus on groups with integer sets and + or ∗ as the operation, however.</p><h2>Integers</h2><p>When the operation is + we call the identity element &quot;null element&quot; and represent it with 0. When the operation is ∗ we call the identity element &quot;unity element&quot; and represent it with 1.</p><p>When the operation is + we call the inverse of an element a its symmetric and represent it as -a. When the operation is ∗ we call the inverse of an element a its inverse and represent it as a⁻¹.</p><h3>(N₀, +)</h3><p>N₀ is the set of natural numbers (w/ zero), and + is the usual addition on natural numbers. Is it a group?</p><ul><li>∀ a, b, c ∈ N₀: a + (b + c) = (a + b) + c</li><li>0 is the identity of the group, because ∀ a ∈ N₀: a + 0 = 0 + a = a</li><li>∀ a, b ∈ N: a + b ≠ 0 (Note that N = N₀∖{0})</li></ul><p>N₀ with + does not satisfy property R3, so it is not a group.</p><h3>(Z, +)</h3><p>Z is the set of integers, and + is the usual addition on integers. Is it a group?</p><ul><li>∀ a, b, c ∈ Z: a + (b + c) = (a + b) + c</li><li>0 is the identity of the group, because ∀ a ∈ Z: a + 0 = 0 + a = a</li><li>∀ a ∈ Z: ∃¹ a&#39; ∈ Z: a + a&#39; = 0</li></ul><p>Z satisfies all 3 requirements so it is a group. We also know that addition is commutative, so Z is an abelian group (see property R4).</p><h3>Other examples</h3><ul><li>(R, +), where R is the set of real numbers, is a group</li><li>(R∖{0}, ∗) is also a group</li><li>(R, ∗) is not a group, because 0 has no inverse (R3)</li><li>(N, +) is not a group, because there is no identity and no inverse (R2 and R3)</li><li>(N, ∗) is not a group, because there is no inverse (R3)</li><li>(Z∖{0}, ∗) is not a group, because other than 1 and -1, no element has inverse (R3)</li></ul><h1>What&#39;s next?</h1><p>Some more definitions.</p><h2>Subgroup</h2><p>Given a group G, H is called a subgroup of G if H is contained in G and it is also a group, and we write H ≤ G. Examples:</p><ul><li>∀ (G, +) group: (G, +) ≤ (G, +)</li><li>Trivial Subgroup: ∀ (G, +) group: ({0}, +) ≤ (G, +)</li><li>(2Z, +) ≤ (Z, +)</li></ul><p>A subgroup H of a group G that is not G itself (H ≠ G, or H ⊂ G) is called a &quot;Proper Subgroup&quot;, and we write H &lt; G. Examples:</p><ul><li>Trivial Subgroup: ∀ (G, +) group: ({0}, +) &lt; (G, +)</li><li>(2Z, +) &lt; (Z, +)</li></ul><h2>Multiples/Powers of an element</h2><p>Given an element a of an additive group, a+...+a (n times) can be written as n∗a. Special case: 0∗a = 0.</p><p>Given an element a of a multiplicative group, a∗...∗a (n times) can be written as aⁿ. Special case: a⁰ = 1.</p><p>For negative n, n∗a = -((-n)∗a) = (-n)∗(-a); and aⁿ = (a⁻ⁿ)⁻¹ = (a⁻¹)⁻ⁿ.</p><h2>Order of an element</h2><p>The order of an element a is the minimum number of times it must be operated with itself until it turns into the identity, and is written as o(a). If no matter how many times you operate the element it doesn&#39;t turn into the identity, its order is said to be infinite.</p><p>A more rigorous definition is:</p><ul><li>a has infinite order if ∀ n ∈ N: n∗a ≠ 0</li><li>a has finite order k, that is, o(a) = k, if: (1) k ∈ N; (2) k∗a = 0; (3) ∀ n ∈ N: n∗a = 0 ⇒ n ≤ k</li></ul><p>In particular, the order of the identity is 1, and the identity is the only element with order 1.</p><p>Useful fact: ∀ G group: ∀ a ∈ G: o(a) | #G. From this comes that in a finite group no element has infinite order.</p><h2>Generated Subgroup</h2><p>Given a ∈ (G, +), 〈a〉 = { n∗a : n ∈ Z } is a subgroup of G and is called the &quot;Subgroup of G generated by a&quot;. In particular, if G = 〈a〉, a is said to generate G, or that G is generated by a. Note that #〈a〉 = o(a). An example of this is 〈1〉 = 〈-1〉 = Z.</p><h1>Zₙ Groups</h1><p>You can group integers together according to their (mod n), make a set out of them, and define a group with it. These groups are called Zₙ, for some n ∈ N, and are defined as Zₙ = { [m]ₙ : m ∈ { 0, ..., n-1 } }.</p><p>These will get repetitive after Z₂, but the reason why they&#39;re here will become clear.</p><h2>(Z₁, +)</h2><p>According to definition above Z₁ = { [0]₁ }, but you can go further here:</p><p>[0]₁<br></br> = { def [m]ₙ }<br></br>{ x : x ∈ Z, x ≣ 0 (mod 1) }<br></br> = { def (mod n) }<br></br>{ x : x ∈ Z, x mod 1 = 0 mod 1 }<br></br> = { 0 mod 1 = 0 }<br></br>{ x : x ∈ Z, x mod 1 = 0 }<br></br> = { ∀ x ∈ Z: 1 | x }<br></br>{ x : x ∈ Z }<br></br> = { def Z }<br></br>Z</p><p>Z₁ is a trivial group (#Z₁ = 1), so it isn&#39;t that interesting, other than Z being its only element.</p><p>Some things we can find about it:</p><ul><li>Since it is a trivial group, its only subgroup is itself</li><li>[0]₁ is the identity, so o([0]₁) = 1</li><li>Z₁ = 〈[0]₁〉</li></ul><h2>(Z₂, +)</h2><p>When n=2 we get Z₂ = { [0]₂, [1]₂ }.</p><p>[0]₂<br></br> = { def [m]ₙ }<br></br>{ x : x ∈ Z, x = 0 (mod 2) }<br></br> = { def (mod n) }<br></br>{ x : x ∈ Z, x mod 2 = 0 mod 2 }<br></br> = { 0 mod 2 = 0 }<br></br>{ x : x ∈ Z, x mod 2 = 0 }<br></br> = { x mod 2 = 0 ⇒ ∃ k ∈ Z: x = 2 ∗ k }<br></br>{ 2 ∗ x : x ∈ Z }<br></br> = { def 2Z }<br></br>2Z</p><p>So [0]₂ = 2Z is the set of even integers. You can probably guess by now, but:</p><p>[1]₂<br></br> = { def [m]n }<br></br>{ x : x ∈ Z, x = 1 (mod 2) }<br></br> = { def (mod n) }<br></br>{ x : x ∈ Z, x mod 2 = 1 mod 2 }<br></br> = { 1 mod 2 = 1 }<br></br>{ x : x ∈ Z, x mod 2 = 1 }<br></br> = { x mod 2 = 1 ⇒ ∃ k ∈ Z: x = 2 ∗ k + 1 }<br></br>{ 2 ∗ x + 1 : x ∈ Z }<br></br> = { def 2Z+1 }<br></br>2Z+1</p><p>And with that you see that [1]₂ is the set of odd integers.</p><p>Some things we can find about it:</p><ul><li>[0]₂ is the identity, so o([0]₂) = 1</li><li>[1]₂ ≠ [0]₂, but [1]₂ + [1]₂ = [1 + 1]₂ = [2]₂ = [0]₂, so o([1]₂) = 2</li><li>〈[0]₂〉 = { [0]₂ } &lt; Z₂</li><li>〈[1]₂〉 = Z₂</li></ul><h2>(Z₃, +)</h2><p>Z₃ = { [0]₃, [1]₃, [2]₃ }</p><p>I&#39;ll skip showing how to get to the definition of each of the classes from now. Also, you may have already noticed, but if not, [0]ₙ is the set of multiples of n, nZ.</p><p>[0]₃ = 3Z<br></br>[1]₃ = 3Z + 1<br></br>[2]₃ = 3Z + 2</p><p>And now things about Z₃:</p><ul><li>o([0]₃) = 1</li><li>o([1]₃) = 3; you may also have noticed that o([1]n) = n. This has to do with the fact that ∀ n ∈ Z: n ∗ 1 = n. So n ∗ [1]n = [n ∗ 1]n = [n]n = [0]n</li><li>o([2]₃) = 3; [2]₃ ≠ [0]₃, 2 ∗ [2]₃ = [1]₃ ≠ [0]₃, 3 ∗ [2]₃ = [0]₃ This one has to do with the fact that 2 and 3 are coprime, which means lcm(2, 3) = 6, and 6 / 2 = 3</li><li>〈[0]₃〉 = { [0]₃ } &lt; Z₃</li><li>〈[1]₃〉 = 〈[2]₃〉 = Z₃</li></ul><h2>(Z₄, +)</h2><p>Z₄ = { [0]₄, [1]₄, [2]₄, [3]₄ }</p><p>[0]₄ = 4Z<br></br>[1]₄ = 4Z + 1<br></br>[2]₄ = 4Z + 2<br></br>[3]₄ = 4Z + 3</p><p>Once again, things about this group:</p><ul><li>o([0]₄) = 1</li><li>o([2]₄) = 2</li><li>o([1]₄) = o([3]₄) = 4</li><li>〈[2]₄〉 = { [0]₄, [2]₄ } &lt; Z₄</li><li>〈[1]₄〉 = 〈[3]₄〉 = Z₄</li></ul><p>Now something interesting happened here! Remember that ∀ G group: ∀ a ∈ G: o(a) | #G</p><p>Because of this we know that the only possible orders are 1, 2 and 4.</p><p>This also means that it is possible for a subgroup of cardinal 2 to exist. In this case, the only one is 〈[2]₄〉. Why, though, did this happen with Z₄, but not with Z₁, Z₂ or Z₃? Z₁ is obvious: #Z₁ = 1, so the only possible subgroup is itself. Z₂ is also easy: its only elements are [0]₂ and [1]₂, and we know that:</p><ul><li>∀ n ∈ N: 〈[0]n〉 = { [0]n }; and that</li><li>∀ n ∈ N: 〈[1]n〉 = Zₙ</li></ul><p>For Z₃ it&#39;s not as clear. The hint is, again: ∀ G group: ∀ a ∈ G: o(a) | #G</p><p>Both 2 and 3 are prime, which means, their only divisors are 1 and themselves. So it&#39;s not possible for a subgroup of Z₃ with cardinal 2 to exist.</p><h2>(Z₅, +)</h2><p>Try this one yourself.</p><h2>(Zₙ, +)</h2><p>Summing up:</p><ul><li>∀ n ∈ N: Zₙ has more than one proper subgroup ⇔ n is not prime</li><li>∀ n ∈ N: Zₙ has exactly one proper subgroup ⇔ n is prime</li></ul><p>Proving this is easy: Let n ∈ N.</p><p>Suppose that Zₙ has more than one proper subgroup. We want to prove that n is not prime.</p><p>There is a proper subgroup H such that #H &gt; 1. Since H is a proper subgroup, then #H &lt; n. From this, and the fact that #H | n, we can conclude n is not prime.</p><p>Now the other way: Suppose n is not prime. We want to prove that Zₙ has more than one proper subgroup. Since n is not prime, then ∃ k ∈ N: 1 &lt; k &lt; n ∧ k | n.</p><p>Let k be such a number. Then ∃ a ∈ Zₙ: o(a) = k.</p><p>Let a be such an element. o(a) = k ⇒ #〈a〉 = k. We know that 〈a〉 ≤ Zₙ and that k &lt; n, so 〈a〉 &lt; Zₙ.</p><h1>TODO</h1><p>Groups that are isomorphic to some proper subgroup.</p></body></html></content> <id>gemini://siiky.srht.site/algebra/groups.gmi</id> <published>2022-07-15T00:00:00Z</published> <title type="text">Groups</title> <updated>2020-02-20T00:00:00Z</updated> <link href="https://siiky.srht.site/algebra/groups.html" rel="alternate" type="text/html" hreflang="en" title="Groups" /> <link href="gemini://siiky.srht.site/algebra/groups.gmi" rel="alternate" type="text/gemtext" hreflang="en" title="Groups" /> </entry> <entry> <content type="html"><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"><html lang="en" xml:lang="en"><head><meta charset="utf-8"></meta></head><body><h1>Gnuplot Quickstart</h1><p>siiky<br></br>2022/01/12<br></br>2022/07/14<br></br>en</p><p>I started learning Gnuplot for a PA because I didn&#39;t want to deal with Python BS or whatnot, and Gnuplot has been around since like... even before the dinosaurs were invented, so it must be super specialized for this kinda thing, and it must be pretty good right?</p><p>Hopefully I&#39;ll document well enough the things I&#39;ve learned these past few days, for posterity or someone else. I&#39;ve been using it to plot 2D graphs of recorded data, not functions/expressions, so my focus will be on that.</p><p>Gnuplot files don&#39;t have a &quot;standard&quot; file extension, but some common ones seem to be .gp, .plot, .gnu, .gnuplot, .plt. I&#39;ve been using .gp and will use .gp here.</p><p>To run Gnuplot scripts, just call gnuplot script.gp. It&#39;s possible to pass arguments to the script by using the -c flag: gnuplot -c script.gp arg1 arg2 etc. And inside the script the arguments are available as the variables ARG1, ARG2, etc. As is common on other programming languages, ARG0 is the script name. I don&#39;t know if there are, or what are the limits on the number of arguments, nor how to loop through them, but I&#39;m guessing it&#39;s possible.</p><p>Now let&#39;s get going with some Gnuplot code. I said the focus would be on plotting datafiles, so let&#39;s start with expressions:</p><pre># The output &quot;format&quot;. set terminal svg # The output file. set output &quot;exp.svg&quot; # Enable gridlines. set grid # Where to place the lines/points/&amp;c legend. set key right bottom # Legend of the XX/YY axes. set xlabel &quot;The passage of time...&quot; set ylabel &quot;Shittiness of the web&quot; # Mirror or not the axes&#39; tics -- notice the YY axis has tics on both the left # and right, but the XX axis has only on the bottom, not the top. set ytics mirror set xtics nomirror # Use a logscale of base 7 for the XX axis -- the base is optional and defaults # to 10 I think. set logscale y 7 # The actual plot: `exp(x)` is the expression to plot; `x` is &quot;special&quot; -- # there are a few different variables you can use, but they seem to depend on # the available axes/dimensions, but I don&#39;t know details of this so RTFM. # # `title &quot;...&quot;` sets this line&#39;s legend. plot exp(x) title &quot;Super straight line&quot; </pre><ul><li><a href="exp.gp">exp.gp</a></li><img src="exp.svg" alt="exp.svg"></img></ul><p>Notice how it starts to grow really fucking quick after t=5 -- right after HTML was invented.</p><p>Here&#39;s another one:</p><pre>set terminal svg set output &quot;rollercoaster.svg&quot; # The number of samples to use to plot the expression. set samples 1000 # The ranges here specify the XX and YY ranges respectively. plot [-50:50] [-5:5] x*sin(x)*cos(x)**x title &quot;Rollercoaster&quot; </pre><ul><li><a href="rollercoaster.gp">rollercoaster.gp</a></li><img src="rollercoaster.svg" alt="rollercoaster.svg"></img></ul><p>The website, with documentation and all (including a 300+ pages PDF of all the documentation, with proper PDF index!):</p><ul><li><a href="http://www.gnuplot.info">http://www.gnuplot.info</a></li><li><a href="http://gnuplot.sourceforge.net">http://gnuplot.sourceforge.net</a></li></ul><p>The first seems to be the &quot;official&quot; one, but is sometimes offline? The second looks like a mirror.</p><p>You can use the help command to read the documentation inside the Gnuplot REPL too.</p><p>An important concept is that of the terminal, as seen above being set to SVG. It&#39;s nothing but an &quot;output backend&quot;, and Gnuplot has tons of those -- run set terminal and see for yourself; there&#39;s even one to output ASCII art to the terminal! Different terminals may have different specific options -- RTFM for those.</p><p>Once you start messing around with line styles, line types, colors, and whatnot, it&#39;s helpful to know what the valid values are. For that use the test command after setting the terminal (the result of the test command varies depending on the terminal, so it&#39;s important to set it):</p><pre>set terminal svg set output &quot;gnuplot-test.svg&quot; test </pre><ul><li><a href="gnuplot-test.gp">gnuplot-test.gp</a></li><img src="gnuplot-test.svg" alt="gnuplot-test.svg"></img></ul><p>Variables are a thing, and you can define them just as you&#39;d expect:</p><pre>some_var = 42 </pre><p>To plot data from files just pass the filename to plot:</p><pre>plot &quot;/path/to/file.tsv&quot; # ... </pre><p>Gnuplot is supposed to support many different formats but I don&#39;t know details here. I&#39;ve been using TSV because it makes sense. For tabular data files (TSV, CSV, ...), this may be useful:</p><pre>set datafile separator tab </pre><p>RTFM for details: help set datafile separator.</p><p>It&#39;s possible to define datasets inside a Gnuplot script, too, like this:</p><pre>plot &quot;-&quot; 1 2 3 4 5 6 7 8 9 0 e </pre><p>Notice the e at the end! You can even define more than one for the same plot command:</p><pre>plot &quot;-&quot;, &quot;-&quot; 1 2 3 4 5 6 7 8 9 0 e 2 1 4 3 6 5 8 7 0 9 e </pre><p>Another arguably more useful way is to do it like so (notice the dollar!):</p><pre>$SomeData &lt;&lt; EOD 1 2 4 5 7 8 EOD plot $SomeData # ... </pre><p>This kind of inline data definition doesn&#39;t seem to work on the REPL though... At least I couldn&#39;t make it work.</p><p>For tabular data files, files may have many columns, some that you want, some that you don&#39;t, some that are in the wrong order... To solve that, you use using:</p><pre>plot &quot;-&quot; using 1:3 1 2 3 4 5 6 7 8 9 </pre><p>The above uses the first and third columns of the dataset.</p><p>And with that, if you want to plot several graphs from the same dataset, you can do it like so:</p><pre>plot &quot;/path/to/file.tsv&quot; using 1:3, &quot;&quot; using 1:4 </pre><p>Assuming the data file has at least 4 columns, the above will plot a line/w.e. using the first and third columns, and then another using the first and fourth columns. The empty string there is a shortcut to mean &quot;the previous dataset/file&quot;.</p><p>For certain plot types, such as for errorlines or errorbars, you may want or need to use more than 2 columns of data.</p><p>And a final plot, pretty much the most advanced I can get right now. The dataset&#39;s fields are separated by tabs but your browser or something may present them as spaces, so download the file for greater €€€profit€€€.</p><pre>$Dataset &lt;&lt; EOD NELEMS RTIME-MEAN RTIME-MIN RTIME-MAX TOTCYC-MEAN TOTCYC-MIN TOTCYC-MAX TOTINS-MEAN TOTINS-MIN TOTINS-MAX L1DCM-MEAN L1DCM-MIN L1DCM-MAX L2DCM-MEAN L2DCM-MIN L2DCM-MAX 100 51.5 51 52 153107.0 151836 154378 49774.5 42768 56781 912.5 849 976 557.0 528 586 1000 386.4 373 396 1117484.4 1076454 1145864 652026.8 634123 680188 5681.0 5118 5990 1660.4 1300 1793 10000 29215.8 29061 29364 21425394.0 10119054 26280869 15941285.8 6979549 22139082 619685.8 169351 1140152 298639.6 17765 644415 100000 2852669.8 2845788 2859074 708231510.6 119757602 1080138950 1145341284.8 184498435 1753956316 93553900.2 13537085 144424582 72470004.8 2110199 120731566 200000 11472829.2 11426994 11502233 922765811.8 181797852 3298279336 1480628498.6 268678225 5359163617 120437869.6 19420767 444041994 87885551.2 2726575 385487784 300000 25821154.8 25729787 25883755 7291510319.0 393353142 9962527951 11904840316.2 594020363 16257913776 988685146.8 45337229 1351805549 907188629.2 12260881 1258022140 400000 45910144.6 45833530 46047114 680904937.0 670501982 689922089 1033095368.6 1029084389 1038083524 80272464.4 80011372 80610671 30805397.6 29580829 32181760 500000 71859779.2 71703444 72007099 11187695199.8 1031362427 25645713435 18329461121.4 1586757574 42172405522 1521273469.8 125041982 3509799991 1394315157.4 56848580 3340745801 600000 103237386.5 103196178 103278595 1492849041.0 1484306515 1501391567 2238479602.0 2234440484 2242518720 177991124.0 177535409 178446839 93661585.0 93119294 94203876 EOD set terminal svg set output &quot;errorlines.svg&quot; # Tell Gnuplot that fields are separated by a tab, as briefly mentioned before. set datafile separator tab set title &quot;Some shitty performance right here...&quot; set key left top # Ask Gnuplot to use log scales for the XX, YY, and YY2 (right side) axes. set logscale xyy2 10 set xtics nomirror set ytics nomirror set y2tics nomirror set xlabel &quot;#Elements&quot; set ylabel &quot;Time (s)&quot; set y2label &quot;L1 Cache Misses&quot; set grid # The `($n/1000000)` syntax asks Gnuplot to divide the values of the field `n` # by 1000000 (in this case, the time is in microseconds, so dividing by # 1000000 converts to seconds). # # `with yerrorlines` changes the style of plot, in this case lines with error # bars. `yerrorbars` is the same but without the connecting lines. # Other common styles are `points` (the default?), `lines`, &amp; `linespoints`. # RTFM for more: `help with`. # # The `yerrorlines` style requires additional values. There are some different # alternatives (RTFM), but in this case the columns are x:y:ymin:ymax. In # this dataset I&#39;ve used the mean for the YY, but you may use whatever you # wish. # # `title columnheader` asks Gnuplot to automatically read the given line&#39;s # legend from the input dataset. Note that Gnuplot supports some LaTeX-like # formatting syntax for text. E.g., the text &quot;RTIME_MEAN&quot; would be rendered # as &quot;RTIMEMEAN&quot; with the the &quot;M&quot; of &quot;MEAN&quot; in subscript. # # Finally, `axis x1y1` &amp; `axis x1y2` set the axes the data should be plotted in # -- x1 &amp; x2 for bottom &amp; top XX respectively; y1 &amp; y2 for left &amp; right YY # respectively. plot $Dataset using 1:($2/1000000):($3/1000000):($4/1000000) with yerrorlines title columnheader axis x1y1,\ &quot;&quot; using 1:11:12:13 with yerrorlines title columnheader axis x1y2 </pre><ul><li><a href="errorlines.gp">errorlines.gp</a></li><img src="errorlines.svg" alt="errorlines.svg"></img></ul><p>-----</p><p>Just a couple of notes on security, especially for someone wanting to develop an interface library. These are things that may be useful when writing and running scripts directly in Gnuplot, but that are a security nightmare if left as something to think about tomorrow.</p><p>system() a la C is a thing!</p><p>And so are backticks like in shell languages! The first line of the following Gnuplot code runs the echo command, but the second one doesn&#39;t:</p><pre>&quot;`echo hello from Gnuplot`&quot; &#39;`echo hello from Gnuplot`&#39; </pre></body></html></content> <id>gemini://siiky.srht.site/kB45oC/gnuplot.gmi</id> <published>2022-07-14T00:00:00Z</published> <title type="text">Gnuplot Quickstart</title> <updated>2022-01-12T00:00:00Z</updated> <link href="https://siiky.srht.site/kB45oC/gnuplot.html" rel="alternate" type="text/html" hreflang="en" title="Gnuplot Quickstart" /> <link href="gemini://siiky.srht.site/kB45oC/gnuplot.gmi" rel="alternate" type="text/gemtext" hreflang="en" title="Gnuplot Quickstart" /> </entry> <entry> <content type="html"><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"><html lang="en" xml:lang="en"><head><meta charset="utf-8"></meta></head><body><h1>Faucets</h1><p>siiky<br></br>2021/07/23<br></br>2022/07/14<br></br>en</p><p>Recently I asked a bunch of people which one out of two types of faucets they prefer. The answers were pretty surprising (to me), as everyone chose the same type.</p><p>In this post I&#39;ll prove them wrong.</p><h1>The Problem</h1><p>The state of a faucet determines 2 things: output pressure and temperature. In real life, many things affect water temperature, including external factors: water pressure (especially for hot water), if the pipes are exposed to the sun, rain, etc. Also in real life, it&#39;s not uncommon for the maximum hot water pressure to be lower than that of cold water. However, to KISS, we won&#39;t take these details into account. In the case of pressure, we&#39;ll just assume it&#39;s the same for both hot and cold water.</p><p>So, in our simplified model, the state of a faucet alone will determine the water state: both water temperature and output pressure.</p><p>The plan is to prove that the faucet types are functionally equivalent to each other, and that each type is fully functional.</p><p>We&#39;ll call two faucet types functionally equivalent iff they can both represent the same set of water states, i.e., if the codomain of the functions FaucetState → WaterState that represent each type is the same. And we&#39;ll call a faucet type fully functional iff it can represent all water states, i.e., there&#39;s a surjective function FaucetState → WaterState.</p><p>After proving that both types are equivalent in function, we&#39;ll follow by proving that it&#39;s not enough to be equivalent, and that in some respects one of them is better than the other.</p><h1>Water</h1><p>Instead of dealing with actual values and their correct units, we&#39;ll simplify our model further and use percentages instead.</p><p>Water pressure will range from 0% (off, no water running), to 100% (water running to the faucet&#39;s full capacity). Likewise, temperature will range from 0% (the coldest water you can get out of the faucet), to 100% (the hottest water you can get out of the faucet).</p><p>The water pressure and temperature considered are the output pressure and temperature, that is, what you&#39;d feel right out of the faucet.</p><p>The types so far:</p><ul><li>Percentage :: 101 (or (roughly) equivalently [0, 1])</li><li>WaterPressure :: Percentage</li><li>WaterTemperature :: Percentage -- we&#39;ll say the temperature is the percentage of hot water in the total amount of water, which fits just right with the definition written in the paragraphs above</li><li>WaterState :: WaterPressure ∗ WaterTemperature ≈ Percentage²</li></ul><h1>Faucets</h1><p>Let&#39;s start by introducing both contenders:</p><img src="type_a_faucet.png" alt="Type A faucet specimen"></img><br></br><img src="type_b_faucet.png" alt="Type B faucet specimen"></img><p>And now let&#39;s move on to the mathematical models.</p><h2>Type A</h2><p>This faucet type has two 1D handles, or knobs: one for cold water, and one for hot water.</p><p>In this type of faucet, the water pressure is simply the sum of hot water pressure and cold water pressure. There&#39;s a catch, however: the pressure of hot and cold water being independent, the maximum hot and cold water pressure must be half of the maximum faucet water pressure.</p><p>And the water temperature is simply the ratio of hot water over the total amount of water: hot water pressure over faucet pressure.</p><p>This is what we have algebraically:</p><ul><li>HotPressure :: Percentage</li><li>ColdPressure :: Percentage</li><li>FaucetState :: HotPressure ∗ ColdPressure</li></ul><p>fA :: FaucetState → WaterState<br></br>fA (h, c) ↦ ((h + c) / 2, h / (h + c))</p><h3>Proof</h3><p>We want to prove that fA is surjective, that is: ∀ (p, t) ∈ WaterState: ∃ (h, c) ∈ FaucetState: fA(h, c) = (p, t)</p><p>So, let&#39;s fix some (p, t) ∈ WaterState; let&#39;s find our (h, c) ∈ FaucetState:</p><p>fA(h, c) = (p, t)<br></br> ≣ { exercise for the reader }<br></br>h = 2pt ∧ c = 2(p-pt)</p><p>Try fA(2pt, 2(p - pt)) if you don&#39;t believe me. p-pt makes sense because p and t are percentages:</p><ul><li>The product of two percentages is also a percentage</li><li>p ≥ pt ⇔ p-pt ≥ 0. Alternatively: p ≥ pt ⇔ 1 ≥ t ⇔ t ≤ 1</li></ul><p>Another way to write c is 2p(1-t). Less obvious how to get to it, but more obvious what it means: the pressure of non-hot water, since t is the temperature (with greater meaning hotter).</p><h2>Type B</h2><p>This faucet type has only one 2D handle: one dimension controls the water pressure, and the other the hot/cold water mixture. In this type of faucet, both the water pressure and temperature are the faucet&#39;s pressure and temperature, so its mathematical model is the simplest possible.</p><p>Algebraically:</p><ul><li>FaucetPressure :: Percentage</li><li>FaucetHotPerc :: Percentage -- to make things easy, we&#39;ll say that the hot/cold water mixture dimension is to be represented simply as the percentage of hot water</li><li>FaucetState :: FaucetPressure ∗ FaucetHotPerc ≈ WaterState</li></ul><p>fB :: FaucetState → WaterState<br></br>fB(p, h) = (p, h)</p><h3>Proof</h3><p>fB clearly is surjective, because it is the identity function.</p><h2>Of As and Bs</h2><p>Since both faucet types are fully functional they&#39;re also functionally equivalent.</p><h1>As Used by Physical Beings through Mechanical Interaction</h1><p>Did you notice something with the mathematical models?<br></br>I&#39;ll give you a hint: it&#39;s obvious -- I&#39;ve even mentioned it already.<br></br>Not there yet? Here&#39;s another: type B.<br></br>Right?! It is the epitome of simplicity!</p><p>Did you notice something else?<br></br>Here&#39;s a hint: it&#39;s not obvious.<br></br>Still not obvious? Here: type A.<br></br>Right?! Not a damn clue! But squint harder...</p><p>Here goes by analogy: ever tried to move a (computer) cursor on a single axis (vertical, horizontal, doesn&#39;t matter) with a (computer) mouse? I&#39;ll bet you have! I&#39;ll also bet you&#39;ve very rarely (and barely) did so satisfactorily, even if trying very hard! This is easily explained, because while we aim to affect one dimension only, the controls we have available for use affect more than that one dimension, and one may simultaneously (and unintentionally) affect more than that one dimension.</p><p>How does this translate to the faucets discussion? Faucets B require you to set one or two parameters with a single 2D control, that is, set one or two parameters simultaneously. While with faucets A you&#39;re only required to set a single parameter at a time, through a single 1D control for each parameter.</p><p>Imagine you&#39;re enjoying the current temperature but not so much the current current. Or maybe you like the current but wish it was a tad hotter. What do you do if you have a faucet A? Just change the thing right away! What do you do if you have a faucet B? Roll for luck!</p><p>For us, physical beings using faucets through mechanical interaction, it follows that faucets A are superior.</p><p>I can think of more reasons to justify the superiority of faucets A, but I&#39;ll leave them for another post, maybe.</p><ul><li><a href="https://en.wikipedia.org/wiki/KISS_principle">KISS</a></li></ul></body></html></content> <id>gemini://siiky.srht.site/algebra/faucets.gmi</id> <published>2022-07-14T00:00:00Z</published> <title type="text">Faucets</title> <updated>2021-07-23T00:00:00Z</updated> <link href="https://siiky.srht.site/algebra/faucets.html" rel="alternate" type="text/html" hreflang="en" title="Faucets" /> <link href="gemini://siiky.srht.site/algebra/faucets.gmi" rel="alternate" type="text/gemtext" hreflang="en" title="Faucets" /> </entry> <entry> <content type="html"><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"><html lang="en" xml:lang="en"><head><meta charset="utf-8"></meta></head><body><h1>Category Theory and Performance</h1><p>siiky<br></br>2019/10/15<br></br>2022/07/14<br></br>en</p><p>Imagine for a second that we understand Category Theory. Now imagine that we have a fancy category, representing a part of a program, with two objects X and Y (representing the input and output types of our program respectively), and morphisms f : X → Y and g : Y → X (because this is a category). This is what we have:</p><img src="ctp-cat.svg" alt="Some category"></img><p>Imagine now that there&#39;s a (reasonable) way to determine if two morphisms are equal. That is, given f, g : X → Y, f and g are equal iff, ∀ x ∈ X: f(x) = g(x).</p><p>Imagine there&#39;s also a way to analyze performance of a given morphism. We&#39;ll represent the performance of a given morphism f as P(f). The lesser P(f) is, for any given morphism, the better.</p><p>From this category we&#39;ll generate a new one where the morphisms are annotated along with their performance. We&#39;ll represent an annotated morphism f as (f, P(f)). Like so:</p><img src="ctp-cat-perf.svg" alt="Some category w/ performance analysis"></img><p>Application of a morphism to an object and composition of morphisms ignores the right component of the tuple:</p><ul><li>(f, P(f))(x) = f(x)</li><li>(g, P(g)) • (f, P(f)) = (g•f, P(g•f))</li></ul><p>And thus, for this post, I&#39;ll say that &quot;two morphisms are equal&quot; to mean that the &quot;plain morphism&quot; is equal, that is, ignoring the right component of the tuples; and I&#39;ll say that &quot;two morphisms are the same&quot; when both components of the tuple are equal. Think of two different implementations of a certain abstract algorithm. Both implementations perform the same operation, but they&#39;re not the same implementation, they (may) have different properties. We&#39;re interested in performance here.</p><p>Some properties right away:</p><ul><li>Two equal morphisms do not necessarily have equal performance: ¬(f = g ⇒ P(f) = P(g)).</li><li>Two morphisms with the same performance aren&#39;t necessarily equal: ¬(P(f) = P(g) ⇒ f = g)</li><li>Two morphisms with different performance aren&#39;t necessarily different: ¬(P(f) ≠ P(g) ⇒ f ≠ g)</li></ul><p>The latter two don&#39;t add much to our toolbox.</p><p>Now, from our original category, we&#39;ll forsake g, because who cares, and we&#39;ll add to it a morphism h equal to f.</p><img src="ctp-cat-perf-h.svg" alt="Category w/ performance analysis &amp; h"></img><p>Because f = h, improving the performance of our program, without changing its results, consists in choosing the morphism with better performance. If P(f) &lt; P(h), choose f; if P(h) &lt; P(f), choose h; otherwise, ask your mirror for the prettier of the two.</p><p>&quot;What&#39;s this all good for?&quot; you may ask! Nothing, really, if you don&#39;t use it. We like imagining, so we&#39;ll do it once more: there&#39;s a complicated (imaginary) category representing our complicated (imaginary) program, with performance annotations. The program takes an input I and transforms it into some output O. For simplicity, we&#39;ll only represent the most performant morphism between each two objects.</p><img src="ctp-complicated-cat.svg" alt="Complicated Category"></img><p>Omitted labels because they clutter too much. {X, Y, Z, W} form a complete graph. Now finding the most performant way to write our program is finding the shortest weighted path between I and O, with the performance as the weight. The hardest part is coming up with different implementations and analyzing their performance, really, because even a computer can find the best way to optimize the program!</p><ul><li><a href="https://en.wikipedia.org/wiki/Category_theory">Category Theory</a></li><li><a href="https://en.wikipedia.org/wiki/Category_(mathematics)">Category</a></li></ul></body></html></content> <id>gemini://siiky.srht.site/algebra/cat_theory_perf.gmi</id> <published>2022-07-14T00:00:00Z</published> <title type="text">Category Theory and Performance</title> <updated>2019-10-15T00:00:00Z</updated> <link href="https://siiky.srht.site/algebra/cat_theory_perf.html" rel="alternate" type="text/html" hreflang="en" title="Category Theory and Performance" /> <link href="gemini://siiky.srht.site/algebra/cat_theory_perf.gmi" rel="alternate" type="text/gemtext" hreflang="en" title="Category Theory and Performance" /> </entry> <entry> <content type="html"><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"><html lang="en" xml:lang="en"><head><meta charset="utf-8"></meta></head><body><h1>GraphViz Scheme DSL</h1><p>siiky<br></br>2019/10/01<br></br>2022/07/14<br></br>en</p><p>I&#39;ve (loosely) defined a DSL to represent GraphViz DOT in Scheme, and created a converter library &amp; program that takes the DSL as input and outputs .gv text. It almost certainly doesn&#39;t support all of the features of DOT, but I intentionally left out &quot;validation&quot; of input, because I don&#39;t know all of DOT and I don&#39;t pretend to. The DSL is not only a Scheme representation but also saves some work.</p><p>I use it on this site, for example:</p><ul><li><a href="../algebra/cat_theory_perf.html">Category Theory and Performance</a></li></ul><p>The code can be found online, but try not to read it, it&#39;s much too ugly. :/</p><ul><li><a href="https://github.com/siiky/gvs">https://github.com/siiky/gvs</a></li></ul></body></html></content> <id>gemini://siiky.srht.site/scheme/gv-dsl.gmi</id> <published>2022-07-14T00:00:00Z</published> <title type="text">GraphViz Scheme DSL</title> <updated>2019-10-01T00:00:00Z</updated> <link href="https://siiky.srht.site/scheme/gv-dsl.html" rel="alternate" type="text/html" hreflang="en" title="GraphViz Scheme DSL" /> <link href="gemini://siiky.srht.site/scheme/gv-dsl.gmi" rel="alternate" type="text/gemtext" hreflang="en" title="GraphViz Scheme DSL" /> </entry> <entry> <content type="html"><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"><html lang="en" xml:lang="en"><head><meta charset="utf-8"></meta></head><body><h1>Donating</h1><p>siiky<br></br>2022/02/01<br></br>2022/07/08<br></br>en</p><p>What if there was a way to force oneself to donate?</p><p>Donating to projects you use, enjoy, or believe in, is a way to help ensure their sustainability. However, for some reason that I haven&#39;t figured out yet, it&#39;s hard to get going. Won&#39;t try to speak for anyone else, but as for me, there&#39;s always a what if, such as, what if I had donated to this instead of that? what if this turns out to be evil?</p><p>My mom, who earns in a month less than me by half, used to donate more than me. I can&#39;t believe I&#39;m unique in that; I&#39;m sure there are many people out there that can donate (have the monetary power) but don&#39;t.</p><p>Think of everything that you use or have used for free, think only of things that are distributed freely by their creators and that you haven&#39;t paid for nor donated to; realize that it took effort to create it, and that otherwise, e.g. with a book or a movie, you&#39;d have to pay for it somewhere; given that you haven&#39;t paid for it, it should be obvious that you&#39;re committing &quot;theft&quot;. Theft is probably on everyone&#39;s naughty list; assuming that we are and/or want to be ethical, then it&#39;s something to avoid.</p><p>I understand that this is so oversimplified it almost couldn&#39;t be at all helpful. And I&#39;m sure I&#39;ve overlooked many aspects of the whole situation.</p><p>But this isn&#39;t supposed to be some very deep philosophical thinking. It&#39;s just a bit of rhetoric to try and convince people to donate to things they enjoy and would like to keep afloat.</p><p>Using rhetoric to improve people... I bet Plato didn&#39;t see that coming!</p><ul><li><a href="../wiki/books.html">Plato, &quot;Gorgias&quot;</a></li></ul></body></html></content> <id>gemini://siiky.srht.site/philosophy/donating.gmi</id> <published>2022-07-08T00:00:00Z</published> <title type="text">Donating</title> <updated>2022-02-01T00:00:00Z</updated> <link href="https://siiky.srht.site/philosophy/donating.html" rel="alternate" type="text/html" hreflang="en" title="Donating" /> <link href="gemini://siiky.srht.site/philosophy/donating.gmi" rel="alternate" type="text/gemtext" hreflang="en" title="Donating" /> </entry> <entry> <content type="html"><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"><html lang="en" xml:lang="en"><head><meta charset="utf-8"></meta></head><body><h1>prettymaps</h1><p>siiky<br></br>2022/01/22<br></br>2022/07/08<br></br>en</p><p>Found this library reading WeeklyOSM 580 called prettymaps:</p><ul><li><a href="https://weeklyosm.eu/archives/14825">WeeklyOSM 580</a></li><li><a href="https://github.com/marceloprates/prettymaps">prettymaps</a></li></ul><p>It does indeed create pretty maps!</p><p>Found also a website that exposes a limited set of options to the library.</p><ul><li><a href="https://prettymaps-online-nzcbpymxfq-uc.a.run.app">https://prettymaps-online-nzcbpymxfq-uc.a.run.app</a></li></ul><p>And created this pretty thing from an area in Seia.</p><ul><li><a href="https://www.openstreetmap.org/#map=16/40.4144/-7.7073">Seia</a></li><img src="seia.png" alt="seia.png"></img></ul></body></html></content> <id>gemini://siiky.srht.site/osm/prettymaps.gmi</id> <published>2022-07-08T00:00:00Z</published> <title type="text">prettymaps</title> <updated>2022-01-22T00:00:00Z</updated> <link href="https://siiky.srht.site/osm/prettymaps.html" rel="alternate" type="text/html" hreflang="en" title="prettymaps" /> <link href="gemini://siiky.srht.site/osm/prettymaps.gmi" rel="alternate" type="text/gemtext" hreflang="en" title="prettymaps" /> </entry> <entry> <content type="html"><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"><html lang="en" xml:lang="en"><head><meta charset="utf-8"></meta></head><body><h1>Content-based Mirrors</h1><p>siiky<br></br>2022/06/09<br></br>2022/07/07<br></br>en</p><p>Contacted SEP yesterday asking if there was a way to make personal archives/mirrors of either the whole site or several entries.</p><ul><li><a href="https://plato.stanford.edu">Stanford Encyclopedia of Philosophy</a></li></ul><p>They kindly replied (awesome, and thanks!) quoting the Terms of Use¹, saying that I have permission to freely crawl/download entries for personal use, within reasonable network use (1. User Rights) -- I just can&#39;t make them public (non-personal) (2b. &amp; 2d. Limited Electronic Distribution Rights).</p><ul><li><a href="https://plato.stanford.edu/info.html#terms">Terms of Use</a></li></ul><p>While I don&#39;t mean to convince them of anything, it gave me the idea for this post: big sites that publish content publicly for free use are a great fit for experimenting with novel means of distribution and archival other than the good (bad) old HTTP we have today.</p><p>More specifically, I&#39;ll try to convince you that content-based content addressing is a better alternative to location-based content addressing (the current web), and try to explain how and why.</p><ul><li><a href="https://en.wikipedia.org/wiki/Content-addressable_network">Content-addressable network</a></li><li><a href="https://docs.ipfs.io/concepts/glossary/#content-addressing">Content addressing (IPFS glossary)</a></li></ul><p>To make writing easier, I&#39;ll pick the Debian package repos as a sort of &quot;case study&quot;, but other package repositories would work equally well (Arch, Nix, F-Droid, Flathub, ...). A good alternative would be any Wikimedia site, such as Wikipedia.² I&#39;ll write about mirrors but much of it applies to archives equally well. Although some of the points I&#39;ll raise may have nuances that make more sense to sites or to package repos, to archives or to mirrors, the spirit is there!</p><h2>Location-based Addressing</h2><p>Let&#39;s start with content.</p><p>Setting up a mirror site isn&#39;t for just about anyone. You can&#39;t wake up one day and think &quot;yup, feel like mirroring Debian&#39;s repos starting today.&quot; Ignoring technical requirements, there&#39;s too much bureaucracy for you to decide it on such a whim.³ But is this bureaucracy necessary? I don&#39;t think so, I think it&#39;s only a symptom of the current web.</p><p>On the current web (location-based), when you go to https://example.com/some-page.html you don&#39;t know what you&#39;re gonna get. Hopefully whatever it is you&#39;re looking for, but you just can&#39;t know. Plus, the content you get from a location may change from today to tomorrow -- a very important point.</p><p>Imagine if anyone could claim to be a Debian mirror. Users set example.com/debian-repo in sources.list, thinking they&#39;re getting the official Debian packages, but (dramatic plot twist) the mirror is malicious and all the packages play nyan cat in loop.</p><p>To emphasize it: there&#39;s no way for a site to prove what content it&#39;s serving, or for you to know that you&#39;ll get what you&#39;re expecting.⁴ When you visit some page on the current web, you have to trust the site. And because the content delivered from a particular location may change, the trustworthy sites of today may not be so tomorrow.</p><p>What would the consequences be if a hypothetical Debian mirror was/became malicious? Assuming it was an &quot;official&quot; one (listed on the mirrors): Debian would have to drop it from the list; damage to its users resulting from it couldn&#39;t be undone (or very unlikely); but worst of all, the rules for registering as a mirror would very likely become stricter in an effort to avoid another incident, thus making the content more centralized.</p><ul><li><a href="https://www.debian.org/mirror/list">Debian mirrors</a></li></ul><h2>Content-based Addressing</h2><p>In contrast, in a content-based system, content is uniquely identified by something⁵, so that when you ask for content ABC you&#39;ll get ABC, not XYZ. This has lots of implications!</p><p>Side note: a content-based system needn&#39;t necessarily be a public P2P network, but since the post is about publicly shared &amp; shareable content, it&#39;s what makes most sense, and what I&#39;ll use as a model here, with all the bad (good) that comes with it.</p><p>First, since the content is no longer tied to a trusted entity (site owner/operator), the content can be distributed by anyone, and the system can take care of making sure the content you get corresponds to the content you request.</p><p>With the trust deal sealed, the bureaucracy is no longer necessary. If Debian&#39;s repos were available through such a system, deciding to mirror them from one day to the next wouldn&#39;t be unthinkable! You could easily opt-in to mirror their repos, and they could trust the system to deliver users the (authentic) packages they request, independently of whom they get the packages from.</p><p>Since anyone can safely share the content with anyone else more easily, more people can join in and help share that content. I could share the packages I have installed on my own PCs, for example, helping others download them too.</p><p>Bonus benefit: Debian&#39;s traffic would decrease, and file transfer would be more local, that is, you&#39;d generally get the files from your closest neighbors (that have them, of course), making the whole packaging system more robust (resilient) -- even if Debian&#39;s servers go down, I can install things as long as I can connect to anyone that has them.</p><ul><li><a href="https://en.wikipedia.org/wiki/Resilience_(network)">Network resiliency</a></li></ul><p>Unfortunately, however, this is only the ideal. For some reason unbeknownst to me, people prefer to stick with the archaic C-S architecture and the so very great HTTP centralized web.</p><ul><li><a href="https://en.wikipedia.org/wiki/Client–server_model">C-S architecture</a></li></ul><p>The only problem I haven&#39;t mentioned yet is that we don&#39;t want content to be immutable (one of the implications of content-based addressing). There must be a way to &quot;update&quot; content. Put another way, we still need some form of location-based addressing, of which there are some. One is for the content owner to provide the latest &quot;root&quot; address through some current means, e.g., https://debian.org/root-content, so that I can ask Debian for the latest content, but fetch it from other peers. Another is to bake a similar mechanism into the system itself -- entities may publish the latest &quot;root&quot; address to the network on a known address (location-based but not necessarily human-readable/human-friendly).</p><h2>IPFS</h2><p>Now, I didn&#39;t come up with any of these ideas myself. I tried to make the post a bit generic, but always thinking of a particular network in the background. And it should be unsurprising that this network should be IPFS. It&#39;s the best content-based addressable P2P content distribution network that I know of to date.</p><p>I won&#39;t go into details here, but there&#39;s a &quot;namespace&quot; of content-identifiers (CIDs), and two network schemes: one for content-based addressing (IPFS, ipfs://) and another for location-based addressing (IPNS, ipns://).⁶</p><p>Unfortunately, IPNS is yet to become generally practical. And, as is common of P2P content distribution networks, unpopular content is hard to get (especially slow to find). Finally, the &quot;reference&quot; IPFS node implementation, Kubo (previously known as go-ipfs), is a bit more resource hungry than BitTorrent clients.⁷</p><h2>Postscript</h2><p>I learned from one of @degrowther&#39;s posts that Debian has tried some decentralization in the past using BitTorrent.</p><ul><li><a href="https://portal.mozz.us/gemini/degrowther.smol.pub/20220808_libraries_internet">Libraries, the Internet we were promised, and the Internet we got</a></li><li><a href="https://wiki.debian.org/DebTorrent">DebTorrent</a></li></ul><h2>Footnotes</h2><p>¹ I hadn&#39;t come across the ToU before while browsing the site (refreshing!) and even had some trouble finding them after the email.</p><p>² Except there are no &quot;official&quot; Wikipedia mirrors, and no restrictions or bureaucracies to become one.</p><ul><li><a href="https://en.wikipedia.org/wiki/Wikipedia:Mirrors_and_forks">Mirrors and forks</a></li><li><a href="https://en.wikipedia.org/wiki/Wikipedia:FAQ/Forking">Forking FAQ</a></li></ul><p>³ Admittedly, much less than I would ever have expected: a manual request! But even this little is already too much...</p><ul><li><a href="https://www.debian.org/mirror/ftpmirror">Setting up a Debian archive mirror</a></li></ul><p>⁴ In the particular case of package repos, a list of checksums, for example, could be downloaded from the official repos, and used to confirm individual files haven&#39;t been altered (apt uses a simple &quot;clock&quot; version to detect outdated mirrors but nothing else). Authenticity of files could be checked using, for example, pubkey cryptography (apt does this), but still there are caveats -- you know a file came from who you expect, but not that it *is* the file you want.</p><p>⁵ This is a technical implementation detail, but if it makes it easier to understand you can think of it as a cryptographic hash of the content. It&#39;s only important that the something be deterministic and based on the content itself.</p><p>⁶ The CID &quot;namespace&quot; is shared, so the same CID may identify different content depending on the scheme (ipfs:// or ipns://), as should be expected.</p><p>⁷ While you may be able to run a BT client on a phone, for example, a full IPFS node would likely be inefficient/slow -- a Raspberry Pi 2 can still manage it for light use. Version v0.13.0 introduced some changes that make &quot;light nodes&quot; closer to a possibility, but no such (working) node exists as of now, AFAIK. Also new in this version is resource management configuration, making it possible to limit certain resources based on configuration. Previously you could only have some heuristics to &quot;garbage collect&quot; connected peers; now you can limit the number of connections, open FDs, maximum memory, &amp;c! My Raspberry Pi 2 is no longer beaten dead by IPFS. :3</p><ul><li><a href="https://github.com/ipfs/go-ipfs/releases/tag/v0.13.0#support-for-block-and-car-response-formats">IPFS v0.13.0 Release Notes</a></li><li><a href="https://github.com/ipfs/kubo/blob/master/docs/config.md#swarmresourcemgr">IPFS resource management</a></li></ul></body></html></content> <id>gemini://siiky.srht.site/kB45oC/mirrors.gmi</id> <published>2022-07-07T00:00:00Z</published> <title type="text">Content-based Mirrors</title> <updated>2022-06-09T00:00:00Z</updated> <link href="https://siiky.srht.site/kB45oC/mirrors.html" rel="alternate" type="text/html" hreflang="en" title="Content-based Mirrors" /> <link href="gemini://siiky.srht.site/kB45oC/mirrors.gmi" rel="alternate" type="text/gemtext" hreflang="en" title="Content-based Mirrors" /> </entry> <entry> <content type="html"><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"><html lang="en" xml:lang="en"><head><meta charset="utf-8"></meta></head><body><h1>The COVID Experience</h1><p>siiky<br></br>2022/05/31<br></br>2022/07/07<br></br>en</p><p>Late at the night of 2022/05/17, while reading Poe&#39;s The Murders in the Rue Morgue before going to sleep, I started feeling sick -- tired, minor headache, and raspy throat that started earlier during the day. The following morning I felt like total shit: I could barely stand, my head was killing me (the first real head ache I&#39;ve had in many years!), felt dizzy, my mouth dry as a bone yet water seemed like it did nothing. There was no goddamn paracetamol in the house, I would be alone until 19h~20h, and needless to say I couldn&#39;t go to the pharmacy myself. Luckily, my dad managed to escape work for a bit to bring me some, at around 13h... or 14h?... Don&#39;t remember now... Still hadn&#39;t eaten anything the whole morning, and I wasn&#39;t even hungry -- though this by itself isn&#39;t surprising since I started skipping breakfast close to one year ago, but let&#39;s leave that for another post -- and I slept most of the time -- sleeping was fuckin&#39; great! The paracetamol really helped, my unscientific and uninformed guess of a reason being that I rarely take any meds -- don&#39;t usually need &#39;em or I just 我慢 motherfucker! Because I can. Anyway, this was basically it for the first day: sleep, sleep, sleep. At the end of the day I did a COVID self-test and it gave positive -- &quot;Why settle for B- when you can have A+?&quot;, says Nicole&#39;s dad (insert appropriate Samuel L. Jackson motherfucker meme). At dinner I had soup but couldn&#39;t bring myself to eat even one third of what I usually eat. &quot;Weird,&quot; I thought, and shrugged back to sleep.</p><ul><li><a href="../wiki/books.html">Edgar Allan Poe, &quot;The Murders in the Rue Morgue&quot;</a></li><li><a href="https://yewtu.be/watch?v=BSGXP6WENj0&amp;t=1m">Nicole&#39;s dad</a></li></ul><p>Thursday morning woke up at like 7h again... and still feeling like shit... Went through the bureaucracy of registering myself as a possible positive in the national health system and scheduling a confirmation lab test. Turns out, you don&#39;t actually schedule the test, you just wait for some code from the health system, and then you can go to any lab at any time and use the code for a free test. Went for mine at 14h, close to 15h. Damn nurses or whatever they are, sticking the damn cotton swab into you till it touches the back of your neck, and laughing all the while. For lunch I tried some chicken nuggets (of those you can just stick into the microwave), and guess what, it tasted so salty I couldn&#39;t taste anything else, at all, only salt. Had some bread afterwards -- at least that just didn&#39;t taste like anything. At dinner I had some soup again, but I could eat even less of it than the previous day. It tasted so bad I started feeling ill, nauseated. It&#39;s not that it didn&#39;t taste like anything, because of lack of smell and/or taste, but that it really tasted bad. I even tested it: smelled a some chocolate cookies, and they smelled fucking great! But tasted like shit...</p><p>On Friday I woke up already feeling hungry, probably because I hadn&#39;t eaten that much since it all started. But I was so tired I went back to sleep. When I woke up again, close to lunch time, I was feeling even more tired and hungry. Since soup tasted like shit, but bread didn&#39;t, I decided to try something somewhat similar-ish, that I like a lot: tuna pasta! Except I made it plainer than radio music: water, pasta, tuna, and the smallest pinch of salt you could possibly pinch with your pinchy fingers. I was feeling so weak while cooking that I mouthed a coffee-spoonful of sugar for fear of passing out. I made it, managed to cook some without falling on my side, and still to get back to my room with food to eat! And I was so glad the pasta didn&#39;t taste like shit! I even went back for seconds! はい、お代わり! It was enough for lunch, dinner, and lunch the next day (not that I made that much, I just didn&#39;t eat that much).</p><p>This food-tasting-like-shit-and-feeling-indisposed-afterwards continued throughout the following week, after I was supposed to be COVID-free already. But I&#39;m alright now, I think, and making plans for eating out one of these days.</p><p>Reading it back, I don&#39;t think I managed to convey well enough how bad this part of the experience was... I&#39;m not even sure that was the intent of the post, but wanted to make it clear now that it really was the worst part! If you can help avoid it, do! You really don&#39;t want food to taste like shit, it sucks ass. And if you do end up catching it, sleep as much as you can, it really helps.</p></body></html></content> <id>gemini://siiky.srht.site/words/covid.gmi</id> <published>2022-07-07T00:00:00Z</published> <title type="text">The COVID Experience</title> <updated>2022-05-31T00:00:00Z</updated> <link href="https://siiky.srht.site/words/covid.html" rel="alternate" type="text/html" hreflang="en" title="The COVID Experience" /> <link href="gemini://siiky.srht.site/words/covid.gmi" rel="alternate" type="text/gemtext" hreflang="en" title="The COVID Experience" /> </entry> <entry> <content type="html"><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"><html lang="en" xml:lang="en"><head><meta charset="utf-8"></meta></head><body><h1>Water Stations</h1><p>siiky<br></br>2022/05/11<br></br>2022/07/07<br></br>en</p><p>Crazy idea: what if instead of selling plastic bottles, stores sold water by the litre, similarly to how diesel/gasoline is sold by the litre? People would BYOB, be it plastic, metal, or glass, and fill it up.</p><p>I know some places already do this, or have something similar, but it&#39;s not that widespread.</p></body></html></content> <id>gemini://siiky.srht.site/kB45oC/water_stations.gmi</id> <published>2022-07-07T00:00:00Z</published> <title type="text">Water Stations</title> <updated>2022-05-11T00:00:00Z</updated> <link href="https://siiky.srht.site/kB45oC/water_stations.html" rel="alternate" type="text/html" hreflang="en" title="Water Stations" /> <link href="gemini://siiky.srht.site/kB45oC/water_stations.gmi" rel="alternate" type="text/gemtext" hreflang="en" title="Water Stations" /> </entry> <entry> <content type="html"><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"><html lang="en" xml:lang="en"><head><meta charset="utf-8"></meta></head><body><h1>Reader Syntax</h1><p>siiky<br></br>2022/03/15<br></br>2022/07/07<br></br>en</p><p>TIL a bit of reader syntax magic. With very few lines of code I was able to make available the #!sql reader syntax to let me read the contents of SQL files as a literal string (any file actually, but I was thinking of using it for SQL files only).</p><pre>; This: #!sql &quot;path/to/file.sql&quot; ; Into this: &quot;CREATE TABLE entries (\n cid TEXT PRIMARY KEY NOT NULL UNIQUE,\n name TEXT NOT NULL,\n consumed BOOLEAN NOT NULL DEFAULT FALSE,\n url TEXT UNIQUE,\n type VARCHAR(10) NOT NULL REFERENCES types (name)\n);\n\nCREATE TABLE nodes (\n id TEXT PRIMARY KEY NOT NULL UNIQUE,\n name VARCHAR(20) UNIQUE\n);\n\nCREATE TABLE pins (\n node TEXT NOT NULL REFERENCES nodes (id),\n cid TEXT NOT NULL REFERENCES entries (cid)\n);\n\nCREATE TABLE types (\n name VARCHAR(10) PRIMARY KEY NOT NULL UNIQUE\n);\n&quot; </pre><p>Here&#39;s the necessary code in its entirety:</p><pre>(set-read-syntax! &#39;sql (lambda (port) (let ((path (read port))) (unless (string? path) (syntax-error &quot;The #!sql syntax expects a string&quot;)) (let ((sql-stmt (call-with-input-file path (cute read-string #f &lt;&gt;) #:text))) (unless (string? sql-stmt) (syntax-error &quot;Failed reading the SQL file&quot;)) sql-stmt)))) </pre><p>There&#39;s one caveat with this approach, however: the reader syntax will be available to the whole program, not just the file or module that defined or imported it. This means that the identifiers must be unique, otherwise different definitions will collide with each other and the compiled program won&#39;t be what you expect. AND I think that it will be available not only at compile time, but at runtime as well -- very good to keep in mind!</p><p>Someone on IRC mentioned that it&#39;s possible to use -extend (-X) to make it available at compile time only. As an example, they said that compiling with -X srfi-19-literals would allow one to write #@1-1-22. Try this, after installing SRFI-19:</p><pre>csi -R srfi-19 -R srfi-19-literals -p &quot;#@`date +&#39;%Y-%m-%d&#39;`&quot; </pre><p>Relevant CHICKEN documentation for set-read-syntax! &amp; friends:</p><ul><li><a href="https://wiki.call-cc.org/man/5/Module%20(chicken%20read-syntax)">https://wiki.call-cc.org/man/5/Module%20(chicken%20read-syntax)</a></li><li><a href="https://api.call-cc.org/5/doc/chicken/read-syntax">https://api.call-cc.org/5/doc/chicken/read-syntax</a></li></ul><p>And the relevant SRFI-19 literals documentation:</p><ul><li><a href="https://wiki.call-cc.org/eggref/5/srfi-19#date-literal-form">https://wiki.call-cc.org/eggref/5/srfi-19#date-literal-form</a></li><li><a href="https://api.call-cc.org/5/doc/srfi-19/date-literal-form">https://api.call-cc.org/5/doc/srfi-19/date-literal-form</a></li></ul><p>-----</p><p>To make it more obvious why this is cool, here goes a slightly more realistic, though still simple, example.</p><p>Let&#39;s say we have these SQL files:</p><pre>-- schema.sql CREATE TABLE sometbl (col TINYINT NOT NULL); -- data.sql INSERT INTO sometbl (col) VALUES (0),(1),(2),(3),(4),(5); -- select.sql SELECT rowid, col FROM sometbl; </pre><p>An example.scm:</p><pre>(import sql-de-lite) (define-constant schema #!sql&quot;schema.sql&quot;) (define-constant data #!sql&quot;data.sql&quot;) (define-constant select #!sql&quot;select.sql&quot;) (print (call-with-database &#39;memory (lambda (db) (let ((schema (sql db schema)) (data (sql db data)) (select (sql db select))) (query fetch-all schema) (query fetch-all data) (query fetch-all select))))) </pre><p>And the set-read-syntax! call from before wrapped up in a module sql-reader-syntax. After compiling the module you can compile the example with csc -X sql-reader-syntax example.scm, and this is the result of running it:</p><pre>$ ./example ((1 0) (2 1) (3 2) (4 3) (5 4) (6 5)) </pre><p>The example.scm is basically transformed into this before being compiled:</p><pre>(import sql-de-lite) (define-constant schema &quot;CREATE TABLE sometbl (col TINYINT NOT NULL);&quot;) (define-constant data &quot;INSERT INTO sometbl (col) VALUES (0),(1),(2),(3),(4),(5);&quot;) (define-constant select &quot;SELECT rowid, col FROM sometbl;&quot;) (print (call-with-database &#39;memory (lambda (db) (let ((schema (sql db schema)) (data (sql db data)) (select (sql db select))) (query fetch-all schema) (query fetch-all data) (query fetch-all select))))) </pre><p>And notice how schema, data, and select are constants (defined with define-constant, kinda similar to the static keyword in C).</p></body></html></content> <id>gemini://siiky.srht.site/scheme/reader-syntax.gmi</id> <published>2022-07-07T00:00:00Z</published> <title type="text">Reader Syntax</title> <updated>2022-03-15T00:00:00Z</updated> <link href="https://siiky.srht.site/scheme/reader-syntax.html" rel="alternate" type="text/html" hreflang="en" title="Reader Syntax" /> <link href="gemini://siiky.srht.site/scheme/reader-syntax.gmi" rel="alternate" type="text/gemtext" hreflang="en" title="Reader Syntax" /> </entry> <entry> <content type="html"><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"><html lang="en" xml:lang="en"><head><meta charset="utf-8"></meta></head><body><h1>Butterfly Effect</h1><p>siiky<br></br>2022/02/17<br></br>2022/07/07<br></br>en</p><p>Everyone or almost everyone has heard that butterfly wings and hurricanes have something to do with each other.</p><p>Whether they perceptibly have or not, small changes/actions have big impacts, even if only for the simple adding-up of all of them.</p><p>So next time you have alternatives, one of them better than the other, even if &quot;it wouldn&#39;t make a difference any way&quot;, choose the better option.</p><p>By &quot;alternative&quot; let it be understood something that is within your reach. Flying over a cliff (rather than falling off it) when you obviously can&#39;t fly is not an alternative. But paying some extra at your local grocer rather than at the biggest supermarket chain probably is.</p><p>-----</p><p>These are some of my goals in line with this idea:</p><ul><li>[X] Stop using TIDAL</li><li>[X] Stop using Google Maps -- help get OSM good enough for everyday use</li><li>[x] Stop using FB messenger (and WhatsApp) once and for all -- already using Signal (other than IRC &amp; email) almost exclusively</li><li>[X] Move away from YT -- probably PeerTube or similar, or Invidious as last resort</li><li>[X] Move to SourceHut from GitHub -- just missing the time; hopefully this summer I&#39;ll have the time to move everything</li></ul></body></html></content> <id>gemini://siiky.srht.site/philosophy/butterfly_effect.gmi</id> <published>2022-07-07T00:00:00Z</published> <title type="text">Butterfly Effect</title> <updated>2022-02-17T00:00:00Z</updated> <link href="https://siiky.srht.site/philosophy/butterfly_effect.html" rel="alternate" type="text/html" hreflang="en" title="Butterfly Effect" /> <link href="gemini://siiky.srht.site/philosophy/butterfly_effect.gmi" rel="alternate" type="text/gemtext" hreflang="en" title="Butterfly Effect" /> </entry> <entry> <content type="html"><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"><html lang="en" xml:lang="en"><head><meta charset="utf-8"></meta></head><body><h1>Double Transposition Cipher</h1><p>siiky<br></br>2022/02/13<br></br>2022/07/07<br></br>en</p><p>Got into &quot;hand ciphers&quot; recently, and this was the first (seemingly) decent one that is easy-ish and quick-ish to use.</p><ul><li><a href="https://en.wikipedia.org/wiki/Double_transposition">Wikipedia</a></li><li><a href="https://www.pbs.org/wgbh/nova/decoding/doubtrans.html">Where I first learned of it</a></li></ul><p>The basic idea is that you create a matrix of N columns (number of letters of the key), where you will write down row-wise the message you want to encipher, and then reorder the result column-wise according to the chosen key.</p><p>An interesting property of this method is that the resulting cipher text has the exact same length and letters of the plain text -- it&#39;s an anagram! This is also its main flaw, of course.</p><h2>Ciphering</h2><p>Let&#39;s say we want to encipher the text &quot;TOMORROW AT DUSK MOJITOS AT THE BEACH&quot;. First, you choose the key, e.g. &quot;GORILLA&quot;, make the matrix and annotate each letter&#39;s sequence number:</p><pre>2673451 GORILLA ------- </pre><p>Then write down the message row-wise (left-to-right, top-to-bottom) in the matrix:</p><pre>2673451 1234567 GORILLA AGILLOR ------- ------- TOMORRO OTORROM WATDUSK KWDUSAT MOJITOS SMITOOJ ATTHEBE EAHEBTT ACH A CH </pre><p>And that&#39;s it, the first transposition is done. The ciphered text can be read column-wise (top-to-bottom, column number) in the columns order: &quot;OKSE TWMAA ODIH RUTE RSOB OAOTC MTJTH&quot;.<br></br>I read some places recommending breaking the ciphered text into blocks of for example 5, so as to be easier to transmit/read off. But I believe also as not to give more hints about the key (due to the shorter columns). With that: &quot;OKSET WMAAO DIHRU TERSO BOAOT CMTJT H&quot;.</p><p>To get to a double transposition ciphered text you have to apply this process again, now using the previous ciphered text as the plain text (and probably a good idea to use a different key). E.g., with the key &quot;ALMOND&quot;:</p><pre>134652 ALMOND ------ OKSETW MAAODI HRUTER SOBOAO TCMTJT H </pre><p>The final ciphered text: &quot;OMHST HWIRO TKARO CSAUB MTDEA JEOTO T&quot;.</p><h2>Deciphering</h2><p>To decipher you have to do the reverse. You make the matrix as before, and then the way you fill it depends on the number of columns and the length of the message. To get the number of rows, and the number of columns of the last row, the formula in Scheme is:</p><pre>(receive (q r) (quotient&amp;modulo (string-length cipher-text) (string-length key)) (+ q 1) ; #rows r) ; #columns of the last row </pre><p>(quotient&amp;modulo is actually CHICKEN-specific; in plain Scheme you&#39;d use quotient and modulo separately)</p><p>In English: the number of rows is the quotient of the division of the length of the cipher text by the length of the key, plus 1; the number of columns of the last row is the remainder.</p><p>So, for the previous cipher text and the key &quot;ALMOND&quot;:</p><pre>(string-length cipher-text) ;=&gt; 31 (string-length &quot;ALMOND&quot;) ;=&gt; 6 (quotient 31 6) ;=&gt; 5 (modulo 31 6) ;=&gt; 1 </pre><p>This means that the matrix must have 6 rows, but that the last row has only 1 letter.</p><p>Putting it into practice, we get this (using * to denote blanks and # blocked blanks):</p><pre>134652 134652 134652 ALMOND ALMOND ALMOND ------ ------ ------