<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Posts on Robby Zambito</title>
    <link>https://robbyzambito.me/posts/</link>
    <description>Recent content in Posts on Robby Zambito</description>
    <generator>Hugo -- gohugo.io</generator>
    <language>en-us</language>
    <copyright>&lt;a href=&#39;https://creativecommons.org/licenses/by-sa/4.0/&#39;&gt;CC BY-SA 4.0&lt;/a&gt;</copyright>
    <lastBuildDate>Fri, 23 Jun 2023 00:35:43 -0400</lastBuildDate>
    
        <atom:link href="https://robbyzambito.me/posts/index.xml" rel="self" type="application/rss+xml" />
    
    
    <item>
      <title>Languages that do not use prefix notation are weird</title>
      <link>https://robbyzambito.me/posts/languages-that-do-not-use-prefix-notation-are-weird/</link>
      <pubDate>Fri, 23 Jun 2023 00:35:43 -0400</pubDate>
      
      <guid>https://robbyzambito.me/posts/languages-that-do-not-use-prefix-notation-are-weird/</guid>
      <description>&lt;p&gt;I don&amp;rsquo;t mean that you should avoid such languages, but rather that they are exceedingly uncommon.&lt;/p&gt;
&lt;p&gt;For some reason, prefix notation is often associated with Lisp.
In reality, there are very few languages that do &lt;em&gt;not&lt;/em&gt; use prefix notation.
Off the top of my head, I can only think of Forth, and Postscript.
Consider the following:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-c&#34; data-lang=&#34;c&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;foo(a, b)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;What language is this?
Well, it could be C, C++, Java, Javascript, Python, C#&amp;hellip;&lt;/p&gt;
&lt;p&gt;Great.
That looks like a normal procedure call.
It could be one of many languages, assuming this is not a complete statement (as it would be missing a semicolon in some languages).
Now, what if we remove the useless comma:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-c&#34; data-lang=&#34;c&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;foo(a b)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;And let&amp;rsquo;s get a little crazy, and move the opening parenthesis to the begining of the expression:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-lisp&#34; data-lang=&#34;lisp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(foo a b)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;What language do we have now?
Well, it could be Common Lisp, Clojure, Elisp, Scheme&amp;hellip;
Generally, it is some dialect of Lisp.&lt;/p&gt;
&lt;p&gt;How did we move the operator in relation to the operands?
We moved it nowhere.&lt;/p&gt;
&lt;p&gt;The only reason that prefix notation is associated with Lisp, is because most other languages have a few inconsistencies.
Namely, arithmetic operators like &lt;code&gt;+&lt;/code&gt;, &lt;code&gt;-&lt;/code&gt;, &lt;code&gt;*&lt;/code&gt;, and &lt;code&gt;/&lt;/code&gt;.
These operators are usually treated in a special way, and given an infix syntax; they are placed between its operands: &lt;code&gt;a + b&lt;/code&gt;.
In most programming domains, the vast majority of operations are procedure calls - not arithmetic operations.
The importance of these operators are blown out of proportion because of how familiar they are.
In practice using a function-like notation for them is not a big deal.&lt;/p&gt;
&lt;p&gt;The operator is always placed before any operands in Lisp.
It does not represent any operators in a special and inconsistent way.
Expressions like &lt;code&gt;(+ a b)&lt;/code&gt; may look strange at first, but just consider: &lt;code&gt;+&lt;/code&gt; is simply the chosen name for the &lt;code&gt;add&lt;/code&gt; procedure.
If we use the name &lt;code&gt;add&lt;/code&gt; instead, we get:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-lisp&#34; data-lang=&#34;lisp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(add a b)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;And if we apply the inverse of the previous transformation, we get:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-c&#34; data-lang=&#34;c&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;add(a, b)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Which is really not all that strange :)&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Using Lisp for Game AI</title>
      <link>https://robbyzambito.me/posts/using-lisp-for-game-ai/</link>
      <pubDate>Sat, 22 Jan 2022 14:25:47 -0500</pubDate>
      
      <guid>https://robbyzambito.me/posts/using-lisp-for-game-ai/</guid>
      <description>&lt;p&gt;The relationship I have had with Lisp until recently has basically amounted to: &amp;ldquo;It sounds interesting, it seems highly polarizing, and I have no immediate reason to learn it&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;It sounded interesting to me because I have heard people describe it as both being very simple, and having features that other languages lack.
