<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="4.3.4">Jekyll</generator><link href="https://her.st/rss.xml" rel="self" type="application/atom+xml" /><link href="https://her.st/" rel="alternate" type="text/html" /><updated>2025-01-24T19:14:18+00:00</updated><id>https://her.st/rss.xml</id><title type="html">her.st - Do you see it yet?</title><subtitle>Minimalism, Linux, Self-Hosting, .NET, Go, Python, Philosophy, Psychology, Privacy, Security.</subtitle><author><name>trbl</name></author><entry><title type="html">freedom</title><link href="https://her.st/usr/bin/freedom.html" rel="alternate" type="text/html" title="freedom" /><published>2024-04-05T00:00:00+00:00</published><updated>2024-04-05T00:00:00+00:00</updated><id>https://her.st/usr/bin/freedom</id><content type="html" xml:base="https://her.st/usr/bin/freedom.html"><![CDATA[<h1 id="rule-of-thumb">rule of thumb</h1>

<center> <img src="/assets/images/iq.webp" alt="iq distribution midwit meme" /> </center>

<p>The majority is not very intelligent -&gt; The majoriy does certain things -&gt; Doing those things is not very intelligent.</p>

<h2 id="obvious-examples">obvious examples</h2>

<table>
  <thead>
    <tr>
      <th>Stupid Majority</th>
      <th>Intelligent Minority</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>they want more money</td>
      <td>they want to need less of it</td>
    </tr>
    <tr>
      <td>they go into debt for liabilities</td>
      <td>they go into debt for assets</td>
    </tr>
    <tr>
      <td>they need full time jobs</td>
      <td>they work for fun</td>
    </tr>
    <tr>
      <td>they have university degrees</td>
      <td>they have real skills</td>
    </tr>
    <tr>
      <td>they believe others</td>
      <td>they question themselves</td>
    </tr>
    <tr>
      <td>they do what authority commands</td>
      <td>they do, given reason to</td>
    </tr>
    <tr>
      <td>they are on social media</td>
      <td>they are not</td>
    </tr>
    <tr>
      <td>they watch mainstream media</td>
      <td>they do not</td>
    </tr>
    <tr>
      <td>they parrot what they are being told</td>
      <td>they have original thoughts</td>
    </tr>
    <tr>
      <td>they vote</td>
      <td>they abstain</td>
    </tr>
  </tbody>
</table>

<p>The majority of people will even stop at a red pedestrian light and not cross an empty road until the light turns green. They are barely autonomous, and just like sheep, as soon as you walk across the red light, they will follow behind you.</p>

<h2 id="why-not-to-vote">why not to vote</h2>

<p>Elections no longer matter (if they ever did is another subject entirely) but all over europe right wing parties win 2024 and are <strong>not allowed to rule</strong>.</p>

<h2 id="how-to-be-free">how to be free</h2>

<p>First of all you need to understand how and why you were programmed.</p>

<p>You were programmed to want money. Everyone has a natural tendency to be greedy. Whatever you have will become boring and you will want more.  You want that new iPhone every year because its better, or a new computer or a bigger house, a better fucking fridge, whatever you have, eventually something better will catch your eye and you will want it. For <em>-some-</em> reason. That’s how humanity made it this far. Survivial is enough for animals and natural selection, but not for us. We want to perpetually improve things and make them better. Capitalism is an ingenius system to encourage that behavior and steers whole societies into that direction by exploiting this innate desire.</p>

<p>Obviously, businesses exploit that in ways more insidious than just making better products. They use all kinds of dirty tricks to keep you consooming. From psyops to planned obsolencence. They will get you to consume one way or the other. After all, they are in the business of making money. And you are working 40h/week to spend it with them.</p>

<h2 id="pressure">pressure</h2>

<p>Everyone wants you to “get a job” and not be “lazy” or a “freeloader”. Usually those people are the most vocal supporters of politicians who do no useful work whatsoever.</p>

<p>Being a politician and being on welfare is almost exactly the same thing: both are paid by the tax payer, but only one of them lies to us on TV. Get what job exactly? During the Covid19 Pandemic most people lost their jobs because they were deemed non-essential <em>and rightfully so</em>. Most jobs are not required to be done, they just exist to keep the system going.</p>

<p>Small businesses are obsolete, the megacorps have taken over. You can get everything delivered from amazon, your groceries get delivered by the big supermarket chains, you can order everything that’s essential from some big company. It doesn’t matter what your opinion on those big corporations is, they provide convenience no small business can provide and the majority of people want that convenience.</p>

<p>They won. And the sooner people accept that, the sooner they can stop wasting their time and energy doing useless jobs that are reminiscent of occupational therapy, just keeping people busy so they don’t think about how fucked up the state of affairs is.</p>

<p>Now, you could get a non-essential job, like software development. What are you going to build? Most likely something a marketing agency convinced enough people they need and not something useful. If you’re fine wasting your life on something like that be my guest.</p>

<p>You see, at some point you realize that there’s no real demand for any low-tech entrepreneurship anymore. The companies that do those things nowdays have been founded 100 years ago and live off of government contracts, own or still rent their stores and workshops at pre-war prices. If they had to rent or pay off a mortgage nowdays, they’d simply not be able to stay open.</p>

<p>And if you’re not in the top ~5% of the IQ distribution, you have no chance of competing in any high-tech field. So you’re stuck with the low-tech stuff, and there’s no demand for that.</p>

<h2 id="breaking-the-loop">breaking the loop</h2>

<h3 id="step-1-cut-all-your-costs">Step 1: Cut all your costs</h3>

<p>Buy food in bulk. Buy everything you can 2nd-hand. Do not rely on any services like plumbers or hairdressers, instead learn how to do that stuff yourself. Pick up a new hobby like soldering or woodworking, get a toolbox. Become a man that will just solve the task at hand without relying on a better man.</p>

<p>If you want to invest in something and you take a loan or credit, you are not investing, you are making the bank invest and the bank will make you work for decades to pay it back. If you currently have debt, pay it off as soon as possible. You can not be free if you are in debt. You are a slave to the bank. Do not go into debt before you <em>actually</em> know the difference between an <em>asset</em> and a <em>liability</em>.</p>

<p><em>If you think a house you live in is an asset you do not understand the difference.</em></p>

<p>Cancel all subscriptions. Cancel all contracts. Get a cheaper phone plan, get a cheaper internet plan. You don’t need cable or Netflix. Do not pay for anything you can get for free. Learn how to get things for free. Before you make any purchase that isn’t necessary to survive, wait 14 days. After 14 days you will realize that you don’t need it. If you still want it, buy it. From my experience, you won’t buy most things because you forget you wanted them.</p>

<h3 id="step-2-move-to-a-cheap-place">Step 2: move to a cheap place</h3>

<p>Get a cheaper apartment. Embrace complete minimalism. Get a Bed, Chair, Table and rice cooker. That’s all you need to survive, you’d be surprised how versatile a rice cooker is. You don’t even need a fridge. Turns out half of the year its cold enough outside to just put stuff outside your windowbed to refrigerate it. Don’t bring all of your old stuff, sell it all. You don’t need it.</p>

<h3 id="steo-3-quit-wage-slavery">Steo 3: quit wage slavery</h3>

<p>At this point your cost of living should be so low, even government welfare is enough to sustain you. You can now quit your job and live off of welfare. You can now do whatever you want. You can work on your own projects and learn new skills. You are almost free. Take small jobs on demand, whatever you are qualified for, get full time jobs, quit them after a month or two, once you made enough money to do what you want to do and spend the rest of the time on learning and practicing new skills.</p>

<p>Avoid working for money. Work for experience or for the joy of doing, learning, creating or helping others. You never have to worry about if the job pays enough now. You can do whatever job you want to do. The money you do get, you invest into assets and/or new skills that will save you money in the long run.</p>

<h3 id="step-4-freedom">Step 4: freedom</h3>

<p>Once you’ve learned enough skills to make money on your own, or get any job you want, you can basically pack your shit whenever you want and leave. That’s freedom. You can go anywhere you want, you can do whatever you want. The job you accepted turns out to be shit? Just quit. You don’t <em>need</em> the money anyway. You just took the job to learn something or to get money for an investment. Just get a different job.</p>

<h4 id="book">Book</h4>

<p>And if you want to learn more about how the system works, I recommend reading “DIE SHEEPLE DIE” by The Honorable DJ Hives. It’s a free ebook and I’ve attached it below. It’s written in a way the stupid majority can not read. It is <strong>FNORD</strong>.</p>

<blockquote>
  <p>“Every appearance of the [misspelled] word subconsciously generates a feeling of uneasiness and confusion, and prevents rational consideration of the subject. This results in a perpetual low-grade state of fear in the populace. This in turn perpetuates the need for Government, because without fear, people don’t need Government.” – The Illuminatus Trilogy (Novel, 1974).</p>
</blockquote>

