💾 Archived View for erock.io › atom.xml captured on 2023-01-29 at 15:38:51.

View Raw

More Information

⬅️ Previous capture (2022-07-16)

-=-=-=-=-=-=-

<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
<id>gemini://erock.io/</id>
<title>erock&#39;s gemlog</title>
<author>
    <name>erock</name>
    <email>gemlog@erock.io</email>
</author>
<updated>2022-07-13T04:06:52Z</updated>
<link href="gemini://erock.io/" rel="alternate"/>
<link href="gemini://erock.io/atom.xml" rel='self'/>
<entry>
	<id>gemini://erock.io/2022/07/12/internet-points/</id>
    <link href="gemini://erock.io/2022/07/12/internet-points/" rel="alternate" />
	<title>internet points</title>
    <updated>2022-07-12T00:00:00Z</updated>
    <content>I&#39;ve spent the past decade chasing internet points on Reddit, Github, and Twitter. I&#39;ve found that focusing on internet points doesn&#39;t actually yield favorable results. I spent so much time trying to figure out what other people want to see that I&#39;ve lost sight of what I want to see.

In the early days of reddit I used to spend hours constructing well thought out and cited posts. I wanted to get karma because it somehow validated how smart I am. Whenever I would get downvoted or receive a confrontational response, I would feel deflated. Negative responses would scare me. It got to the point where I would feel an intense amount of anxiety whenever I opened my inbox. What are they going to say about my post? Was it well received? I would obsess over the points I had accrued over time. I justified that this was a training process to figure out how to construct well written posts. To some extent I think that&#39;s true, but the reality is my focus on internet points ultimately led to an unfavorable result. I was merely trying to please people while sacrificing my own thoughts, ambitions, or desire to express my mind.

Then along came Github. Github stars are a seductive drug. The more stars you have the more internet clout you have as a developer. The issue is compounded by the fact that popular projects open doors for you as a software developer. I&#39;ve spent years chasing stars only to slowly realize yet again that internet points mean nothing. They say nothing about you or the project you are working on besides a popularity contest. Why do I want to be popular so badly? Why do I always fall short of these popularity contests?

Recently I&#39;ve come to the realization that social networking sites are reinforcing this need to be popular and now that I&#39;ve put a name to the concept I&#39;ve been trying to recuse myself of it entirely. It&#39;s tough because it feels like you can&#39;t create software projects without being on Github. Sourcehut has been a great outlet for me lately. The whole philosophy behind Sourcehut is really resonating with me as I lash out against all things social networking.

Who knows, maybe this is just an ad-hoc rationalization for why my projects never seem to gain any traction.

Even if that is true, I know that focusing on internet points is counter-productive. From now on I&#39;m only going to build projects or products that I want to use.
</content>
</entry>

<entry>
	<id>gemini://erock.io/2022/06/14/interview-at-hashicorp/</id>
    <link href="gemini://erock.io/2022/06/14/interview-at-hashicorp/" rel="alternate" />
	<title>my interview experience with hashicorp</title>
    <updated>2022-06-14T00:00:00Z</updated>
    <content>I figured I would write about my relatively recent experience interviewing at Hashicorp.

I had a friend who referred me to an open position at Hashicorp and figured I would apply just to see what the job would be like.  For context, my current employment is great and I had zero sense of urgency to move to a different company.  Having said that, I figured it might be fun to go through the interview process at a well known SV tech company and who knows, maybe it would be something I was really excited about.

Spoiler: I didn&#39;t make it very far.

I had a very nice chat with one of their recruiters.  Everything seemed to line up -- they almost always do at this stage -- and so I moved on to the next part of the interview.

The next stage was to chat with a product manager.  I liked him, we got along very well and seemed to have a great conversation.  It eventually came out that the position I was applying for was primarily front-end (which is a strength of mine) and their FE stack is all ember.js (not a strength of mine).  I&#39;m not sure if this part of the conversation took a turn for the worse, but he didn&#39;t really ask me any follow up questions about my experience with ember.  I did remember saying something to the effect of:

&gt; The recruiter mentioned that I could use react for the technical challenge so I figured at least some of the codebase was using react.

To which he responded:

&gt; No it&#39;s all in ember.

At this point I definitely lost some interest in the position and upon reflection wonder if my demeanor changed and that&#39;s the reason for the rejection?  Regardless, I figured they were not picky about technology choices since they offered alternatives to ember during the technical interview.  The interview ended and I went about my day.

I didn&#39;t hear anything from them for a couple of days -- which is usually a bad sign when they have a team dedicated to hiring.  I eventually received a call from the recruiter saying they were *not* going to move me forward to the next step.  I asked for feedback, she didn&#39;t have any to give.  Whenever you get rejected it&#39;s never a great feeling but I always force myself to perceive the experience as an opportunity to improve.  Whether it&#39;s my communication style, the way I answered questions, or the questions I should have asked.  I want to be my best self and feedback, even though it&#39;s hard to hear sometimes, is an invaluable aspect of self-improvement.

I decided to reach back out to my friend who works there to let him know I was rejected.  I indicated that they didn&#39;t have any feedback for me and he took it upon himself to figure out what happened.  A couple of hours later I received a message:

&gt; So they didn&#39;t want to say why they rejected you but you should feel free to apply again at a later date.

I don&#39;t get why companies are so apprehensive to provide constructive feedback.  Simply &#34;we are looking at other, more qualified applicants&#34; or &#34;you are a react fanboi&#34; would be sufficient.  There was no reason provided and they were being a little secretive about it.  Maybe it&#39;s about liability or they don&#39;t want any opportunity for the applicant to be confrontational?  It was nice to get a rejection phone call even though an email would be sufficient since it was pretty clear that they wanted to cut off all further communication.

Hashicorp is doing some amazing things in the open source community and I would have enjoyed being part of it.  Having said that, after the two phone calls I had with the company, it was becoming more clear that this wasn&#39;t the right company for me.  It was too large of an organization for my taste and the entire process felt very rigid.  Also the way they responded to me asking for feedback was awkward and off-putting.

To Hashicorp and other companies that are hiring: Please provide constructive feedback to your applicants.  Even if they get the job, providing constructive feedback is such a valuable mechanism for growth on both sides.  I learn a lot both when providing and receiving feedback.  When providing feedback, it requires me to really understand my rationale and clearly communicate it.  When receiving feedback, it requires me to have patience and mental dexterity to be better.
</content>
</entry>

<entry>
	<id>gemini://erock.io/2022/06/03/github-as-social-network/</id>
    <link href="gemini://erock.io/2022/06/03/github-as-social-network/" rel="alternate" />
	<title>On github as a social network</title>
    <updated>2022-06-03T00:00:00Z</updated>
    <content>Ever since I became jaded by social networks, I&#39;ve been examining the sites I visit and why I continue to visit them. We all know the addictive behavior driving social networking &#34;engagement.&#34; Ever since I first discovered facebook I have been fighting against the constant drip of accumulating social currency. Slowly I began to realize that these social networking sites were echo-chambers that really didn&#39;t mean much at all. When you talk to people in person, there&#39;s a sense of restraint. In person, people have manners, can read the room, and understand what they should vocalize to their listeners. Perhaps most important of all, they know when to keep thoughts to themselves.

It was only on these social networking sites, where people have a podium, that I noticed quite a change in discourse. All of a sudden, you could read family and friends&#39; thoughts on all types of subjects that are never uttered in person. Through these sites, I learned that some things are best left unsaid. And so I left.

However, there&#39;s still a few social networking sites that I use. There&#39;s one in particular, that is cloaked under the guis of productivity. Hidden behind both my personal and professional life. It&#39;s one of the first pages I open during the day, and one of the last ones to be closed before bed. Notifications from this site are important because they could be a ping from a colleague who needs me to review what they wrote. Or it could be a new question raised on one of my projects. Github is the worst kind of social networking site. Like a virus, it has infected my mind and is constantly getting me to engage with it. It&#39;s a social networking site that I have to use for work. Software engineers stand no chance against github. How did a site with such good intentions turn into one that preys so easily upon our weaknesses?

&#34;Github is the software engineer&#39;s resume, it will help you get a job&#34; That&#39;s what I have convinced myself is true. Is it actually true, though? I imagine it&#39;s true for the people who have accumulated a lot of social currency. However, it has been my experience that many companies do not even look at your resume.  No, these companies have a rigid process for potential employees and they rarely deviate from the norm.

Now, with github sponsors, it&#39;s easier than ever to become popular and get paid to work on open source projects. Popular, being the operative word.  There&#39;s even more reason to use github because the platform could help suppliment your income.