People seem to have very strong opinions, both for and against the use of Lisp.
Some express a nearly &lt;a href=&#34;https://en.wikipedia.org/wiki/Editor_war#Humor&#34;&gt;religious fascination&lt;/a&gt; with Lisp, while others express a hatred toward the syntax which is very unfamiliar to those coming from other programming languages.&lt;/p&gt;
&lt;p&gt;Last year I started using the &lt;a href=&#34;https://guix.gnu.org/&#34;&gt;GNU Guix&lt;/a&gt; package manager and operating system, which has given me a reason to start giving Lisp a serious try.
Guix uses the &lt;a href=&#34;https://www.gnu.org/software/guile/&#34;&gt;GNU Guile&lt;/a&gt; implementation of Scheme, which has an interesting ability to be embedded in C programs, similar to Lua.&lt;/p&gt;
&lt;p&gt;When I was in college I took an AI class, where one of my projects was to implement a game, and make an AI that would play the game.
The game I chose to implement was &lt;a href=&#34;https://en.wikipedia.org/wiki/Reversi&#34;&gt;Othello&lt;/a&gt;, which my family has played a lot with each other.
At the time, my go-to programming language was Scala, &lt;a href=&#34;https://git.robbyzambito.me/robby/othello-ai.git/&#34;&gt;so that&amp;rsquo;s what I used to create the project&lt;/a&gt;.
This project wasn&amp;rsquo;t particularly flexible; to change which AI was used, the user had to modify the code and recompile the game.
You can see in the main function, &lt;a href=&#34;https://git.robbyzambito.me/robby/othello-ai.git/tree/src/main/scala/me/robbyzambito/othello/Main.scala&#34;&gt;I had some pre-defined configurations commented out so I could easily uncomment what I wanted to use.&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Since I&amp;rsquo;m familiar with C, I decided an interesting way to expand my knowledge of Lisp would be to recreate this project using C for the game logic, and using Scheme for the AI.
I have created this project, it can be found &lt;a href=&#34;https://git.robbyzambito.me/robby/othello-ai-guile-c.git/&#34;&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;If you wish to give it a try, you can clone the project using:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;git clone https://git.robbyzambito.me/robby/othello-ai-guile-c.git
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;You can see the dependencies required for building in the &lt;code&gt;manifest.scm&lt;/code&gt; file.
If you have the Guix package manager installed on your system (it can be installed on any GNU/Linux distro) you can simply use the &lt;code&gt;guix shell&lt;/code&gt; command to spawn a shell with the required dependencies.
When you have a shell with the dependencies, simply run &lt;code&gt;make&lt;/code&gt; to build.
You can find the output under the newly created &lt;code&gt;./bin&lt;/code&gt; folder.&lt;/p&gt;
&lt;p&gt;The game works by specifying a script to use for each player as command line arguments.
If no script is specified for a certain player, the game will prompt for a move from standard input.
Some example scripts can be found under the &lt;a href=&#34;https://git.robbyzambito.me/robby/othello-ai-guile-c.git/tree/strategies&#34;&gt;strategies directory&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I encourage you to try writing your own scripts!
If you write a script that you&amp;rsquo;d like to share, feel free to either &lt;a href=&#34;https://git-send-email.io/&#34;&gt;email me a patch&lt;/a&gt;, or &lt;a href=&#34;https://robbyzambito.me/about&#34;&gt;get in touch with me however works best&lt;/a&gt; and I will add it to the repository.&lt;/p&gt;
&lt;p&gt;My next desire is to create an AI for the game &lt;a href=&#34;https://en.wikipedia.org/wiki/Rocket_League&#34;&gt;Rocket League&lt;/a&gt; which is implemented in Lisp.
There is a &lt;a href=&#34;https://rlbot.org/&#34;&gt;community of people&lt;/a&gt; who create bots for Rocket League, and run tournaments which they compete their bots against each other.
I think it would be particularly fun to try to make a bot which tries to adapt to the opponents behaviour.
Given how easy it is to dynamically generate and evaluate code using Lisp, I think it would be interesting to try making the bot adapt to the opponent by continuously building a knowledge bank about the opponents behaviour, and using that knowledge to create or modify strategies to more conistently outplay the opponent.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>How to Set Primary X Display on Sway</title>
      <link>https://robbyzambito.me/posts/how-to-set-primary-x-display-on-sway/</link>
      <pubDate>Mon, 23 Aug 2021 20:56:40 -0400</pubDate>
      
      <guid>https://robbyzambito.me/posts/how-to-set-primary-x-display-on-sway/</guid>
      <description>&lt;p&gt;In my PC setup, I have three displays.
My somewhat recent post about my setup is outdated now; from left to right I have a 1440x900 60Hz monitor oriented vertically, a 1920x1080 120Hz monitor, and a 1920x1080 60Hz monitor.&lt;/p&gt;
&lt;p&gt;I noticed some games would try to run at the resolution and refresh rate of my leftmost vertical monitor, which is not what I want.
There is no way to set a &amp;ldquo;primary display&amp;rdquo; in Sway, because that construct doesn&amp;rsquo;t exist in Wayland.
Applications simply open on the display you have focused.&lt;/p&gt;
&lt;p&gt;However, many applications (particularly games) will try to query for the primary display.
XWayland will (in my experience) default to setting the primary display to the one which is the closest to the &amp;ldquo;origin&amp;rdquo; (top left pixel).
This can be remedied by running &lt;code&gt;xrandr --listmonitors&lt;/code&gt; to find what X thinks the names of your displays are, and then using &lt;code&gt;xrandr --output XWAYLANDN --primary&lt;/code&gt; where N is the number of the correct display, to set the primary display.&lt;/p&gt;
&lt;p&gt;I wrote a basic script to handle this:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#00f&#34;&gt;#!/bin/sh
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#00f&#34;&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;display=&lt;span style=&#34;color:#00f&#34;&gt;$(&lt;/span&gt;xrandr --listactivemonitors | grep &lt;span style=&#34;color:#a31515&#34;&gt;&amp;#34;&lt;/span&gt;$1&lt;span style=&#34;color:#a31515&#34;&gt;&amp;#34;&lt;/span&gt; | head -n1 | cut -d&lt;span style=&#34;color:#a31515&#34;&gt;&amp;#39; &amp;#39;&lt;/span&gt; -f6&lt;span style=&#34;color:#00f&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#00f&#34;&gt;if&lt;/span&gt; [ -n &lt;span style=&#34;color:#a31515&#34;&gt;&amp;#34;&lt;/span&gt;$display&lt;span style=&#34;color:#a31515&#34;&gt;&amp;#34;&lt;/span&gt; ]; &lt;span style=&#34;color:#00f&#34;&gt;then&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    xrandr --output $display --primary
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#00f&#34;&gt;fi&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;I have this saved in ~/.local/bin/set-correct-monitor so I can use it anywhere.
What this does is &lt;code&gt;grep&lt;/code&gt; the output of &lt;code&gt;xrandr --listactivemonitors&lt;/code&gt; for the script argument, and set the display to the first display that matches.
For example, I run &lt;code&gt;set-correct-monitor 300+900&lt;/code&gt; to set my display, since that is the position of the monitor I want to be considered my primary.&lt;/p&gt;
&lt;p&gt;Doing this will work until you do one of several things:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;logout&lt;/li&gt;
&lt;li&gt;otherwise kill Sway&lt;/li&gt;
&lt;li&gt;disconnect a monitor&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The first two were pretty okay for me to deal with for some time, since usually I only logout once a day, and many games &lt;em&gt;don&amp;rsquo;t&lt;/em&gt; run into an issue with this, particularly if they are run in &amp;ldquo;windowed mode&amp;rdquo; (which I recommend).
The last was pretty frustrating for me though, because I use a KVM switch to change between my work laptop and my PC.
Every time I switch between devices, my primary display usually defaults back to my vertical monitor.&lt;/p&gt;
&lt;p&gt;To make this setting persist, I made a small C program which will execute a command each time a new display is attached.
The program can be found here: &lt;a href=&#34;https://git.robbyzambito.me/robby/wayland-run-on-new-display.git&#34;&gt;https://git.robbyzambito.me/robby/wayland-run-on-new-display.git&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;By adding this line to my ~/.config/sway/config, my primary display is always properly set when I run Sway:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;exec wayland-run-on-new-display set-correct-monitor 300+900
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description>
    </item>
    
    <item>
      <title>Tips and Tricks for Taking Screenshots and Selecting Text From Images on Sway</title>
      <link>https://robbyzambito.me/posts/tips-and-tricks-for-taking-screenshots-and-selecting-text-from-images-on-sway/</link>
      <pubDate>Wed, 28 Jul 2021 18:02:31 -0400</pubDate>
      
      <guid>https://robbyzambito.me/posts/tips-and-tricks-for-taking-screenshots-and-selecting-text-from-images-on-sway/</guid>
      <description>&lt;p&gt;Several days ago I saw someone rant about how there were no good programs for copy text from an image.