<p><a href="/assets/DIE-SHEEPLE-DIE.pdf">DIE SHEEPLE DIE! by The Benevolent DJ Hives</a></p>]]></content><author><name>trbl</name></author><category term="personal" /><summary type="html"><![CDATA[The less money you need the more free you are. Don't play a game that can't be won.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://her.st/assets/images/freedom.webp" /><media:content medium="image" url="https://her.st/assets/images/freedom.webp" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">symbolism, meditation, prayer, psychedelics</title><link href="https://her.st/usr/bin/symbolism-rituals-part-one.html" rel="alternate" type="text/html" title="symbolism, meditation, prayer, psychedelics" /><published>2024-04-05T00:00:00+00:00</published><updated>2024-04-05T00:00:00+00:00</updated><id>https://her.st/usr/bin/symbolism-rituals-part-one</id><content type="html" xml:base="https://her.st/usr/bin/symbolism-rituals-part-one.html"><![CDATA[<h2 id="jungs-mist">Jung’s Mist</h2>

<p>There’s a time in your life - if you can think back far enough - where you did not know that you were separate from everything else. When you did not discriminate between you and an ant crawling through the dirt. Everyhting is One and One is All. Carl Jung called the moment of realization the ‘stepping out of the mist’.</p>

<blockquote>
  <p>“[..] That was in my eleventh year. There I suddenly was on my way to school I stepped out of a mist. It was just as if I had been in a mist, walking in a mist, and I stepped out of it and I knew, “I am.” “I am what I am.” And then I thought, “But what have I been before?” And then I found that I had been in a mist, not knowing how to differentiate my self from things. I was just one thing among other things.” – C. G. Jung</p>
</blockquote>

<p>Once you ‘step out of the mist’, you become like god. And you - like him - are alone.</p>

<h2 id="adam-and-the-apple">Adam and the Apple</h2>

<blockquote>
  <p>The word fruit appears in Hebrew as פֶּ֫רִי (pərî). As to which fruit may have been the forbidden fruit of the Garden of Eden, possibilities include apple, grape, pomegranate, fig, carob, etrog or citron, pear, quince, and <em>mushrooms</em>.</p>
</blockquote>

<p>Adam was not conscious before eating the forbidden fruit. He had awareness but He was not conscious.</p>

<blockquote>
  <p>“And the serpent said unto the woman, Ye shall not surely die: For God doth know that in the day ye eat thereof, then your eyes shall be opened, and ye shall be as gods, knowing good and evil.”</p>
</blockquote>

<center>
    <img src="/assets/images/good-evil-pov.png" alt="good is a point of view" />
</center>

<p>Good and evil have no objective existance, you can only be taught what good and evil are.
Without betraying god, loyalty to god was meaningless. Eating the forbidden fruit gave him the experience of evil and provided the contrast to good.</p>

<h3 id="yin-yang">Yin Yang</h3>

<center>
    <img src="/assets/images/yinyang.webp" alt="yin yang symbol" />
</center>

<p>This is usually oversimplified as “the bad contains a bit of good” and “the good contains some bad”. This hides the truth. If you deny one side, you never experience the other side to its fullest. You lack the contrast. This is conveniently left out from the movies.</p>

<blockquote>
  <p>“One quickly learns that the Jedi Code does not give all the answers. If you are to truly understand, then you will need the contrast, not adherence to a single ideal.” – Kreia</p>
</blockquote>

<p><em>There is no virtue in a harmless persion for not harming.</em></p>

<p>Are you a nice person who could never hurt anyone? Are you unable to fight? Are you… harmless?  Harmless people are not good. If you can’t harmm there is no virtue in not harming.</p>

<blockquote>
  <p>“[..] fear and cowardice, dressed up as morality.” – Nietzsche</p>
</blockquote>

<p>If you are not capable of cruelty, you are the victim to someone who is. You have to be capable of it and then learn to control it. How else are you supposed to respect yourself and demand to be respected?</p>

<center> <img src="/assets/images/weakness-offends-me-meme.webp" alt="your weakness offends me meme" /> </center>

<p>Weak people are dangerous because they deny their potential for it.</p>

<blockquote>
  <p>“if you are going to be a figher, you have to want to win and you have to want to hurt people. But not for the sake of hurting them, thats what makes you different than an evil person. But you have to have that capacity. You have to develop that. And you know, thats a step to the way of enlightenment, weirdly enough, because that isn’t what people think.” – J. B. Peterson</p>
</blockquote>

<center>
    <img src="/assets/images/jfc.webp" alt="yin yang symbol" />
</center>

<p>In Kung Fu Training you will learn how to break the arm, ribcage and nose of an attacker in a single fluid motion on your first day of training and practice it on your peers and your peers on you. Injuries during training are common. You might just get a bit too carried away or not have paid sufficient attention and injure or get injured. You learn quickly how much harm you are capable of inflicting unintentionally, and it will dawn on you how much more you could do intentionally.</p>

<p>With time you become very dangerous, but at the same time, you learn discipline and mental strength. You learn how to be focused, and confident. When somoene tries to provoke a fight, you can respond with confidence to make the aggressor rethink his choice - and if he doesn’t, he will regret it.</p>

<p>In the end, learning to fight is the best way not to get into fights in the future. Strong people know how dangerous they are and learn how control it.</p>

<h3 id="the-shadow">The Shadow</h3>

<p>You have to understand that you are no saint, in fact you are much closer to being satan himself. Jung said your shadow reaches right down into the depths of hell.
Given the right circumstances, you’d be exactly like Hitler, Stalin, Mao, … And if you don’t know that, you know nothing about people or yourself.</p>

<p>Learning that about yourself is not fun. That’s why you didn’t do it. You have to be willing to descend into hell to learn things like that.
If you want to find wisdom, the answer is behind the door you do not want to go through at all. That’s where you kept it all this time.</p>

<p>Integrating the shadow means to step out of the moral framework you have built around you. All the things you denied yourself to feel or experience. Whatever you supress has to be brought into your life and integrated into it.</p>

<p>By denying those things, you also deny feeling the opposites to their full extent.</p>

<h2 id="spiritual-disciplines">Spiritual Disciplines</h2>

<p>They work. But not how they are practiced today. They also don’t require supernatural beings or explanations. They work even if you do not believe in them. I’ll tell you how.</p>

<h3 id="prayers">Prayers</h3>

<p>Especially in the western/christian world, prayer has been bastardized into begging “God” for handouts. People think praying for strength will magically make them stronger. The Clergy will tel you that if you pray for strenght, god will put you into situations that will give you a chance to practice strength.</p>

<p>Cute, but doesnt work like that.</p>

<p>Prayer was taken alot more serious in the past. Why do you think prayer is still a thing today? Do you think the people who started your religion were praying like you and had the same answer-ratio that you got? No. Their prayer worked 9 times out of 10. Even though there is no god.</p>

<center>
    <img src="/assets/images/trigger-me-jesus.webp" alt="triggered jesus meme" />
</center>

<p>You see, 10min of prayer is not enough. You want to pray for a prolongued amount of time. You will know when you are doing it long enough and right. Repeat the prayer over and over and over…</p>

<h3 id="mantra">Mantra</h3>

<p>Mantras are phrases or sounds you repeat at a certain rythm, almost like a song, over extended periods of time. The human brain is quite bad at multitasking, so, by repeating words or sounds, your brains language region is occupied and can’t function in autopilot. That basically means, you deny your brain to create and think thoughts for extended periods of time. Your brain does not like that. It will try its best to make you stop. First you will get bored, then you will slur the words or sounds and break the rythm. Those little errors will kick your mind back into autopilot and you will have chatter in your skull. If you persist, eventually you will start to hallucinate as your brains visual region takes over the task of thinking thoughts.</p>

<h3 id="meditation">Meditation</h3>

<p>People do it completely backwards.
Meditation is not about saying “Om” and focusing your attention on your breath or heartbeat. Its not about controlling your mind. You are not supposed to stop thinking.
What you want to do is to let the thoughts flow freely and stop passing judgement on them. The goal is observe them come and go and to practice mindfulness. You should be able to be consciously aware of thoughts before they are completely ‘prepared’ and your inner voice starts to speak them to you. You should observe and take mental notes on what sensations you feel in your body when you experience certain thoughts. You do this until you dissociate from your ego and watch your thoughts like an external observer.</p>

<h3 id="fasting">Fasting</h3>

<p>Once again, fasting has been washed down and turned on easy-mode for todays population. Intermittend fasting as is now being practiced does bring some health benefits, but it will not get you closer to “god” or “enlightenment”. You want to starve yourself for a week or two. Some monks sat in a temple and meditated without food until they died sitting. Some were even turned into statues and preserved forever. Don’t you think they’d have gotten up if nothing happened to them in their mind as they were approaching death? The closer you get to death, the more you will learn. Clearly one of the worst ways to affect your mind. Not very healthy. But there’s always a time and place for everything.</p>

<h3 id="sacrifice">Sacrifice</h3>

<p>Imagine standing in front of an altar in a dark, candle lit underground room. Surrounded by other people in robes, chanting prayers.
On the altar, there is a young woman, naked, blindfolded, breathing slowly and deeply. The ritual master slowly raising a dagger above his head as the people chant louder and louder, until he brings the dagger down with force, stabbing the woman in the chest and her screams hall through the dungeon as she fights a losing battle for her life.</p>

<p>Just readng this should have made you feel something. Imagine experiencing something like that for real. Do you understand? Traumatic experiences alter your state of concsiousness. I think I’d rather do a few weeks of fasting.</p>

<h3 id="psychedelics">Psychedelics</h3>

<p>The fastest way. Most religions originally had their special potion. Clearly, a psychedelic potion. If I were to start a religon, I’d ‘prove’ it right by giving my acolytes a potion laced with psilocybe mushrooms and set up an appointment with god or satan for them.</p>

<p>Ego Death is is the key. Given a high enough dose of psilocybin for example, you will be convinced that you are dying. No matter how rational you think you are, even if you remind yourself that you are just on psychedelics and everything is fine, you will still believe that you have done it this time and taken too much. For all you know, you are literally dying. But your body survives.</p>

<center>
    <img src="/assets/images/ifyoudiebeforeyoudie.webp" alt="Inscription over a door at St. Paul's Monastery on Mt. Athos" />
</center>
<blockquote>
  <p>“If you die before you die, then you won’t die when you die.” – Inscription over a door at St. Paul’s Monastery on Mt. Athos</p>
</blockquote>

<p>The most astounding property of psilocybin and possibly other psychedelic agents - however, I only know this about psilocybin for a fact - is the ability to re-mount your subconscious from readonly to read/write.</p>

<p>You can put a spotlight on any automatic behavior, any impulse response, and then just “will” it into a new behavior. It’s as easy as saying “this behavior no longer serves me, i will not do this anymore” and the next day you wake up a changed man.</p>

<p>For reference: I’ve spent ~9 years in PTSD therapy, stationary for <em>significant</em> amounts of time, been on all kinds of drugs which get prescribed randomly and switched for others in the same random manner, countless hours of therapy sessions and talking about everything. This yielded zero improvements. One heavy dose of psilocybin with the conscious goal of improving my life and 8 hours later, I was virtually symptom free and started functioning. But not only that. I did a career speedrun the likes of which nobody would believe.</p>

<p>You will never be able to talk me out of advocating psychedelics. They are a great tool and they have saved my life.</p>

<h3 id="zen-and-desire">Zen and Desire</h3>

<p>The root teaching of Buddhism is the following: <strong>You suffer because you desire</strong></p>

<p>As soon as you start practicing zen, your spiritual teacher will use mindgames on you to break through your mental conditioning. He will guide you towards enlightenment like a prankster. First he will make you give up all your possessions - often by donating it to him. Then he will start giving you more and more chores and excercises until you are completely overwhlemed and have a mental breakdown. Here’s an example:</p>

<ul>
  <li><em>Student</em>: I am suffering.</li>
  <li><strong>Master</strong>: You suffer because you desire.</li>
  <li><em>Student</em>: What shall I do?</li>
  <li><strong>Master</strong>: Try not to desire.</li>
  <li><em>Student</em>: I have tried not to desire for many months now, I still find myself to desire</li>
  <li><strong>Master</strong>: Try not to desire less than you can.</li>
</ul>

<p>[often never or after a long time]</p>

<ul>
  <li><em>Student</em>: I now desire <strong>not to desire</strong></li>
</ul>

<p>The more you desire enlightenment, the longer it will take you to accept your inevitable and unavoidable defeat. You will be trapped in a loop, a catch-22 - like the Oroburos eating its own tail. Eventually you <strong>will</strong> have a breakdown and accept your inability to do what is asked from you, and during this painful emotional resignation, you may truly understand:</p>

<ul>
  <li>If you seek it, you can not find it.</li>
  <li>If you dont want it, you have it.</li>
</ul>

<p>The Buddha himself sat in the mountains under a tree for weeks trying to achieve enlightenment, and only at the last moment when he accepted defeat and got up, it suddenly happened to him.</p>

<h2 id="englightenment">Englightenment</h2>

<p>The experience of enlightenment is indescribable and incomprehensible until you get a taste first hand.</p>

<ol>
  <li>You experience three ‘people’ inside you.
    <ul>
      <li>one that is your identity, the ego</li>
      <li>one that creates thought, the thinker</li>
      <li>one that processes thought, the prover</li>
    </ul>
  </li>
  <li>The thinker finally shuts up
    <ul>
      <li>no more chatter in the skull, no compulsive thinking</li>
      <li>silence in your mind is the new normal mode</li>
    </ul>
  </li>
  <li>A feeling of peace at an unimaginable magnitude
    <ul>
      <li>calmness, serenity, hearing birds chirp and truly appreciating it</li>
      <li>no more anger, more patience</li>
      <li>seeing through peope playing out the act that is their ego</li>
      <li>no worries, no anxiety, just acceptance</li>
      <li>understanding why things are the way they are</li>
    </ul>
  </li>
  <li>A boost of Confidence, you no longer identify with your identity
    <ul>
      <li>your identity is put in the background</li>
      <li>you stop caring about status, fame or power</li>
      <li>you start to see whats really important</li>
      <li>public speaking is suddenly easy</li>
    </ul>
  </li>
  <li>A feeling of connectedness with everything
    <ul>
      <li>feeling reborn</li>
      <li>no longer fear death</li>
      <li>highly enhanced sense of empathy</li>
    </ul>
  </li>
</ol>

<p>Those effects last forever as far as I can tell and are the new default.</p>

<p>You will still get sad, worried, angry, start obsessively thinking thoughts and get worked up by all of it - but as soon as you notice, you can just stop.</p>

<p>You will find a kind of enjoyment in negative emotions. YOu can face your fears, like the fear of heights by sitting at the edge of a cliff in absolute terror, then take a step back - in your mind - and observe your thoughts, all the sensations you feel in your body and take mental notes as if you were an observer. This works for everything.</p>

<p>You can speak your mind without fear of being ridiculed, you no longer worry about what people think about you. That’s why you do not lie. You don’t work for money, you just work for knowledge. You get a minimalist life and home without much stuff because you don’t need many things and dont desire things you dont need.</p>

<p>You go to bed and your mind is no longer reminding you of all the fuck-ups you have (or surely will) commit in the future. You’re fine with fucking up every now and then. Nightmares disappear.</p>

<hr />

<p>Edit: After the death of my Dog and weeks of grief and sadness on a level I’ve not experienced before, not even for a human, I am still standing by what I’ve said above.
I was able to embrace the grief and sadness but also put it aside when I had to.</p>

<p>R.I.P Inu.</p>

<p>– Nov 28th 2020 - Oct 21st 2024</p>

<h4 id="footnotes">footnotes</h4>

<center>
    <video controls="" style="width: 854px; height: auto">
        <source src="/assets/images/masterpiece.mp4" type="video/mp4" />
    </video>
</center>

<blockquote>
  <p>‘the thinker’ &amp; ‘the prover’ borrowed from “Prometheus Rising” by Robert Anton Wilson</p>
</blockquote>]]></content><author><name>trbl</name></author><category term="personal" /><category term="symbolism" /><category term="philosophy" /><summary type="html"><![CDATA[people spend decades in monestaries living like monks - yet never learn. You were closer to enlightenment before seeking it than after starting the practice. And the practice just attempts to break you.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://her.st/assets/images/enlit_thumb.webp" /><media:content medium="image" url="https://her.st/assets/images/enlit_thumb.webp" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">LLMs solved the search problem</title><link href="https://her.st/usr/bin/rip-google.html" rel="alternate" type="text/html" title="LLMs solved the search problem" /><published>2023-03-23T00:00:00+00:00</published><updated>2023-03-23T00:00:00+00:00</updated><id>https://her.st/usr/bin/rip-google</id><content type="html" xml:base="https://her.st/usr/bin/rip-google.html"><![CDATA[<h3 id="google-is-dead">Google is dead</h3>

<p>Google has emerged as the predominant source of information, offering answers to a wide range of queries, from trivial to scholarly. Its vast resources, including billions of web pages, articles, books, images, and videos, have replaced libraries as the go-to places for knowledge and culture. Google’s success can be attributed to its convenience, enabling users to access information 24/7 from anywhere in the world. Google’s personalization features, which tailor results to users’ preferences, behavior, and relevant factors, have also played a crucial role in its widespread adoption.</p>

<p>Google’s commercial nature means that it collects and analyzes users’ data to improve its algorithms and provide relevant results, making users the product, not the customer. While other companies also collect data, Google’s dominance and value lie in its data collection. Nonetheless, Google’s algorithms are not neutral or objective, and they can be influenced by censorship laws or political agendas. The quality of Google’s results can be inconsistent, depending on the sources it indexes and ranks.</p>

<p>Google’s dominance may be coming to an end as it has not released any new products in years, and its acquisition of other companies has not resulted in significant innovation. Its size is now limiting its ability to move quickly in a fast-changing landscape, and it risks being left behind.</p>

<h3 id="the-search-problem">The Search Problem</h3>

<p>The search problem refers to the challenge of efficiently and accurately retrieving relevant information from vast amounts of data. This problem is particularly relevant in the context of search engines like Google and Bing, which index and search through billions of web pages.</p>

<p>In order to solve the search problem, search engines like Google and Bing use complex algorithms to analyze the content of web pages and determine their relevance to specific search queries. These algorithms take into account a wide range of factors, such as the frequency and location of keywords on a web page, the popularity of the page, and the credibility of the source.</p>

<p>Google and Bing systematically download and analyze web pages and index the content of those pages into a searchable database. Ranking involves determining the relevance and importance of each page in relation to specific search queries.</p>

<h3 id="the-solution-llms">The Solution: LLMs</h3>

<p>Storing massive amounts of text in a searchable format requires an index, similar to Google’s. However, even small-scale, self-hosted Full-Text-Search solutions like ElasticSearch require <em>insane</em> amounts of RAM, often in the hundreds of gigabytes, for comparatively benign datasets. Google, on the other hand, requires entire data centers to store everything.</p>

<p>Literally tens of thousands of servers spread across multiple data centers. To give you an idea of the scale, according to a report from Statista, as of 2021, Google’s search index contained over 130 trillion web pages, and the company processes over 3.5 billion searches per day. This level of scale requires an enormous amount of hardware resources to maintain and operate.</p>

<p>In contrast, Large Language Models (LLMs) like LLaMA’s 65 billion parameter model, trained on over 1 trillion tokens, require only about 10GB of disk/ram and can be queried easily with 100 tokens per second on a consumer GPU. This is an incredible level of compression and performance for searching vast amounts of information.</p>

<p>GPT4 by OpenAI, a model trained on over 100 times more tokens than LLaMA, yet with only marginally more parameters and hence disk/ram requirements pretty much knows everything and fits into a single server.</p>

<p>With LLaMA, parameter count can be trimmed without losing much accuracy. You can shave off half the size and still have the same quality for a given language, like English. Furthermore, LLMs are currently unoptimized for space/resource usage, and techniques such as trimming and quantization are improving every month. Quantization algorithms can currently quantize a 16-bit model down to 4 bits, saving three-quarters of the RAM/DISK requirements while still delivering almost identical results when queried. The potential for further optimization in this area is truly mind-blowing.</p>]]></content><author><name>trbl</name></author><category term="ai" /><category term="google" /><summary type="html"><![CDATA[Google has become the primary source of information for people worldwide, replacing traditional libraries. Now, AI is replacing Google for the same. LLMs solved the 'Search Problem']]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://her.st/assets/images/baibaigoogle.webp" /><media:content medium="image" url="https://her.st/assets/images/baibaigoogle.webp" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">nginx mirroring</title><link href="https://her.st/usr/bin/nginx-mirroring.html" rel="alternate" type="text/html" title="nginx mirroring" /><published>2022-12-10T00:00:00+00:00</published><updated>2022-12-10T00:00:00+00:00</updated><id>https://her.st/usr/bin/nginx-mirroring</id><content type="html" xml:base="https://her.st/usr/bin/nginx-mirroring.html"><![CDATA[<h1 id="nginx-mirroring">nginx mirroring</h1>