Why do I get so excited when I get stars on my projects hosted on github? I am constantly trying to come up with new projects to build, but do I actually want to build them? Or do I just want social currency? I&#39;m not sure I can tell the difference anymore.

Github isn&#39;t just a code repository, it&#39;s a social networking site. The network effect makes it really hard to host other open source projects anywhere else. I catch myself typing in a somewhat generic phrase, looking for an OSS project, and append the search with &#34;github.&#34; Ultimately, github makes it easier for people to discover your work. People that want to share their work and have people use it gravitate towards github. No other code repository site has as much mindshare as github and it&#39;s all thanks to the human desire to accumulate and compare with peers. Humans yearn for social clout and recognition.

Why was my judgment so clouded?

I really like sourcehut[1] and will be moving everything there. There are no &#34;engagement&#34; features like stars or trending projects. Drew, more than anyone, has made me realize that you don&#39;t have to participate in social networking in order to have people use your projects.

=&gt; https://sr.ht sourcehut[1]

For now, I&#39;m going to maintain a mirror on github of my popular code repositories, but I think I need to start distancing myself from the most addictive social network in my life.
</content>
</entry>

<entry>
	<id>gemini://erock.io/2022/06/02/on-language-package-managers/</id>
    <link href="gemini://erock.io/2022/06/02/on-language-package-managers/" rel="alternate" />
	<title>On language package managers</title>
    <updated>2022-06-02T00:00:00Z</updated>
    <content>The more I read about supply chain attacks and security issues revolving around language package managers, the more pressing I think this issue has become.

&gt; They join a growing club of broken-by-design package managers which publish packages uploaded by vendors directly, with no review step, and ship those packages directly to users with no further scrutiny.

=&gt; https://drewdevault.com/2022/05/12/Supply-chain-when-will-we-learn.html

On one hand, I totally agree with Drew here.  The fact that there are virtually no security measures in place for publishing packages to a registry is a source of our problems here.

However, I&#39;m also of the opinion that regardless of what protections a package manager puts into place for consumers, the ultimate responsibility falls on the consumer to properly vet their dependencies.  I&#39;m all for having standard practices put into effect to make it easier to follow a secure path, but that&#39;s about where I draw the line.

I think having a third-party review the package before it can be listed in the registry is fine.  However, there still needs to be an easy way to side-load those packages then.  There have been many times where I wanted to publish a package just to proply test it works properly end-to-end.

I know Drew uses golang quite a bit, I wonder what he thinks about the no-registry paradigm that golang employs.  I think it&#39;s even easier to use than npm, but that comes with a big downside: there is no friction between creating a git repo with a golang package and a consumer using it.  No review step and no further scrutiny.

I&#39;ve been trying to learn more about products or services that help prevent supply chain attacks and compiled a meager list here:

=&gt; gemini://lists.sh/erock/bookmark-supply-chain-security

I really wonder if services like these will ever get traction.  The reason why there&#39;s a blossoming ecosystem revolving around popular package managers is because they lower the barrier to entry to consume code.  Adding this security step sounds great but in reality, I really wonder how many people will use it.  I guess one could argue that TLS is equally a pain and we have been seeing pretty awesome tooling around that to make it as simple as possible.

As an aside, I started using caddy instead of nginx primarily because of its auto-tls functionality.

If anyone else has any thoughts on how to help prevent supply chain attacks, I&#39;d love to read about them.  I&#39;m too early in my research to provide any concrete thoughts of my own.  I do think regardless of what is proposed, it needs to strike a balance between easy package publishing and providing the tools for a package developer to be successful without jumping through a dozen hoops.
</content>
</entry>

<entry>
	<id>gemini://erock.io/2022/05/28/reply-error-handling/</id>
    <link href="gemini://erock.io/2022/05/28/reply-error-handling/" rel="alternate" />
	<title>reply -- error handling</title>
    <updated>2022-05-28T00:00:00Z</updated>
    <content>&gt; That is, the function is able to return either the intended return value or the error.  Zig also has tagged unions, which in code look like an enum wrapping a union. This is what is really meant by the term Algabraic Data Types.

=&gt; gemini://gemini.hitchhiker-linux.org/gemlog/re_error_handling.gmi

After reading this post I felt the urge to mention that Typescript also has the same concept, although it&#39;s called a discriminated union.

=&gt; https://www.typescriptlang.org/docs/handbook/unions-and-intersections.html#discriminating-unions

Recently I&#39;ve been doing a lot of software development in golang and this is something that was missed.  It looks like there&#39;s an outstanding github issue[1] discussing the addition of discriminated unions to golang.

=&gt; https://github.com/golang/go/issues/19412 [1] sum type

I love discriminated unions in Typescript.  Sometimes I wish there was a more standard way to utilize them in the js ecosystem.  At least in typescript, there&#39;s nothing enforcing error handling via a disciminated union for return types.

I always liked the idea of a maybe type[2] but never end up using it in my code.

=&gt; https://github.com/chrissrogers/maybe#readme [2] maybe npmjs

Wikipedia article on algebraic data types for those interested in learning more:

=&gt; gemini://gemi.dev/cgi-bin/wp.cgi/view?Algebraic%20data%20type

Overall I often find myself learning new concepts from the JS ecosystem than any other language.  There are some really bright minds working in that ecosystem, producing fantatic ideas.  All of this is to say that js gets a lot of hate but there are some good parts to it as well.
</content>
</entry>

<entry>
	<id>gemini://erock.io/2022/05/21/shifting-away-from-spa/</id>
    <link href="gemini://erock.io/2022/05/21/shifting-away-from-spa/" rel="alternate" />
	<title>reply -- the balance has shifted away from SPAs</title>
    <updated>2022-05-21T00:00:00Z</updated>
    <content>A recent article popped up on hackernews[0] that I figured I would respond to here.

=&gt; https://news.ycombinator.com/item?id=31459316 [0] The balance has shifted away from SPAs

# New frameworks are focusing on MPA &#43; 0kb JS by default

I definitely see a trend where more and more web frameworks are trying to leverage multi-page applications with minimal or no javascript on the front-end.  I welcome these changes because not everything needs to be an SPA.  I recently built lists.sh[1] which doesn&#39;t have any javascript in its stack.  Everything works perfectly fine a simple document browser.  It was a lot of fun to build and didn&#39;t require any heavy lifting on the front-end.  But here&#39;s the thing, it didn&#39;t require any interactivity.  One of its features was no javascript.  At the core of the site is a blog.  Blogs do not need javascript and in fact, tend to make the reading experience worse.  This is one reason why I&#39;m enjoying gemini so much.  Gemini is great for what it is: a document browser.

=&gt; https://lists.sh [1] lists.sh

In the comments someone mentioned the concept of holotypes[2], which classifies each use case of the modern browser in a category.

=&gt; https://jasonformat.com/application-holotypes/ [2] application holotypes

Some categories are better suited as an SPA vs an MPA.  So let&#39;s organize the list that way:

## SPA



## MPA



I really like this list because it helps us understand why SPAs are so prevalent.  Does everything need to be an SPA? No, but there are a lot of use cases where it just makes sense.

In this context, it&#39;s pretty clear that SPAs are not going anywhere.

# New browser APIs to support MPAs

The article continues to discuss that browser&#39;s have been implementing more and more features to make MPAs more usable:



Honestly, I don&#39;t think these features are particularly compelling.  When I look at this list, I don&#39;t think &#34;game changer.&#34;  These are polish features to make MPAs are little more pleasant, but that&#39;s about it.

# Control

&gt; Choosing an MPA is a big architectural decision that may effectively cut off the future possibility of taking control of the page in cases where the browser APIs are not quite up to snuff. At the end of the day, an SPA gives you full control, and many teams are hesitant to give that up.

That&#39;s it.  He described exactly why I like building SPAs: control.  As a software engineer who has built a career on SPAs, the control I have when building applications is critical.  Control is the primary characteristic I think about when architecting a web app.  This is especially important when working at a startup where the business requirements are vague.  Making big decisions about an application that might stick around for 5&#43; years while at the same time not fully understanding the business requirements puts us in a tough position.

At the end of the day, SPAs provide us with control over our application.  I can make an SPA do anything I want and that&#39;s really all I care about.  Do I particularly enjoy building massive javascript applications?  Not really.  That&#39;s why in my free time I&#39;m focusing less on javascript and more on products that doesn&#39;t require it.
</content>
</entry>

<entry>
	<id>gemini://erock.io/2022/05/19/captains-log/</id>
    <link href="gemini://erock.io/2022/05/19/captains-log/" rel="alternate" />
	<title>captain&#39;s log</title>
    <updated>2022-05-19T00:00:00Z</updated>
    <content>I decided to create a separate gemini-only blog that&#39;s separate from my web blog.  I felt like that one is a little too publically visible and I wanted to keep it mostly technical in nature.