They were using the command line tool &lt;a href=&#34;https://github.com/tesseract-ocr/tesseract&#34;&gt;&lt;code&gt;tesseract&lt;/code&gt;&lt;/a&gt;, but they felt it was too clunky for them.
They were using &lt;code&gt;tesseract&lt;/code&gt; by taking a screenshot of the text they were trying to copy, saving the screenshot to a file, and running &lt;code&gt;tesseract&lt;/code&gt; on that file to generate a &lt;em&gt;new&lt;/em&gt; file with the text that was found.
After all that, they would open the final text file, copy the text, and delete the file.&lt;/p&gt;
&lt;p&gt;This is something that I actually used to do a lot with my Android phone, before they decided to remove the feature for some reason (or at least move it somewhere that I haven&amp;rsquo;t been able to find for years) so I decided to see how easy it would be to hook up &lt;a href=&#34;https://wayland.emersion.fr/grim/&#34;&gt;&lt;code&gt;grim&lt;/code&gt;&lt;/a&gt; and &lt;a href=&#34;https://wayland.emersion.fr/slurp/&#34;&gt;&lt;code&gt;slurp&lt;/code&gt;&lt;/a&gt; with &lt;code&gt;tesseract&lt;/code&gt; to copy text from images the same way.&lt;/p&gt;
&lt;p&gt;It turns out, it was not that hard to do:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;grim -g &amp;#34;$(slurp)&amp;#34; - | tesseract - - | wl-copy
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This works by selecting the region using &lt;code&gt;&amp;quot;$(slurp)&amp;quot;&lt;/code&gt;, and using &lt;code&gt;grim -g&lt;/code&gt; to take a screenshot of that region.
The file is then &amp;ldquo;saved&amp;rdquo; to standard output (that&amp;rsquo;s what the &lt;code&gt;-&lt;/code&gt; represents here).
&lt;code&gt;tesseract&lt;/code&gt; is then able to read the image from &lt;code&gt;-&lt;/code&gt; (standard input, which it gets from the standard output of &lt;code&gt;grim&lt;/code&gt;), and write the text it finds to - (standard output).
Finally, we stuff the text that was found using &lt;code&gt;tesseract&lt;/code&gt; into the clipboard using &lt;code&gt;wl-copy&lt;/code&gt;, and voilà!
We now have the text from some image in our clipboard by just drawing a box around it, and we did it with no temporary files on the disk.&lt;/p&gt;
&lt;p&gt;However, calling this from the command line each time you want to select text from an image could become cumbersome if it&amp;rsquo;s something you want to do frequently.
I decided to set this up using a wofi menu, and several options for taking screenshots.&lt;/p&gt;
&lt;p&gt;Here is the script that I created:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#00f&#34;&gt;#!/bin/sh
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#00f&#34;&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;screenshot_copy_all_displays=&lt;span style=&#34;color:#a31515&#34;&gt;&amp;#34;Screenshot all displays to clipboard&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;screenshot_all_displays_to_file=&lt;span style=&#34;color:#a31515&#34;&gt;&amp;#34;Screenshot all displays to file&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;screenshot_copy_area=&lt;span style=&#34;color:#a31515&#34;&gt;&amp;#34;Screenshot area to clipboard&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;screenshot_copy_area_ocr=&lt;span style=&#34;color:#a31515&#34;&gt;&amp;#34;Screenshot area to copy text&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;screenshot_area_to_file=&lt;span style=&#34;color:#a31515&#34;&gt;&amp;#34;Screenshot area to file&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;screenshot_copy_window=&lt;span style=&#34;color:#a31515&#34;&gt;&amp;#34;Screenshot focused window to clipboard&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;screenshot_window_to_file=&lt;span style=&#34;color:#a31515&#34;&gt;&amp;#34;Screenshot focused window to file&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;screenshot_copy_monitor=&lt;span style=&#34;color:#a31515&#34;&gt;&amp;#34;Screenshot focused monitor to clipboard&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;screenshot_monitor_to_file=&lt;span style=&#34;color:#a31515&#34;&gt;&amp;#34;Screenshot focused monitor to file&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#008000&#34;&gt;# Store each option in a single string seperated by newlines.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;options=&lt;span style=&#34;color:#a31515&#34;&gt;&amp;#34;&lt;/span&gt;$screenshot_copy_all_displays&lt;span style=&#34;color:#a31515&#34;&gt;\n&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;options+=&lt;span style=&#34;color:#a31515&#34;&gt;&amp;#34;&lt;/span&gt;$screenshot_all_displays_to_file&lt;span style=&#34;color:#a31515&#34;&gt;\n&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;options+=&lt;span style=&#34;color:#a31515&#34;&gt;&amp;#34;&lt;/span&gt;$screenshot_copy_area&lt;span style=&#34;color:#a31515&#34;&gt;\n&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;options+=&lt;span style=&#34;color:#a31515&#34;&gt;&amp;#34;&lt;/span&gt;$screenshot_copy_area_ocr&lt;span style=&#34;color:#a31515&#34;&gt;\n&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;options+=&lt;span style=&#34;color:#a31515&#34;&gt;&amp;#34;&lt;/span&gt;$screenshot_area_to_file&lt;span style=&#34;color:#a31515&#34;&gt;\n&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;options+=&lt;span style=&#34;color:#a31515&#34;&gt;&amp;#34;&lt;/span&gt;$screenshot_copy_window&lt;span style=&#34;color:#a31515&#34;&gt;\n&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;options+=&lt;span style=&#34;color:#a31515&#34;&gt;&amp;#34;&lt;/span&gt;$screenshot_window_to_file&lt;span style=&#34;color:#a31515&#34;&gt;\n&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;options+=&lt;span style=&#34;color:#a31515&#34;&gt;&amp;#34;&lt;/span&gt;$screenshot_copy_monitor&lt;span style=&#34;color:#a31515&#34;&gt;\n&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;options+=&lt;span style=&#34;color:#a31515&#34;&gt;&amp;#34;&lt;/span&gt;$screenshot_monitor_to_file&lt;span style=&#34;color:#a31515&#34;&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#008000&#34;&gt;# Prompt the user with wofi.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;choice=&lt;span style=&#34;color:#a31515&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#00f&#34;&gt;$(&lt;/span&gt;echo -e &lt;span style=&#34;color:#a31515&#34;&gt;&amp;#34;&lt;/span&gt;$options&lt;span style=&#34;color:#a31515&#34;&gt;&amp;#34;&lt;/span&gt; | wofi -d&lt;span style=&#34;color:#00f&#34;&gt;)&lt;/span&gt;&lt;span style=&#34;color:#a31515&#34;&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#008000&#34;&gt;# Make sure that all pictures are saved in the screenshots folder.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;cd ~/Pictures/Screenshots
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#00f&#34;&gt;case&lt;/span&gt; $choice in
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    $screenshot_copy_all_displays)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        grim - | wl-copy
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        ;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    $screenshot_all_displays_to_file)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        grim
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        ;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    $screenshot_copy_area)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        grim -g &lt;span style=&#34;color:#a31515&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#00f&#34;&gt;$(&lt;/span&gt;slurp&lt;span style=&#34;color:#00f&#34;&gt;)&lt;/span&gt;&lt;span style=&#34;color:#a31515&#34;&gt;&amp;#34;&lt;/span&gt; - | wl-copy
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        ;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    $screenshot_copy_area_ocr)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        grim -g &lt;span style=&#34;color:#a31515&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#00f&#34;&gt;$(&lt;/span&gt;slurp&lt;span style=&#34;color:#00f&#34;&gt;)&lt;/span&gt;&lt;span style=&#34;color:#a31515&#34;&gt;&amp;#34;&lt;/span&gt; - | tesseract - - | wl-copy
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        ;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    $screenshot_area_to_file)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        grim -g &lt;span style=&#34;color:#a31515&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#00f&#34;&gt;$(&lt;/span&gt;slurp&lt;span style=&#34;color:#00f&#34;&gt;)&lt;/span&gt;&lt;span style=&#34;color:#a31515&#34;&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        ;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    $screenshot_copy_window)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        grim -g &lt;span style=&#34;color:#a31515&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#00f&#34;&gt;$(&lt;/span&gt;swaymsg -t get_tree | jq -j &lt;span style=&#34;color:#a31515&#34;&gt;&amp;#39;.. | select(.type?) | select(.focused).rect | &amp;#34;\(.x),\(.y) \(.width)x\(.height)&amp;#34;&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#00f&#34;&gt;)&lt;/span&gt;&lt;span style=&#34;color:#a31515&#34;&gt;&amp;#34;&lt;/span&gt; - | wl-copy
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        ;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    $screenshot_window_to_file)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        grim -g &lt;span style=&#34;color:#a31515&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#00f&#34;&gt;$(&lt;/span&gt;swaymsg -t get_tree | jq -j &lt;span style=&#34;color:#a31515&#34;&gt;&amp;#39;.. | select(.type?) | select(.focused).rect | &amp;#34;\(.x),\(.y) \(.width)x\(.height)&amp;#34;&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#00f&#34;&gt;)&lt;/span&gt;&lt;span style=&#34;color:#a31515&#34;&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        ;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    $screenshot_copy_monitor)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        grim -o &lt;span style=&#34;color:#00f&#34;&gt;$(&lt;/span&gt;swaymsg -t get_outputs | jq -r &lt;span style=&#34;color:#a31515&#34;&gt;&amp;#39;.[] | select(.focused) | .name&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#00f&#34;&gt;)&lt;/span&gt; - | wl-copy
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        ;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    $screenshot_monitor_to_file)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        grim -o &lt;span style=&#34;color:#00f&#34;&gt;$(&lt;/span&gt;swaymsg -t get_outputs | jq -r &lt;span style=&#34;color:#a31515&#34;&gt;&amp;#39;.[] | select(.focused) | .name&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#00f&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        ;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#00f&#34;&gt;esac&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;em&gt;This script does assume that the file ~/Pictures/Screenshots exists.&lt;/em&gt;
&lt;em&gt;Make sure that folder either exists, or modify the script to save the file in a different folder&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;This script has a bunch of options that I find useful.
You can either choose to save the screenshot to a file, or to the clipboard.
You can choose whether to screenshot a region, the focused window, the focused monitor, or all monitors.
These could of course all be bound to different shortcuts, but I personally like having a single screenshot button for simplicity.&lt;/p&gt;
&lt;p&gt;Speaking of binding shortcuts, lets go over making this script into a shortcut on Sway.
I recommend you save this script to a file in your path.
I personally have this saved to &lt;code&gt;~/.local/bin/screenshot-menu.sh&lt;/code&gt;.
Remember to mark the script as executable using &lt;code&gt;chmod +x&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Make sure to check that the script works properly for you by running the script from the command line.
In my case, I can open a new terminal and type &lt;code&gt;screenshot-menu.sh&lt;/code&gt; and the wofi menu will appear.&lt;/p&gt;
&lt;p&gt;If that&amp;rsquo;s working fine, you can now add a binding to your sway config to run the script.
Add a new line to your config (mine is located at &lt;code&gt;~/.config/sway/config&lt;/code&gt;), for the new binding.
It should look something like:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    bindsym $meh+a exec screenshot-menu.sh
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The &lt;code&gt;$meh&lt;/code&gt; key is a special modifier on my keyboard; you should use something that makes sense for you.&lt;/p&gt;
&lt;p&gt;Happy screenshotting!&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>How to Generate a Vanity Algorand Address</title>
      <link>https://robbyzambito.me/posts/how-to-generate-a-vanity-algorand-address/</link>
      <pubDate>Sun, 28 Feb 2021 11:24:16 -0500</pubDate>
      
      <guid>https://robbyzambito.me/posts/how-to-generate-a-vanity-algorand-address/</guid>
      <description>&lt;p&gt;A vanity address is an address that has been generated such that it has some recognizable pattern.