<p>So you might want to implement some basic realtime functionality on your website. Think of the Hit Counter for example, or maybe you want to do some realtime logging. What if you wanted to do something with requests but you don’t want to use Javascript? What if you on’t want to rewrite your site with some kind of dynamic backend? You can use Nginx to do that!</p>

<p>When I deployed OpenFaaS (Functions as a Service), something identical to AWS’s Lambda, I wanted to write a small function that would log the requests to my site. The easiest way would be to have a small <code class="language-plaintext highlighter-rouge">&lt;script&gt;</code> tag in the <code class="language-plaintext highlighter-rouge">&lt;head&gt;</code> of my site, but I didn’t want to do that. I like the idea of being free of Javascript, and I don’t want to have to rewrite my site to use a dynamic backend.</p>

<p>The basic idea is to multicast the http requests to a function so the flow looks something like this:</p>

<pre><code class="language-ascii">                                            ┌──────────┐
                                       ┌───►│ Function │
                                       |    └──────────┘
    ┌────────┐    ┌───────┐   ┌────────┤
    │ Client ├────| Nginx ├───| MIRROR │ 
    └────────┘    └───────┘   └────────┤
                                       │    ┌─────────┐
                                       └───►│ Content │
                                            └─────────┘
</code></pre>

<p>Which can be implemented like this:</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">server</span> <span class="p">{</span>
    <span class="n">listen</span> <span class="mi">80</span><span class="p">;</span>
    <span class="n">listen</span> <span class="mi">443</span> <span class="n">ssl</span> <span class="n">http2</span><span class="p">;</span>
    <span class="n">server_name</span> <span class="n">her</span><span class="p">.</span><span class="n">st</span><span class="p">;</span>

    <span class="c1"># .. cert stuff omitted
</span>    
    <span class="n">location</span> <span class="o">/</span> <span class="p">{</span>
        <span class="n">mirror</span> <span class="o">/</span><span class="n">log_function</span><span class="p">;</span>    <span class="c1"># mirror requests to /log_function
</span>        <span class="n">mirror_request_body</span> <span class="n">off</span><span class="p">;</span> <span class="c1"># if you want to mirror the payload change this to 'on'
</span>        <span class="n">root</span> <span class="o">/</span><span class="n">srv</span><span class="o">/</span><span class="n">http</span><span class="o">/</span><span class="n">her</span><span class="p">.</span><span class="n">st</span><span class="p">;</span>   <span class="c1"># your content root
</span>    <span class="p">}</span>

    <span class="n">location</span> <span class="o">/</span><span class="n">log_function</span> <span class="p">{</span>
        <span class="n">internal</span><span class="p">;</span>                                 <span class="c1"># don't allow public access
</span>        <span class="n">proxy_pass</span> <span class="n">https</span><span class="p">:</span><span class="o">//</span><span class="n">f</span><span class="p">.</span><span class="n">her</span><span class="p">.</span><span class="n">st</span><span class="o">/</span><span class="n">log_function</span><span class="p">;</span> <span class="c1"># your function
</span>    <span class="p">}</span>
<span class="p">}</span>
</code></pre></div></div>