This gemlog is going to be more focused on stream of consiousness.  Something more akin to a diary.  I&#39;d like to set a goal to post something at least one per day, but I know that&#39;s going to be hard to accomplish.

This gemlog is built using `kiln`[0] which I&#39;m hoping is easier to use and publish than with my hacked up hugo at erock.io.

=&gt; https://kiln.adnano.co kiln[0]

I&#39;ve got a lot of ideas for things to write and build targeting gemini.  I honestly think Gemini is the modern document browser that ought to replace all document-based websites.  The modern browser (essentially chromium at this point) should be reserved for web apps.

On that note, ever since getting more acquianted with gemini, I&#39;ve slowly come to the realization that the modern web is too commercial.  It has completely lost its magic of humans communicating with each other.  In that way, I think gemini is for the cyber romantics.

So hey.  I&#39;m reaching out to you.  Feel free to email me if you read my gemlog.
</content>
</entry>

<entry>
	<id>gemini://erock.io/2022/05/19/new-framework-laptop/</id>
    <link href="gemini://erock.io/2022/05/19/new-framework-laptop/" rel="alternate" />
	<title>new and upgraded framework laptop</title>
    <updated>2022-05-19T00:00:00Z</updated>
    <content>Today, frame.work just announced a new framework laptop.

=&gt; https://news.ycombinator.com/item?id=31433556

I purchased a framework laptop late last year and have been absolutely loving it.  I have a separate review post for those interested.

=&gt; gemini://erock.io/2021/11/01/framework-vs-mbp

The new upgrades are:


One big complaint I have with the laptop is how flimsy the lid feels.  It would stay in place for me, but if I had to walk around at all the lid would slowly become flat and flush to with the rest of the laptop.

For $90 I&#39;m definitely getting this upgrade.

The mainboard I&#39;m excited about, especially the potential for power savings.  However, for ~$450 which is half the price of the laptop, I have a much harder time justifying that purchase.  I was hoping for an AMD or and ARM mainboard because I would be very interested in either of those.

People online have been speculating that the reliance on thunderbolt 4 is preventing framework from selling an AMD mainboard, even thought it&#39;s just an implementation of USB4 and the new AMD CPUs support USB4.

Anyway, what I really love about this laptop is normally when there&#39;s a new model release I get this intense sense of FOMO or buyer&#39;s remorse.

I regularly think to myself:

&gt; If I would have waited to get a new laptop until now

I don&#39;t feel that way at all with framework.  They are clearly committed to selling any new models as upgrades to previous models, which is so refreshing.

I can&#39;t wait to see what they comes up with next and by the look of it, they are doing very well as a business so I expect to see them around for awhile.
</content>
</entry>

<entry>
	<id>gemini://erock.io/2022/04/25/lists-launch/</id>
    <link href="gemini://erock.io/2022/04/25/lists-launch/" rel="alternate" />
	<title>lists.sh launch</title>
    <updated>2022-04-25T00:00:00Z</updated>
    <content>I&#39;m excited to announce a new product I&#39;ve been working on over the past few months: lists.sh[1].

=&gt; https://lists.sh 1: https://lists.sh

It&#39;s a microblog dedicated for lists.

After seeing charm.sh[2] a few months ago, I&#39;ve been enamored by the idea of SSH apps. I decided that a blogging platform focused on developers could be the perfect use case for an SSH app.

=&gt; https://charm.sh 2: https://charm.sh

Also, I love writing lists. I think restricting writing to a set of lists can really help improve clarity in thought. The goal of this blogging platform is to make it simple to use the tools you love to write and publish lists. There is no installation, signup is as easy as SSH&#39;ing into our CMS, and publishing content is as easy as copying files to our server.

Check it out and let me know what you think!

## How it&#39;s built

The app relies on two different servers: ssh and web. The entire stack is written in golang.

### SSH App

The SSH app leverages the charm toolset:



These three technologies make it possible to build SSH apps that behave very much like a traditional web app. The user doesn&#39;t need to install anything besides SSH in order to use our content management system. All they have to do is `ssh lists.sh` and from there they can create an account.

SSH apps are a relatively new and exciting concept and I couldn&#39;t wait to build something leveraging it.

Under the hood I used `wish` which leverages golang&#39;s implementation of the SSH protocol but provides us with the flexibility to do something more than simply logging into a remote computer and seeing a shell. It allows us to construct a TUI app -- using `bubbletea` and `lipgloss` that the user interacts with.

Once the user creates an account and has some blog posts to upload to the platform, all they have to do is use `scp` to send the files to us.

In order for `scp` to work, there needs to be a client and a server with the command installed. In the case of lists.sh, we actually reimplemented the `scp` and retooled it for our purposes. When a user runs `scp ~/blog/hello-world.txt lists.sh:/`, they don&#39;t actually copy a file onto our server root directory. Instead, we read that file and save it into our postgresql database.

### Web app

The web app simply uses `net/http` and `templates/html` to construct a minimally designed, html&#43;css only website. Some interesting features of the website:



Because we are using an SSH app and leveraging public-key cryptography, we don&#39;t need to worry about authentication inside the website. The website is effectively just a read-only portal.

## Conclusion

I&#39;ve been using lists.sh[3] for my own lists the past week while I was testing the functionality. It&#39;s hard not to get excited because the workflow is painless. Whenever I need to make a change to a list, I just open `vim`, edit the file, and then call `scp` to publish the changes.

=&gt; https://lists.sh 3: https://lists.sh

Because I&#39;m leveraging SSH and public-key cryptography, there are a lot of technical considerations that I don&#39;t have to worry about. Authentication is handled for me, I don&#39;t have to implement an online editor, or worry about draft states.

This is just the first of many ideas I have leveraging SSH apps and I&#39;m excited to build them!

=&gt; https://github.com/neurosnap/lists.sh Source code
</content>
</entry>

<entry>
	<id>gemini://erock.io/2022/02/17/the-duality-of-software-production/</id>
    <link href="gemini://erock.io/2022/02/17/the-duality-of-software-production/" rel="alternate" />
	<title>the duality of software production</title>
    <updated>2022-02-17T00:00:00Z</updated>
    <content>My mind is swimming against the current of project ideas. Breathe. Focus. Limit the scope and head upstream.

My ideal setup is shockingly similar to a web application itself: I have a front- and back-end computer for all personal software development. As I reflect on this, I find it humorous that I&#39;ve aligned myself with a setup that resembles so closely to how I write web apps. The duality of web and the duality of software production are united.

My back-end &#34;server&#34; is an old gaming rig that I have repurposed. It sits in my basement with an ethernet connection sitting right next to my home network. It is connected to a UPC so brownouts don&#39;t interrupt my flow. I have also changed a BIOS setting so my server will turn back on automatically whenever I lose power. All of this hardware helps keep my server online and always available.

The benefits of having a server for software development is multi-faceted:



The other really amazing feature of this setup is since I have a server to host my dev environment, it doesn&#39;t matter what front-end I use, I&#39;ll always pick up exactly where I left off.

It also makes long-running tasks easier to handle since I don&#39;t have to worry about my computer going to sleep while it&#39;s processing.  For example, I can have a full ethereum node running in a tmux session and I don&#39;t have to worry about it getting interrupted.

My front-end clients consist of a few machines. I have a framework laptop that I purchased late last year. It is a fantastic ultra thin laptop[1] that I would highly recommend to anyone interested in a similar setup. I have my primary gaming rig that I&#39;ll sometimes use when I don&#39;t want to switch computers. I also have an iPad that I can be perfectly productive using with this setup.

=&gt; https://erock.io/2021/11/01/framework-vs-mbp.html [1] https://erock.io/2021/11/01/framework-vs-mbp.html

In order to make this workflow feasible, I need to move as much of my software tools into the terminal.

I accomplish this goal with a couple of tools:



Only recently has this workflow accelerated my productivity and that&#39;s primarily because of neovim with its introduction of LSP[2] and treesitter[3] support.

=&gt; https://neovim.io/doc/user/lsp.html [2] https://neovim.io/doc/user/lsp.html
=&gt; https://neovim.io/doc/treesitter/ [3] https://neovim.io/doc/treesitter/

&gt; Want to get started with neovim? Check out
&gt; neovimcraft[4] for a curated list of neovim plugins

=&gt; https://neovimcraft.com [4] https://neovimcraft.com