For example, if you want to accept Algorand at your business, you could generate a wallet whose address resembles or matches a portion of your business name.
Personally, I have an address which matches my nickname, which is quite nice.&lt;/p&gt;
&lt;p&gt;To generate addresses, I created this Go program (Repo can be found &lt;a href=&#34;https://git.robbyzambito.me/robby/vawg.git&#34;&gt;here&lt;/a&gt;).&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-go&#34; data-lang=&#34;go&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#00f&#34;&gt;package&lt;/span&gt; main
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#00f&#34;&gt;import&lt;/span&gt; (
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a31515&#34;&gt;&amp;#34;fmt&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a31515&#34;&gt;&amp;#34;github.com/algorand/go-algorand-sdk/crypto&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a31515&#34;&gt;&amp;#34;github.com/algorand/go-algorand-sdk/mnemonic&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a31515&#34;&gt;&amp;#34;os&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a31515&#34;&gt;&amp;#34;regexp&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a31515&#34;&gt;&amp;#34;runtime&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#00f&#34;&gt;func&lt;/span&gt; main() {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    walletChan := make(&lt;span style=&#34;color:#00f&#34;&gt;chan&lt;/span&gt; &lt;span style=&#34;color:#2b91af&#34;&gt;string&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    pattern := os.Args[1]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#00f&#34;&gt;for&lt;/span&gt; i := 0; i &amp;lt; runtime.NumCPU(); i++ {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#00f&#34;&gt;go&lt;/span&gt; &lt;span style=&#34;color:#00f&#34;&gt;func&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#00f&#34;&gt;for&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                account := crypto.GenerateAccount()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#00f&#34;&gt;go&lt;/span&gt; &lt;span style=&#34;color:#00f&#34;&gt;func&lt;/span&gt;(acc crypto.Account) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    m, _ := mnemonic.FromPrivateKey(acc.PrivateKey)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    wallet := fmt.Sprintf(&lt;span style=&#34;color:#a31515&#34;&gt;&amp;#34;%s:%s\n&amp;#34;&lt;/span&gt;, acc.Address, m)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    matched, _ := regexp.MatchString(pattern, wallet)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    &lt;span style=&#34;color:#00f&#34;&gt;if&lt;/span&gt; matched {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                        walletChan &amp;lt;- wallet
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                }(account)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        }()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    fmt.Println(&amp;lt;-walletChan)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    os.Exit(0)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;em&gt;This script is made available under the &lt;a href=&#34;license/LICENSE.txt&#34;&gt;0-clause BSD license&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;To run this program, you must have Go installed on your machine.
I will assume you have it installed for this post.
If you need help installing it, you can reach out to me, and I will try to help you get set up.&lt;/p&gt;
&lt;p&gt;You can install this by running the following command, which should automatically build and install the dependencies.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ go install git.robbyzambito.me/robby/vawg/v2@latest
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;If you have go installed properly, this should add the vawg binary to your $PATH.
You can then generate a wallet by passing a regular expression as an argument.
Here is an example of running the program:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ vawg &amp;#34;^H[E3]LL[0O]&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;H3LLOVA5RAKHN5ZDL6TMO5UF3XH5VS4UWELAL7UUFWKO6NUFALLK3BPM3I:number frog indicate over verb stable ignore salute leopard loop merit neither attract wrap assume pluck rely firm album deny shield dumb visit absent canal
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;em&gt;I advise against using this wallet since I posted it on the internet.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;This took about two minutes to run on my machine with a Ryzen 7 3700X.
If it seems to hang and eat up a lot of CPU, that means it&amp;rsquo;s working :)&lt;/p&gt;
&lt;p&gt;A few things to note:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Wallet addresses are in full caps, so if you do not pass it a full caps string it will never find a wallet.&lt;/li&gt;
&lt;li&gt;The regular expression matches against the whole output.
The ^ means that it should match against the beginning of the output.
This is usually what you want.&lt;/li&gt;
&lt;li&gt;Since it uses regular expressions, you could increase the results you would accept (and potentially cut down on search time) by providing accepted alternatives.
This is shown in the example, where a 3 is accepted in place of an E, and a 0 would be accepted in place of an O.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The seed phrase (the sequence of words after the &amp;ldquo;&lt;code&gt;:&lt;/code&gt;&amp;rdquo;) can be used to add the wallet to whatever wallet app you use.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>My Computer Setup</title>
      <link>https://robbyzambito.me/posts/my-computer-setup/</link>
      <pubDate>Mon, 01 Feb 2021 00:11:17 -0500</pubDate>
      
      <guid>https://robbyzambito.me/posts/my-computer-setup/</guid>
      <description>&lt;p&gt;&lt;img src=&#34;photos/small_DSC_0128.jpg&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;p&gt;I built my computer after purchasing the parts on Black Friday 2019, with the expectation of programming on it, but also being able to game on it at times.