<p>Now we need to write a function that will log the requests. I wrote a simple function in C# that will log the requests to a Redis database.</p>

<h2 id="the-function">The Function</h2>

<p>First we have to create a new openfaas function. I’m using the <code class="language-plaintext highlighter-rouge">csharp-httprequest</code> template</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>faas-cli template store pull csharp-httprequest
faas-cli new nginxlog <span class="nt">--lang</span> csharp-httprequest <span class="nt">--gateway</span> https://f.her.st
</code></pre></div></div>

<p>this will create a new folder called <code class="language-plaintext highlighter-rouge">log_function</code> with the following files:</p>

<pre><code class="language-ascii">├── log_function
│   ├── log_function.csproj
│   └── log_function.cs
└── log_function.yml
</code></pre>

<blockquote>
  <p>For more information about the function template, see the <a href="https://docs.openfaas.com/cli/templates/">openfaas docs</a>.</p>
</blockquote>

<p>Inside log_function.cs you’ll see something like</p>

<div class="language-csharp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">using</span> <span class="nn">System.IO</span><span class="p">;</span>
<span class="k">using</span> <span class="nn">System.Threading.Tasks</span><span class="p">;</span>
<span class="k">using</span> <span class="nn">Microsoft.AspNetCore.Http</span><span class="p">;</span>

<span class="k">namespace</span> <span class="nn">Function</span>
<span class="p">{</span>
    <span class="k">public</span> <span class="k">class</span> <span class="nc">FunctionHandler</span>
    <span class="p">{</span>
        <span class="k">public</span> <span class="k">async</span> <span class="n">Task</span><span class="p">&lt;(</span><span class="kt">int</span><span class="p">,</span> <span class="kt">string</span><span class="p">)&gt;</span> <span class="nf">Handle</span><span class="p">(</span><span class="n">HttpRequest</span> <span class="n">request</span><span class="p">)</span>
        <span class="p">{</span>
            <span class="kt">var</span> <span class="n">reader</span> <span class="p">=</span> <span class="k">new</span> <span class="nf">StreamReader</span><span class="p">(</span><span class="n">request</span><span class="p">.</span><span class="n">Body</span><span class="p">);</span>
            <span class="kt">var</span> <span class="n">input</span> <span class="p">=</span> <span class="k">await</span> <span class="n">reader</span><span class="p">.</span><span class="nf">ReadToEndAsync</span><span class="p">();</span>

            <span class="k">return</span> <span class="p">(</span><span class="m">200</span><span class="p">,</span> <span class="s">$"Hello! Your input was </span><span class="p">{</span><span class="n">input</span><span class="p">}</span><span class="s">"</span><span class="p">);</span>
        <span class="p">}</span>
    <span class="p">}</span>
<span class="p">}</span>
</code></pre></div></div>

<p>Now we need to add StackExchange.Redis to the project.</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>dotnet add package StackExchange.Redis
</code></pre></div></div>

<p>Now we can add the code to log the requests to Redis.</p>

<div class="language-csharp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">using</span> <span class="nn">System.Threading.Tasks</span><span class="p">;</span>
<span class="k">using</span> <span class="nn">Microsoft.AspNetCore.Http</span><span class="p">;</span>
<span class="k">using</span> <span class="nn">StackExchange.Redis</span><span class="p">;</span>

<span class="k">namespace</span> <span class="nn">Function</span>
<span class="p">{</span>
    <span class="k">public</span> <span class="k">class</span> <span class="nc">FunctionHandler</span>
    <span class="p">{</span>
        <span class="k">public</span> <span class="k">const</span> <span class="kt">int</span> <span class="n">FunctionId</span> <span class="p">=</span> <span class="m">1</span><span class="p">;</span>
        <span class="k">public</span> <span class="k">const</span> <span class="kt">string</span> <span class="n">RedisHost</span> <span class="p">=</span> <span class="s">"10.1.0.105:6379"</span><span class="p">;</span>

        <span class="k">public</span> <span class="k">async</span> <span class="n">Task</span><span class="p">&lt;(</span><span class="kt">int</span><span class="p">,</span> <span class="kt">string</span><span class="p">)&gt;</span> <span class="nf">Handle</span><span class="p">(</span><span class="n">HttpRequest</span> <span class="n">request</span><span class="p">)</span>
        <span class="p">{</span>
            <span class="kt">var</span> <span class="n">connectTask</span> <span class="p">=</span> <span class="n">ConnectionMultiplexer</span><span class="p">.</span><span class="nf">ConnectAsync</span><span class="p">(</span><span class="n">RedisHost</span><span class="p">);</span>
            <span class="kt">var</span> <span class="n">funcInput</span> <span class="p">=</span> <span class="k">new</span> <span class="nf">FunctionInput</span>
            <span class="p">(</span>
                <span class="n">request</span><span class="p">.</span><span class="n">Path</span><span class="p">,</span>
                <span class="n">request</span><span class="p">.</span><span class="n">Headers</span>
            <span class="p">);</span>
            <span class="kt">var</span> <span class="n">json</span> <span class="p">=</span> <span class="n">System</span><span class="p">.</span><span class="n">Text</span><span class="p">.</span><span class="n">Json</span><span class="p">.</span><span class="n">JsonSerializer</span><span class="p">.</span><span class="nf">Serialize</span><span class="p">(</span><span class="n">funcInput</span><span class="p">);</span>

            <span class="kt">var</span> <span class="n">redis</span> <span class="p">=</span> <span class="k">await</span> <span class="n">connectTask</span><span class="p">;</span>
            <span class="kt">var</span> <span class="n">db</span> <span class="p">=</span> <span class="n">redis</span><span class="p">.</span><span class="nf">GetDatabase</span><span class="p">(</span><span class="n">FunctionId</span><span class="p">);</span>

            <span class="kt">var</span> <span class="n">incrTask</span> <span class="p">=</span> <span class="n">db</span><span class="p">.</span><span class="nf">StringIncrementAsync</span><span class="p">(</span><span class="s">"requests:count"</span><span class="p">);</span>
            <span class="kt">var</span> <span class="n">addTask</span> <span class="p">=</span> <span class="n">db</span><span class="p">.</span><span class="nf">SetAddAsync</span><span class="p">(</span><span class="s">"requests"</span><span class="p">,</span> <span class="n">json</span><span class="p">);</span>

            <span class="k">await</span> <span class="n">Task</span><span class="p">.</span><span class="nf">WhenAll</span><span class="p">(</span><span class="n">incrTask</span><span class="p">,</span> <span class="n">addTask</span><span class="p">);</span>

            <span class="k">return</span> <span class="p">(</span><span class="m">200</span><span class="p">,</span> <span class="n">json</span><span class="p">);</span>
        <span class="p">}</span>
    <span class="p">}</span>
    <span class="k">public</span> <span class="k">record</span> <span class="nc">FunctionInput</span><span class="p">(</span><span class="kt">string</span> <span class="n">Url</span><span class="p">,</span> <span class="n">IHeaderDictionary</span> <span class="n">Headers</span><span class="p">);</span>
<span class="p">}</span>
</code></pre></div></div>

<p>Now we can build the function and deploy it to our OpenFaaS instance</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>faas-cli build <span class="nt">-f</span> log_function.yml
faas-cli push <span class="nt">-f</span> log_function.yml
faas-cli deploy <span class="nt">-f</span> log_function.yml
</code></pre></div></div>

<h2 id="the-result">The Result</h2>

<p>Let’s send a request to our function and see what happens.</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>curl https://f.her.st/nginxlog | jq
</code></pre></div></div>

<div class="language-json highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="p">{</span><span class="w">
  </span><span class="nl">"Url"</span><span class="p">:</span><span class="w"> </span><span class="s2">"/"</span><span class="p">,</span><span class="w">
  </span><span class="nl">"Headers"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
    </span><span class="nl">"Accept"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="w">
      </span><span class="s2">"*/*"</span><span class="w">
    </span><span class="p">],</span><span class="w">
    </span><span class="nl">"Accept-Encoding"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="w">
      </span><span class="s2">"gzip"</span><span class="w">
    </span><span class="p">],</span><span class="w">
    </span><span class="nl">"Host"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="w">
      </span><span class="s2">"10.62.0.37:8080"</span><span class="w">
    </span><span class="p">],</span><span class="w">
    </span><span class="nl">"User-Agent"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="w">
      </span><span class="s2">"curl/7.86.0"</span><span class="w">
    </span><span class="p">],</span><span class="w">
    </span><span class="nl">"X-Call-Id"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="w">
      </span><span class="s2">"2fea566b-2684-46d7-9af3-98d3b57b158d"</span><span class="w">
    </span><span class="p">],</span><span class="w">
    </span><span class="nl">"X-Forwarded-For"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="w">
      </span><span class="s2">"42.0.69.69"</span><span class="w">
    </span><span class="p">],</span><span class="w">
    </span><span class="nl">"X-Forwarded-Host"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="w">
      </span><span class="s2">"f.her.st"</span><span class="w">
    </span><span class="p">],</span><span class="w">
    </span><span class="nl">"X-Forwarded-Proto"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="w">
      </span><span class="s2">"https"</span><span class="w">
    </span><span class="p">],</span><span class="w">
    </span><span class="nl">"X-Forwarded-Scheme"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="w">
      </span><span class="s2">"https"</span><span class="w">
    </span><span class="p">],</span><span class="w">
    </span><span class="nl">"X-Real-Ip"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="w">
      </span><span class="s2">"42.0.69.69"</span><span class="w">
    </span><span class="p">],</span><span class="w">
    </span><span class="nl">"X-Start-Time"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="w">
      </span><span class="s2">"1670663513325430714"</span><span class="w">
    </span><span class="p">]</span><span class="w">
  </span><span class="p">}</span><span class="w">
</span><span class="p">}</span><span class="w">
</span></code></pre></div></div>

<p>now let’s send a request to the blog</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>curl https://her.st/
</code></pre></div></div>

<p>Now let’s check the Redis database to see if the request was logged.</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nv">$ </span>redis-cli <span class="nt">-n</span> 1 GET requests:count
<span class="s2">"2"</span>
</code></pre></div></div>