Previously I used VSCode, which is a nice code editor / IDE, but ultimately it doesn&#39;t fit into a terminal-based workflow so I eventually migrated off of it.  I haven&#39;t used vscode in years both whether it&#39;s professional work or a side project.  I pretty much live in the terminal.

The constant drip of perfecting my workflow is a drug to my mind. Breathe. Focus.
</content>
</entry>

<entry>
	<id>gemini://erock.io/2022/01/08/nvimsh-release/</id>
    <link href="gemini://erock.io/2022/01/08/nvimsh-release/" rel="alternate" />
	<title>nvim.sh launch</title>
    <updated>2022-01-08T00:00:00Z</updated>
    <content>The older I get the more time I spend in the terminal.  I really appreciate
services that accommodate accessing information from the terminal.

For example, I am a huge fan of cht.sh to quickly access docs for
programming languages and wttr.in to get a nice display of the weather.

=&gt; https://cht.sh

=&gt; https://wttr.in

I thought it would be fun to be able to quickly search for neovim plugins
within the terminal.  Since I already have a curated list of neovim plugins
via neovimcraft.com, I thought it would be a fun project to work on for
the day.

=&gt; https://neovimcraft.com

So I&#39;m happy to announce nvim.sh - a website that makes it easy to find
neovim plugins.

=&gt; https://nvim.sh

Using the service is easy and the default response is `text/plain`.

To figure out how the service works simply `curl` the website:

curl https://nvim.sh

nvim.sh - neovim plugin search from the terminal

api description

https://nvim.sh help

https://nvim.sh/s return all plugins in directory

https://nvim.sh/s/:search search for plugin within directory

https://nvim.sh/t list all tags within directory

https://nvim.sh/t/:search search for plugins that exactly match tag within directory

powered by: https://neovimcraft.com

source: https://github.com/neurosnap/nvim.sh


Finding a plugin using `/s/:search` will look something like this:

$ curl https://nvim.sh/s/git

Name Stars OpenIssues Updated Description

sindrets/diffview.nvim 671 7 2021-12-17T16:10:43Z Single tabpage interface for easily cycling through diffs for all modified files for any git rev.

tveskag/nvim-blame-line 121 1 2021-07-27T18:59:55Z A small plugin that uses neovims virtual text to print git blame info at the end of the current line.

TimUntersberger/neogit 1056 57 2022-01-08T08:04:27Z magit for neovim

tanvirtin/vgit.nvim 265 12 2022-01-08T06:55:57Z Visual Git Plugin for Neovim

kdheepak/lazygit.nvim 255 7 2022-01-04T23:44:54Z Plugin for calling lazygit from within neovim.

Iron-E/nvim-highlite 134 1 2022-01-06T18:55:05Z A colorscheme template that is &#34;lite&#34; on logic for the developer.

onsails/vimway-lsp-diag.nvim 71 5 2021-12-28T07:58:29Z Live render workspace diagnostics in quickfix with current buf errors on top, buffer diagnostics in loclist

onsails/diaglist.nvim 71 5 2021-12-28T07:58:29Z Live render workspace diagnostics in quickfix with current buf errors on top, buffer diagnostics in loclist

lourenci/github-colors 29 1 2021-10-04T13:53:35Z Yet another GitHub colorscheme

lewis6991/gitsigns.nvim 1066 19 2021-12-30T11:54:10Z Git integration for buffers

tversteeg/registers.nvim 335 4 2022-01-03T08:48:42Z đź“‘ Neovim plugin to preview the contents of the registers

f-person/git-blame.nvim 247 4 2022-01-04T23:20:49Z Git Blame plugin for Neovim written in Lua

ruifm/gitlinker.nvim 148 7 2021-12-23T15:11:12Z A lua neovim plugin to generate shareable file permalinks (with line ranges) for several git web frontend hosts. Inspired by tpope/vim-fugitive&#39;s :GBrowse

projekt0n/github-nvim-theme 559 5 2022-01-08T11:29:31Z Github theme for Neovim, kitty, iTerm, Konsole, tmux and Alacritty written in Lua

winston0410/range-highlight.nvim 97 5 2021-08-03T07:19:30Z An extremely lightweight plugin (~ 120loc) that hightlights ranges you have entered in commandline.

m00qek/plugin-template.nvim 29 0 2022-01-05T20:16:10Z A template to create Neovim plugins written in Lua

rktjmp/highlight-current-n.nvim 16 1 2021-10-26T12:16:53Z Highlights the current /, ? or * match under your cursor when pressing n or N and gets out of the way afterwards.


Searching for a plugin uses a fuzzy matching algorithm Levenshtein distance to find the best matches based on the name and description.

=&gt; https://en.wikipedia.org/wiki/Levenshtein_distance Levenshtein distance

Since all of the plugins are tagged, you can also search for plugins matching
the tag with `/t/:search`

$ curl https://nvim.sh/t/comment

Name Stars OpenIssues Updated Description

folke/todo-comments.nvim 607 24 2021-12-11T09:13:48Z âś… Highlight, list and search todo comments in your projects

numToStr/Comment.nvim 572 8 2022-01-02T12:51:22Z :brain: :muscle: // Smart and powerful comment plugin for neovim. Supports treesitter, dot repeat, left-right/up-down motions, hooks, and more

b3nj5m1n/kommentary 471 13 2021-12-03T13:54:42Z Neovim commenting plugin, written in lua.

terrortylor/nvim-comment 207 7 2022-01-04T23:21:12Z A comment toggler for Neovim, written in Lua

danymat/neogen 149 6 2022-01-08T12:34:58Z A better annotation generator. Supports multiple languages and annotation conventions.

winston0410/commented.nvim 93 2 2021-11-14T06:00:20Z Neovim commenting plugin in Lua. Support operator, motions and more than 60 languages! :fire:

glepnir/prodoc.nvim 42 0 2021-01-23T07:01:54Z a neovim comment and annotation plugin using coroutine

s1n7ax/nvim-comment-frame 37 0 2021-09-14T06:54:29Z Detects the language using treesitter and adds a comment block

gennaro-tedesco/nvim-commaround 33 0 2021-12-16T11:39:07Z nvim plugin to toggle comments on and off


The data source for this service is https://neovimcraft.com and it is
automatically refreshed once per hour.

I&#39;d be happy to read any feedback or suggestions to make this service even more
useful!
</content>
</entry>

<entry>
	<id>gemini://erock.io/2021/11/01/framework-vs-mbp/</id>
    <link href="gemini://erock.io/2021/11/01/framework-vs-mbp/" rel="alternate" />
	<title>framework vs mpb</title>
    <updated>2021-11-01T00:00:00Z</updated>
    <content>Suddenly, I&#39;m awake. I head over to the kitchen to find my work laptop to start
the day. I pick up my 2019 15&#34; macbook pro. The cold metal grazes my arm as I
carry it to my desk. I grip the binding like a book before laying it down in
front of me. The edges are round and it feels like a contiguous hunk of metal.
With one hand, I can open the monitor.

Whether you like Apple or their ecosystem or not, the macbook pro is _the_
premium laptop. I&#39;ve been searching for years to find something that can come
close to it within the linux ecosystem.

Most of my laptops have been loaners from work and they have all been macbook
pros. In the beginning I absolutely loved it. I basically get a free premium
laptop everytime I get a new job. However, as the years pass, the more I&#39;ve been
getting bored with the Apple ecosystem. OSX is stable and it works reasonably
well for a software engineer. But I like to tinker. I like to make the tool work
for me, not the other way around.

Whenever I look at other laptops, my internal monologue is always asking: &#34;but
how&#39;s the trackpad?&#34; This question causes me to hesitate when looking at other
laptops. I know what I&#39;m going to get with a macbook pro. Premium build,
speakers, monitor, trackpad, and battery life. Some of these features are easy
to compare without having used the laptops, others are impossible.

I love the idea behind the framework laptop. If you&#39;re looking at this review,
you already know why it&#39;s a potentially industry-changing laptop. I finally
caved and bought it a couple months ago and I finally received it in the mail
last week.

When attempting to make this decision, I was searching online for comparisons
specifically to macbook pros. So, in this article, I want to compare the two
laptops in hopes that I can convince people that it does in fact compete with
the macbook pro.

For these comparisons:

- I&#39;m going to set the scale between -1 and 1.
- The macbook pro will be set to 0 for all categories.
- If a score is less than 0, then it is not as good as the mbp.
- If a score is greater than 0, then it is better than the mbp.
- If the final score for the framework is a 0 then the laptops are very close to
  identical.

Let&#39;s start with the question I posed above

# Trackpad (-0.2)

After all of my research, this was the one feature that I gambled on. I had no
idea what to expect. I have been using macbook pros exclusively for the better
part of a decade so I didn&#39;t know what to expect. All the other windows laptops
I have tried had garbage trackpads. I felt an overall lack of precision when
using them.