When I program I like to make use of virtual machines, which can quickly make use of a lot of RAM.
I prioritized RAM and CPU in my build, followed by my GPU and storage.
Below is a list of parts used in my machine.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;photos/small_DSC_0111.jpg&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&#34;text-align:left&#34;&gt;Part&lt;/th&gt;
&lt;th style=&#34;text-align:center&#34;&gt;Item&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:left&#34;&gt;CPU&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;&lt;a href=&#34;https://www.amazon.com/gp/product/B07SXMZLPK/ref=ppx_od_dt_b_asin_title_s00?ie=UTF8&amp;amp;psc=1&#34;&gt;AMD Ryzen 7 3700X&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:left&#34;&gt;RAM&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;&lt;a href=&#34;https://www.newegg.com/g-skill-32gb-288-pin-ddr4-sdram/p/N82E16820232867?Item=N82E16820232867&#34;&gt;32GB G.SKILL Trident Z Neo&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:left&#34;&gt;GPU&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;&lt;a href=&#34;https://www.newegg.com/sapphire-radeon-rx-590-100415p8gl/p/N82E16814202333?Item=N82E16814202333&#34;&gt;Sapphire Radeon PULSE RX 590&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:left&#34;&gt;Motherboard&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;&lt;a href=&#34;https://www.amazon.com/gp/product/B07C57Q1XH/ref=ppx_yo_dt_b_asin_title_o00_s00?ie=UTF8&amp;amp;psc=1&#34;&gt;ASUS Prime X470-Pro&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:left&#34;&gt;Storage drive&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;&lt;a href=&#34;https://www.amazon.com/gp/your-account/order-history?opt=ab&amp;amp;digitalOrders=1&amp;amp;unifiedOrders=1&amp;amp;returnTo=&amp;amp;orderFilter=year-2019&#34;&gt;4TB Seagate BarraCuda&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:left&#34;&gt;External drive&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;&lt;a href=&#34;https://www.newegg.com/black-wd-elements-4tb/p/N82E16822236807?Description=wd%20elements&amp;amp;cm_re=wd_elements-_-22-236-807-_-Product&#34;&gt;4TB WD Elements (May not be exact model, I&amp;rsquo;ve had this drive a while)&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:left&#34;&gt;Boot drive&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;&lt;a href=&#34;https://www.amazon.com/gp/product/B07MG119KG/ref=ppx_yo_dt_b_asin_title_o00_s00?ie=UTF8&amp;amp;psc=1&#34;&gt;250GB Samsung 970 EVO Plus&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:left&#34;&gt;Wireless card&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;&lt;a href=&#34;https://www.amazon.com/gp/product/B00HF8K0O6/ref=ppx_yo_dt_b_asin_title_o00_s00?ie=UTF8&amp;amp;psc=1&#34;&gt;Gigabyte GC-WB867D-I&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:left&#34;&gt;Power Supply&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;&lt;a href=&#34;https://www.newegg.com/seasonic-focus-plus-750-gold-ssr-750fx-750w/p/N82E16817151187?Item=N82E16817151187&#34;&gt;750W Seasonic FOCUS GX-750&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:left&#34;&gt;Case&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;Used Corsair case from a friend, not sure what the model is&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:left&#34;&gt;Monitor stand&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;&lt;a href=&#34;https://www.amazon.com/Ergotech-Freedom-Single-Aluminum-Monitor/dp/B00CEHME92&#34;&gt;Ergotech Freedom Arm x2&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:left&#34;&gt;Main Monitor&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;&lt;a href=&#34;https://www.amazon.com/Atron-Vision-AVF240-1920x1080-Overclock/dp/B01DXN5NX4&#34;&gt;Atron Vision AVF240 24&amp;quot; 144Hz Monitor&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:left&#34;&gt;Ultrawide Monitor&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;Old LG Ultrawide (2560x1080), not sure what the model is&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:left&#34;&gt;Top Monitor&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;Used LG 1600x900, not sure what the model is&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Recently I added a &lt;a href=&#34;https://www.newegg.com/syba-sy-mra55006-usb-3-0-front-panel/p/N82E16817998184?Item=N82E16817998184&#34;&gt;2.5&amp;quot; / 3.25&amp;quot; SATA drive bay&lt;/a&gt; that allows me to hot swap drives easily.
My intention is to use this to install operating systems on physical hardware that otherwise have limited hardware support, like GNU/Hurd.
I do this by passing the physical drive to a virtual machine, and then installing the OS in the VM, before removing the drive and putting it back in its original machine.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;photos/small_DSC_0135.jpg&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;p&gt;On the left side of my desk I have my #cofe (often tea as well, I don&amp;rsquo;t discriminate!).
The switch is a &lt;a href=&#34;https://www.netgear.com/support/product/JFS524.aspx&#34;&gt;24 port Netgear JFS524&lt;/a&gt;, that I actually picked up for free from a garage sale as it was ending.
Connected to the switch is a Raspberry Pi 3, and next to that is an &lt;a href=&#34;https://store.digilentinc.com/arty-a7-artix-7-fpga-development-board-for-makers-and-hobbyists/&#34;&gt;Arty A7&lt;/a&gt;, which I intend to use to play around with RISC-V.
On top of the switch I have my headphone stand, and my box of USB drives.
Both of which I made during a woodworking class I was lucky enough to take in high school.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;photos/small_DSC_0119.jpg&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;p&gt;Bonus shot using my phone as a fan to cool the Raspberry Pi.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;photos/small_DSC_0117.jpg&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;p&gt;I am fairly proud of the cable job I have below my desk.
It isn&amp;rsquo;t perfect, but the few cables that aren&amp;rsquo;t tied up with the rest I often unplug to move between machines (ie my webcam).
On the topic of my desk, it is made of a solid core door that my parents had in their garage, and a few 4x4s for the legs.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;photos/small_DSC_0129.jpg&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;p&gt;I purchased a &lt;a href=&#34;https://www.pine64.org/pinephone/&#34;&gt;PinePhone&lt;/a&gt; which I tried to use for my daily driver for a while, but I was having connectivity issues in my area and had to switch back to my Samsung S10.
I plan on replacing my phone plan to switch to a network that I have better connectivity with, so I can ditch my Android phone.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;photos/small_DSC_0139.jpg&#34; alt=&#34;&#34;&gt;
&lt;img src=&#34;photos/small_DSC_0143.jpg&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;p&gt;Here are the input devices that I use with my desktop&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;photos/small_DSC_0145.jpg&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&#34;text-align:left&#34;&gt;Device&lt;/th&gt;
&lt;th style=&#34;text-align:center&#34;&gt;Item&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:left&#34;&gt;Mouse&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;&lt;a href=&#34;https://www.amazon.com/Logitech-Lag-Free-Wireless-Gaming-Mouse/dp/B00E4MQODC&#34;&gt;Logitech G602&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:left&#34;&gt;Keyboard&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;&lt;a href=&#34;https://www.corsair.com/us/en/Categories/Products/Gaming-Keyboards/CORSAIR-Gaming-K70-Mechanical-Gaming-Keyboard-%E2%80%94-CHERRY%C2%AE-MX-Red/p/CH-9000069-NA&#34;&gt;Corsair K70&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:left&#34;&gt;Drawing tablet&lt;/td&gt;
&lt;td style=&#34;text-align:center&#34;&gt;&lt;a href=&#34;https://www.amazon.com/gp/product/B078GZFY1C/ref=ppx_yo_dt_b_asin_title_o03_s00?ie=UTF8&amp;amp;psc=1&#34;&gt;Huion Inspiroy H430P&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;The price of the Logitech G602 has risen since I got mine.
If you want a mouse like the one linked, the G604 is a newer model and likely a decent option.
I tell my self that I will use the drawing tablet to actually draw things, but in practice I have only used it to play &lt;a href=&#34;https://github.com/ppy/osu&#34;&gt;osu&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;photos/20210131_203118.jpg&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;p&gt;I will make another post going over my software setup soon!&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Proprietary Software is Anti-Capitalist</title>
      <link>https://robbyzambito.me/posts/proprietary-software-is-anti-capitalist/</link>
      <pubDate>Tue, 17 Nov 2020 07:26:15 -0500</pubDate>
      
      <guid>https://robbyzambito.me/posts/proprietary-software-is-anti-capitalist/</guid>
      <description>&lt;p&gt;A theoretically perfect market under capitalism assumes that consumers have