<p>Works like a charm!</p>]]></content><author><name>trbl</name></author><category term="coding" /><category term="nginx" /><category term="web" /><category term="functions" /><summary type="html"><![CDATA[What if you wanted to do something with requests but you don't want to use Javascript? You can use Nginx to do that!]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://her.st/assets/images/nginxmirror.webp" /><media:content medium="image" url="https://her.st/assets/images/nginxmirror.webp" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">coding is dead</title><link href="https://her.st/usr/bin/coding-is-dead.html" rel="alternate" type="text/html" title="coding is dead" /><published>2022-12-01T00:00:00+00:00</published><updated>2022-12-01T00:00:00+00:00</updated><id>https://her.st/usr/bin/coding-is-dead</id><content type="html" xml:base="https://her.st/usr/bin/coding-is-dead.html"><![CDATA[<h1 id="ai-is-better-than-you">AI is better than you</h1>

<p>AIs like Github Copilot will replace the need for general purpose software developers very soon. Already Copilot is alot more useful to me than a junior. It writes entire methods from a tiny comment and usually writes decent code at that. As soon as you figure out how to talk to it, it will tell you pretty much anything you want to know. This is just the beginning. Copilot is the first AI to write code. Other AIs already create Art that wins competitions, we have Video generation AI, we have speech synthesis, even AIs that write entire blog posts on major news sites. The rate of improvement is ridiculous. All of those AIs created utter shit two years ago and today they are almost on the level of a human.</p>

<blockquote>
  <p>In the future, people will just descibe what software they want and the AI will write it for them. For free, in a few seconds. We won’t be able to compete with that. That future is maybe - optimistically - 5 years away.</p>
</blockquote>

<h2 id="frontend-development">frontend development</h2>
<p>Webdevs will be the first to fall victim to it I predict. No matter how highly you think about yourself as a webdev, especially the frontend, its doesnt take more than a few weeks to learn the basics and more than room-temperature IQ. Already most companies outsource frontend stuff to 1$/hr indians. There’s already some AIs that can create entire websites from a few screenshots and prompts. They existed before Copilot and they will be better than you in a few years.</p>

<h2 id="mobile-apps">mobile apps</h2>
<p>Next in line will be mobile app developers who are not much more than glorified webdevs. They will be replaced by AIs that can write apps for all platforms at the same time in a few seconds.</p>

<h2 id="backend-developers">backend developers</h2>
<p>REST APIs are very trivial too, especially if you use microservices or something else with a very strict architecture and flow. AI will write better SQL queries than you, too.</p>

<h2 id="general-purpose-software-developers">general purpose software developers</h2>
<p>Unit Testing will be done by AIs too. They will write the tests for you and run them. You will just have to tell them what to test.
UIs will be generated by AIs too. You will just have to tell them what to show and how to show it. They will even write the code for you.
Utilities, Scripts, DevOps, everything will be done by AIs. Those things are trivial and usually passed to juniors anyway.</p>

<h2 id="specialized-software-developers">specialized software developers</h2>

<p>If you’re working on something that is very specific and non trivial, like low level networking code, optimization, … you’re safe for a couple more years. But even then, AIs will be able to write code that is better than you in a few years.</p>

<h2 id="copilot--others">copilot &amp; others</h2>

<p>They do not sleep. They are not limited by typing speed, they dont take breaks and they are extremely cheap to run. Yes, you might need a 100$/m subscription for some serious stuff, or run it on a server that costs you a few 1000$ a  month, but that’s still orders of magnitude cheaper than a team of developers.</p>

<p>Hardware acceleration of AI just started a few years ago. Initially we had GPUs do the heavy lifting, but now we have FPGAs, ASICs, TPUs, … that are orders of magnitude faster than GPUs. They are also orders of magnitude cheaper and more power efficient. Supercomputer clusters have been built with AI accelerators for years now and they train AIs 24/7/365. They are already better than humans at many things. You are training AIs everytime you solve captchas, play games, use google, … and you are training them to be better than you. Well, you are classifying training data for them, but you get the point.</p>

<h2 id="computer-linguists">computer-linguists</h2>

<p>Eventually I think people will get really good at describing things to AIs and get hired just for that. You won’t hire a programmer but an computer-linguist to “develop” your software. A person that is intrinsically good at describing things to AIs, with a good understanding of the domain, the problem, and maybe a bit above Junior level programming skills to be able to write the glue code if needed.</p>

<h3 id="conclusion">conclusion</h3>

<p>We took our jobs.</p>

<h4 id="update-7th-dec-2022">update 7th Dec 2022</h4>

<p><a href="https://youtu.be/vnzAY1SUFSA">https://youtu.be/vnzAY1SUFSA</a></p>]]></content><author><name>trbl</name></author><category term="coding" /><summary type="html"><![CDATA[Github Copilot is more useful than a Junior today and a Senior tomorrow. Frontend Web Developers will be out of a job first.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://her.st/assets/images/jobs.webp" /><media:content medium="image" url="https://her.st/assets/images/jobs.webp" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">education</title><link href="https://her.st/usr/bin/education.html" rel="alternate" type="text/html" title="education" /><published>2022-11-08T00:00:00+00:00</published><updated>2022-11-08T00:00:00+00:00</updated><id>https://her.st/usr/bin/education</id><content type="html" xml:base="https://her.st/usr/bin/education.html"><![CDATA[<p><em>I’m going to write from the perspective of a high iq autodidactic individual who values self determination and autonomy above anything else.</em></p>

<h1 id="public-schools">public schools</h1>

<p>Designed to break your autonomy and resistance to authority, from the first day you’re forced to sit still for hours and do <em>as</em> you are told, <em>when</em> you are told and <em>how</em> you are told. If you resist, you get sanctioned. Either you will be told to do more stuff (eg. repeatedly write a sentence  or copy a paragraph) or you will be punished (eg. detention, suspension, expulsion). The goal is to break your autonomy and make you a good worker. A good worker is someone who waits for instruction and does as he is told without question.</p>

<p>Education boils down to obedience training - as you would train a dog. A dog works for treats and his training is basically just conditioning his behavior to get treats by following instruction. Children do not get treats, they get grades. Grades are a form of social currency. They are a way to measure your worth in society, your obedience to authority, your ability to follow instruction. The child’s parents believe in this reward because they were taught to and their parents believed in it for the same reason. If you follow this back a few generations, you arrive at a point in time when education actually did result in better lives, but that has been out of date for at least 3 generations at the time of writing. If you go back to the 1950s it still does not work. The world has changed and the system has not.</p>

<h2 id="university">university</h2>

<blockquote>
  <p>You pay twice for your education: once with money and once with time. – AI generated</p>
</blockquote>

<p>A waste of time and money for most professions. If there is no danger to human life you can learn everything you need on your own. I might not want a surgeon to trial and error his skills on life human beings, but if you’re in a theoretical field there’s no reason not to. Most practical fields are of no danger to anyone but yourself either. Additionally, every degree is bundled together with subjects that have no relevance to what you want to do. Even if university access is free in your country, it is still too expensive to attend.</p>

<blockquote>
  <p>University standardizes the knowledge of different fields. It is a way to make sure that everyone has the same knowledge. – AI generated</p>
</blockquote>

<p>Let’s take computer science as an example here, as I had to interview my fair share of graduates.</p>

<p>I’m a senior now and throughout the years I’ve had to hold the hands of alot of juniors and get them started. On average, compsci graduates have all the same skills. You have 50 graduates who have learned the identical stuff applying for the job, interview one of them and you know all of them. They are useless. You have to spell out every step of the way for them to know what they are supposed to do and then hold their hand till the end. If you get a CV without a portfolio of projects they did on their own time that resume goes into the trash. It takes way less time to teach a self-taught programmer the obscure but useful things compsci graduates understand than teaching those graduates how to be a competent programmer.</p>

<p>This is not my opinion, this is first-hand real-world experience.</p>

<p>Nowdays you’re lucky if you can dump a folder of creds and profiles on a new hire and say “there you go, that has your wiregurad profile, your company password manager and your creds for internal services, please setup your laptop and clone this repo”. Most won’t be able to figure it out on their own, which is quite an achievement if you consider they have a compsci degree.</p>

<h2 id="testing">testing</h2>

<p>Testing measures your short-term memory first and foremost. That’s why testing has been dumbed down over the years, lowering the passing scores, simplifying the language of the questions. As soon as there’s complex syntax used and variables hidden in the query, the conditioned child will no longer be able to process the information and draw conclusions. Children have been conditioned to follow clear instruction, with every step of the way being verbosely defined. Nothing is left to the imagination. The child was not allowed to think for himself, be creative or autonomous. And now it can’t be.</p>

<blockquote>
  <p>The purpose of exams is not to measure your knowledge, it is to measure your obedience to authority. – AI generated</p>
</blockquote>

<h2 id="jobs">jobs</h2>

<p>Now you’re prepared to join the workforce. You will be doing as you are told for the next 50 years until retirement. For a fraction of the money you could have made if you had been self-employed. Well, at least that’s what I’d have said 5 years ago, now post-covid, all the small businesses went bankrupt and the big guys bought all of it up. So now you’re stuck in the workforce.</p>

<h2 id="retirement--beyond">retirement &amp; beyond</h2>

<p>Your body is tired now and will cease to function shortly after. This is the time when you won’t have regrets like “Oh I wish i studied harder, worked harder, spent more time in the office”. You will be in denial. You will be happy that you can finally rest and live your life, not allowing thoughts like “I could have done that from the beginning”, “I’ve wasted my life playing a game that wasnt worth playing”. You will have health issues from age and exhaustion and won’t be able to really live your life now.</p>

<p>The energy you once had will have faded and as the darkness approaches, you will finally have the courage to admit to yourself and your children that you’ve wasted your life.  That you should have spent more time with your family and doing things you wanted to do. You will tell your children to take it easy and follow their dreams, to not worry about what everyone else thinks about you. Like your grandparents told you, but you didn’t believe. But it’s too late for your children now. They’re adults and in the middle of the same game you’ve lost, and they will lose too, because like yourself, they were conditioned to follow instruction and do as they are told, just not your last instruction, but the instruction of the system.</p>

<h3 id="conclusion">conclusion</h3>

<blockquote>
  <p>The educational system works as intended but not for the benefit of the students. It is a system that is designed to produce workers for the economy. The system is not designed to produce critical thinkers, innovators, or entrepreneurs but to produce good consumers who will buy the products and services of the economy, citizens who will pay taxes and obey the laws, soldiers who will fight for the country, drones who will do as they are told and not question authority. Slaves.</p>
</blockquote>]]></content><author><name>trbl</name></author><category term="personal" /><summary type="html"><![CDATA[You will be a good corpse - or 'My opinion on this form of child abuse'. Featuring AI generated text.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://her.st/assets/images/carlin.webp" /><media:content medium="image" url="https://her.st/assets/images/carlin.webp" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">introducing: atlas - my gemini server</title><link href="https://her.st/usr/bin/atlas-gemini-server.html" rel="alternate" type="text/html" title="introducing: atlas - my gemini server" /><published>2022-08-26T00:00:00+00:00</published><updated>2022-08-26T00:00:00+00:00</updated><id>https://her.st/usr/bin/atlas-gemini-server</id><content type="html" xml:base="https://her.st/usr/bin/atlas-gemini-server.html"><![CDATA[<p>Atlas is a gemini server without any dependencies. It works on x86, x64 and ARM64. Linux is supported and Windows/MacOS should work fine too - but I don’t know since I don’t use either. The name refers to the launch rocket used to launch the gemini capsules into space.</p>

<h3 id="features">Features</h3>

<ul>
  <li>C#/net7</li>
  <li>gemini://</li>
  <li>titan://</li>
  <li>spartan://</li>
  <li>CGI</li>
  <li>VHOST</li>
  <li>Simple configuration</li>
  <li>Docker</li>
</ul>

<h2 id="gemini">gemini://</h2>

<p>After a week of trial and error with the occasional look at the documentation, I’ve finished the first version of atlas. The gemini protocol is super easy to understand and implement but the other features I wanted were not :D</p>

<p>There’s no way to upload anything using gemini. The best you can do is to use the INPUT request to pass query strings to the server.</p>

<h2 id="titan">titan://</h2>

<p>So there’s a companion protocol called Titan which allows you to upload files. The Titan protocol uses the same status codes as gemini and works just fine in-band.</p>

<p>gemini:// and titan:// are pretty much the same, titan just adds a filename and size parameter inside the META section of the request. Very easy to parse.</p>

<h3 id="spartan">spartan://</h3>

<p>Spartan was a bit more involved, as it’s not compatible with gemini. It uses a different default port and no encryption. Also the status codes are not identical to those of gemini. I’ve had to open another socket for spartan and write custom handlers for all the different requests. Although the protocol itself is very similar to gemini - simpler really - it is different enough to require a second codepath for parsing requests and sending responses.</p>

<h3 id="vhosts">vhosts</h3>

<p>Gemini Virtual-Hosts can be easily implemented by looking at the SNI parameter in the TLS handshake, spartan doesn’t use TLS, so they put the hostname into the request header - no problems there.</p>

<h3 id="cgi-bin">cgi-bin</h3>

<p>CGI scripting was super easy too, just a bunch of different environment variables that get passed to the script and its output redirected to the user’s browser. Authorisation and authentication can be done using the client certificate when the request comes from gemini. If the request comes from spartan however, the script has to do the heavy lifting. Maybe there shouldn’t be any authorization or authentication with spartan since its a plaintext protocol and passwords or tokens would be suseptible to MITM attacks.</p>

<h3 id="directory-index">directory index</h3>

<p>Directory Listing was implemented directly in the server and creates a nicely spaced list of files. I’ve not done directory navigation yet though. That shouldn’t be too hard though.</p>

<h3 id="config">config</h3>

<p>For configuring atlas, i’ve settled on a simple JSON file.</p>

<div class="language-json highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="p">{</span><span class="w">
  </span><span class="nl">"Port"</span><span class="p">:</span><span class="w"> </span><span class="mi">1965</span><span class="p">,</span><span class="w">
  </span><span class="nl">"Capsules"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
    </span><span class="nl">"sallsave.net"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
      </span><span class="nl">"AbsoluteRootPath"</span><span class="p">:</span><span class="w"> </span><span class="s2">"/srv/gemini/sallsave.net/"</span><span class="p">,</span><span class="w">
      </span><span class="nl">"AbsoluteTlsCertPath"</span><span class="p">:</span><span class="w"> </span><span class="s2">"/srv/gemini/sallsave.net/sallsave.net.pfx"</span><span class="p">,</span><span class="w">
      </span><span class="nl">"FQDN"</span><span class="p">:</span><span class="w"> </span><span class="s2">"sallsave.net"</span><span class="p">,</span><span class="w">
      </span><span class="nl">"Index"</span><span class="p">:</span><span class="w"> </span><span class="s2">"index.gmi"</span><span class="p">,</span><span class="w">
      </span><span class="nl">"Locations"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="w">
        </span><span class="p">{</span><span class="w">
          </span><span class="nl">"AbsoluteRootPath"</span><span class="p">:</span><span class="w"> </span><span class="s2">"/srv/gemini/sallsave.net/"</span><span class="p">,</span><span class="w">
          </span><span class="nl">"Index"</span><span class="p">:</span><span class="w"> </span><span class="s2">"index.gmi"</span><span class="p">,</span><span class="w">
        </span><span class="p">}</span><span class="w">
      </span><span class="p">]</span><span class="w">
    </span><span class="p">},</span><span class="w">
    </span><span class="nl">"evilcorp.net"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
      </span><span class="nl">"AbsoluteRootPath"</span><span class="p">:</span><span class="w"> </span><span class="s2">"/srv/gemini/evilcorp.net/"</span><span class="p">,</span><span class="w">
      </span><span class="nl">"AbsoluteTlsCertPath"</span><span class="p">:</span><span class="w"> </span><span class="s2">"/srv/gemini/evilcorp.net/evilcorp.net.pfx"</span><span class="p">,</span><span class="w">
      </span><span class="nl">"FQDN"</span><span class="p">:</span><span class="w"> </span><span class="s2">"evilcorp.net"</span><span class="p">,</span><span class="w">
      </span><span class="nl">"Index"</span><span class="p">:</span><span class="w"> </span><span class="s2">"index.gmi"</span><span class="p">,</span><span class="w">
      </span><span class="nl">"MaxUploadSize"</span><span class="p">:</span><span class="w"> </span><span class="mi">4194304</span><span class="p">,</span><span class="w">
      </span><span class="nl">"Locations"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="w">
        </span><span class="p">{</span><span class="w">
          </span><span class="nl">"AbsoluteRootPath"</span><span class="p">:</span><span class="w"> </span><span class="s2">"/srv/gemini/evilcorp.net/"</span><span class="p">,</span><span class="w">
          </span><span class="nl">"Index"</span><span class="p">:</span><span class="w"> </span><span class="s2">"index.gmi"</span><span class="p">,</span><span class="w">
        </span><span class="p">},</span><span class="w">
        </span><span class="p">{</span><span class="w">
          </span><span class="nl">"AbsoluteRootPath"</span><span class="p">:</span><span class="w"> </span><span class="s2">"/srv/gemini/evilcorp.net/cgi/"</span><span class="p">,</span><span class="w">
          </span><span class="nl">"Index"</span><span class="p">:</span><span class="w"> </span><span class="s2">"script.csx"</span><span class="p">,</span><span class="w">
          </span><span class="nl">"CGI"</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="p">,</span><span class="w">
          </span><span class="nl">"RequireClientCert"</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="p">,</span><span class="w">
        </span><span class="p">},</span><span class="w">
        </span><span class="p">{</span><span class="w">
          </span><span class="nl">"AbsoluteRootPath"</span><span class="p">:</span><span class="w"> </span><span class="s2">"/srv/gemini/evilcorp.net/files/"</span><span class="p">,</span><span class="w">
          </span><span class="nl">"Index"</span><span class="p">:</span><span class="w"> </span><span class="s2">"index.gmi"</span><span class="p">,</span><span class="w">
          </span><span class="nl">"DirectoryListing"</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="p">,</span><span class="w">
          </span><span class="nl">"AllowFileUploads"</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="p">,</span><span class="w">
          </span><span class="nl">"AllowedMimeTypes"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
            </span><span class="nl">"text/*"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
              </span><span class="nl">"MaxSizeBytes"</span><span class="p">:</span><span class="w"> </span><span class="mi">1048576</span><span class="w">
            </span><span class="p">},</span><span class="w">
            </span><span class="nl">"image/*"</span><span class="p">:</span><span class="w"> </span><span class="p">{},</span><span class="w">
            </span><span class="nl">"audio/mpeg"</span><span class="p">:</span><span class="w"> </span><span class="p">{},</span><span class="w">
            </span><span class="nl">"audio/ogg"</span><span class="p">:</span><span class="w"> </span><span class="p">{},</span><span class="w">
            </span><span class="nl">"audio/wave"</span><span class="p">:</span><span class="w"> </span><span class="p">{}</span><span class="w">
          </span><span class="p">}</span><span class="w">
        </span><span class="p">}</span><span class="w">
      </span><span class="p">]</span><span class="w">
    </span><span class="p">}</span><span class="w">
  </span><span class="p">}</span><span class="w">