I&#39;m happy to announce that I don&#39;t notice a huge difference between my macbook
pro&#39;s trackpad and this one. It&#39;s precise, it worked well out-of-the-box on Arch
using sway, and is good enough. To be clear, the mbp&#39;s trackpad is superior,
especially with its gestures so tightly integrated into OSX but for basic mouse
functionality, it works great.

# The Feel (0.1)

This laptop feels like a hunk of metal. I was very surprised at how nice it
feels to carry. It&#39;s difficult to lift the lid with one hand but it is doable.
The monitor hinge feels a little loose. When falling onto the couch while
holding the laptop, the mbp&#39;s screen won&#39;t move from its original position,
whereas the framework&#39;s will. Using my finger to slightly tap the framework
monitor will cause it to shake quite a bit, whereas the mbp will barely budge.


my mbp.  The mbp is heavy and bulky.  It&#39;s not nearly as satisfying as my
framework so I&#39;m upgrading this result.  A macbook air might be comparable to
the framework but I don&#39;t have one so I cannot judge.

Also, there is a little bump / ridge under the laptop to lift the chasis off
the ground slightly for what I&#39;m assuming is to help with heat management. It
has a delightful side-effect of being great to grab when holding it.

# Speakers (-0.7)

The speakers on the framework are pretty bad. They are downward facing, are not
super loud, and overall sound tinny. I did a side-by-side comparison between the
two and the difference is substantial. Listening to a podcast with the laptop on
a solid surface sounds different than when it&#39;s on my lap.

This is easily the worst feature of the framework laptop. If you want to use a
framework as an entertainment device, look for something else.

Having said that, I am able to enjoy listening to youtube and podcasts just fine
with it.

# Screen (0.1)

I love the aspect ratio of the framework laptop. It&#39;s great for productivity and
writing code. The resolution is 2256x1504 which is great. The brightest setting
seems bright to me. Because of the aspect ratio, I&#39;m marking this as an
improvement over the mbp. I pretty much have the brightness setting set to 10%
virtually all day.

# Keyboard (0.5)

The keyboard on the framework is a huge improvement over the 2019 mbp. My wife
has the new and improved keyboard and I find them to be comparable.

# Webcam (0.2)

The physical kill switch is a pretty great feature. I usually purchase a little
plastic shield for my mbp so I can cover the webcam when I&#39;m not using it. It
has a higher resolution than the mbp so I&#39;m giving it an edge although I haven&#39;t
really needed to use the webcam very much yet.

# Ports (0.4)

The ports are swappable and it&#39;s pretty fantastic. I no longer need a dongle for
USB-A or display port. I think this is a killer feature and something I
absolutely love about the framework.

# Battery life (-0.2)

The battery life is meh. I anticipated as much from the reviews. There are
reports that you&#39;ll be lucky to reach 8 hours of battery life. It works fine for
me but it&#39;s not as good as the mbp.

Thankfully, I work from home and am able to use any macbook pro charger with it
so there&#39;s always a hookup close-by for me to use. If traveling an external
charger is going to be crucial.

As I have used the laptop more and tweaked the power management, I think the
battery life is adequate.


house.  I&#39;m downgrading this difference by 0.2 to reflect that. YMMV

# Fan noise / heat (0)

I don&#39;t notice much of a difference between my macbook pro and the framework.

They will both equally run hot at times but for the most part, my framework
laptop doesn&#39;t spin its fans very often. To be fair, I have a dev machine that I
remote into for all my heavy lifting. As a result, the most CPU intensive thing
I run on this laptop is firefox.

# Performance

No comment on this primarily because I have a back-end linux desktop that I use
for all programming related tasks. This laptop is being used primarily for watching
videos and SSHing into my desktop machine to work on side projects.

=&gt; gemini://erock.io/2022/02/17/the-duality-of-software-production.gmi

# Results (0.2)

I think this is pretty accurate to my interpretation. The biggest downsides are
the speakers and battery. It&#39;s not quite as good as the macbook pro in terms of
overall quality of parts used, but it is very close for how I intend to use it.


linux totally blows the mbp out of the water.  I&#39;m never going back.

# Conclusion

After using the framework laptop for awhile, I would most definitely purchase it
all over again if I had to.

Because I wanted to use linux as a daily driver and the features that I care
about are comparable to the mbp, I&#39;m excited about the framework laptop. If you
really don&#39;t want to use OSX anymore and figuring out how to install linux on an
M1 doesn&#39;t interested you, then I think the framework laptop is an excellent
laptop.


owned.  Ignoring the speakers, it so satisfying to use it.  Sometimes I just
carry it around because of how great it feels in my arms.
</content>
</entry>

<entry>
	<id>gemini://erock.io/2021/11/01/on-autoloading/</id>
    <link href="gemini://erock.io/2021/11/01/on-autoloading/" rel="alternate" />
	<title>on autoloading</title>
    <updated>2021-11-01T00:00:00Z</updated>
    <content>Autoloading is a paradigm in some programming languages or frameworks that
allows code to be automatically imported into any developer&#39;s source code file.
This has a few benefits, like removing the need to have the header of a file
contain a series of import statements.

Autoloading appears to be the most popular in scripting languages like Ruby
(via Rails) and PHP.

=&gt; https://guides.rubyonrails.org/autoloading_and_reloading_constants.html

=&gt; https://www.php.net/manual/en/language.oop5.autoload.php

At Aptible, a significant portion of our infrastructure
is a set of services written using Rails. After spending the better part of a
couple years working with rails, I would argue that autoloading **negatively**
impacts the developer experience as well as the productivity of our engineers.

=&gt; https://aptible.com

Autoloading is the worst feature in rails and getting rid of it entirely would
make the framework much more enjoyable. Even the creator of ruby wrote a post
about how he strongly discourages the use of autoloading.
Granted their reasons are unrelated to what I&#39;m interested in discussing and
later in the post they rescinded their stance.

=&gt; https://bugs.ruby-lang.org/issues/5653

For this post, I&#39;d like to focus on how autoloading impacts the developer
experience of a novice.

As someone who was first getting introduced to ruby _and_ rails, I found it
extremely difficult to figure out where classes or functions were defined in the
codebase. Since there are no import statements at the top of the file, it was a
guessing game to figure out where source code was located. Is `SomeClass` a
class we created in one of our repos? Is it a third-party class? I have no clue
just by looking at how the class is being used. This makes onboarding to a
codebase frustrating and confusing. There are
conventions
that help you correctly guess, but I found the best way to find the source code
was to grep for it.

=&gt; https://guides.rubyonrails.org/v5.2/autoloading_and_reloading_constants.html#autoload-paths-and-eager-load-paths

Here was my basic search algorithm for finding the source to `SomeClass`:



It was not uncommon for me to give up entirely. Autoloading made it more
difficult to figure out how something worked and left me feeling defeated.

Even after searching for the right way to do this and asking colleagues, it
still feels like there&#39;s no great solution to this problem that virtually every
other modern programming language avoids by having import statements.

There are IDEs like RubyMine or an LSP that make finding the source code one
click away but `solargraph` -- the LSP I use with `neovim` -- still comes up
empty sometimes. And at least for `solargraph` it doesn&#39;t even bother searching
the source from my installed gems. There&#39;s also the `source_location` method
which we can use at runtime to find the source, but it&#39;s also not full-proof and
a little awkward. My immediate reaction is: Do I really need to run `rails c` in
order to figure out where the source code is for a piece of functionality?

=&gt; https://railsguides.net/find-method-source-location/

Coming from python and typescript, the entire experience feels foreign,
backwards, and confusing.

I think when people say that rails feels &#34;magical,&#34; autoloading is a significant
part of the magic.

`fxn` -- the creator of the current autoloading implementation in rails called
`Zeitwerk` --
commented about the reasons why he likes autoloading.

=&gt; https://bugs.ruby-lang.org/issues/5653#note-40

I&#39;ll focus on the arguments they claim result in a better developer experience:

&gt; 1. Being able to reload code is handy in web applications development. That is
&gt;    replacing the objects stored in the autoloaded constants, not reopening
&gt;    classes by reevaluating the files.

Every other development web server I&#39;ve used solves this by watching files and
reloading the server. It is rarely, if ever, an issue. This argument doesn&#39;t
convince me in the slightest.

&gt; 2. In any non-trivial project, getting the require calls right is difficult,
&gt;    you always forget some and gives load order bugs.

The error shows up immediately, you fix it, and then move on with your life.
Again, this is not a very convincing argument as I would much rather fix an
easily traceable error once than perform my crude search algorithm every single
time I want to inspect a definition.