access to an infinite supply of producers. This allows consumers to inspect the
market, and select the product that best fits their needs. In the long term,
monopolies erode capitalism, because they meaningfully constrict the market and
decrease the options available to consumers. This means that consumers have
limited access to a variety of products and services under a market controlled
by a monopoly.&lt;/p&gt;
&lt;p&gt;A patent is a construct that grants a company a temporary monopoly to produce
something. This is based on the assumption that guaranteed monopolistic power
for a temporary period can encourage innovation. Some assume that proprietary
software licencing can encourage innovation in a similar way. However this is
not the case, because the proprietor of a piece of software actually has a
permanent monopoly on the marketable actions to that software, such as
distribution, repair, and modification.&lt;/p&gt;
&lt;p&gt;The key difference between Free Software and proprietary software for the
average consumer is not that they have the right to view the source code and
learn to repair or modify their own software. The difference is that the
consumer can access an unrestricted market of software developers to make
the modifications or repairs to the software that the consumer desires. This is
no different than a consumer bringing their car to their mechanic of choice in
order to repair or modify their vehicle.&lt;/p&gt;
&lt;p&gt;Should you be interested in finding support for Free Software, or if you are
interested in providing service, the &lt;a href=&#34;https://www.fsf.org/resources/service&#34;&gt;Free Software Foundation has put together
a list of services&lt;/a&gt; that could provide
assistance. You could also reach out to freelance software developers on sites
like Fiverr, or Upwork.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>You Are Forbidden From Innovating Here</title>
      <link>https://robbyzambito.me/posts/you-are-forbidden-from-innovating-here/</link>
      <pubDate>Thu, 12 Nov 2020 09:12:55 -0500</pubDate>
      
      <guid>https://robbyzambito.me/posts/you-are-forbidden-from-innovating-here/</guid>
      <description>&lt;h3 id=&#34;when-was-the-last-time-you-heard-of-someone-creating-an-innovative-technology-built-on-top-of-the-web&#34;&gt;When was the last time you heard of someone creating an innovative technology built on top of the Web?&lt;/h3&gt;