</span><span class="p">}</span><span class="w">
</span></code></pre></div></div>

<p>I took some inspiration from nginx there and since gemini, spartan and titan rely heavily on mimetypes, I’ve added a TSV file of mimetypes that can be easily edited by hand.</p>

<h3 id="docker">docker</h3>

<p>To make deployment easy, I’ve added docker support.
you can pull it from dockerhub</p>

<p><em>docker pull herstfortress/atlas:latest</em></p>

<p>make sure you mount two volumes, one for /srv and one for /etc
the config belongs in <code class="language-plaintext highlighter-rouge">/etc/atlas/config.json</code> and the capsules in <code class="language-plaintext highlighter-rouge">/srv/gemini/my.capsule.com/</code></p>

<h3 id="code">code</h3>

<p>The code can be found on <a href="https://github.com/Alumniminium/atlas">github</a></p>

<p>That’s basically it for now.</p>

<p>You can check out a demo at:</p>

<p><a href="gemini://ec.her.st/">gemini://ec.her.st/</a></p>

<p><a href="spartan://ec.her.st/">spartan://ec.her.st/</a></p>]]></content><author><name>trbl</name></author><summary type="html"><![CDATA[The gemini protocol is quite simple - but gemini alone isn't enough - in order to support file uploads I had to implement the titan protocol. Then I discovered the spartan protocol and implemented that too.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://her.st/assets/images/atlas.webp" /><media:content medium="image" url="https://her.st/assets/images/atlas.webp" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">the http web is a lost cause</title><link href="https://her.st/usr/bin/http-a-lost-cause.html" rel="alternate" type="text/html" title="the http web is a lost cause" /><published>2022-08-20T00:00:00+00:00</published><updated>2022-08-20T00:00:00+00:00</updated><id>https://her.st/usr/bin/http-a-lost-cause</id><content type="html" xml:base="https://her.st/usr/bin/http-a-lost-cause.html"><![CDATA[<p><em>I’m going to refer to the HTTP/S-BASED internet as ‘web’ from here on out</em></p>

<p>Back in the 80s, the web was a new medium for communication, used by real people to communicate with each other. You’d find a website of someone who wrote about something he was interested in and nothing more. No ads, no tracking, no “call to action” buttons, no JavaScript. There were no newsletters or sign-up forms - just a simple website with a couple of pages that linked to other websites with interesting content. That was the time of truly original content. People would make their “WebRings” and have a page dedicated to linking to other people’s websites.</p>

<p>That’s how you found ‘content’ on the web before search engines like Google ruined it all by incentivizing people to embedd ads, tracking code and keywords into every single page and do shit like “Search Engine Optimization” to get more traffic. In the 90s, more and more people started to get on it and businesses started to get really interested too. It was all about email, and how to use it to market your business and get more people to buy your stuff.</p>

<p>Today, it’s a big mess. The web is mostly used by businesses. People don’t create websites anymore, they sign up at a couple ‘Social-Media’ platforms and use it to post pictures of food and to repeat what media outlets say to virtue-signal and get a lot of ‘likes’ and ‘shares’ on their posts. It’s used to crowdsource ‘clout’ and dopamine kicks. They know what they are doing. Everyone on the right side of the bell-curve knows what they are doing.</p>

<p>There are no real people anymore, just a bunch of algorithms that have an Instagram account. I came to the conclusion that the web is not an actual medium that allows you to reach an audience or to share your ideas with the world. It’s an illusion. It’s a bunch of websites that people create for the sole purpose of making money from advertisers. The people running them spend more time on SEO and automation than they do on the actual content.</p>

<h2 id="all-browsers-are-spywaremalware-by-google">all browsers are spyware/malware by Google</h2>