&gt; 3. If you structure your project in a conventional manner in which file paths
&gt;    match constant paths, the requires don&#39;t feel DRY. You are repeating
&gt;    something all the time that could be automated.

I have another rant about DRY that deserves its own post. I&#39;ll keep it brief
here: the obsession with DRY in the rails community is a virus that has infected
the minds of engineers. I know DRY wasn&#39;t invented with rails but it certainly
popularized it. All aspects of structuring code need to be evaluated based on
their merits and DRY is not always the correct decision. I would also argue in
some cases it produces far **less** readable and maintainable code.

&gt; 4. Being able to work as if all your classes and modules are just available
&gt;    everywhere (as in Rails) is a great user experience.

Fair enough, I do see this as a positive and I&#39;m not blind to the benefits of
having all modules, classes, and functions automatically loaded. Once you&#39;ve
memorized them you can really cut down on the preamble of writing code. I have
also spent a significant amount of time refactoring JS code to fix imports
because I wanted to move some code to another location.

I remember when I first started to learn python and stumbled across this
stackoverflow post about auto importing modules in python. I think it
provides some interesting arguments **for** having import statements:

=&gt; https://stackoverflow.com/a/1494402

&gt; 1. They serve as a sort of declaration of **intent**.
&gt; 2. Imports serve as a proxy for the **complexity** of a module.

So much information and complexity is hidden by removing the import statements.

If we want rails to feel less magical, we should start by looking at removing
autoloading.
</content>
</entry>

<entry>
	<id>gemini://erock.io/2021/09/30/staying-productive/</id>
    <link href="gemini://erock.io/2021/09/30/staying-productive/" rel="alternate" />
	<title>staying productive</title>
    <updated>2021-09-30T00:00:00Z</updated>
    <content>It&#39;s 11:56 PM.

9 weeks 2 days and 12 hours since my child was born. He just got his 2-month vaccines a few days ago and he had a rough day today which invariably made our day ... challenging. Restless, fussy, causing us to test our patience. My wife is a champion. She spent the previous night with him and only got a few hours of sleep just so I could sleep in our guest bed uninterrupted. She claims it&#39;s the cortisol keeping her going but she&#39;s just so strong. It&#39;s moments like these that make me realize how smart past Eric was for choosing to be with her.

I went back to work last week, returning from 8 weeks of parental leave. I&#39;m working from home so I try to help as much as I can but my primary directive is to work.

Today was probably one of the hardest days we&#39;ve had so far as parents so I thought I would reflect on this day. Today is one of those days where it&#39;s hard to see the upside in parenthood. We all hear about it from friends, family, or otherwise. Sometimes I feel like parents&#39; affection for their children is the result of Stockholm syndrome [1]. When the child takes a break from their multi-hour cry session and grace us with a smile we are euphoric.

This is the first time since his birth that I felt like I didn&#39;t have needs of my own. Everything was secondary to the crying. It was virtually impossible to get anything done and yet we still managed:



I hope things are better tomorrow. We can&#39;t figure out if he has really bad acid reflux or his fussy-ness is from the vaccines. Either way we can&#39;t do too many more of these days.

It&#39;s days like today where I feel like all my motivation to write code goes out the window. I have all these ideas and things I want to accomplish but literally my hands are occupied holding a baby; my mind is occupied with soothing him.

I have to convince myself that my own desires are temporarily on hold and that I&#39;ll be able to dedicate some time to my hobbies again soon. But who knows, maybe this is the sacrifice people talk about with parenthood.

[1] Stockholm syndrome is a condition in which hostages develop a psychological bond with their captors during captivity.
</content>
</entry>

<entry>
	<id>gemini://erock.io/2021/06/17/crickets/</id>
    <link href="gemini://erock.io/2021/06/17/crickets/" rel="alternate" />
	<title>crickets</title>
    <updated>2021-06-17T00:00:00Z</updated>
    <content>Time and time again I spend a considerable amount of time working on a project
that I find useful and think:

&gt; surely other people will find this useful as well&#34;

... only to find out that it isn&#39;t resonating with people like I had expected.

It&#39;s frustrating to spend so much time and energy on building open-source
libraries only to discover no one cares or no one see its potential. Part of me
thinks it has to do with networking. I&#39;m terrible at networking. My social
sphere is extremely limited. This is especially true in the developer community.
I struggle to gain any traction, no matter how many projects or blog articles I
publish. I find the entire endeavor exhausting and not my personality. I want
the result of having a big network without having to engage in it at all. Some
people have managed to pull this off very successfully. They can write a blog
post, not advertise it anywhere and get a huge audience to read it.

Twitter seems like it has massive potential to build a large network of people
that will see my projects or ideas but how do you grow that audience? I don&#39;t
like twitter, I find the whole ecosystem toxic and to be perfectly honest really
boring. I&#39;m sure a big reason why I think it&#39;s boring is because it feels like
I&#39;m sending my tweets directly into `/dev/null`.

I try to write high quality and thoughtful blog articles but after every post I
hear crickets. Every library I publish I hear crickets. Every app I create I
hear crickets.

The end result is I feel like I&#39;m wasting my time or that my ideas aren&#39;t that
great to begin with. Maybe it&#39;s true that my ideas don&#39;t reasonate with people.
I rarely feel lonely, but when I try to announce a project I&#39;m excited to share
with the world only to hear crickets ... it&#39;s hard not to feel alone.
</content>
</entry>

<entry>
	<id>gemini://erock.io/2021/05/19/apology-series-john/</id>
    <link href="gemini://erock.io/2021/05/19/apology-series-john/" rel="alternate" />
	<title>apology series -- john</title>
    <updated>2021-05-19T00:00:00Z</updated>
    <content>Every so often I reflect on my life and think about the times when I mistreated
someone because of my own inadequacies as a fellow human. These are events that
I truly regret and as a result, they greatly shaped who I am today. I would like
to tell those stories and write an apology to the people involved in the story.
My plan is to write these letters in chronological order, starting from my
youngest age to now. This letter is the first of the series.

## Context

When I was about 13 years old I was riding home on the school bus. A couple of
classmates were talking about a video game that piqued my interest.

Me: &#34;What game are you talking about?&#34;

John: &#34;It&#39;s a computer game called Graal Online.&#34;

Connor: &#34;It&#39;s like a multiplayer zelda game.&#34;


I ran home and figured out how to install the game. Eventually I logged in and
met up with John and Connor. They showed me around the game and helped me get
hearts and weapons. I was having a blast. This was one of the first online
multiplayer games I have ever played and needless to say, I was hooked from the
beginning.

There was one aspect of the game that was really interesting. It wasn&#39;t just an
adventure game, it was also a builder game. I think of it like minecraft but
with 2d zelda graphics. People could build levels and then upload them to the
game server so other people could play on your levels.

Another aspect of this game was playerworlds. People could purchase their own
server and then build their own worlds. Not only could players build levels, but
there was also a scripting language (GScript) to build NPCs, events, etc. The
creators of the playerworlds would also hire other players to help them build
the world. These were referred to as &#34;Staff.&#34; They had their own special guild
tags so everyone would know that they were staff members. This usually came with
special abilities, access to hidden levels, as well as a special chatroom for
all the staff members to talk.

One day, John decided to show me what he built. He built a house that him and
his friends could go to and hang out. I was really impressed. It was clear he
spent a lot of time building it and was really proud that he managed to get it
uploaded to the playerworld for everyone to see.

Some time had passed and I was getting really into the game. I started to learn
more about how the game worked and more importantly I started to learn how
exclusive and how powerful you can be as a staff member. Staff members would
walk through walls, teleport to any level, and have abilities no one else had
access to. Not to mention the really sweet tags next to their names.

The easiest way to become a staff member was to have a marketable skill and
willing to help them build their playerworld. Here are the common positions:

- LAT (Levels Administration Team)
- NAT (NPC Administration Team)
- GAT (Graphics Administration Team)
- SFX (Sound effects)

## The event

I decided that I would apply for the LAT position since the playerworld I played
on was hiring. They wanted to see an example of a level I built.

I don&#39;t know what came over me but I decided to show them John&#39;s level. The
staff member teleported us to the level and he took a look around. He was as
impressed as I was with the level and decided to give me the position.

Needless to say I was ecstatic. I was part of the exclusive club. I was walking
through walls and teleporting all over the place. Not only that, but I got
access to the entire world and could see how the playerworld operated. I was
having a blast.

A week or so later I get a message from the person that hired me.

Staff: &#34;Hey Erock, we need to talk.&#34;

Me: &#34;Okay?&#34;