&lt;p&gt;Since the creation of the Web, there has been an incredible burst of innovation,
that still continues today. In contrast, when was the last time you heard of
someone innovating on top of Facebook? Maybe you have watched some talk from an
engineer at Facebook about technology they created to overcome some problem they
ran into, but that&amp;rsquo;s about it. Innovation on top of Facebook&amp;rsquo;s technology, occurs
at Facebook. If you do not make it past the interview process at Facebook, you
are &lt;strong&gt;not allowed to innovate&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;You might have a great idea for how Facebook could better suite your needs, and
even the skills to implement it given the opportunity. Should Facebook deem you
&amp;ldquo;unworthy&amp;rdquo; of hiring however, it is often &lt;em&gt;illegal&lt;/em&gt; for you to implement your
changes.&lt;/p&gt;
&lt;p&gt;This is a disaster. The hiring team at Facebook should not have the power to
decide who has the right to innovate. Free Software is essential because it
grants you permission to innovate and create new things with the things you
already have.&lt;/p&gt;
&lt;p&gt;I believe many people understand the situation backwards. They think proprietary
software is a necessary evil because it drives innovation. The opposite is true
though: proprietary software leeches off the innovation done by Free Software
that had been created before it, and that it is built on top of. Facebook would
not have been possible had the Web not been created as a Free protocol for
anyone to use and build on top of.&lt;/p&gt;
&lt;p&gt;A tangible example of this is Android versus iOS. Let&amp;rsquo;s say I wanted to build my
own smart phone right now, and sell it for a profit. I can use the Android
operating system on the device, and even make changes to Android to make it
better suite how I expect the device to be used. I wouldn&amp;rsquo;t need to special
permission to do this, and my clients would benefit from having access to the
existing ecosystem of applications. In contrast, it is illegal to manufacture
and sell a device with iOS installed on it, without the permission of Apple.
That&amp;rsquo;s why there are many companies that manufacture devices using Android,
such as Samsung, LG, Sony, Google, etc. and Apple is the only company that sells
devices running iOS.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;In short, the history of technology is a continuous stream of innovation, built
upon previous technologies. Companies have been allowed to become the gatekeepers
of innovation in the name of profit. Using Free Software is not breaking the
cycle, it is allowing the cycle to continue.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Deleting Social Media with Algorithmic Feeds</title>
      <link>https://robbyzambito.me/posts/deleting-social-media-with-algorithmic-feeds/</link>
      <pubDate>Tue, 03 Nov 2020 06:01:51 -0500</pubDate>
      
      <guid>https://robbyzambito.me/posts/deleting-social-media-with-algorithmic-feeds/</guid>
      <description>&lt;h3 id=&#34;algorithmic-feeds-are-designed-with-a-purpose-to-make-consumers-behave-in-ways-that-they-otherwise-wouldnt&#34;&gt;Algorithmic feeds are designed with a purpose, to make consumers behave in ways that they otherwise wouldn&amp;rsquo;t.&lt;/h3&gt;