<p>I’m going to keep this section short, you can <a href="/usr/bin/which-browser-for-privacy.html">read my browser post</a> and <a href="https://digdeeper.club/articles/browsers.xhtml">dig deeper</a> yourself.</p>

<p>Mozilla gets the majority of its budget from Google and Firefox just exists as a legal shield for Google against an anticompetitive/monopoly lawsuit.
Firefox will die as soon as Google pulls the funding from Mozilla.</p>

<p><strong>BUT WHAT ABOUT [[PRIVACY BROWSER NAME]]???!?</strong></p>

<p>They are based on firefox or chromium. They exist at the mercy of Google.</p>

<p><strong>BUT [[BROWSER NAME]] HAS ITS OWN ENGINE!</strong></p>

<p>Yes and that browser can’t display half of the websites correctly.</p>

<center>
<i>burn it all down and rebuild it from the ashes</i>
<br />
<img src="/assets/images/gemini.webp" alt="best viewed on gemini" />
</center>

<h1 id="gemini">gemini</h1>

<blockquote>
  <p>You may think of Gemini as “the web, stripped right back to its essence” or as “Gopher, souped up and modernised just a little”, depending upon your perspective (the latter view is probably more accurate) – Project Gemini FAQ</p>
</blockquote>

<p>Gemini is a new protocol (june 2019) that explicitly states that it opposes the use of the web for anything other than displaying content. No ads, no tracking, no “call to action” buttons, no JavaScript. Just a lightweight browser that can display .gmi files.</p>

<blockquote>
  <blockquote>
    <p>as of early 2021 there were about 200,000 known Gemini URLs, spread across about 750 “capsules” (the Gemini community’s term for “sites”), 500 domains and 600 IP addresses. – Project Gemini FAQ</p>
  </blockquote>
</blockquote>

<p>The Protocol is so simple that it’s possible to implement it and create a basic browser  in a single weekend. I’m going to attempt this myself - stay tuned for that - it’s a fun project. Also there seems to be a lot of interest in the project.</p>

<p>According to <a href="gemini://gemini.bortzmeyer.org/">the statistics (gemini uri)</a> there’s 2622 of them, totaling about half a million of URIs.</p>

<p>There’s quite a bit of content on gemini!</p>

<h2 id="no-server-side-styling">no server-side styling</h2>

<p>There’s no css support. There’s no styling support what-so-ever on the server. The rationale is, the CLIENT is the one who decides how to display the content. Finally we can have unified styling across all sites! No need for ‘dark mode’ extensions that make the content look like shit.</p>

<h2 id="the-protocol-will-never-change">the protocol will never change</h2>

<p>If you write your own client for fun, you can use the protocol today, tomorrow and in 10 years, without having to update your code.</p>

<h2 id="the-markup-language-will-never-change">the markup language will never change</h2>

<p>The markup language is Gemtext. It’s a simple markup language that will not change.
Unlike Markup (and Markdown…) which has different flavours, Gemini Markup is consistent.</p>

<h2 id="gemini-markup">gemini markup</h2>

<ul>
  <li>Long lines get wrapped by the client to fit the screen</li>
  <li>Short lines <em>don’t</em> get joined together unlike Markdown</li>
  <li>Write paragraphs as single long lines</li>
  <li>Blank lines are rendered as blank lines</li>
</ul>

<pre><code class="language-gemtext">Headings
# Heading
## Sub-heading
### Sub-Sub-heading

List
* Mercury
* Gemini
* Apollo

Quote
&gt; I contend that text-based websites should not exceed in size the major works of Russian literature.

Code
    ```
        echo "Hello World"
    ```

</code></pre>

<p>And that’s it. Easy to learn, easy to style locally, easy to parse and render. There’s no special syntax.</p>

<h2 id="quickstart">quickstart</h2>

<p>I’m currently using <a href="https://gmi.skyjake.fi/lagrange/">lagrange, a gui client</a> until my own one is done. The website looks exactly like how the client renders gemini sites out of the box. <a href="https://geminiquickst.art/">geminiquickst.art</a> is a great place to start exploring.</p>