The staff member teleports me to where he was. It was John&#39;s house that I
claimed to be my own. He also wasn&#39;t alone ... John was also there waiting for
me. At this point I&#39;m freaking out because it became clear in that instant that
I had been caught as a fraud.

I don&#39;t know how, but John figured out that I said his house was mine in order
to get the LAT position and he told the staff member. I was mortified.

I was immediately stripped of my LAT position along with all of its trappings.

After that embarrassing event, John and I were never really the same again. I
never apologized for what I did and we pretty much stopped hanging out. I really
liked John. I looked up to him. He was one of the gifted kids. He was in honors
classes and the REACH program that always seemed to have the coolest rooms in
the school. I made a stupid decision and never recovered from it.

After I was stripped of my LAT title and outed as a fraud I continued to play
Graal. I continued to try to prove to myself and anyone else that I wasn&#39;t a
fraud. I eventually became LAT Lead on multiple playerworlds and built a
reputation for building great levels. By this point years have gone by and John
and Connor have long stopped playing the game.

I know it sounds silly, it&#39;s just a game, right? But I learned a valuable lesson
that day about pretending to be someone I&#39;m not. I learned that there are no
shortcuts in life and that I have to work hard for the thing I want in life.

20 years later and I still reflect on that life event.

## My apology to John

Dear John,

I&#39;ve always wanted to apologize for what I did. At the time, I wanted something
so badly that I was willing to lie and cheat to get it. Claiming your level as
my own was the quickest way to getting what I wanted. I was immature and didn&#39;t
fully understand the ramifications of my actions. I just want to let you know
that I&#39;ve never forgotten what happened and I still haven&#39;t really forgiven my
13 year old self for being so selfish.

I wish I had the courage and maturity to tell you this when we were 13. I wish
that I had the clarity I do now to confront my own insecurities and try to
salvage our relatively new friendship.
</content>
</entry>

<entry>
	<id>gemini://erock.io/2021/03/27/my-love-letter-to-front-end-web-development/</id>
    <link href="gemini://erock.io/2021/03/27/my-love-letter-to-front-end-web-development/" rel="alternate" />
	<title>my love letter to front-end development</title>
    <updated>2021-03-27T00:00:00Z</updated>
    <content>Building front-end web applications has been my primary job for the past 5
years. Having a pulse of the current javascript ecosystem is exhausting. The
ecosystem is under constant churn where new tools are being built at a rapid
pace that radically changes the way we build web applications. There&#39;s also a
lot of tools in our stack in order to build a production-grade web application.
How did we go from being able to inline javascript in our HTML to having a build
pipeline that involves making a handful of tooling decisions before a single
line of javascript code can be written?

Software engineering as a profession has been around for decades, there are
dozens of modern programming languages, thousands of tools and frameworks to
help satisfy our business requirements for a product or service. After hundreds
of thousdands of minds building software and learning from previous mistakes,
why does it feel like the front-end is churning the tech it uses so much? Why
does it seem like the front-end is such a mess? From fiasco&#39;s like `left-pad` to
tooling churn, front-end development stands alone as the black swan in software
development.

I&#39;m constantly reading on hackernews and the ilk that people who consider
themselves competent software engineers -- generalists even -- avoid front-end
web development like the plague. Why do so many professional engineers have
disdain for front-end development?

The answers to these questions are why I love front-end web development.
Javascript sucks and that&#39;s why it&#39;s amazing. Let&#39;s explore this ecosystem
together while I try to convince you why front-end development is so exciting.

# A black swan

Javascript has a very unique set of challenges that differentiates itself from
the rest of the programming world. The primary driving factor for its unique
position is javascript is downloaded on the client&#39;s browser. Languages that run
on the server, for example, don&#39;t need to send code that it runs onto client
machines, they merely respond to requests made from the browser. The computation
runs on the server. Traditional desktop applications only require the client to
download the code or executable once to run the application. For front-end
development, it&#39;s downloaded everytime. This is the key requirement that
differentiates front-end development from the rest of its comrads:

&gt; Front-end development needs to consider total code size.

Where other slices of the tech stack don&#39;t need to worry as much about code
size, it&#39;s a primary consideration for us.

What&#39;s the side-effect of this requirement?

- Small libraries are preferred over large ones
- A lot of tooling focuses on reducing code size

Let&#39;s look at these side-effects to better understand how it affects the
ecosystem.

## Small libraries are preferred over large ones

Because code size matters, javascript libraries are hyper-focused on delivering
the most powerful set of functionality in the smallest amount of code possible.
When I think of modern javascript libraries, I&#39;m reminded of the unix philosophy
of doing one thing and do it well.

&gt; Javascript libraries do one thing and do it well out of necessity

This is taken to the extreme when there are libraries that are one line of code.

`is-promise` is a popular one-line javascript function that was infamous for
breaking a ton of applications and libraries because it introduced a regression.