&lt;p&gt;About a month ago I decided to deactivate my Facebook account, and to uninstall
Snapchat, Instagram, and Slide for Reddit from my phone. I did this because I
felt like I was not using the internet on my own terms anymore. I felt (and
still do) that handing the power to curate everything I see over to black boxes
such as the ones I listed was not healthy for me. As a consumer of algorithmic
feeds, you are not allowed to view, let alone control the system that decides
what kind of information you see.&lt;/p&gt;
&lt;p&gt;As an example, if you wanted to use Instagram as a way to show you content that
makes you happy, the most you can do is aggressively suggest to the system that
it should show you that content, by searching for it and following users who
regularly post related content. For the last 2 years or so, I have tried to
exclusively use Instagram for looking up dog photos, videos, and memes, and
sharing them with a group chat of my friends. Despite this, I still would have
content in my feed that did not align with my desires, such as political content,
or other content that would evoke strong emotional responses from me.&lt;/p&gt;
&lt;p&gt;As an experiment, I didn&amp;rsquo;t tell anyone that I was deleting the social media apps
that I listed above before doing it. I wasn&amp;rsquo;t sure what kind of response I would
get from those around me for doing this, if any. The first person to notice
anything was my girlfriend, who noticed that she couldn&amp;rsquo;t see my Facebook page.
I told her that I decided to deactivate my account, and that was that. To be
fair though, I haven&amp;rsquo;t really been using Facebook for many years, so I figure
most people haven&amp;rsquo;t noticed my page is missing. Snapchat on the other hand has
been a little different. I didn&amp;rsquo;t look into seeing if I could deactivate my
account without deleting it, so my account is still accessible to people. I
think this may have caused some confusion, since people might be thinking that
I&amp;rsquo;m ignoring them. A friend of mine said that he sent something, and I told him
that I haven&amp;rsquo;t had Snapchat installed for a while now. Again, that has been that
as far as my life without Snapchat.&lt;/p&gt;
&lt;p&gt;There is this idea that you need to have an algorithm to curate content for you,
or else it will be boring. After using my own Pleroma instance as my primary
social media platform since July, I can tell you first hand that you do not need
to have a timeline showing content in any order other than chronological in order
to have meaningful conversation. In fact, I feel like I have been able to have
healthier discussions with people of different backgrounds, since I am not being
artificially confined to my own bubble. I&amp;rsquo;m also in complete control over the
content that appears in my feed. If I decide that I don&amp;rsquo;t want to see content
from someone anymore, if I stop following them, my server won&amp;rsquo;t show me their
content unless I look for it. My feed on Pleroma is strictly a chronological
timeline of posts from the people that I follow, and that is great.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Hello World</title>
      <link>https://robbyzambito.me/posts/hello-world/</link>
      <pubDate>Fri, 30 Oct 2020 09:19:45 -0400</pubDate>
      
      <guid>https://robbyzambito.me/posts/hello-world/</guid>
      <description>&lt;p&gt;I am ditching my old site for this one for several reasons. My old site was
built in Vue, and I thought it looked very nice. However because the entire
site was built in Vue, it could not be viewed without JavaScript. I don&amp;rsquo;t have
issues with using JavaScript in general, but it seemed a little absured that a
site as simple as mine required it to render.&lt;/p&gt;
&lt;p&gt;Requiring JavaScript also meant that my site could not be properly archived by
&lt;a href=&#34;https://web.archive.org/&#34;&gt;The Wayback Machine&lt;/a&gt;. I enjoy looking at old versions
of websites, so being able to look back on my own website in the future is
important to me.&lt;/p&gt;
&lt;p&gt;I hope to use this site as a place to publish my ideas, and write about projects
that I&amp;rsquo;m working on. You can get regular updates by following the
&lt;a href=&#34;https://robbyzambito.me/posts/index.xml&#34;&gt;RSS feed&lt;/a&gt;&lt;/p&gt;
</description>
    </item>
    
  </channel>
</rss>