<h2 id="gemini-sites-capsules">gemini sites (capsules)</h2>
<!-- [gem.her.st - my gemini site](gemini://gem.her.st/) -->

<p><a href="gemini://gemini.bortzmeyer.org/">gemini.bortzmeyer.org - Crawler, Statistics about Capsules, Gemini Software</a></p>

<p><a href="gemini://heavysquare.com/">heavysquare.com - A personal blog about tech, coding and random thoughts</a></p>

<p><a href="gemini://astrobotany.mozz.us/">astrobotany.mozz.us - Virtual Garden Game</a></p>

<p><a href="gemini://mozz.us/">mozz.us - cool collection of projects like geminichat</a></p>

<p><a href="gemini://tilde.pink/">tilde.pink -  tilde.pink is an open tilde server, providing shell, email, and gopher/gemini accounts.</a></p>

<p><a href="gemini://konpeito.media/">konpeito.media - Low-Fi Music</a></p>

<p><a href="gemini://rawtext.club/">rawtext.club - Resist the dazzling spectacle of mainstream social and news media.</a></p>

<h3 id="have-fun">have fun</h3>

<p>I’ll be writing my own gemini server called <a href="https://en.wikipedia.org/wiki/Atlas-Agena">Atlas</a> and my own client called <a href="https://en.wikipedia.org/wiki/Extravehicular_activity">EVA</a> now - following the gemini naming convention.</p>

<p>Peace!</p>]]></content><author><name>trbl</name></author><summary type="html"><![CDATA[Nobody but google can afford to develop a web browser. Feature-creep of browsers lead to them being more complex than the fking Linux kernel. Multiplayer games using WebSockets using WebGL and gamepad support w/ WebUSB. Even headers can track you.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://her.st/assets/images/gemini.webp" /><media:content medium="image" url="https://her.st/assets/images/gemini.webp" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">the RG351MP</title><link href="https://her.st/usr/bin/the-rg351mp.html" rel="alternate" type="text/html" title="the RG351MP" /><published>2022-03-13T00:00:00+00:00</published><updated>2022-03-13T00:00:00+00:00</updated><id>https://her.st/usr/bin/the-rg351mp</id><content type="html" xml:base="https://her.st/usr/bin/the-rg351mp.html"><![CDATA[<h1 id="the-software">the software</h1>

<p>I have no idea what the factory shipped, I was afraid of anbernic-poisoning so I immediately went to flash ArkOS … 3 times… unsuccessfully and then settled for 351elec @ <a href="https://351elec.de/">https://351elec.de/</a>.
<img src="/assets/images/351ELEC-PF.webp" alt="351elec logo" /></p>

<p>elec was a new experience for me. Linux, yes, but everything runs as root, there are no users, no homes, not even a package manager. Getting dotnet and monogame up and running was quite the adventure.</p>

<!-- *I've written a wiki page on how to make c#/monogame work over at 351elec.de by the time you read this* -->

<p>Now, what can this thing do? Let’s look at the hardware so we can get a rough idea about its capabilities.</p>

<h3 id="cpu-rk3326">CPU: RK3326</h3>

<p>The official Anbernic Store says its a 1.5ghz CPU, that however is a <em>lie</em>. It runs at 1.3ghz. I’ll be taking a look at overclocking later, maybe I can make it true.</p>

<ul>
  <li>Quad-core ARM Cortex-A35 CPU</li>
  <li>ARM Neon Advanced SIMD</li>
  <li>ARMv8 Cryptography Extensions</li>
  <li>256KB unified system L2 cache</li>
  <li>VFPv3 single and double-precision</li>
</ul>

<p>Alright, so we’re dealing with an Ultra-Low-Power CPU from long-long-ago. The L2 cache is hilariously small, there’s no L3 cache at all.
1GB of DDR3L RAM is not fast either and the GPU will share it with the CPU, making it even slower. Small cache, slow RAM, I’m predicting a memory bandwidth bottleneck. At least it can do SIMD, so we can vectorize our code. Now let’s look at the GPU.</p>

<h3 id="gpu-mali-g31-mp2">GPU: Mali G31 MP2</h3>

<p>Further research shows it’s running at 650 MHz, has two cores and can push 1,3 GPix/s, 980 MT/s or 21.4 GFLOPs.
Interestingly, ARM claims 4x MSAA has almost no performance overhead - we’ll see about that!
Also surprisingly, it supports Vulkan!</p>

<h5 id="apis">APIs</h5>

<ul>
  <li>OpenGL ES 3.2</li>
  <li>Vulkan 1.1</li>
  <li>OpenCL 2.0</li>
  <li>h264,h265,VP9 - Decode &amp; Encode</li>
</ul>

<h3 id="handheld-xbox">handheld xbox</h3>

<p>So we’re basically working with an original xbox in terms of performance - with some extra CPU cores and newer feature-sets. Sweet.</p>

<p>Anbernic was smart enough to use a low resolution screen, namely a 3.5”, 640x480 @ 60hz IPS screen.<br />
Most manufacturers would have slapped a 720p or 1080p screen on it just for marketing and cripple the rest of the hardware, but at 640x480, there aren’t many pixels to push.</p>

<p>I want to add that the screen is super crisp. The resolution is more than enough for the size.</p>

<h4 id="getting-distracted">getting distracted</h4>

<p>Suikoden, Pokemon, Earthbound, Batsugun, Alien Soldier, Advance Wars 2, Tekken 3…. I’ve already wasted a couple of hours writing this post, even at this moment, it’s next to me playing some demo videos of random games as screensaver (which you can jump into by pressing start, launching the game that’s currently playing, super cool!) begging me to pick it up or at least look at it.</p>

<p>Can’t wait to play some more Destruction Derby later, but the dog will want out before I’m done writing. Ugh.</p>

<h1 id="game-development">game development</h1>

<p>The primary reason for me to even buy this device has been to give me some additional motivation for creating games. I want to target the RG351 directly and make it my primary platform. I figured becoming a console game developer would be cool as it would impose a lot of hard limitations on me - not only in terms of performance, but also input methods and screen size.</p>

<p>elec is a readonly OS. Every reboot - it resets. Persistent storage is only possible in <code class="language-plaintext highlighter-rouge">/storage</code>. Which is the 2nd uSD card in the RG351MP. That’s fine by me.</p>

<p>Since elec has no real shell, ships almost no libraries and has no terminal, we need to setup a couple of things like a script to launch our game and find/ship all the files required for the game to function. On MonoGame you need to ship <code class="language-plaintext highlighter-rouge">libGL.so.1</code> and <code class="language-plaintext highlighter-rouge">libEGL.so.1</code>.</p>

<p>351elec is a 64bit OS and the RK3326 is an ARM CPU, that makes our dotnet command</p>

<p><code class="language-plaintext highlighter-rouge">dotnet publish -c release -r linux-arm64</code></p>

<p>but first we have to enable single file output.</p>

<p>csproj</p>

<div class="language-xml highlighter-rouge"><div class="highlight"><pre class="highlight"><code>  <span class="nt">&lt;PropertyGroup&gt;</span>
    <span class="nt">&lt;OutputType&gt;</span>Exe<span class="nt">&lt;/OutputType&gt;</span>
    <span class="nt">&lt;TargetFramework&gt;</span>net6<span class="nt">&lt;/TargetFramework&gt;</span>
    <span class="nt">&lt;MonoGamePlatform&gt;</span>DesktopGL<span class="nt">&lt;/MonoGamePlatform&gt;</span>
    <span class="nt">&lt;TieredCompilation&gt;</span>false<span class="nt">&lt;/TieredCompilation&gt;</span>
    <span class="nt">&lt;PublishSingleFile&gt;</span>true<span class="nt">&lt;/PublishSingleFile&gt;</span>
    <span class="nt">&lt;SelfContained&gt;</span>true<span class="nt">&lt;/SelfContained&gt;</span>
  <span class="nt">&lt;/PropertyGroup&gt;</span>
</code></pre></div></div>

<p>now we scp the contents of the publish folder and create our little launcher script</p>

<div class="language-sh highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c">#!/bin/bash</span>

<span class="nv">gamedir</span><span class="o">=</span><span class="s2">"/storage/roms/ports/test/"</span>

<span class="k">if</span> <span class="o">[</span> <span class="nt">-d</span> <span class="s2">"/opt/system/Tools/PortMaster/"</span> <span class="o">]</span><span class="p">;</span> <span class="k">then
  </span><span class="nv">controlfolder</span><span class="o">=</span><span class="s2">"/opt/system/Tools/PortMaster"</span>
<span class="k">elif</span> <span class="o">[</span> <span class="nt">-d</span> <span class="s2">"/opt/tools/PortMaster/"</span> <span class="o">]</span><span class="p">;</span> <span class="k">then
  </span><span class="nv">controlfolder</span><span class="o">=</span><span class="s2">"/opt/tools/PortMaster"</span>
<span class="k">elif</span> <span class="o">[</span> <span class="nt">-d</span> <span class="s2">"/roms/ports"</span> <span class="o">]</span><span class="p">;</span> <span class="k">then
  </span><span class="nv">controlfolder</span><span class="o">=</span><span class="s2">"/roms/ports/PortMaster"</span>
 <span class="k">elif</span> <span class="o">[</span> <span class="nt">-d</span> <span class="s2">"/roms2/ports"</span> <span class="o">]</span><span class="p">;</span> <span class="k">then
  </span><span class="nv">controlfolder</span><span class="o">=</span><span class="s2">"/roms2/ports/PortMaster"</span>
<span class="k">else
  </span><span class="nv">controlfolder</span><span class="o">=</span><span class="s2">"/storage/roms/ports/PortMaster"</span>
<span class="k">fi

</span><span class="nb">echo</span> <span class="s2">"Starting Pixel Engine (.net6, C#10, ECS) by https://her.st/"</span> <span class="o">&gt;</span> /dev/tty0
<span class="nb">source</span> <span class="nv">$controlfolder</span>/control.txt
<span class="nb">source</span> <span class="nv">$controlfolder</span>/tasksetter.sh

<span class="nb">export </span><span class="nv">LIBGL_ES</span><span class="o">=</span>31
<span class="nb">export </span><span class="nv">LIBGL_FB</span><span class="o">=</span>4
<span class="nb">export </span><span class="nv">SDL_VIDEO_GL_DRIVER</span><span class="o">=</span><span class="s2">"</span><span class="nv">$gamedir</span><span class="s2">/libs/libGL.so.1"</span>

<span class="nb">cd</span> <span class="nv">$gamedir</span>
<span class="nv">$GPTOKEYB</span> <span class="s2">"Pixel"</span> <span class="nt">-c</span> <span class="s2">"./test.gptk"</span> &amp;
<span class="nv">$TASKSET</span> ./Pixel <span class="o">&gt;</span> /dev/tty0
<span class="nb">kill</span> <span class="nt">-9</span> <span class="si">$(</span>pidof gptokeyb<span class="si">)</span>
<span class="nb">printf</span> <span class="s2">"</span><span class="se">\0</span><span class="s2">33c"</span> <span class="o">&gt;&gt;</span> /dev/tty0
</code></pre></div></div>

<p>map.gptk:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>back = esc
start = enter
a = enter
b = up
x = \"
y = \"
l1 = mouse_right
l2 = mouse_right
r1 = mouse_left
r2 = mouse_left
up = w
down = s
left = a
right = d
left_analog_up = up
left_analog_down = down
left_analog_left = left
left_analog_right = right
right_analog_up = mouse_movement_up
right_analog_down = mouse_movement_down
right_analog_left = mouse_movement_left
right_analog_right = mouse_movement_right
deadzone_triggers = 3000
mouse_scale = 8192
mouse_delay = 16
</code></pre></div></div>

<p>The “game” will now show up in 351elec and you’ll be able to launch it.</p>

<p>That’s as far as I got in a day. Documentation didn’t exist so I had to reverse engineer other ports to figure out how to port &gt;.&gt;
I got my PixelGlue engine running, tomorrow I’ll get inputs working properly…</p>

<h2 id="conclusion">conclusion</h2>

<p>For game development on the RG351MP, the architectural choice seems obvious -&gt; ECS</p>

<p>We need to hit the cache or we cripple the GPU with increased memory bandwidth requirements from the CPU side. It will be essential to use all four cores as they’re rather weak.</p>

<p>Vulkan goes without saying, however that’s out of reach for me at this point. I lack the required skills.</p>

<ul>
  <li>It’s smaller yet heavier than expected (i didn’t check the measurements)</li>
  <li>The D-PAD lacks a center pin, it can press all directions at once - and often does so</li>
  <li>The screen isn’t very vibrant and quite dim - no usage outdoors if sun</li>
  <li>The sound is meh. NO bass, muddy mids, exaggerated highs.</li>
  <li>The battery life seems to be 5 hours, not 8</li>
  <li>You can’t really use both analog sticks at once due to ergonomics</li>
  <li>Too slow for N64, Dreamcast, PSP.</li>
</ul>

<h1 id="stay-tuned-for-part-2">stay tuned for part 2</h1>]]></content><author><name>trbl</name></author><category term="c#" /><category term="csharp" /><category term="dotnet" /><category term="gamedev" /><category term="programming" /><category term="rg351mp" /><category term="retro" /><summary type="html"><![CDATA[Recently I've purchased a RG351MP and a 50W solar panel to play some old games from my childhood during WW3 when I'm bored in the bunker. I made the right choice, BUT THE D-PAD SUCKS!]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://her.st/assets/images/rg351mp.webp" /><media:content medium="image" url="https://her.st/assets/images/rg351mp.webp" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">how VPNs are not helping you</title><link href="https://her.st/usr/bin/how-vpns-are-not-helping-you.html" rel="alternate" type="text/html" title="how VPNs are not helping you" /><published>2021-08-10T00:00:00+00:00</published><updated>2021-08-10T00:00:00+00:00</updated><id>https://her.st/usr/bin/how%20vpns%20are%20not%20helping%20you</id><content type="html" xml:base="https://her.st/usr/bin/how-vpns-are-not-helping-you.html"><![CDATA[<p>First of all, a VPN will only hide information from your ISP as you are encrypting everything on your computer and then send it to the VPN provider which then decrypts it and passes it on to the open internet. This means the VPN provider itself has the ability to see exactly what you’re doing and keep records of every packet you send through it.</p>

<h2 id="what-if-vpns-are-illegal-in-your-country">what if vpns are illegal in your country</h2>

<p>Then you’re fucked as soon as you connect.</p>

<center><img src="/assets/images/vpn1.webp" height="50%" alt="birth" /></center>
<center><img src="/assets/images/vpn2.webp" height="50%" alt="birth" /></center>

<p>The popular VPN protocols like OpenVPN and WireGuard are easily detected on the network. Even if your government doesn’t know what sites you access, they see that you are using a VPN and the IP of the VPN server you’re connected to. Now they can call your ISP, get your address and come arrest you. They don’t even have to go to the VPN provider in that situation.</p>

<p>SSH is usually not monitored though, and supports tunneling. If you happen to own a vps somewhere that isn’t directly connected to you, you might create a socks5 tunnel quite easily</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>ssh <span class="nt">-ND</span> 8080 user@ho.st <span class="c"># Creates the socks5 proxy</span>
curl <span class="nt">-x</span> socks5h://localhost:8080 https://wtfismyip.com/text <span class="c"># uses the proxy</span>
</code></pre></div></div>

<center><img src="/assets/images/vpn3.webp" height="50%" alt="birth" /></center>

<p>but make no mistake, ssh tunnels have a considerable impact on your net speed, especially ping times.</p>

<center><img src="/assets/images/speed1.webp" height="50%" alt="birth" /></center>

<p>compared to without the tunnel</p>

<center><img src="/assets/images/speed2.webp" height="50%" alt="birth" /></center>

<p>That’s just a socks proxy though, not a VPN. DNS for example will still bypass the tunnel.</p>

<h2 id="vpns-are-legal-and-my-vpn-provider-doesnt-keep-logs">vpn’s are legal and my vpn provider doesn’t keep logs</h2>

<p>Let’s give them the benefit of doubt and say they really don’t. Who’s to say the Datacenter they reside in doesn’t? After all, packets from protocols like OpenVPN are easily identified on their infrastructure - as I’ve made evident above.</p>

<p>Additionally, if the VPN you’re using is in any of the following countries</p>

<ul>
  <li>Australia</li>
  <li>British Overseas territories (e.g. British virgin islands)</li>
  <li>Canada</li>
  <li>Israel</li>
  <li>Japan</li>
  <li>New Zealand</li>
  <li>United Kingdom</li>
  <li>United States</li>
  <li>Denmark</li>
  <li>Netherlands</li>
  <li>France</li>
  <li>Norway</li>
  <li>Germany</li>
  <li>Belgium</li>
  <li>Spain</li>
  <li>South Korea</li>
  <li>Singapore</li>
  <li>Sweden</li>
  <li>Italy</li>
</ul>

<p>They are required <em>by law</em> to have logs and share them with the authorities.
Even if they <em>claim</em> not to keep logs. If you live in one of them, your government can spy on you by proxy - simply report you to a member-state and request the data from them.</p>

<p>Additionally, in order to pay the VPN provider, you have to give them your payment details which are directly linked to you. The only VPN provider on the clear-net that allows cash payments and no sharing of personal details - as far as I know - is <a href="https://mullvad.net/">mullvad</a></p>

<p>Do you think your VPN provider will defend you when they get pressured/threatened by a government to surrender the data they have about you? Risking their business? Their money? Don’t be naive.</p>

<center><img src="/assets/images/capitalism2.gif" height="50%" alt="birth" /></center>]]></content><author><name>trbl</name></author><category term="privacy" /><summary type="html"><![CDATA[DOWNLOAD NORDVPN TO STOP TRACKERS AND HACKERS FROM SEEING WHAT YOU DO! Shut the fuck up, that aint gonna help.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://her.st/assets/images/vpns-big.webp" /><media:content medium="image" url="https://her.st/assets/images/vpns-big.webp" xmlns:media="http://search.yahoo.com/mrss/" /></entry></feed>