function isPromise(obj) {

return (

!!obj &amp;&amp;

(typeof obj === &#39;object&#39; || typeof obj === &#39;function&#39;) &amp;&amp;

typeof obj.then === &#39;function&#39;

);

}


`left-pad` was another famous example of a tiny library causing projects all
over the world to fail to build.

It seems silly, but this side-effect is perfectly explained by the unique
requirements of front-end web development.

## A lot of tooling focuses on reducing code size

From code minification to tree-shaking, there&#39;s an abundance of tools that help
reduce the overall filesize of our javascript code that gets downloaded over the
wire. The front-end development build pipeline needs to spend time figuring out
what code is actually being used in an application as well as figure out how to
mangle it to be as small as possible. I&#39;ve never worked on another project,
outside of front-end development, that needed to care so much about code size.

For example, projects that use python don&#39;t have to consider the ramifications
of bringing in large dependencies. `numpy` is a very popular pypi package for
data science and statistics. Adding that one package to your project will
increase the total code footprint by ~30MB. Can you imagine the vitriol
front-end developers would receive if they had a javascript bundle size of even
a fraction of that? It would be reprehensible.

Sometimes we _do_ need to pull in large libraries because of how useful they are
to us. They save hundreds and thousands of person hours and are cost effective
to the business. We have to get creative and that is illustrated in the
incredible amount of tooling in the javascript ecosystem. The ecosystem is
constantly churning through tooling libraries in order to satisfy this one
requirement.

# One ring to rule them all

There is only one programming language that we can target for browsers:
javascript. We have other languages that can target javascript, but the end
result must always be javascript -- for now.

&gt; For better or worse, thousands of developers **must** use javascript

Since there is effectively only one language ecosystem, there is an immense
amount of creativity and labor hours put into solving its toughest problems. The
ecosystem is under constant churn because it **needs** to satisfy so many
requirements for a wide range of businesses. If we had the same number of
popular programming languages on the front-end as we do on the back-end, there
would be far less churn within each ecosystem. I would also argue that because
javascript has its faults -- like any language -- there are a lot of incredible
people coming up with ingenious solutions to patch those issues.

&gt; Because developers are forced to use javascript, they are forced to come up
&gt; with creative solutions.

This creativity leads to fantastic and ingenious solutions. It&#39;s truly one of
the most vibrant and interesting programming ecosystems to be apart of. In
recent years, there are some tools that have revolutionized javascript. In
particular:

- Typescript
- Prettier
- ESLint
- React (`view = f(state)`)

I would argue that the type system in typescript has contributed to more stable
web applications than any single piece of tooling within the ecosystem. I would
also argue that its type system is superior not in design, but by its
application than any other type system I have worked with.

Prettier is just as good as `gofmt` which is saying something considering
`gofmt` was built by the golang language designers.

ESLint is the best linter I have ever seen in a programming language. There
might be comparable linters in other languages, but I haven&#39;t seen any
convincing evidence of them yet.

Everytime I grab another programming language, I miss these three tools almost
immediately. Going to python after working with javascript is like going back in
time in terms of tooling.

I would also argue that React is another library that has completely
revolutionized how to build UI applications. There&#39;s a reason why so many
applications are built with electron and I would argue it&#39;s not because people
don&#39;t know how to use Qt. There&#39;s a reason why people don&#39;t want to use Qt and
it&#39;s because the ergonomics of it pale in comparison to React and the web.
Thinking of the view as a function of state was groundbreaking to the UI world.

# There are many ways to run javascript

Javascript has a specification: ECMAScript. This specification is implemented in
different browsers in subtly different ways. The number of javascript
implementations has been slowly declining over the years since v8 has dominated
the browser market with its speed as well as it server side implementations
(e.g. node). However, the fact still remains: javascript is implemented in
subtly different ways and getting adoption of new features is very slow. Getting
users to update their browsers is a momumental undertaking, one that has plagued
front-end developers for years. The delay from a new feature in ECMAScript to
market-share adoption is on the scale of years, not months. This creates yet
another unique constraint for javascript.

The solution to this problem was two-fold:

- new features -- introduced by ECMAScript -- need to be backwards compatible
- tooling can be created to transpile code from one spec to another

Because the designers of ECMAScript make new features backwards compatible (for
the most part), we can build tooling around converting code from a later
specification to an earlier one. This created a new set of tools called
transpilers (e.g. babel) which would convert ES6 code to ES5.

These transpilers allowed developers to write code in the latest specification
without really worrying about market-share adoption. At the same time, it forced
us to be okay with a compilation step to our build pipeline. This opened the
flood gates for all sorts of tooling. Modern javascript code is compiled and
that&#39;s not going away anytime soon. Does it add friction for people trying to
learn the ecosystem? Absolutely, but the benefit is huge.

# Conclusion

Because so many talented people are forced to use javascript, because javascript
has wholly unique requirements, we get the pleasure of working within a vibrant
ecosystem. There isn&#39;t a year that goes by without some new innovation that
takes the community by storm. However, at the same time, the ecosystem is
starting to mature. React, arguably one of the most popular javascript view
libraries ever built, has been around for 7&#43; years now. Typescript is
essentially required for all new projects.

Building modern, production-grade web applications is difficult and there are
times when it seems like all of this tooling really gets in the way. There are
times when I&#39;m sick of re-implementing the same components, dealing with the
minor details of moving pixels on the screen, or satisfying the
similar-but-slightly-different UX of an app that makes abstractions difficult.
However, that&#39;s what makes front-end development so interesting. A new project
rarely looks like the last.

If we attempted to replace javascript with some other language, it would still
be restricted by the same requirements that restricts javascript today.

When I think about the challenges that face front-end developers I get excited
to be part of this community.
</content>
</entry>

<entry>
	<id>gemini://erock.io/2021/03/04/adventure-into-gemini-as-fe-engineer/</id>
    <link href="gemini://erock.io/2021/03/04/adventure-into-gemini-as-fe-engineer/" rel="alternate" />
	<title>adventures into gemini as a front-end engineer</title>
    <updated>2021-03-04T00:00:00Z</updated>
    <content>I wanted to talk a little about my current profession and why the juxtoposition
of it with gemini is interesting to me.

It seems like most people venturing into the gemini space are people who live
inside the terminal and never want to leave. There is also some overlap of
people that have disdain for the modern web because of how bloated websites have
become. With javascript, ads, popups, cookie consent modals, I can hardly blame
people. The modern web reminds of nascars with advertizements plastured on their
vehicles. It seems like every website is trying to monetize itself into silicon
valley stardom and as a result, it has ostrcized its early adopters. The people
begging for a simpler web have lost the battle. Even after many attempts to
bring the web into their terminals (e.g. lynx, w3m) it ends up a hack at best
and at worst completely unusable.

Enter gemini. Gemini is against everything about the modern web and wants to
bask in the nostalgic glow of a past life. A life where documents didn&#39;t shift
out from under you. They are static, there&#39;s a strict 1:1 mapping between the
gemini page and the number of requests made to the server to render the page.

I&#39;m fascinated by this world because I also live in the terminal, but it&#39;s also
my job to build web apps. I&#39;ve been working as a front-end software engineer for
the better part of 5 years now. I build massive javascript web apps for
companies that are trying to monetize the web. I&#39;m building the demons that
haunt the people that enjoy gemini so much.

I agree with the sentiment behind the need for gemini. I think the web has
transformed into a completely different utility than its original intent:
communicating with people. It still very much is about communication, but its
been co-opted by commercialization, which I think is both good and bad. Billions
of dollars are being made off of voluntarist companies building web
applications. The employees are not working in factories, sacrificing their
health and bodies for a paycheck. The only exploitation of its customers are
data. This is not to say people&#39;s data isn&#39;t sacred, I just think we need
perspective. The people employed in tech lead relatively comfortable lives, and
I think there&#39;s something of value to it. Whether we want to admit it or not, we
are generating value for businesses around the globe and it doesn&#39;t appear to be
slowing down.

I guess I&#39;ve read a lot of comments around the gemini community showing disdain
and vitriol for the modern web, but I have a different perspective. I enjoy the
modern web for what it is just like I&#39;m really enjoying gemini for what it is.

In my next article, I&#39;m going to write about why I love javascript so much and
argue for why you should as well.
</content>
</entry>

<entry>
	<id>gemini://erock.io/2021/01/23/docker-disk-out-of-space/</id>
    <link href="gemini://erock.io/2021/01/23/docker-disk-out-of-space/" rel="alternate" />
	<title>docker in production -- running out of disk space</title>
    <updated>2021-01-23T00:00:00Z</updated>
    <content>&gt; tl;dr: If you are deploying docker containers to production, be sure to run
&gt; `docker system prune -f` before pulling new images so you don&#39;t run out of
&gt; disk space.

When I&#39;m building a new project, I generally learn towards using docker-compose
during development.

=&gt; https://docs.docker.com/compose docker-compose documentation

When coupled with docker-machine I have a quick and easy way to deploy my
containers to the cloud provider of my choice.

=&gt; https://docs.docker.com/machine docker-machine documentation

Overall, it works really well, but there&#39;s one important thing to consider when
using docker for production: running out of disk space.

Images, containers, networks, and volumes will continue to grow on a production
VM which will inevitably lead to the hard drive running out of memory. This
seems obvious, but it wasn&#39;t obvious to me when I first started using
`docker-machine`.

I recently built a new app (listifi) to google cloud compute and ran into
out-of-memory issues after a bunch of iterations. The default VM only has around
15GB.

=&gt; https://listifi.app listifi app I built

=&gt; https://cloud.google.com

Here&#39;s a brief overview of my deployment process:

- Develop using `docker-compose` locally
- Build features locally
- Use a production tuned `docker-compose` yml file to build images locally
- Push the images to Google&#39;s Container Registry
- Then I run `eval $(docker-machine &lt;name&gt; env)` to tunnel into my production
- VM&#39;s docker
- Then I run `docker-compose -f production.yml pull --ignore-pull-failures` to
- download the new images
- Then I run `docker-compose -f production.yml up --no-deps -d` to restart my
  containers with the new images

This process works great. I don&#39;t need to setup CI for a new project but it
still provides me with the flexibility to deploy to my own VM and inspect its
health with docker.

# The problem

Things are working great, I&#39;m iterating on feature development and deploying in
between major changes. Only, the last deploy I tried to perform failed. The
reason: hard drive is out of space. Hmm, my VM has 16GB of diskspace, why is it
out of memory?

When I run `docker system df` the problem becomes clear: I have unused images
soaking up all of my hard drive space. I have scoured docker deployment
strategies and never came across documentation that references this issue. There
are plenty of StackOverflow issues referencing the problem with a solution, but
I never really made the connection to my production VM until I hit this problem.

# The solution

Before I pull my new images in production, I run another command:

docker system prune -f


=&gt; https://docs.docker.com/engine/reference/commandline/system_prune documentation for system prune

Once I added that to my deployment step, things are working much more smoothly.

# Conclusion

I completely forgot that as I deployed new changes to production, there was
lingering old docker images laying dormant on my production VM, increasing in
size of time.

It never clicked for me until I ran into the problem, hopefully this short blog
article will help others avoid this problem in the future as well.
</content>
</entry>

<entry>
	<id>gemini://erock.io/2014/07/14/heideggars-brilliance/</id>
    <link href="gemini://erock.io/2014/07/14/heideggars-brilliance/" rel="alternate" />
	<title>heideggars brilliance</title>
    <updated>2014-07-14T00:00:00Z</updated>
    <content>&gt; Philosophers since Descartes had been trying to prove the existence of the
&gt; external world, and Kant said it’s a scandal philosophers have not
&gt; successfully proven the existence of the external world, and Heidegger said it
&gt; was a scandal people are trying to prove the external world.

Rarely do I care to read the musings of a philosopher with more obscurity than
my girlfriend’s makeup routine, but I do enjoy Heidegger’s distilled brilliance.
Technology, something I think Heidegger denigrated vehemently for being
antithetical to Being, is ironically illuminating his ideas on Being.

After reading my own writings, I fear as I think Heidegger did, that language is
the core of obfuscating the meaning of being. We are bound by our rough modes of
communication, and it seems more common than not that it confuses what we mean.

I find Heidegger to be a stunning case of irony: his verbose writing style
describes precisely what he is ridiculing, the obfuscation of dasein.
</content>
</entry>
</feed>